Linux下安裝部署 Nginx + uWSGI + Django

前言

上一篇文章,我們提到了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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章