Отладка заголовков в Nginx

Сервер Nginx позволяет передавать заголовки при проксировании через директивы:

Синтаксис:    proxy_set_header поле значение;
Умолчание:    
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
Контекст:    http, server, location

Выглядит в конфиге это примерно так:

location / {
    proxy_pass http://headers;
    proxy_set_header X-FORWARDED-FOR $remote_addr;
}

Я столкнулся с тем, что не всегда и не все заголовки передаются, но об этом позже. Отсюда возник вопрос: каким образом определить на проксирующем nginx, какие переданы заголовки.

Передача заголовков при проксировании

Схема работы такая:

Proxy Nginx -> Backend Nginx

Известно, что переданные заголовки на стороне Backend Nginx придут с префиксом http_. Но, способа посмотреть весь список мне найти не удалось. Решение пришло благодаря модулю nginx-mod-http-lua.

На сайте https://onelinerhub.com/nginx-lua/ можно найти некоторое количество примеров использования lua в Nginx.

Я написал следующий код для отладки заголовков, который поместил в Backend Nginx:

location /headers {
    content_by_lua_block {
        local output = cjson.encode(ngx.req.get_headers())
        ngx.header["Content-type"] = 'application/json'
        ngx.say(output)
    }
}

в результате которого ручка http://yourserver.dev/headers будет возвращать все переданные заголовки в виде json-объекта. Для их передачи дальше достаточно достаточно использовать префикс http_. Например:

fastcgi_param COUNTRY_CODE $http_country_code;
fastcgi_param COUNTRY_NAME $http_country_name;
fastcgi_param CITY_NAME    $http_city_name;

Установка модуля lua в Nginx

Все ниже сказанное актуально для Ubuntu 22.04, но скорее всего будет полезно и админам других дистрибутивов.

Проверим, установлен ли модуль:

# ls -1 /etc/nginx/modules-enabled/
50-mod-http-geoip2.conf
50-mod-http-image-filter.conf
50-mod-http-xslt-filter.conf
50-mod-mail.conf
50-mod-stream.conf
70-mod-stream-geoip2.conf

Для начала убедимся что у нас будет работать команда add-apt-repository:

sudo apt update
sudo apt install software-properties-common

Далее добавим репозиторий с модулем и установим его:

sudo add-apt-repository ppa:ondrej/nginx
sudo apt update
apt install libnginx-mod-http-lua

Убедимся, что модуль появился:

# ls -1 /etc/nginx/modules-enabled/
10-mod-http-ndk.conf
50-mod-http-geoip.conf
50-mod-http-geoip2.conf
50-mod-http-image-filter.conf
50-mod-http-lua.conf
50-mod-http-xslt-filter.conf
50-mod-mail.conf
50-mod-stream.conf
70-mod-stream-geoip.conf
70-mod-stream-geoip2.conf

Теперь проверим, что он работает.

vim /etc/nginx/sites-enabled/default.conf

Включем в конфиге nginx модуль cjson

http {
    init_by_lua_block  {
        cjson = require("cjson")
    }
}

И добавим первый lua скрипт:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/html;

    # Add index.php to the list if you are using PHP
    index index.html index.htm index.nginx-debian.html;

    server_name _;

    location /lua {
        content_by_lua_block {
            local data = {name='Donald'}
            local output = cjson.encode(data)
            ngx.header["Content-type"] = 'application/json'
            ngx.say(output)
        }
    }
}

Перезапустим nginx:

sudo systemctl restart nginx

PS

Так вот в итоге ошибкой оказалось то, что директива proxy_set_header не передает заголовки, в которых для разделителя использоватся символ _ нижняя черта.

Мне было необходимо вместо

proxy_set_header X_FORWARDED_FOR $remote_addr;

использовать

proxy_set_header X-FORWARDED-FOR $remote_addr;

Работа с Open Resty изданием Nginx описана на хабре.


Создано:
Автор:
« Назад на главную

comments powered by Disqus