我有一个作为代理服务器工作的 Nginx 服务器。
我还在端口 8080、9090 和 8888 上运行 3 个不同的 NodeJS Express 服务器(全部正常运行)。
服务器 8080 和 9090 执行相同的 APP。当 POST 请求被转发时,8888 上的服务器当前应该返回“POSTING”。
GET 和 POST 路由均针对服务器 8888 正确设置,如果我使用 CURL 请求直接调用它们,我会得到正确的响应:
import Express from 'express';
import BodyParser from 'body-parser';
// Initialise server
const server = Express();
// for parsing application/json
server.use(BodyParser.json());
// Setting port
server.set('port', 8888);
server.post('/', function(request, response) {
console.log('POSTING');
response.send('POSTING');
});
server.get('/', function(request, response) {
console.log('GETTING');
response.send('GETTING');
});
console.log(`Starting server on port ${server.get('port')}`)
server.listen(server.get('port'));
我的 Nginx 配置如下:
upstream amit4got {
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
server {
listen 7070;
server_name 127.0.0.1;
access_log /usr/local/etc/nginx/logs/default.access.log;
error_log /usr/local/etc/nginx/logs/default.error.log;
location /amit4got/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://amit4got;
proxy_read_timeout 90;
}
location /amit4got/flows {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 90;
if ($request_method = POST) {
proxy_pass http://127.0.0.1:8888;
}
if ($request_method = GET) {
proxy_pass http://amit4got;
}
}
}
Nginx 在端口 7070 上提供服务,对于端点 /amit4got,从 8080 或 9090 加载内容。
问题是,当我尝试 POST 到 /amit4got/flows 时,没有 POST 请求http://127.0.0.1:8888。我刚刚收到 404 未找到的响应。
如果我将 proxy_pass 更改为重写,那么我会从 8888 服务器得到正确的响应。
if ($request_method = POST) {
rewrite ^ http://127.0.0.1:8888;
}
我需要通过 POST 参数发送,因此重写对我来说不起作用。
我怎样才能使 proxy_pass 到服务器 8888 工作?
谢谢,阿米特
答案1
正如评论中提到的:
proxy_pass http://127.0.0.1:8888;
最终会发布到 http://127.0.0.1:8888/amit4got/flows
而不是http://127.0.0.1:8888/
。