如何在绑定SSL域名的CentOS服务器部署公网可访问Django应用
- 你当前使用的
runserver、runserver_plus、runsslserver均为Django生态的开发调试服务器,仅设计用于本地开发场景,无生产级并发处理、安全防护能力,禁止直接暴露在公网长期运行。 - 公网访问8000端口超时的直接原因是8000端口的公网入站链路未放通:服务器本地iptables防火墙、云服务商侧安全组(如果是云服务器)均未添加8000端口的放行规则,而你能正常访问80/443端口是因为这两个端口的规则已经提前配置完成。
即使临时放通8000端口,也不建议长期用开发服务器承载公网流量,极易出现性能瓶颈、安全漏洞。
基于你已经配置完成的Apache+SSL环境,直接通过mod_wsgi模块对接Django应用是最优方案,可复用现有SSL证书、不需要开放额外公网端口,稳定性和安全性符合生产要求。
步骤1:安装必要组件
- 安装Apache对应WSGI模块:
yum install mod_wsgi - 进入你的Django项目运行的Python环境(如果用了虚拟环境就激活虚拟环境),安装Python侧mod_wsgi依赖:
pip install mod_wsgi
步骤2:加载mod_wsgi模块到Apache
执行以下命令获取模块加载配置:
mod_wsgi-express module-config
命令会输出3行配置,格式参考如下:
LoadModule wsgi_module /usr/lib64/httpd/modules/mod_wsgi.so WSGIPythonHome /path/to/your/python/env WSGIPythonPath /path/to/your/django/project
将输出的内容全部复制,追加到Apache主配置文件/etc/httpd/conf/httpd.conf的末尾,或者新建/etc/httpd/conf.d/wsgi.conf写入内容(CentOS下Apache会自动加载conf.d目录下所有.conf后缀的配置文件)。
步骤3:配置Apache虚拟主机规则
找到你已经配置好SSL的443端口虚拟主机配置文件,保留原有SSL证书相关配置不变,添加Django相关映射规则,适配Apache 2.2语法的配置示例如下:
<VirtualHost *:443> ServerName mywebsite.com # 保留原有SSL配置,不要修改 SSLEngine on SSLCertificateFile /path/to/your/cert_file.crt SSLCertificateKeyFile /path/to/your/private.key SSLCertificateChainFile /path/to/your/ca_chain.crt # 映射Django静态文件,提前执行collectstatic收集静态资源到指定目录 Alias /static/ /data/www/your_django/static/ <Directory /data/www/your_django/static> Order allow,deny Allow from all </Directory> # 映射Django用户上传的媒体文件 Alias /media/ /data/www/your_django/media/ <Directory /data/www/your_django/media> Order allow,deny Allow from all </Directory> # 绑定Django的WSGI入口 # 如果要把全站请求转给Django,路径填/;如果只转/django_app路径,填/django_app WSGIScriptAlias /django_app /data/www/your_django/your_project/wsgi.py <Directory /data/www/your_django/your_project> <Files wsgi.py> Order allow,deny Allow from all </Files> </Directory> </VirtualHost>
如果仅将/django_app路径映射给Django,需要额外在Django的settings.py中添加配置:FORCE_SCRIPT_NAME = '/django_app',避免路径解析错误。
步骤4:调整Django生产配置
编辑项目下的settings.py文件:
- 关闭调试模式:
DEBUG = False - 配置允许访问的主机,不要使用通配符
*:ALLOWED_HOSTS = ['mywebsite.com', '127.0.0.1'] - 配置静态文件根目录:
STATIC_ROOT = '/data/www/your_django/static/' - 执行静态资源收集命令,将项目、admin后台等所有静态文件汇总到指定目录:
python manage.py collectstatic
步骤5:重启Apache生效
执行命令重启Apache服务:
service httpd restart
配置完成后不需要启动runserver系列服务,直接访问https://mywebsite.com/django_app/home即可通过公网正常访问Django应用。
如果仅临时需要公网访问Django调试服务,不需要做完整生产部署,按以下步骤放通端口即可:
- 配置服务器本地iptables防火墙,放行8000端口TCP入站流量:
iptables -I INPUT -p tcp --dport 8000 -j ACCEPT service iptables save - 如果服务器是云服务商提供的实例,登录对应云平台控制台,在实例安全组添加入站规则:放行TCP 8000端口,源地址设为0.0.0.0/0。
- 重新执行
python manage.py runserver 0.0.0.0:8000启动服务,即可通过公网IP:8000访问。
开发服务器单进程仅能处理串行请求,且默认开启调试模式会暴露敏感信息,调试完成后立即停止服务,关闭8000端口的公网放行规则。
内容的提问来源于stack exchange,提问作者Abhilash Singh Chauhan

