nginx + uwsgi部署
阿新 • • 發佈:2020-11-14
1 總體業務流程
1.1 總體概述
1.1.1 web容器
- web容器是幫助我們部署java、php、python、vue等專案的
- web容器是幫助django服務端處理客戶端連線,官方號稱可以處理10萬(實現高併發)
- web容器是幫助處理靜態資源請求(html、css、JS),返回給客戶端瀏覽器(django等web伺服器處理靜態資源能力差)
1.1.2 常見web容器
- nginx(python、php)
- LNMP
- L:LInux
- N:Nginx
- M:MySQL
- P: php
- LNMP
- apache(PHP)
- LAMP
- L:LInux
- A:Apache
- M:MySQL
- P: php
- LAMP
- Tomcat(JAVE)
1.1.3 WSGI
WSGI是一種 python專用 的web協議 和http類似 WSGI實質:WSGI是一種描述web伺服器(如 nginx,uWSGI web伺服器 )如何與 web框架 (如用 Django、Flask框架寫的程式)通訊的規範、協議 WSGI定義了使用 python編寫的web app(django)與web server(uWSGI)之間介面格式 * 為什麼需要web協議: 1)不同的框架有不同的開發方式,但是無論如何,開發出的 應用程式(django)都要和伺服器 (nginx)程式配合 ,才能為使用者提供服務。 2) 這樣, 伺服器程式(nginx) 就需要為不同的框架提供不同的支援,只有支援它的伺服器才能被開發出的應用使用,顯然這是不可行的。 3)web協議本質:就是定義了 Web伺服器和Web應用程式或框架之間的一種簡單而通用的介面規範。
1.1.4 uWSGI
什麼是uWSGI: uWSGI是一個全功能的HTTP伺服器,實現了WSGI協議 、uwsgi協議 、http協議等。
uWSGI作用:它要做的就是把HTTP協議轉化成語言支援的網路協議,比如把HTTP協議轉化成WSGI協議,讓Python可以直接使用。uWSGI特點:輕量級,易部署,效能比nginx差很多,支援多種協議
1.1.5 Nginx
Nginx是一個Web伺服器,其中的HTTP伺服器功能和 uWSGI功能很類似
但是Nginx還可以用作更多用途,比如最常用的 反向代理、負載均衡、攔截攻擊等,而且效能極高
單臺nginx號稱可以處理10萬併發
1.1.6 Django
Django是一個Web框架,框架的作用在於處理request和 reponse,其他的不是框架所關心的內容。
所以如何部署Django不是Django所需要關心的。
1.2 nginx+uwsgi+django部署各模組作用
1.3 Django + Uwsgi + Nginx方案
1.請求處理整體流程:
nginx接收到瀏覽器傳送過來的http請求,將包進行解析,分析url
* 靜態檔案請求:就直接訪問使用者給nginx配置的靜態檔案目錄(html/css/js/圖片),直接返回使用者請求的靜態檔案。
* 動態介面請求: 那麼nginx就將請求轉發給uWSGI,最後到達django處理
2.各模組作用。
nginx:是對外的伺服器,外部瀏覽器通過url訪問nginx,nginx主要處理靜態請求(html/css/js/圖片)
uWSGI:是對內的伺服器,主要用來 處理動態請求 。(從mysql、redis、es等中動態查詢到的
資料)。
uwsgi:是一種web協議,接收到請求之後將包進行處理,處理成wsgi可以接受的格式,併發給wsgi。
wsgi:是python專用的web協議,根據請求呼叫應用程式(django)的某個檔案,某個檔案的某個函式。
django:是真正幹活的,查詢資料等資源,把處理的結果再次返回給WSGI, WSGI將返回值進行打包,打包成uwsgi能夠接收的格式。
uwsgi:接收wsgi傳送的請求,並轉發給nginx,nginx最終將返回值返回給瀏覽器。
1.4 Django + uWSGI方案特點
沒有nginx而只有uwsgi的伺服器,則是Internet請求直接由uwsgi處理,並反饋到web專案中。
nginx可以實現安全過濾,防DDOS等保護安全的操作,並且如果配置了多臺伺服器,nginx可以保證伺服器的負載相對均衡。
而uwsgi則是一個web伺服器,實現了WSGI協議(Web Server Gateway Interface),http協議等,它可以接收和處理請求,發出響應等。所以只用uwsgi也是可以的。
1.5 nginx和uWSGI特點
1.5.1 nginx的作用
反向代理,可以攔截一些web攻擊,保護後端的web伺服器
負載均衡,根據輪詢演算法,分配請求到多節點web伺服器
快取靜態資源,加快訪問速度,釋放web伺服器的記憶體佔用,專項專用
1.5.2 uWSGI的適用
單節點伺服器的簡易部署
輕量級,好部署
2 後端部署
2.1 Django的settings配置
# 正式上線關閉除錯模式, 不會暴露伺服器資訊
DEBUG = True
# 允許的主機
ALLOWED_HOSTS = ['*']
# 靜態資源收集位置
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
# 命令列執行
python manage.py collectstatic
2.2 關於 uwsgi
2.2.1 安裝uwsgi
workon syl
pip3 install uwsgi # 安裝uwsgi
whereis uwsgi # 檢視uwsgi安裝路徑
2.2.2 uwsgi_conf中寫入uwsgi.ini
# vim /root/shiyanlou_project/uwsgi_conf/uwsgi.ini
# vim中,A鍵進入插入模式,ESC退出,:wq儲存並退出
# 或者pycharm中直接貼上也可以
[uwsgi]
# 使用Nginx連線時使用,Django程式所在伺服器地址和埠號
socket=127.0.0.1:8000
# 專案目錄絕對路徑
chdir=/root/shiyanlou_project/syl
# 專案中wsgi.py檔案的目錄,相對於專案目錄
wsgi-file=syl/wsgi.py
# 程序數(機器核數的1倍)
processes=4
# 執行緒數
threads=20
# uwsgi伺服器的角色
master=True
# 存放程序編號的檔案
pidfile=uwsgi.pid
# 日誌檔案
daemonize=uwsgi.log
# 指定依賴的虛擬環境
virtualenv=/root/.virtualenvs/syl
2.2.3 用uwsgi啟動django
# 一定要在專案目錄裡面
uwsgi --http 192.168.56.100:6666 --file syl/wsgi.py --static-map=/static=static
# 訪問專案 訪問專案:http://192.168.56.11 (只是測試)
2.3 關於nginx
2.3.1 安裝nginx
sudo apt update # 更新ap
sudo apt install nginx # 安裝nginx [root@linux-node1 /]# sudo systemctl status nginx # 檢視nginx狀態
2.3.2 配置nginx+uwsgi啟動
# etc/nginx/conf.d/django.conf
server {
listen 8888;
server_name 192.168.56.100;
location /static {
alias /root/shiyanlou_project/syl/static;
}
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000;
uwsgi_ignore_client_abort on;
}
}
2.3.3 解讀
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768; # 連結數量
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
access_log /var/log/nginx/access.log;
# 客戶瀏覽器訪問nginx服務記錄(客戶 戶端訪問異常時可以檢視)
error_log /var/log/nginx/error.log;
# nginx錯誤日誌(nginx啟動時報錯的 日誌)
include /etc/nginx/conf.d/*.conf;
# nginx擴充套件配置檔案件
include /etc/nginx/sites-enabled/*;
}
2.4 uwsgi和nginx操作日誌
2.4.1 啟動並檢視nginx日誌
systemctl restart nginx
# 開啟nginx
tail -f /var/log/nginx/access.log
# 檢視nginx接入日誌
tail -f /var/log/nginx/error.log
# 檢視nginx錯誤日誌
2.4.2 啟動並檢視uwsgi日誌
cd /root/shiyanlou_project/uwsgi_conf
# 進入實驗樓目錄
uwsgi --ini uwsgi.ini
# 啟動uwsgi的 django專案
# http://192.168.56.11:8888/ 訪問專案
uwsgi --stop uwsgi.pid
# 關閉uwsgi
tail -f uwsgi.log
# 檢視uwsgi日誌