nginx代理请求特定路径

eat*_*ode 5 nginx

是否可以将对特定路径的请求传递到不同的上游服务器?

这是我的 nginx 站点配置:

upstream example.org {
    server 127.0.0.1:8070;
    keepalive 8;
}

server {
    listen 0.0.0.0:80;
    server_name example.org www.example.org;
    access_log /var/log/nginx/example.org.log;

    location / {
      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_pass http://example.org;
      proxy_redirect off;
    }
 }
Run Code Online (Sandbox Code Playgroud)

目前,对此站点的请求被重定向到在端口 8070 上运行的 Node.js 实例。

我希望将此站点的请求(具有以/services开头的路径)重定向到在端口 8080 上运行的另一个 Node.js 实例。

这可能吗?当然还有——怎么会这样呢?

sev*_*rin 3

是的,只需添加另一个位置块:

upstream example.org {
    server 127.0.0.1:8070;
    keepalive 8;
}
upstream other.example.org {
    server 127.0.0.1:8080;
    keepalive 8;
}

server {
    listen 0.0.0.0:80;
    server_name example.org www.example.org;
    access_log /var/log/nginx/example.org.log;

    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_redirect off;

    location / {
      proxy_pass http://example.org;
    }

    location /services {
      proxy_pass http://other.example.org;
    }
 }
Run Code Online (Sandbox Code Playgroud)

注意:我将所有共享代理指令提取到服务器块中,以便它们不会在每个位置块中重复。如果它们在不同位置之间有所不同,您将不得不将它们再次移动到位置块中......