Nginx proxy pass: различия между версиями
Материал из noname.com.ua
Перейти к навигацииПерейти к поискуSirmax (обсуждение | вклад) |
Sirmax (обсуждение | вклад) |
||
| (не показано 20 промежуточных версий этого же участника) | |||
| Строка 1: | Строка 1: | ||
[[Категория:nginx]] |
[[Категория:nginx]] |
||
[[Категория:Linux]] |
[[Категория:Linux]] |
||
| + | Это заметка о бекендах, тут все протсто но постоянно забываются детали, записано что бы подсматривать. |
||
| + | <BR> |
||
| + | * 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 <code>proxy_pass</code>= |
=Nginx <code>proxy_pass</code>= |
||
| Строка 7: | Строка 14: | ||
|+ Файлы |
|+ Файлы |
||
|- |
|- |
||
| − | + | ! location !! proxy_pass !! Пример конфигурации !! Request !! Received by upstream |
|
|- |
|- |
||
| |
| |
||
| − | <code>/test_links |
+ | <code>/test_links</code> |
|| |
|| |
||
| + | <code>/new_location</code> |
||
| + | || |
||
| + | <PRE> |
||
| + | location /test_links { |
||
| + | proxy_pass https://noname.com.ua/new_location; |
||
| + | } |
||
| + | </PRE> |
||
| + | || |
||
| + | * <code>/test_links?foo=bar</code> |
||
| + | * <code>/test_links/baz?foo=bar</code> |
||
| + | || |
||
| + | * <code>/new_location?foo=bar</code> |
||
| + | * <code>/new_location/baz?foo=bar</code> |
||
| − | <code>/test_links</code> |
||
| − | || |
||
| + | |- |
||
| + | | |
||
| + | <code>/test_links<B>/</B></code> |
||
| + | || |
||
<code>/new_location</code> |
<code>/new_location</code> |
||
|| |
|| |
||
| − | |||
<PRE> |
<PRE> |
||
| − | location /test_links { |
+ | location /test_links/ { |
proxy_pass https://noname.com.ua/new_location; |
proxy_pass https://noname.com.ua/new_location; |
||
} |
} |
||
| Строка 29: | Строка 50: | ||
* <code>/test_links?foo=bar</code> |
* <code>/test_links?foo=bar</code> |
||
* <code>/test_links/baz?foo=bar</code> |
* <code>/test_links/baz?foo=bar</code> |
||
| − | |||
|| |
|| |
||
| − | * <code> |
+ | * <code>/new_location?foo=bar</code> |
| − | * <code> |
+ | * <code>/new_locationbaz?foo=bar HTTP/1.0"</code> |
| − | |- |
||
| − | | |
||
| − | Текст ячейки |
||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |- |
||
| + | | |
||
| + | <code>/test_links</code> |
||
| + | || |
||
| + | <code>/new_location/</code> |
||
| + | || |
||
| + | <PRE> |
||
| + | location /test_links { |
||
| + | proxy_pass https://noname.com.ua/new_location/; |
||
| + | } |
||
| + | </PRE> |
||
|| |
|| |
||
| − | <code> |
+ | * <code>/test_links?foo=bar</code> |
| + | * <code>/test_links/baz?foo=bar</code> |
||
| + | || |
||
| + | * <code>/new_location/?foo=bar HTTP/1.0</code> |
||
| + | * <code>/new_location//baz?foo=bar</code> |
||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
|- |
|- |
||
| + | | |
||
| − | | Текст ячейки || Текст ячейки |
||
| + | <code>/test_links/</code> |
||
| + | || |
||
| + | <code>/new_location/</code> |
||
| + | || |
||
| + | <PRE> |
||
| + | location /test_links { |
||
| + | proxy_pass https://noname.com.ua/new_location/; |
||
| + | } |
||
| + | </PRE> |
||
| + | || |
||
| + | * <code>/test_links?foo=bar</code> |
||
| + | * <code>/test_links/baz?foo=bar</code> |
||
| + | || |
||
| + | * <code>"POST /new_location?foo=bar</code> |
||
| + | * <code>POST /new_location/baz?foo=bar</code> |
||
| + | |||
|} |
|} |
||
| + | |||
| + | Однако все это хорошо но не работает с переменными, точнее работает не так как ожидалось (мной) |
||
| + | |||
| + | =Переменные= |
||
| + | |||
| + | Пример правильного конфига |
||
| + | <PRE> |
||
| + | #### тестовые локации ###### |
||
| + | # пример оставлен после тестов |
||
| + | 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; |
||
| + | </PRE> |
||
| + | Ключевой момент тут <code>https://$app_backend_host/$test_links_destination_location%1$is_args$args;</code> |
||
| + | * Вроде-бы должно работать <code>https://$app_backend_host/$test_links_destination_location</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>$args</code> содержит аргументы запроса, еcли они есть |
||
| + | * не забывать что для регулярок указывать <code>^</code> как знак начала строки (что бы не попали наприер выражение <code>/some/path/test_links?foo=bar</code> |
||
| + | |||
| + | =DNS= |
||
| + | Использовать пересенные что бы делать резолв при запросах |
||
| + | <PRE> |
||
| + | server { |
||
| + | resolver 8.8.8.8 valid=1s; |
||
| + | ... |
||
| + | </PRE> |
||
| + | |||
| + | Или |
||
| + | * https://my.f5.com/manage/s/article/K000134632 |
||
| + | <PRE> |
||
| + | upstream new.backend.com { |
||
| + | resolver 192.168.1.2 valid=30s; |
||
| + | server example.com resolve; |
||
| + | zone http_backend 32k; |
||
| + | } |
||
| + | </PRE> |
||
Текущая версия на 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;
}