我有一个 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 可能以您不想要的方式处理位置规则。