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

Nginx Aug 30, 2017

วันก่อนโพสต์เรื่องเอา 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

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.