Отладка заголовков в 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;
Автор: keltanas
comments powered by Disqus