Nginx 反向代理到另一台提供静态文件的 nginx 服务器

Nginx 反向代理到另一台提供静态文件的 nginx 服务器

我有一个 Nginx 服务器托管一个 Web 应用,直接访问时运行良好。其配置如下

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 设置为 server1 的反向代理时,为什么 nginx 会在 server2 中查找静态文件?同样的设置在 apache 中运行良好,

ProxyPass /应用程序/ http:server1:8000/应用程序/

ProxyPassReverse /应用程序/ http:server1:8000/应用程序/

我错过了什么?

答案1

一般不需要添加nginx的路径!

自动添加位置路径

所以这

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

应该是:

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

答案2

问题在于您的第二个 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/;
  }  

答案3

尝试将更具体的/app/位置放在代理中更通用的/位置之前/之上,因为 nginx 可能以您不想要的方式处理位置规则。

相关内容