基于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端口,端口优先级规则如下:
- 优先读取Dockerfile中
EXPOSE声明的端口 - 若无
EXPOSE,则检查应用启动命令(如Procfile、Dockerfile的CMD/ENTRYPOINT)中指定的端口 - 以上都没有的话,Dokku才会默认尝试5000端口
你的情况是Gunicorn配置文件设为8080,但日志显示用5000,大概率是以下原因:
- Dockerfile中
EXPOSE了5000端口,Dokku优先使用该端口 - 应用的启动命令(比如Procfile里的
web: gunicorn --bind 0.0.0.0:5000 <app>.wsgi)指定了监听5000,覆盖了配置文件的设置
内容的提问来源于stack exchange,提问作者JayaAnim
相关产品推荐
相关产品推荐

