/ Nginx

Nginx Active Connections ฉบับขี้เกียจ

วันก่อนโพสต์เรื่องเอา Nginx Active Connections มาวาดกราฟด้วย Google Sheet วาร์ป เพราะว่าขี้เกียจใส่ระบบ Monitor Connections เลยเขียน shell script 2-3 บรรทัด อ่านค่าผ่าน cURL มาใส่ไฟล์ csv แล้วเอาเข้า Google Sheet ดูกราฟ

Screen-Shot-2560-08-26-at-7.21.12-PM

จริงๆแล้วมันง่ายมาก ถ้าใครใช้ nginx และเขียน shell script เป็นสักนิดหน่อย เอาเป็นว่า สิ่งที่ต้องการเลยก็คือ Nginx + ngx_http_stub_status_module โดยโมดูลนี้ มันไม่ได้ถูกเปิดใช้ ถ้าเราไม่เปิดใช้เองน่ะ ต้องเพิ่มตอนคอมไพล์ ด้วย --with-http_stub_status_module เอาเป็นว่า เพื่อความง่าย และผมขี้เกียจ ผมจะเขียนตัวอย่างด้วย Docker :D โดยจะใช้ docker image domecloud/openresty:edge แต่ว่าคอนฟิกเอาไปใช้กับ Nginx/OpenResty อื่นๆได้ถ้ามี --with-http_stub_status_module

โดยใช้คอนฟิกไฟล์นี้ โดยใส่ไฟล์ชื่อ default


server {
    listen 80;
    server_name  xxx.yyy;
    client_max_body_size 100m;

    location / {
    }

    location /basic_status {
        access_log off;
        stub_status;
    }
}

ต่อไปก็รัน docker

docker run -d --name sloth -v $(pwd)/default:/opt/lixen/nginx/conf/site/default -p 8080:80 domecloud/openresty:edge
df7b5266e8d0

จากนั้นเช็คว่าเว็บเซิร์ฟเวอร์รันอยู่

docker ps

จะได้

df7b5266e8d0        domecloud/openresty:edge   "/start.sh"              4 seconds ago       Up 2 seconds        0.0.0.0:8080->80/tcp     sloth

ทดลองเรียกหน้าเว็บด้วย cURL

curl -I 127.0.0.1:8080

จะได้

HTTP/1.1 200 OK
Server: openresty/1.11.2.3
Date: Wed, 30 Aug 2017 07:39:36 GMT
Content-Type: text/html
Content-Length: 562
Last-Modified: Tue, 23 May 2017 08:01:51 GMT
Connection: keep-alive
Vary: Accept-Encoding
ETag: "5923ec6f-232"
Accept-Ranges: bytes

ถ้าหน้าแรกได้ 200 OK แล้วลอง

curl 127.0.0.1:8080/basic_status

จะได้

Active connections: 1
server accepts handled requests
 6 6 6
Reading: 0 Writing: 1 Waiting: 0

จะได้ตัวเลข Active connections แล้ว ทีนี้ จะเอามันลงไฟล์ ด้วย shell script ให้มันชื่อ get_conn.sh นามสมมติ

#!/bin/bash
CONN=$(curl -s http://127.0.0.1:8080/basic_status | head -n1 | cut -d: -f2 | sed 's/ //g')
echo "`date`,$CONN" >> "/data/web/conn-`date +%F`.csv"

แล้ว chmod +x get_conn.sh จากนั้นเพิ่ม crontab ให้เรียกไฟล์นี้ทุกๆ 1 นาที หรือมากกว่าก็ได้

*/1 * * * * /path/to/get_conn.sh &

โดยไฟล์ csv จะถูกสร้างชื่อตามวันที่ เช่น conn-2017-08-29.csv และมีบรรทัดข้อมูลประมาณนี้

Wed Aug 30 00:00:02 +07 2017,1
Wed Aug 30 00:01:02 +07 2017,1
Wed Aug 30 00:02:02 +07 2017,2
Wed Aug 30 00:03:01 +07 2017,5
Wed Aug 30 00:04:01 +07 2017,1
Wed Aug 30 00:05:01 +07 2017,10
Wed Aug 30 00:06:01 +07 2017,9

เสร็จแล้วสำหรับการเตรียมข้อมูล ต่อไปคือการเอาเข้า Google Sheet เพื่อแสดงผล โดยไปที่เมนู Import
Screen-Shot-2560-08-30-at-2.50.49-PM

จากนั้นเลือกไฟล์ และเช็คตรง Insert new sheet
Screen-Shot-2560-08-30-at-2.52.32-PM

จากนั้นสร้างกราฟตามอัธยาสัยเลยครับ

chart

return 200 OK