Nginx proxy pass: различия между версиями
Материал из noname.com.ua
Перейти к навигацииПерейти к поискуSirmax (обсуждение | вклад) |
Sirmax (обсуждение | вклад) |
||
(не показаны 2 промежуточные версии этого же участника) | |||
Строка 117: | Строка 117: | ||
− | location ~ /test_links(.*)$ { |
+ | location ~ ^/test_links(.*)$ { |
# Эту переменную помещать внутрь location так как только тут доступна $1 (которая построится из регулярки ~ /test_links(.*)$ |
# Эту переменную помещать внутрь location так как только тут доступна $1 (которая построится из регулярки ~ /test_links(.*)$ |
||
set $test_links_proxy_pass https://$test_links_backend_host/$test_links_destination_location$1$is_args$args; |
set $test_links_proxy_pass https://$test_links_backend_host/$test_links_destination_location$1$is_args$args; |
||
Строка 135: | Строка 135: | ||
* <code>$1</code> - содержит часть выделенную регуляркой <code>/test_links(.*)$</code>, в примере это все что идет после <code>/test_links</code>, например из запроса <code>/test_links/bar</code> это будет <code>/bar</code> |
* <code>$1</code> - содержит часть выделенную регуляркой <code>/test_links(.*)$</code>, в примере это все что идет после <code>/test_links</code>, например из запроса <code>/test_links/bar</code> это будет <code>/bar</code> |
||
* <code>$is_args</code> содержит знак <code>?</code> или пустую строку если нет аргументов |
* <code>$is_args</code> содержит знак <code>?</code> или пустую строку если нет аргументов |
||
− | * <code>$args</code> содержит аргументы запроса |
+ | * <code>$args</code> содержит аргументы запроса, еcли они есть |
+ | * не забывать что для регулярок указывать <code>^</code> как знак начала строки (что бы не попали наприер выражение <code>/some/path/test_links?foo=bar</code> |
||
=DNS= |
=DNS= |
Текущая версия на 18:39, 16 июля 2024
Это заметка о бекендах, тут все протсто но постоянно забываются детали, записано что бы подсматривать.
- 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
содержит аргументы запроса, еcли они есть- не забывать что для регулярок указывать
^
как знак начала строки (что бы не попали наприер выражение/some/path/test_links?foo=bar
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; }