Ubuntu16.04服务器上Django2.0与Apache2、WSGI部署故障求助
结合你给出的环境配置(Ubuntu 16.04 Server、Django 2.0、Python 3.5、Apache2.4 + WSGI),我来帮你一步步排查并解决Django部署的常见问题——毕竟我踩过不少类似的坑:
1. 先确认Python3对应的WSGI模块已正确安装启用
Ubuntu 16.04默认自带的WSGI模块是针对Python2的,而你用的是Python3.5,必须安装对应版本的模块:
- 安装模块:
sudo apt-get install libapache2-mod-wsgi-py3 - 启用模块:
sudo a2enmod wsgi - 重启Apache让配置生效:
sudo systemctl restart apache2
2. 配置Apache站点文件(核心步骤)
你需要创建一个专门的站点配置文件,指向你的Django项目。比如创建/etc/apache2/sites-available/datasystems.conf,内容如下:
<VirtualHost *:80> # 替换成你的服务器域名或公网IP ServerName your-server-ip-or-domain # 项目根目录 DocumentRoot /var/www/html/DatasystemsCORE # 指向WSGI脚本文件 WSGIScriptAlias / /var/www/html/DatasystemsCORE/DatasystemsCORE/wsgi.py # 允许Apache访问WSGI脚本所在目录 <Directory /var/www/html/DatasystemsCORE/DatasystemsCORE> <Files wsgi.py> Require all granted </Files> </Directory> # 静态文件映射(Django部署必须配置,否则静态资源加载失败) Alias /static/ /var/www/html/DatasystemsCORE/static/ <Directory /var/www/html/DatasystemsCORE/static> Require all granted </Directory> # 如果项目用到用户上传的媒体文件,添加这段配置 Alias /media/ /var/www/html/DatasystemsCORE/media/ <Directory /var/www/html/DatasystemsCORE/media> Require all granted </Directory> # 如果你用了虚拟环境,取消下面两行注释并替换虚拟环境路径 # WSGIDaemonProcess datasystems python-path=/var/www/html/DatasystemsCORE:/path/to/your/venv/lib/python3.5/site-packages # WSGIProcessGroup datasystems </VirtualHost>
配置完成后,启用这个站点并重启Apache:
sudo a2ensite datasystems.conf sudo systemctl restart apache2
3. 补全并检查WSGI.py文件
你提供的wsgi.py内容被截断了,完整的文件应该包含Python路径的设置(确保Django能找到项目):
import os import sys # 将项目根目录添加到Python路径 sys.path.append('/var/www/html/DatasystemsCORE') from django.core.wsgi import get_wsgi_application os.environ.setdefault("DJANGO_SETTINGS_MODULE", "DatasystemsCORE.settings") application = get_wsgi_application()
4. 修复文件权限(最容易忽略的坑)
Apache运行的用户是www-data,必须确保它能访问甚至读写你的项目文件:
- 递归修改项目目录的所属用户和组:
sudo chown -R www-data:www-data /var/www/html/DatasystemsCORE - 调整目录和文件的权限:
sudo chmod -R 755 /var/www/html/DatasystemsCORE - 如果你用的是SQLite数据库,还要单独给数据库文件加读写权限:
sudo chmod 664 /var/www/html/DatasystemsCORE/db.sqlite3
5. 验证Django项目本身是否正常
先排除项目自身的问题:
- 进入项目目录:
cd /var/www/html/DatasystemsCORE - 执行数据库迁移(如果还没做):
python3 manage.py migrate - 重点:收集静态文件(部署时必须执行,Django会把所有app的静态文件集中到static目录):
python3 manage.py collectstatic - 临时启动开发服务器测试:
python3 manage.py runserver 0.0.0.0:8000
如果能通过服务器IP:8000正常访问,说明项目本身没问题,问题大概率出在Apache配置。
6. 查看Apache错误日志定位问题
如果以上步骤都做完还是不行,直接看错误日志找具体原因:
tail -n 50 /var/log/apache2/error.log
日志里会明确提示是模块缺失、权限不足还是配置语法错误,针对性解决即可。
内容的提问来源于stack exchange,提问作者Essex
相关产品推荐
相关产品推荐

