Nginx proxy pass

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску

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

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;
              }