我正在尝试使用我之前的 PHP 应用程序设置一个新节点。
设想
- php 应用程序在 上运行
www.xyz.com
。它使用 nginx 提供服务。 - 节点应用程序通过端口 8142 上的 NodeJs 服务器提供服务。
我想在链接处为 NodeJs 应用程序提供服务
www.xyz.com/nodeApp
我尝试过
我的方法是将所有请求代理www.xyz/nodeApp
到端口 8142,然后节点服务器将接收该端口的请求。
我在 nginx 文件中添加了以下代理配置www.xyz.com
。
location ~ ^/nodeApp(.*)$ {
proxy_http_version 1.1;
proxy_pass_request_body on;
proxy_set_header Host $host;
proxy_set_header Scheme $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8142$1$is_args$args;
proxy_buffering off;
}
结果
点击 后www.xyz.com/nodeApp/
,一切正常。Node 服务器接收请求并在链接等处提供css
和文件。js
www.xyz.com/nodeApp/app.js
但(没有尾部斜杠)
点击 时www.xyz.com/nodeApp
,它不起作用。Node 服务器接收请求并html
正确提供页面,但css
和js
文件在链接等处提供www.xyz.com/app.js
。因此应用程序崩溃。
我错在哪里了?
我的节点服务器文件
var express = require("express");
var app = express();
app.use(express.static(__dirname + '/build'));
var port = process.env.PORT || 8142;
app.listen(port, function() {
console.log("Listening on " + port);
});
答案1
您应该简化配置:
location /nodeApp/ {
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header Scheme $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8142/;
proxy_buffering off;
}
在这种情况下,nginx 将处理尾部斜杠。请参阅http://nginx.org/r/location
如果位置由以斜杠字符结尾的前缀字符串定义,并且请求由
proxy_pass
、 [...] 之一处理,则执行特殊处理。响应 URI 等于此字符串的请求,但没有尾部斜杠,将返回带有斜线的请求 URI 的永久重定向(代码为 301)。
此外,中不需要变量。Nginx 将自动用proxy_pass
替换前缀并附加查询字符串。/nodeApp/
/