Linux下安裝部署 Nginx + uWSGI + Django


引自: 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/; } }

好了,這就是最終版,動靜分離。

訪問地址:http://news.52itstyle.com/admin/

本文參與騰訊雲自媒體分享計划,歡迎正在閱讀的你也加入,一起分享。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM