引自: https://cloud.tencent.com/developer/article/1372693
上一篇文章,我們提到了Python3+Django2 配置后台管理,在開發環境中這樣啟動測試是沒有任何問題的,我們可以使用 Django 默認的服務器。但是,如果部署到外網就要考慮 Django 運行的性能問題了,默認服務器的處理能力是遠遠不夠的。
項目結構
│ manage.py
├─news
│ │ admin.py │ │ apps.py │ │ models.py │ │ tests.py │ │ views.py │ │ __init__.py │ │ │ ├─migrations │ │ │ __init__.py │ │ │ └─itstyle │ settings.py │ urls.py │ wsgi.py │ __init__.py
配置
服務器還是選擇Linux,部署前需要做以下操作。
Django
由於之前外網沒有安裝 Django,需要先安裝:
pip install Django
sqlite
為了測試方便,這里我們選擇 Django 默認自帶的 sqlite 數據庫:
yum install sqlite*
安裝成功以后需要重新配置並編譯安裝 Python3:
# 配置編譯
./configure # 編譯安裝 make && make install
uwsgi
安裝服務器 uwsgi,你可以把它想象成Java界的Tomcat
pip3 install uwsgi
切換到 news目錄,啟動:
uwsgi --http :8000 --file itstyle/wsgi.py
你可以可以自定義參數:
# 目錄下新建文件夾 mkdir script
在 script 下新增 uwsgi.ini:
# uwsig使用配置文件啟動
[uwsgi] # 項目目錄 chdir=/www/news/ # 指定項目的application module=itstyle.wsgi:application # 指定sock的文件路徑 socket=/www/news/script/uwsgi.sock # 進程個數 workers=5 pidfile=/www/news/script/uwsgi.pid # 指定IP端口 http=127.0.0.1:8000 # 指定靜態文件 static-map=/static=/www/news/static # 啟動uwsgi的用戶名和用戶組 uid=root gid=root # 啟用主進程 master=true # 自動移除unix Socket和pid文件當服務停止的時候 vacuum=true # 序列化接受的內容,如果可能的話 thunder-lock=true # 啟用線程 enable-threads=true # 設置自中斷時間 harakiri=30 # 設置緩沖 post-buffering=4096 # 設置日志目錄 daemonize=/www/news/script/uwsgi.log
然后使用以下命令啟動:
uwsgi --ini uwsgi.ini
執行命令,查看是否啟動成功:
[root@AY140216131049Z script]# ps -ef|grep uwsgi root 3040 1 0 Nov21 ? 00:00:03 uwsgi --ini uwsgi.ini root 3041 3040 0 Nov21 ? 00:00:00 uwsgi --ini uwsgi.ini root 3042 3040 0 Nov21 ? 00:00:00 uwsgi --ini uwsgi.ini root 3043 3040 0 Nov21 ? 00:00:00 uwsgi --ini uwsgi.ini root 3044 3040 0 Nov21 ? 00:00:00 uwsgi --ini uwsgi.ini root 3045 3040 0 Nov21 ? 00:00:00 uwsgi --ini uwsgi.ini root 3046 3040 0 Nov21 ? 00:00:00 uwsgi --ini uwsgi.ini root 6606 6580 0 18:13 pts/0 00:00:00 grep --color=auto uwsgi
可以通過以下命令殺死進程:
killall -9 uwsgi
Nginx
最后一步,配置Nginx 轉發,具體安裝這里不再說明,直接上配置:
server {
listen 80; server_name news.52itstyle.com; charset utf-8; location / { #proxy_pass http://127.0.0.1:8000; include uwsgi_params; # 導入一個Nginx模塊他是用來和uWSGI進行通訊的 uwsgi_connect_timeout 30; # 設置連接uWSGI超時時間 uwsgi_pass unix:/www/news/script/uwsgi.sock; # 指定uwsgi的sock文件所有動態請求就會直接丟給他 } }
重啟Nginx,你以為這樣就成功了么?顯然不是,由於靜態沒有加載,這里還需要對靜態文件進行映射。
修改配置setting.py,在最后面加入以下配置:
STATIC_ROOT = '/www/news/static/'
然后執行命令:
python3 manage.py collectstatic
最后不要忘了修改一下域名限制參數,否則無法通過域名訪問:
# 修改為 * 允許所有
ALLOWED_HOSTS = ['*']
重啟服務,如果正常顯示,說明沒有問題,如果無法訪問,再回頭仔細檢查一下配置。
調優
既然,我們使用了 Nginx 做代理,最好做動靜分離,Nginx處理靜態資源的能力可以大大高於uWSGI 的。
server {
listen 80; server_name news.52itstyle.com; charset utf-8; location / { include uwsgi_params; # 導入一個Nginx模塊他是用來和uWSGI進行通訊的 uwsgi_connect_timeout 30; # 設置連接uWSGI超時時間 uwsgi_pass unix:/www/news/script/uwsgi.sock; # 指定uwsgi的sock文件所有動態請求就會直接丟給他 } # 動靜分離 Nginx 處理靜態請求 location /static { root /www/news/; } }
好了,這就是最終版,動靜分離。
本文參與騰訊雲自媒體分享計划,歡迎正在閱讀的你也加入,一起分享。