- WSGI是一種通信協議
- uwsgi是一種線路協議而不是通信協議,在此常用於在uWSGI服務器與其他網絡服務器的數據通信
- 而uWSGI是實現了uwsgi和WSGI兩種協議的Web服務器
- Nginx是一個高性能的HTTP和反向代理服務
nginx-uWSGI-Django項目工作流程
- 客戶端發出http請求到服務器
- nginx接收http請求
- 如果請求的是靜態文件(前端服務器)則根據設置好的靜態文件路徑返回對應內容
- 如果請求的是動態內容,則將請求轉發給uWSGI服務器(nginx和uWSGI使用socket進行通信)
- uWSGI 將接收到的包進行處理,並轉發給wsgi
- wsgi根據請求調用django項目的API,處理並返回響應數據,wsgi接收響應數據
- wsgi將響應數據進行打包,轉發給uWSGI
- uWSGI接收後轉發給nginx,nginx最終將響應數據返回給客戶端
環境安裝
安裝python
sudo apt-get install python3
安裝pip
sudo apt-get install python3-pip
安裝虛擬環境
sudo pip install virtualenv
sudo pip install virtualenvwrapper
安裝完虛擬環境後,如果提示找不到mkvirtualenv命令,須配置環境變量:
# 1、創建目錄用來存放虛擬環境
mkdir $HOME/.virtualenvs
# 2、打開~/.bashrc文件,並添加如下:
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
# 3、運行
source ~/.bashrc
創建虛擬環境
- 如果不指定python版本,默認安裝的是python2的虛擬環境
- 創建虛擬環境需要聯網
mkvirtualenv -p python3 虛擬環境名稱
在本地生成依賴文件
pip freeze > requirements.txt
雲端安裝依賴文件
pip install -r requirements.txt
安裝數據庫(有不需要安裝)
sudo apt-get install mysql-server
sudo apt-get install mysql-client
sudo apt-get install libmysqlclient-dev
靜態文件
當Django運行在生產模式時,將不再提供靜態文件的支持,需要將靜態文件交給靜態文件服務器。(修改settings配置文件中DEGUB=False)
我們要將收集的靜態文件放到靜態文件(front_end_pc)目錄下的static目錄中,所以先創建目錄static。
Django提供了收集靜態文件的方法。先在配置文件中配置收集之後存放的目錄
STATIC_ROOT = os.path.join(os.path.dirname(os.path.dirname(BASE_DIR)), 'front_end_pc/static')
# os.path.join() 拼接路徑(基於項目根路徑)
執行收集命令
python manage.py collectstatic
使用Nginx服務器作爲靜態文件服務器
安裝nginx服務器
sudo apt install nginx
打開Nginx的配置文件
sudo vim /etc/nginx/sites-available/default
在server部分中配置
server {
listen 80; # 監聽80端口,可以根據需求設置
server_name loaclhost; # 服務名可以根據需求設置
location / {
root /root/project/front_end_pc; # 項目靜態文件目錄
index index.html index.htm; 可以針對不同的訪問設置不同的首頁
}
}
重啓Nginx服務器
sudo service nginx restart
停止nginx服務器
sudo service nginx stop
動態接口
django的程序使用uwsgi服務器來運行
安裝uwsgi
pip install uwsgi
在項目目錄下創建uwsgi配置文件 uwsgi.ini
[uwsgi]
#使用nginx連接時使用,Django程序所在服務器地址
socket= ip:port # 設置你的ip:port
#直接做web服務器使用,Django程序所在服務器地址
#http= ip:port
#項目目錄
chdir=/path/to/your/project
#項目中wsgi.py文件的目錄,相對於項目目錄
wsgi-file=project/wsgi.py
# 進程數
processes=4
# 線程數
threads=2
# uwsgi服務器的角色
master=True
# 存放進程編號的文件
pidfile=uwsgi.pid
# 日誌文件,因爲uwsgi可以脫離終端在後臺運行,日誌看不見。我們以前的runserver是依賴終端的
daemonize=uwsgi.log
# 指定依賴的虛擬環境
virtualenv=/root/.virtualenvs/虛擬環境名 # 虛擬環境位置
啓動uwsgi服務器
uwsgi --ini uwsgi.ini
查看運行狀態
ps aux | grep uwsgi
修改Nginx配置文件,讓Nginx接收到請求後轉發給uwsgi服務器
upstream project { # 這個配置是寫一組被代理的服務器地址
server ip:port; # 此處爲uwsgi運行的ip地址和端口號
# 如果有多臺服務器,可以在此處繼續添加服務器地址
}
server {
listen 8000; # 監聽端口
server_name localhost;
location / {
include uwsgi_params;
uwsgi_pass project ; # 請求轉向project 定義的服務器列表
# uwsgi_pass ip:port; # 會轉發到uwsgi監聽的端口,所以務必和uwsgi保持一致(uwsgi.ini中socket配置)
}
}
重啓nginx
sudo service nginx restart
需要注意的是
- 執行了收集命令後,修改了靜態文件,需要刪除收集存放的目錄,再次執行收集命令
- 修改了nginx配置,需要重啓nginx
- 修改了後端項目代碼,需要重啓uwsgi服務器
- 添加安全組規則
以上爲個人總結,發現錯誤希望能指出,糾正錯誤