我正在尝试让 nginx 作为反向代理工作。
我想要一个虚拟服务器hostname/service
,它连接到位于端口 5000 的 NodeJS 服务器。
如果我尝试:
server {
listen 80 default_server;
location /service {
proxy_pass http://localhost:5055;
(...)
}
}
当我尝试连接时,出现 404 错误,提示没有/service
文件。不过,我很确定是 NodeJS 在响应我。
所以问题是,对/service
nginx 的请求被代理到对 NodeJS 的请求/service
。如何将请求转换为/service
请求/
?
答案1
在您的 proxy_pass 中您正在传递给端口5055并且您上面说过您正在端口上运行节点5000。
也许只需改变proxy_pass
就http://localhost:5000;
可以了。
此外,当您代理到位置时,/service
所有请求也可能使用 edge 代理/service
,正如 nginx 网站上所说的那样
如果指定了 proxy_pass 但没有指定 URI,则在处理原始请求时,请求 URI 将以客户端发送的相同形式传递给服务器,或者在处理更改的 URI 时传递完整的规范化请求 URI:
location /some/path/ { proxy_pass http://127.0.0.1; }
在 1.1.12 版本之前,如果指定了 proxy_pass 但没有指定 URI,则在某些情况下可能会传递原始请求 URI 而不是改变后的 URI。
我通常使用上游来执行此操作,以下是我使用的示例配置,它也可以正确代理 Web 套接字连接。
upstream sample_app {
server localhost:5000;
}
server {
listen 80 default_server;
location /service {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade"
proxy_pass sample_app;
proxy_redirect off;
}
}
使用此配置,如果您转到http://localhost/service
自动转到端口 80,它应该将请求传递给以 5000 运行的节点服务器。