nginx-uWSGI-Django項目-阿里雲部署

  • WSGI是一種通信協議
  • uwsgi是一種線路協議而不是通信協議,在此常用於在uWSGI服務器與其他網絡服務器的數據通信
  • 而uWSGI是實現了uwsgi和WSGI兩種協議的Web服務器
  • Nginx是一個高性能的HTTP和反向代理服務

nginx-uWSGI-Django項目工作流程

  1. 客戶端發出http請求到服務器
  2. nginx接收http請求
    1. 如果請求的是靜態文件(前端服務器)則根據設置好的靜態文件路徑返回對應內容
    2. 如果請求的是動態內容,則將請求轉發給uWSGI服務器(nginx和uWSGI使用socket進行通信)
  3. uWSGI 將接收到的包進行處理,並轉發給wsgi
  4. wsgi根據請求調用django項目的API,處理並返回響應數據,wsgi接收響應數據
  5. wsgi將響應數據進行打包,轉發給uWSGI
  6. 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服務器
  • 添加安全組規則
    在這裏插入圖片描述

以上爲個人總結,發現錯誤希望能指出,糾正錯誤

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