如何在Django生产服务器中移除URL中的端口号?
移除Django生产环境URL中的端口号
以下是几种可行的解决方法,按生产环境实用性排序:
1. 用Nginx做反向代理(推荐方案)
这是生产环境的标准部署方式,Nginx作为前端服务器监听80(HTTP)或443(HTTPS)端口,将请求转发到后台运行在8586端口的Django服务(如gunicorn/uwsgi)。
操作步骤:
- 安装Nginx:根据服务器系统执行对应命令,比如Ubuntu/Debian:
sudo apt install nginx,CentOS/RHEL:sudo yum install nginx - 创建站点配置文件:在
/etc/nginx/sites-available/目录下新建your_domain.conf,写入以下内容(替换your_domain_name为你的实际域名):
server { listen 80; server_name your_domain_name; location / { proxy_pass http://127.0.0.1:8586; # 传递必要的请求头,确保Django能正确识别请求来源 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; } }
- 启用配置:创建软链接到
sites-enabled目录:sudo ln -s /etc/nginx/sites-available/your_domain.conf /etc/nginx/sites-enabled/ - 验证配置并重启Nginx:
sudo nginx -t,如果输出test is successful,执行sudo systemctl restart nginx - 开放80端口:确保服务器防火墙/安全组允许80端口的入站流量
2. 让Django服务直接监听80端口(不推荐)
直接修改Django应用服务器的监听端口为80,这样访问时无需附加端口,但存在安全和权限问题:
- 非root用户无法直接监听1024以下端口,要么用root启动服务(风险高),要么给服务授权:比如给gunicorn添加端口权限:
sudo setcap 'cap_net_bind_service=+ep' /usr/bin/gunicorn - 启动示例:
gunicorn --bind 0.0.0.0:80 your_project.wsgi:application - 此方式缺乏反向代理的负载均衡、静态文件处理等能力,不适合生产环境长期使用
3. 配置防火墙端口转发
通过防火墙将80端口的流量转发到8586端口,无需额外安装反向代理服务:
- 使用iptables配置转发:
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8586 - 保存规则:Ubuntu/Debian执行
sudo iptables-save > /etc/iptables/rules.v4,CentOS/RHEL执行sudo service iptables save - 开放80端口的入站流量
额外注意事项
- 确保Django配置文件中的
ALLOWED_HOSTS包含你的域名,例如:ALLOWED_HOSTS = ['your_domain_name'] - 建议配置HTTPS:申请SSL证书(如Let's Encrypt),修改Nginx配置监听443端口,并将80端口的请求重定向到HTTPS
- 关闭8586端口的外部访问:在防火墙中仅允许本地IP访问8586,避免直接暴露后台服务
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

