NGINX:如何将 http(s) 流量代理到一个服务器并将 ws(s) 流量代理到另一台服务器?

NGINX:如何将 http(s) 流量代理到一个服务器并将 ws(s) 流量代理到另一台服务器?

我是 nginx 的新手,不熟悉它如何处理定位,希望能够解决我遇到的问题:

在同一台服务器上,我有一个 Apache Web 服务器和一个 websocket 服务器。Apache 在端口 8080 上工作,而 websocket 服务器在端口 9090 上工作。我想在前面放置一个 nginx 代理,以便 http/https 流量被代理到 apache,而 ws/wss 流量被代理到 websocket 服务器。

我有以下配置:

location /ws* {
    proxy_pass ws://127.0.0.1:9090;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

location / {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host;
    proxy_pass http://127.0.0.1:8080;
}

这工作正常,但我面临的问题是所有 ws* 请求也会重定向到 apache 服务器,而我只希望它们重定向到 ws 服务器。我读到 nginx 只采用第一个匹配的位置,但这在我的情况下似乎是错误的。

所以问题是我如何仅将 http(s) 流量代理到 apache 以及仅将 ws(s) 流量代理到 web 套接字服务器?

答案1

您拥有的位置语法似乎与您想要做的不一样。

如果您尝试使用位置 URL 执行正则表达式,正确的语法是:

location ~ /ws.* {

如果您尝试在 ws 目录下执行所有操作,则应该:

location /ws/ {

您可能需要查看文档以获取有关位置的更多信息。http://nginx.org/en/docs/http/ngx_http_core_module.html#location

相关内容