将 nginx 配置为 websocket 的代理
Posted
技术标签:
【中文标题】将 nginx 配置为 websocket 的代理【英文标题】:configuring nginx as proxy for websocket 【发布时间】:2014-07-06 14:47:35 【问题描述】:我有一个带有 websocket 的应用程序,它位于:
http://localhost:8888/something/ws
我想使用 nginx 作为代理,但是连接的转发不起作用。这是我的配置文件:
upstream backend
server 127.0.0.1:8888;
server
listen 80;
server_name localhost;
location /
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://backend;
proxy_next_upstream error;
location /something/ws
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
有什么问题。我必须重写路径还是其他什么?
更新
Ubuntu 12.04。附带 nginx 1.1。在将 nginx 升级到 1.6 之前,我也必须删除 nginx-common 和 nginx-full,否则会重新安装 nginx 1.1 ...
【问题讨论】:
我相信你应该在Server Fault上问这个问题 @demas 不一定,见Are questions about webserver config files and rewrite rules on-topic?。 我在 serverfault 上发现了类似的问题,但我不确定这是否是解决方案:serverfault.com/questions/482026/… 即使你使用的是 nginx,你还需要一个 websocket 客户端吗?您是否尝试过与 wscat 连接?我已成功按照此处的说明进行操作:nginx.com/blog/websocket-nginx 但他们仍在使用 wscat。 nginx版本是> 1.3.13吗? 【参考方案1】:你可以试试下面的:
location /something/ws/
proxy_pass http://backend;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Path rewriting
rewrite /something/ws/(.*) /$1 break;
proxy_redirect off;
关键是路径重写。
【讨论】:
以上是关于将 nginx 配置为 websocket 的代理的主要内容,如果未能解决你的问题,请参考以下文章