You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Dokku中通过同一域名暴露WebSocket端口的连接问题

解决Dokku上Django Channels WebSocket连接失败问题

问题核心原因

  1. Daphne默认绑定127.0.0.1:8000,容器内Nginx无法访问本地回环地址,导致请求无法转发到Channels进程
  2. 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:验证配置和连接

  1. 查看Nginx配置是否生效:
dokku nginx:show-config web

确认输出中包含location /ws/的路由规则。

  1. 查看Daphne日志,确认监听地址为0.0.0.0:8000:
dokku logs web -t
  1. 测试WebSocket连接,确认不再出现Not Found: /ws/mywebsocket错误,连接正常建立。

内容的提问来源于stack exchange,提问作者ydnaklementine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 12:45:42