将 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 的代理的主要内容,如果未能解决你的问题,请参考以下文章

Nginx实战之反向代理WebSocket的配置实例

配置 Nginx 反向代理 WebSocket

Nginx支持WebSocket配置

Nginx支持WebSocket配置

Nginx学习之反向代理WebSocket配置实例

Nginx反向代理websocket配置实例