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/。所以你可以把它設定一下。