Nginx proxy pass
Материал из noname.com.ua
Это заметка о бекендах, тут все протсто но постоянно забываются детали, записано что бы подсматривать.
- https://dev.to/danielkun/nginx-everything-about-proxypass-2ona
- https://www.middlewareinventory.com/blog/nginx-dynamic-ip-address-upstream-dns-cache-issue-how-to-solve/
- https://my.f5.com/manage/s/article/K000134632
- https://ercanermis.com/prevent-nginx-from-caching-dns-for-proxy/
- https://serverfault.com/questions/240476/how-to-force-nginx-to-resolve-dns-of-a-dynamic-hostname-everytime-when-doing-p
Nginx proxy_pass
| location | proxy_pass | Пример конфигурации | Request | Received by upstream |
|---|---|---|---|---|
|
|
|
location /test_links {
proxy_pass https://noname.com.ua/new_location;
}
|
|
|
|
|
|
location /test_links/ {
proxy_pass https://noname.com.ua/new_location;
}
|
|
|
|
|
|
location /test_links {
proxy_pass https://noname.com.ua/new_location/;
}
|
|
|
|
|
|
location /test_links {
proxy_pass https://noname.com.ua/new_location/;
}
|
|
|
Однако все это хорошо но не работает с переменными, точнее работает не так как ожидалось (мной)
Переменные
Пример правильного конфига
#### тестовые локации ######
# пример оставлен после тестов
set $test_links_backend_host noname.com.ua;
set $test_links_destination_location api/v3/extension/test_links;
location ~ /test_links(.*)$ {
# Эту переменную помещать внутрь location так как только тут доступна $1 (которая построится из регулярки ~ /test_links(.*)$
set $test_links_proxy_pass https://$test_links_backend_host/$test_links_destination_location$1$is_args$args;
access_log /var/log/nginx/location-access.log-ssl;
error_log /var/log/nginx/location-error.log-ssl;
access_log /var/log/nginx/location-debug-access.log-ssl debug;
#proxy_set_header Host $http_host;
proxy_ssl_server_name on;
proxy_redirect off;
proxy_pass $test_links_proxy_pass;
Ключевой момент тут https://$app_backend_host/$test_links_destination_location%1$is_args$args;
- Вроде-бы должно работать
https://$app_backend_host/$test_links_destination_locationно нет - теряются аргументы запроса $1- содержит часть выделенную регуляркой/test_links(.*)$, в примере это все что идет после/test_links, например из запроса/test_links/barэто будет/bar$is_argsсодержит знак?или пустую строку если нет аргументов$argsсодержит аргументы запроса
DNS
Использовать пересенные что бы делать резолв при запросах
server {
resolver 8.8.8.8 valid=1s;
...
Или
upstream new.backend.com {
resolver 192.168.1.2 valid=30s;
server example.com resolve;
zone http_backend 32k;
}