nginx: откат к try_files при сбое proxy_pass требует необычной конфигурации - PullRequest
1 голос
/ 19 апреля 2019

Я использую Nginx для сервера одностраничного приложения.По сути, нам просто нужно обслуживать страницу index.html всякий раз, когда не найден соответствующий файл.Расположение выглядит следующим образом и работает нормально:

location / {
   try_files $uri $uri/ /index.html
}

Теперь я хотел бы запросить вышестоящий сервер, и только в случае сбоя используйте директиву try_files, как указано выше

Если try_files просто перемещен в резервное положение, такое как

location @fallback {
  try_files $uri $uri/ /index.html;
}

location / {
  proxy_pass http://127.0.0.1:8080;
  proxy_intercept_errors on;
  error_page 400 403 502 503 504 @fallback;
}

, тогда - когда вышестоящий сервер недоступен - клиент видит страницу ошибки Nginx 502 вместо файлов, подаваемых из файловой системы.

Наконец-то я нашел решение, которое работает с использованием двойной косой черты перед отступом /index.html.Это весь файл конфигурации, который можно использовать с официальным образом докера nginx для тестирования

events {
} 

http {

  error_log /var/log/nginx/error.log;
  access_log /var/log/nginx/access.log;

  server {

    listen 80;

    root /usr/share/nginx/html/;

    location / { 
      proxy_pass http://127.0.0.1:9990;
      proxy_intercept_errors on; 
      error_page 400 403 502 503 504 = @fallback;
    }

    location @fallback {
      try_files $uri?$args /index.html //index.html;
    }
  }
}

, который можно запустить с помощью команды, подобной

docker run -v /path/to/www/folder:/usr/share/nginx/html:ro -v /path/to/config/nginx.conf:/etc/nginx/nginx.conf -d -p 8080:80 nginx

В случае, если двойная косая черта не установленаприсутствует перед последним index.html отступлением, например

location @fallback {
  try_files $uri?$args /index.html;
}

Затем nginx создает путь в файловой системе, например <root>index.html, в котором вместо правильного <root>/index.html вместо пропущенного *1025* указывается пропущенный символзапрашивается корневой URL.

Последний вопрос: почему для этой настройки требуется двойной слеш в директиве try_files?Почему нельзя просто использовать раздел try_files из обычной конфигурации и переместить его в резервное место, используемое при перехвате ошибок?

...