Задать вопрос
Ответы пользователя по тегу Nginx
  • Может ли браузер дублировать POST запрос?

    @IvanShatsky
    Метод POST относится к неидемпотентным методам (неидемпотентными считаются три метода - POST, LOCK и PATCH). Разница между идемпотентными и неидемпотентными методами описана в RFC 9110, раздел 9.2.2. Там же сказано следующее:

    A client SHOULD NOT automatically retry a request with a non-idempotent method unless it has some means to know that the request semantics are actually idempotent, regardless of the method, or some means to detect that the original request was never applied.

    Nginx тоже не должен повторять попытку повторно передать запрос с неидемпотентным методом на бэкенд в случае сбоя соединения, хотя его можно заставить это делать, указав в директиве proxy_next_upstream флаг non_idempotent.
    Ответ написан
    Комментировать
  • Как сделать редирект на мобильную версию сайта в nginx?

    @IvanShatsky
    Очевидно, что запросы к example.com и m.example.com для подобной конфигурации надо обрабатывать в разных блоках server (иначе получим бесконечный цикл переадресации):

    server {
        server_name example.com;
        root /var/www/html;
    
        set $mobile_redirect 0;
        # Условие, которое здесь надо записать, смотрим на http://detectmobilebrowsers.com/
        if (...) {
            set $mobile_redirect 1;
        }
        if ($mobile_redirect) {
            # Не нужен здесь rewrite и лишний вызов libpcre, достаточно return
            return 301 https://m.example.com$request_uri;
        }
        location ^~ /mobile/ {
            # Не надо из основного домена ходить в папку mobile
            internal;
        }
    
        # остальная конфигурация
        ...
    }
    server {
        server_name m.example.com;
        root /var/www/html/mobile;
        ...
    }
    Ответ написан
    Комментировать
  • Как запустить Nginx балансировщик, если host not found in upstream?

    @IvanShatsky
    У меня получилось это сделать, путём введения дополнительного слоя проксирования, так сказать "проксирования самого на себя". Вот моя конфигурация (для проверки в моей песочнице запущен DNS-сервер dnsmasq, который резолвит все домены *.localdomain в 127.0.0.1):

    resolver 127.0.0.1 ipv6=off;
    
    upstream bundle {
        server unix:/tmp/nginx-app.sock;             # заменить на "app"
        server unix:/tmp/nginx-fallback.sock backup; # заменить на "fallback"
    }
    
    server {
        listen 127.0.0.1:80;
        server_name upstream-loopback.localdomain;
    
        location / {
            proxy_pass http://bundle;
        }
    }
    
    # Второй слой проксирования
    # Чтобы минимизировать накладные расходы, вместо TCP-порта слушаем UNIX-сокет
    
    server {
        listen unix:/tmp/nginx-app.sock;
        set $backend upstream-loopback-app.localdomain;      # заменить на "app"
        location / {
            proxy_pass http://$backend;
        }
    }
    
    server {
        listen unix:/tmp/nginx-fallback.sock;
        set $backend upstream-loopback-fallback.localdomain; # заменить на "fallback"
        location / {
            proxy_pass http://$backend;
        }
    }
    
    # Эти блоки используются только для проверки того, что приведенный выше подход работоспособен
    
    server {
        listen 127.0.0.1:80;
        server_name upstream-loopback-app.localdomain;
        return 200 "Response from the app backend\n";
    }
    
    server {
        listen 127.0.0.1:80;
        server_name upstream-loopback-fallback.localdomain;
        return 200 "Response from the fallback backend\n";
    }
    Ответ написан
    Комментировать