Назад | Перейти на главную страницу

Обратный прокси-сервер Nginx на другой сервер Nginx, обслуживающий статические файлы

У меня есть сервер Nginx, на котором размещено веб-приложение, которое отлично работает при прямом доступе. Его конфигурация ниже

server {
    listen 8000 default_server;

    listen [::]:8000 default_server ipv6only=on;

    root /data/www/ ;
    server_name server1.com;

    location / {
            try_files $uri $uri/ =404;
        }

    location /app/ {

    }    
}

Теперь мне нужно обслуживать это приложение с другого сервера Nginx, поэтому я настраиваю обратный прокси, как показано ниже.

server {
        listen 80 default_server;

        listen [::]:80 default_server ipv6only=on;

        root /data/www/ ;
        server_name server2.com;

        location / {
                try_files $uri $uri/ =404;
            }

        location /app/ {
                proxy_pass http://server1.com:8000/app/;
        }    

Когда я открываю приложение с server2, я получаю такие ошибки, как показано ниже, например, когда я обращаюсь к http://server2.com/app/css/app.css (извините, нет репутации для размещения ссылок)

[ошибка] 6601 # 0: * 1 open () "/data/www/app/css/app.css" не выполнен (2: нет такого файла или каталога)

и никаких ошибок в журналах server1. Почему nginx ищет статические файлы на server2, когда я настроил его на обратный прокси-сервер на server1, такая же настройка отлично работает в apache с

ProxyPass / приложение / http: server1: 8000 / приложение /

ProxyPassReverse / приложение / http: server1: 8000 / приложение /

Что мне не хватает?

Проблема в том, что ваш второй экземпляр nginx пытается обслуживать файлы локально:

   location / {
           try_files $uri $uri/ =404;
      }

Просто удалите все это, если хотите служить, используя http://server2.com/app/. Если вы хотите использовать http://server2.com/ вместо этого обновите конфигурацию, чтобы отразить это:

  listen [::]:80 default_server ipv6only=on;

   server_name server2.com;

   location / {
          proxy_pass http://server1.com:8000/app/;
  }  

Как правило, указывать путь к nginx не требуется!

Путь от локации добавляется автоматически

так это

location /app/ {
      proxy_pass http://server1.com:8000/app/;
}

действительно должно быть:

 location /app/ {
      proxy_pass http://server1.com:8000;
}

Попробуйте указать более конкретное /app/ расположение в вашем прокси-сервере перед / над более общим / location, поскольку nginx может обрабатывать правила местоположения не так, как вы предполагали.