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以有權限的用戶/組執行。