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

san*_*re6 3 reverse-proxy 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/ {

    }   
}
Run Code Online (Sandbox Code Playgroud)

现在我必须从另一台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/;
    }
}   
Run Code Online (Sandbox Code Playgroud)

当我从server2访问该应用程序时,出现以下错误,例如当我访问http:server2.com/app/css/app.css时

[错误] 6601#0:* 1 open()“ /data/www/app/css/app.css”失败(2:没有此类文件或目录)

并且serv er1日志中没有错误。当我将它设置为反向代理到server1时,nginx为什么要在server2中寻找静态文件?

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

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

我想念什么?

Ale*_*Ten 5

您有location与您的请求匹配的正则表达式,/app/css/app.css并拦截了来自代理的请求。这就是regexp location的工作方式。为防止^~在您的应用位置使用此use 修饰符,请执行以下操作:

location ^~ /app/ {
    proxy_pass ...;
}
Run Code Online (Sandbox Code Playgroud)

这将阻止正则表达式location匹配。

文档:http : //nginx.org/r/location