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

Nginx反向代理到另一个提供静态文件的Nginx服务器,nginx,reverse-proxy,Nginx,Reverse Proxy,我有一个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;

我有一个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:没有这样的文件或目录)

而且serv er1日志中没有错误。当我将nginx设置为reverseproxy to server1时,为什么nginx在server2中查找静态文件?同样的设置在apache中也可以正常工作

ProxyPass/app/http:server1:8000/app/

ProxyPassReverse/app/http:server1:8000/app/


我遗漏了什么?

您拥有与您的请求匹配的regexp
位置
,并拦截来自代理的请求。这就是regexp
location
s的工作原理。要防止出现这种情况,请对应用程序位置使用
^ ~
修饰符:

location ^~ /app/ {
    proxy_pass ...;
}
这将阻止regexp
location
匹配


文档:

我很确定,您没有发布完整配置。提供服务器2的完整配置,除了位置~*\(css | js)${expires 365d;}等浏览器缓存之外,其他任何内容都不提供。该位置与您的
/app/css/app.css
完全匹配,并防止代理服务器1 Hanks alexey这是问题所在。请将其作为答案发布,我将接受它:)