INT 21h

Hi, I am Vladimir Smagin, SysAdmin and Kaptain. Telegram Email / GIT / Thingiverse / RSS / GPG

Add cache control and CORS to nginx ingress in Kubernetes

№ 11131 В разделе "Sysadmin" от November 3rd, 2020,
В подшивках: ,

annotations:
    nginx.ingress.kubernetes.io/configuration-snippet: |
      if ($request_uri ~* \.(js|css|gif|jpe?g|png|woff|woff2|ico)) {
        expires 1M;
        add_header Cache-Control "public";
      }
    nginx.ingress.kubernetes.io/cors-allow-headers: >-
      DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,X-CSRF-Token,
      Authorization
    nginx.ingress.kubernetes.io/cors-allow-methods: 'GET, PUT, POST, DELETE, PATCH, OPTIONS'
    nginx.ingress.kubernetes.io/cors-allow-origin: '*'
    nginx.ingress.kubernetes.io/enable-cors: 'true'

Нет комментариев »

История провала: webdav и nginx для Windows

№ 10985. В разделе " Sysadmin " от April 25th, 2020

В подшивках: , ,

Разбор логов nginx моментально при их поступлении, без парсинга файлов

№ 9038 В разделах: Programming Sysadmin от June 16th, 2018,
В подшивках: , ,

Захотел я выцеплять ботов, которые небрежно и наплевав на все разумные robots.txt сканят мой драгоценный няшный говноблог. Штатный живой мониторинг nginx доступен только в платной plus версии, а socket file работает только для syslog. Выход все же есть как завернуть лог через вашу программу разбора и называется он named pipes. Это штатная линуксовая фишка как раз для таких извращенцев как я.

Итак, первым делом пишем нашу программу. Поскольку я сейчас использую в основном Python, то программа будет именно на нем.

import os
import errno

FIFO = '/run/nginx-detect-bots.pipe'

try:
    os.mkfifo(FIFO)
except OSError as oe: 
    if oe.errno != errno.EEXIST:
        raise

while True:
    with open(FIFO) as fifo:
        print("Listening log file")
        while True:
            data = fifo.readline()
            if len(data) == 0:
                # stop cycle if no data
                #break
                pass
            else:
                # here your code
                print(data)

Теперь добавляем дополнительную строку в nginx

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        access_log /run/nginx-detect-bots.pipe;
        error_log /var/log/nginx/error.log;

В данном примере получаемые строки просто выводятся на экран. Вы можете приделать регэкспы, разбор статы, запись данных в БД и прочую требуху по вашему усмотрению.

Мой готовый код для выцепляния IP адресов и их юзер агентов https://git.blindage.org/21h/nginx-detect-bots

Тут вы можете скачать собранные данные в CSV формате за все время, начиная с даты этого поста. Данные обновляются моментально, подходит для запихивания в cron.

Нет комментариев »

Zabbix: nginx stub_status monitoring

№ 9029 В разделе "Sysadmin" от June 15th, 2018,
В подшивках: , , ,

stub_status in nginx looks like this

root@boroda:~# curl -s blindage.org/status 
Active connections: 2 
server accepts handled requests
 231167 231167 496908 
Reading: 0 Writing: 1 Waiting: 1 

Counters helps you to understand some statistics of your server and you can monitor this metrics in Zabbix.

Open Nginx config file and add to server section with host’s name from zabbix:

    location /status {
        allow 127.0.0.1; #allow only local agent
        deny all;
        stub_status on;
        access_log off;
    }

Create file /etc/zabbix-agent/zabbix_agentd.d/nginx.conf:

UserParameter=nginx.active[*],wget -O- -q $1/status | awk '/^Active/ {print $NF}'
UserParameter=nginx.reading[*],wget -O- -q $1/status | awk '/Reading/ {print $$2}'
UserParameter=nginx.writing[*],wget -O- -q $1/status | awk '/Writing/ {print $$4}'
UserParameter=nginx.waiting[*],wget -O- -q $1/status | awk '/Waiting/ {print $$6}'
UserParameter=nginx.accepted[*],wget -O- -q $1/status | awk '/^[ \t]+[0-9]+[ \t]+[0-9]+[ \t]+[0-9]+/ {print $$1}'
UserParameter=nginx.handled[*],wget -O- -q $1/status | awk '/^[ \t]+[0-9]+[ \t]+[0-9]+[ \t]+[0-9]+/ {print $$2}'
UserParameter=nginx.requests[*],wget -O- -q $1/status | awk '/^[ \t]+[0-9]+[ \t]+[0-9]+[ \t]+[0-9]+/ {print $$3}'

Woohoo! You on a right way! Create template and items inside like this one

Create new graphic, all loves graphics!

Ok, you created cool monitoring for your Nginx, now look how to calculate rate in Zabbix.

Нет комментариев »

Python: анализ логов nginx в специальном формате

№ 8580 В разделах: Programming Sysadmin от December 24th, 2017,
В подшивках: ,

Один из проектов, который я веду вырос довольно геморройным и требовательным к производительности. Программа должна прочитать специально разогретый и смазанный лог нгинкса, извлечь всю необходимую мне информацию и отправить полученные данные в zabbix чтобы было видно здоровье фермы. В эту же программу вкорячил и вывод полной статистики по логу, а не только по конкретным кодам + добавил с какого времени начинать и заканчивать обработку. Больше всего боли приносят конвертации даты и времени при чтении лога. 6 секунд без указания времени против 40 секунд с точкой отсчета.

Исходный код

Пример обрабатываемого лога:

"172.31.30.163","23/Dec/2017:15:38:08 +0000","200","GET /grabit/script.php HTTP/1.1";
"172.31.30.163","23/Dec/2017:15:38:08 +0000","200","GET /grabit/script.php HTTP/1.1";
"172.31.30.163","23/Dec/2017:15:38:08 +0000","200","GET /grabit/script-min.js HTTP/1.1";
"172.31.30.163","23/Dec/2017:15:38:08 +0000","302","GET /grabit/pixel.php HTTP/1.1";
"172.31.30.163","23/Dec/2017:15:38:08 +0000","200","GET /grabit/script.php HTTP/1.1";
"172.31.9.241","23/Dec/2017:15:38:08 +0000","200","GET /grabit/script.php HTTP/1.1";
"172.31.9.241","23/Dec/2017:15:38:08 +0000","200","GET /grabit/script-min.js HTTP/1.1";

Пример вывода:

$ python ./nginx-analyzer.py -h
usage: nginx-analyzer.py [-h] --log logfile [--code HTTP_CODE] [--time]
                         [--totime] [--summ]

Get statistics from nginx special format log file

optional arguments:
  -h, --help        show this help message and exit
  --log logfile     Of course, you need to parse something
  --code HTTP_CODE  Show only response code
  --time            Start counting from timestamp DD-MM-YYYY HH:MM:SS
  --totime          Stop counting from timestamp DD-MM-YYYY HH:MM:SS
  --summ            Display fancy summary

$ time python ./nginx-analyzer.py --log nginx/http.access.log --summ --time "23-12-2017 15:37:00"

HTTP codes  | Type   | Count 
------------+---------------+-----------
 All |               | 3,593,692 
 20x | Success       | 3,188,176 
 30x | Redirection   | 395,021 
 40x | Client errors | 86 
 500 | Server errors | 5,855 
 502 | Server errors | 56 
 50x | Server errors | 5,911

real 0m39,535s
user 0m39,398s
sys 0m0,136s

$ time python ./nginx-analyzer.py --log nginx/http.access.log --code 404

83

real 0m5,790s
user 0m5,702s
sys 0m0,088s

Нет комментариев »

Яндекс.Метрика

Fortune cookie: Today's spam: Prozac Life is so easy...