将Nginx反向代理到另一个Nginx服务器,用于提供静态文件。

3

我有一个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时,我会收到以下错误:
[error] 6601#0: *1 open() "/data/www/app/css/app.css" failed (2: No such file or directory)
但在server1日志中没有错误。为什么nginx在server2中查找静态文件,而我已将其设置为反向代理到server1?同样的设置在apache中运行良好,如下所示:
ProxyPass /app/ http:server1:8000/app/ ProxyPassReverse /app/ http:server1:8000/app/
我错过了什么吗?

我很确定,你没有发布完整的配置。请提供server2的完整配置。 - Alexey Ten
除了浏览器缓存,像这样的编程内容location ~* .(css|js)$ { expires 365d; } - sanre6
确切地说,此位置与您的/app/css/app.css匹配,并防止代理到server1。 - Alexey Ten
谢谢Alexey,那就是问题所在,请把它发布为答案,我会接受的 :) - sanre6
1个回答

6

您有一个正则表达式location,它匹配您的请求/app/css/app.css并拦截代理请求。这就是正则表达式location的工作方式。为了防止这种情况发生,请在您的应用程序位置使用^~修饰符:

location ^~ /app/ {
    proxy_pass ...;
}

这将阻止正则表达式location进行匹配。
文档: http://nginx.org/r/location

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接