在Dokku中通过同一域名暴露WebSocket端口的连接问题
解决Dokku上Django Channels WebSocket连接失败问题
问题核心原因
- Daphne默认绑定
127.0.0.1:8000,容器内Nginx无法访问本地回环地址,导致请求无法转发到Channels进程 - Nginx默认将所有请求转发到Gunicorn的5000端口,
/ws/路径的WebSocket请求未被路由到Daphne的8000端口
步骤1:修正Daphne监听地址
修改项目根目录的Procfile,让Daphne绑定容器的所有网络接口(0.0.0.0):
web: gunicorn django_project.wsgi:application socket: daphne -b 0.0.0.0 -p 8000 django_project.asgi:application
重新部署应用生效:
git add Procfile && git commit -m "Fix Daphne listen address" git push dokku main
步骤2:创建自定义Nginx配置(nginx.sigil)
在本地项目根目录创建nginx.sigil文件,添加WebSocket路径的路由规则:
{% include "nginx.conf" %} server { listen [::]:{{ .NGINX_PORT }}; listen {{ .NGINX_PORT }}; server_name {{ .NGINX_SERVER_NAME }}; access_log {{ .NGINX_ACCESS_LOG_PATH }}; error_log {{ .NGINX_ERROR_LOG_PATH }}; # 静态文件和媒体文件路由(保留原有规则) location /static/ { alias {{ .APP_ROOT }}/staticfiles/; expires 1y; add_header Cache-Control "public, immutable"; } location /media/ { alias {{ .APP_ROOT }}/media/; } # WebSocket请求路由到Daphne的8000端口 location /ws/ { proxy_pass http://{{ .APP_NAME }}-socket:8000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # 其他请求转发到Gunicorn的5000端口 location / { proxy_pass http://{{ .APP_NAME }}-web:5000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_redirect off; } }
说明:
{{ .APP_NAME }}-socket是Dokku自动为socket进程生成的内部DNS名称,无需手动修改,Dokku会自动解析到对应的容器。
步骤3:部署自定义Nginx配置到Dokku
将nginx.sigil推送到Dokku服务器并应用:
git add nginx.sigil && git commit -m "Add custom Nginx config for WebSocket" git push dokku main
或者直接在服务器上配置:
# 本地将nginx.sigil复制到Dokku服务器 scp ./nginx.sigil dokku@your-server:/home/dokku/web/nginx.sigil # 设置自定义sigil路径 dokku nginx:set web custom-sigil-path /home/dokku/web/nginx.sigil # 重启Nginx和应用进程 dokku nginx:reload web dokku ps:restart web
步骤4:验证配置和连接
- 查看Nginx配置是否生效:
dokku nginx:show-config web
确认输出中包含location /ws/的路由规则。
- 查看Daphne日志,确认监听地址为
0.0.0.0:8000:
dokku logs web -t
- 测试WebSocket连接,确认不再出现
Not Found: /ws/mywebsocket错误,连接正常建立。
内容的提问来源于stack exchange,提问作者ydnaklementine
相关产品推荐
相关产品推荐

