1. 程式人生 > 實用技巧 >Nginx+ uWSGI +django進行部署

Nginx+ uWSGI +django進行部署

一:uWSGI的安裝

sudo pip install uwsgi


如果安裝報錯:

conda install -c conda-forge uwsgi 
conda install -c conda-forge libiconv


測試 test.py:

uwsgi --http :8020 --chdir /mnt/d/hegh/projects/0806/data_plot(專案路徑) -w data_plot.wsgi


一個重要的任何就是監控。知道發生了什麼在生產環境中是極其重要的。stats 子系統允許你 用 JSON 輸出 uWSGI 的內部資料:

uwsgi --http :9090
--wsgi-file foobar.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191


啟動測試, 可以正常訪問就安裝沒有問題
在專案的根目錄下建立以自己專案命名的配置檔案data_plot.ini:

[uwsgi]
project = data_plot
base = /mnt/d/hegh/projects/0806/
socket = 127.0.0.1:8030 # 指定專案執行的埠號,用nginx的時候就要配socket
chdir = %(base)/%(project) # 指定專案的目錄
wsgi-file=%(base
)/%(project)/%(project)/wsgi.py # 專案上wsgi.py所在的位置,與settings目錄相同 master = true # master :允許主執行緒存在(true) processes = 5 # 開啟的程序數量 threads=2 pidfile=data_plot.pid daemonize=data_plot.log # 日誌,uwsgi無法啟動時來這檢視錯誤日誌

這將會產生 4 個程序(每個程序 2 個執行緒),一個主程序(當你的程序死掉時會重新 spawn 一個新的)以及 HTTP 路由器
老版(1.4 以下)的 Django(沒有wsgi.py 檔案) 發行版需要設定 evn, module 和 pythonpath (.. 使得我們可以訪問 myproject.settings 模組)

uwsgi --ini data_plot.ini # 啟動uwsgi, 一定要在django實際使用的conda環境下,否則會報錯

  uwsgi --stop data_plot.pid # 停止uwsgi

  uwsgi --reload data_plot.pid # 重啟uwsgi

或者 建立一個自啟指令碼

sudo vi /etc/init/uwsgi.conf

內容如下 setuid的值改為你的專案名:

description "uWSGI application server in Emperor mode"
start on runlevel [2345]
stop on runlevel [!2345]
setuid data_plot
setgid www-data

exec exec /mnt/d/hegh/miniconda3/envs/data_plot/bin/uwsgi --emperor /mnt/d/hegh/projects/0806/data_plot


二: 方向代理: Nginx的安裝和配置
1:安裝: sudo apt-get install nginx

2: 建立配置檔案: sudo vim /etc/nginx/sites-available/data_plot

server{
listen 8030;
server_name localhost;
access_log /mnt/d/hegh/projects/0806/data_plot/nginx.access.log;
error_log /mnt/d/hegh/projects/0806/data_plot/nginx.error.log;

location /static/ {
root /mnt/d/hegh/projects/0806/data_plot; 或者:alias /mnt/d/hegh/projects/0806/data_plot/static;
}
location /favico.ico {
root mnt/d/hegh/projects/0806/data_plot/static/img/favico.ico;
}
location / {
include /etc/nginx/uwsgi_params;
uwsgi_pass 127.0.0.1:8030;
}
} 

  

然後連結檔案:

sudo ln -s /etc/nginx/sites-available/data_plot /etc/nginx/sites-enabled/


檢查是否有錯誤:

sudo service nginx configtest


出現錯誤,那就是配置檔案寫錯了,自己檢查一下,沒有就直接啟動!

sudo service nginx restart


最後輸入,啟動uwsgi :

uwsgi /mnt/d/hegh/projects/0806/data_plot/data_plot.ini -d /mnt/d/hegh/projects/0806/data_plot/data_plot.log

Django專案setting.py設定:
DEBUG = False
一般在開發環境中: 即settings.py中的DEBUG = True 時 , Django 會自動幫助我們處理靜態檔案,所以不用操心靜態檔案404的問題,但是在部署時,出於安全考慮,我們必須關閉DEBUG!保證自己網站的資訊不洩露。只是當DEBUG關閉後,Djang就不會幫我們處理靜態檔案了,所以會出現樣式丟失,靜態檔案404問題

STATIC_URL = '/static/'
# STATIC_ROOT = os.path.join(BASE_DIR, 'static')
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)


1.MEDIA_ROOT:媒體檔案,所有上傳的檔案。示例:影象,檔案
2.STATIC_ROOT 在開發過程中無用,只需要部署。
在開發中,STATIC_ROOT什麼都不做。你甚至不需要設定它。Django在每個應用程式目錄(myProject/appName/static)中查詢靜態檔案,並自動提供。
當你的專案部署時,事情有所不同。很可能你將使用Django提供動態內容,Nginx將提供靜態檔案。為什麼?因為Nginx的效率非常高,並且會減少Django的工作量。
這時候STATIC_ROOT才有用,因為Nginx不知道你的django專案,不知道在哪裡找到靜態檔案。
所以你設定STATIC_ROOT = '/some/folder/', 並告訴Nginx尋找靜態檔案/some/folder/。然後執行manage.py collectstatic,Django將會從所有應用程式複製靜態檔案/some/folder/。
3.STATICFILES_DIRS : 靜態檔案的額外目錄
STATICFILES_DIRS用於包含要查詢的其他目錄。例如,預設情況下,Django無法識別/myProject/static/。所以你可以把它設定一下。