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

基于Dokku、Nginx与Gunicorn部署Django应用的配置疑问

Dokku部署无文档Django应用的常见疑问解答

问题1:通过Dockerfile在Dokku部署应用时,末尾显示的“app deployed to -> address:random_port”,该随机端口是Nginx端口还是容器通信端口?

这个随机端口是容器内部的监听端口,Dokku会自动让Nginx将外部请求转发到这个端口。Nginx默认监听主机的80/443端口,和容器的通信完全通过这个内部随机端口完成,外部用户无需直接访问该端口。

问题2:此前设置DOKKU_PROXY_PORT为随机端口、端口映射80:5000时,会出现Nginx欢迎页;设置80:random_port则超时。按网上教程设置DOKKU_PROXY_PORT为80、端口映射http:80:5000、vhost为公网IP后,出现蓝屏(推测因settings.py中Redis HOST变量报错导致进程不断重启),此配置是否正确?

你采用的DOKKU_PROXY_PORT=80、端口映射http:80:5000、vhost设为公网IP的配置逻辑是正确的,蓝屏(进程反复重启)的核心原因是Redis HOST配置错误,和Dokku的端口/代理配置无关。建议优先排查:

  • 确认Redis服务已在Dokku中正确部署并绑定到当前应用
  • 检查settings.py里的Redis HOST是否设为redis(Dokku服务链接后会自动生成这个主机名),而非IP或其他无效值
  • 执行dokku logs <app-name>查看应用日志,确认Redis连接的具体报错信息

之前的异常情况原因:

  • 设置80:5000出现Nginx欢迎页,是因为该映射直接把主机80端口绑定到了Dokku默认的欢迎页容器,而非你的应用容器
  • 设置80:random_port超时,是因为这个随机端口是容器内部端口,主机未开放对应端口,且Nginx没有配置转发规则

问题3:为何无法将domains-global设为IP而非vhost?为何部分资料不推荐使用vhost?

  • Dokku的domains-global是全局虚拟主机配置,而IP地址不符合HTTP虚拟主机的规范(HTTP Host头要求为域名格式),因此无法直接设为IP。如果要通过EC2公网IP访问应用,直接给应用绑定IP作为域名即可:dokku domains:set <app-name> <你的EC2公网IP>,无需修改domains-global。
  • 部分资料不推荐用IP作为vhost,原因包括:
    • 限制应用扩展性,后续绑定域名时需重新调整配置
    • 多数SSL证书颁发机构不支持给IP地址签发证书,无法启用HTTPS
    • 虚拟主机的设计初衷是用域名区分同一IP上的多个应用,用IP会浪费多应用部署的能力

问题4:Dokku中Gunicorn是否自动监听5000:5000(容器内:Dokku暴露端口)?我的配置显示Gunicorn设为8080,但日志显示使用5000。

Dokku不会自动强制Gunicorn监听5000端口,端口优先级规则如下:

  1. 优先读取Dockerfile中EXPOSE声明的端口
  2. 若无EXPOSE,则检查应用启动命令(如Procfile、Dockerfile的CMD/ENTRYPOINT)中指定的端口
  3. 以上都没有的话,Dokku才会默认尝试5000端口

你的情况是Gunicorn配置文件设为8080,但日志显示用5000,大概率是以下原因:

  • Dockerfile中EXPOSE了5000端口,Dokku优先使用该端口
  • 应用的启动命令(比如Procfile里的web: gunicorn --bind 0.0.0.0:5000 <app>.wsgi)指定了监听5000,覆盖了配置文件的设置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:18:10