Nginx proxy pass: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
 
(не показана 21 промежуточная версия этого же участника)
Строка 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
+
! location !! proxy_pass !! Пример конфигурации !! Request !! Received by upstream
 
|-
 
|-
 
|
 
|
<code>/test_links?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>/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;
 
}
 
}
 
</PRE>
 
</PRE>
 
||
 
||
<code>/test_links?foo=bar</code>
+
* <code>/test_links?foo=bar</code>
  +
* <code>/test_links/baz?foo=bar</code>
 
 
||
 
||
<code>"POST /new_location?foo=bar</code>
+
* <code>/new_location?foo=bar</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>"POST /new_location?foo=bar</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>

Текущая версия на 19:39, 16 июля 2024

Это заметка о бекендах, тут все протсто но постоянно забываются детали, записано что бы подсматривать.

Nginx proxy_pass

Файлы
location proxy_pass Пример конфигурации Request Received by upstream

/test_links

/new_location

location /test_links {
    proxy_pass https://noname.com.ua/new_location;
}
  • /test_links?foo=bar
  • /test_links/baz?foo=bar
  • /new_location?foo=bar
  • /new_location/baz?foo=bar



/test_links/

/new_location

location /test_links/ {
    proxy_pass https://noname.com.ua/new_location;
}
  • /test_links?foo=bar
  • /test_links/baz?foo=bar
  • /new_location?foo=bar
  • /new_locationbaz?foo=bar HTTP/1.0"





/test_links

/new_location/

location /test_links {
    proxy_pass https://noname.com.ua/new_location/;
}
  • /test_links?foo=bar
  • /test_links/baz?foo=bar
  • /new_location/?foo=bar HTTP/1.0
  • /new_location//baz?foo=bar




/test_links/

/new_location/

location /test_links {
    proxy_pass https://noname.com.ua/new_location/;
}
  • /test_links?foo=bar
  • /test_links/baz?foo=bar
  • "POST /new_location?foo=bar
  • POST /new_location/baz?foo=bar

Однако все это хорошо но не работает с переменными, точнее работает не так как ожидалось (мной)

Переменные

Пример правильного конфига

#### тестовые локации ######
    # пример оставлен после тестов
    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;
              }