django开发时只需要python就能完成,利用其自带的开发服务,可以方便在开发环境运行起应用,但部署于生产时则需要一些额外的操作。
配置修改
首先是配置的修改,settings.py
里有些最小配置需要修改
STATIC_ROOT = os.path.join(os.getcwd(), 'static')
ALLOWED_HOSTS = ['127.0.0.1']
DEBUG = False
如果应用里有图片,样式表资源,需要设置STATIC_ROOT
; DEBUG
模式必须关掉,否则会暴露过多信息造成安全问题;ALLOWED_HOSTS
列表需要指明允许的主机。
部署方式
django官方介绍了多种WSGI方式的生产部署方案:
- apache 和 apache 模块 mod_wsgi
- 使用uWSGI
- 使用Gunicorn
除了WSGI部署,django 3.0开始也支持ASGI部署。
静态文件
生成环境下各个django项目下的app静态文件是不能像开发服务运行时那样,开箱即用,可以直接访问到的。需要人为配置让静态文件能够被所用的服务器软件能够正确读取。
推荐的做法是执行命令
python manage.py collectstatic
各个app的静态文件会被同一收集到STATIC_ROOT
配置指定的位置。
Apache+Gunicorn
django部署方式多样,可以根据需要选择。
Gunicorn运行django服务,Apache对外暴露,反向代理到Gunicorn的方案基本配置过程大体如下:
安装相关软件包
通过包管理器或其他方式安装Apache, pip或其他方式安装gunicorn。
yum install httpd #redhat
apt install apache2 #debain
pip install gunicorn
配置Apache
配置反向代理到gunicorn运行的django服务,配置apache处理静态资源。
修改/etc/httpd/conf/httpd.conf
配置文件:
#处理静态资源配置
Alias /static/ /path/to/static/
<Directory /path/to/static/>
Require all granted #2.4
</Directory>
#反向代理
ProxyPass /static/ ! #排除/static路径
ProxyPass / http://127.0.0.1:8000/
ProxyPassReverse / http://127.0.0.1:8000/
如果想要重写Server
头,可以加入配置
<IfModule mod_headers.c>
Header unset Server
Header always unset X-Powered-By
Header unset X-Powered-By
Header unset X-CF-Powered-By
Header unset X-Mod-Pagespeed
Header unset X-Pingback
</IfModule>
运行Apache
systemctl start httpd
运行Gunicorn
最简单的情况下,可以直接运行
gunicorn django_project.wsgi
常见错误
- 访问django地址出现400错误,检查django配置了
ALLOWED_HOSTS = ['127.0.0.1']
- 访问静态文件地址出现403, 检查静态文件所在目录Apache是否有权限,可以修改所在目录或者文件的权限,也可配置
User
和Group
,让Apache以有权限的用户/组执行。