在带有协议升级的 nginx 反向代理后面运行 daphne 总是路由到 http 而不是 websocket

Posted

技术标签:

【中文标题】在带有协议升级的 nginx 反向代理后面运行 daphne 总是路由到 http 而不是 websocket【英文标题】:Running daphne behind nginx reverse proxy with protocol upgrade always routes to http instead of websocket 【发布时间】:2018-09-27 06:08:14 【问题描述】:

我正在尝试在 nginx 反向代理服务器后面部署由 django 通道驱动的通知应用程序,以仅服务于 websocket 通信,同时设置 Nginx + uWSGI 来服务于 django 应用程序。

当使用python manage.py runserver --noasgi + daphne -p 8000 myproject.asgi:applicationpython manage.py runserverdaphne 在内部处理所有请求时,该应用程序可以在我的本地计算机上无缝运行。

问题:

所有的 websocket 请求都被路由到http 协议类型而不是websocket 协议类型并且它返回WebSocket connection to 'ws://ip_address/ws/' failed: Error during WebSocket handshake: Unexpected response code: 404

已安装的软件包:

Django==2.0.3
channels==2.0.2
channels-redis==2.1.1
daphne==2.1.0
asgiref==2.3.0
Twisted==17.9.0
aioredis==1.0.0
autobahn==18.4.1

环境:

Ubuntu - 16.04
Nginx - 1.12.0

用于升级请求的 Nginx 配置:

map $http_upgrade $connection_upgrade 
    default upgrade;
    '' close;


# the upstream component nginx needs to connect to websocket requests
upstream websocket 
    server unix:/path/to/my/app/daphne.sock;


# configuration of the server
server 

        # the port your site will be served on
        listen      80;

        # the domain name it will serve for
        server_name ip_address;
        charset     utf-8;

       # Sending all non-media requests for websockets to the Daphne server.
        location /ws/ 
            proxy_pass http://websocket;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        


routing.py

from django.conf.urls import url

from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from myapp import consumers

application = ProtocolTypeRouter(
    'websocket': AuthMiddlewareStack(
        URLRouter([
            url(r'^ws/$', consumers.MyConsumer),
        ])
    ),
)

达芙妮日志:

None - - [TimeStamp] "GET /ws/" 404 3
None - - [TimeStamp] "GET /ws/" 404 3
None - - [TimeStamp] "GET /ws/" 404 3

如果需要任何其他帮助,请告诉我。

P.S:我在两台服务器上部署了相同的应用程序(都具有与上述相同的配置和环境),结果是相同的。

【问题讨论】:

请将此添加到文档中的频道 GitHub 存储库中,在我看来,这似乎是一个很好的部署解决方案。您能否提供有关 daphne 套接字和 ssl 重定向的更多信息? 【参考方案1】:

最后我发现罪魁祸首是我公司的防火墙,它在通过http 访问应用程序时剥离了升级标头。所以在将http 升级到https 后,它开始按预期工作。

【讨论】:

哦!你节省了我的时间。太好了!!

以上是关于在带有协议升级的 nginx 反向代理后面运行 daphne 总是路由到 http 而不是 websocket的主要内容,如果未能解决你的问题,请参考以下文章

带有反向代理后面的HTTPS的build_absolute_uri

升级 HTTP 至 HTTPS:使用 Nginx 反向代理

Angular App 在 nginx 上运行并在附加的 nginx 反向代理后面

Next js 和 google 分析在 nginx 反向代理后面不起作用

带有动态容器的 Nginx 反向代理

Nginx 最全操作——nginx反向代理(5)