快速搭建一個web應用服務器最快的方式就是使用django框架,我們在開發的時候測試時使用python manage.py runserver就可以進行API接口的測試,這樣開發起來非常方便,但是如果開發完成後需要部署到生產環境的話就不能使用這樣的方式進行部署,針對django的生產環境的部署業界已經有成熟的方案來進行生產環境的部署,那就是nginx+uwsgi。
我們來大概說下爲什麼要使用nginx和uwsgi來搭建Django的生產環境,而不是直接使用python manage.py直接啓動。
uwsgi 是一個web服務器,也可以當做中間件,它是連接Django和nginx的橋樑
如果訪問量不是特別大的話,只需要配置uwsgi,不需要配置nginx都可以,但是畢竟是生產環境,完整的配置也應該加上nginx。
nginx是一個Http和反向代理服務器
使用nginx的好處:
1、安全:不管什麼請求都要經過代理服務器,這樣就避免了外部程序直接攻擊web服務器
2、負載均衡:根據請求情況和服務器負載情況,將請求分配給不同的web服務器,保證服務器性能
3、提高web服務器的IO性能:客戶端傳到web服務器是需要時間的,傳遞多長時間就會讓這個進程阻塞多長時間,而通過反向代理,就可以在反向代理這完整接受請求,然後再傳給web服務器,從而保證服務器性能
4、能更好地處理靜態資源(一些http request header)
生產環境的大致流程是這樣:客戶端訪問到服務器後,首先是nginx監聽到終端的請求,然後鏈家到uwsgi的服務上(nginx與uwsgi通信使用的是socket通信,所以nginx和uwsgi既可以部署到同一臺機子也可以部署到兩臺不同的機子),uwsgi服務然後再鏈接到Django裏面的API函數。
前面的基本概念有了之後,現在我們開始使用部署Django項目的生產環境(包括http和https),我的生產服務器是ubuntu
1、在服務器上安裝nginx
sudo apt install nginx
nginx操作相關命令
#查看nginx狀態
systemctl status nginx.service
#停止nginx
systemctl stop nginx.service
#啓動nginx
systemctl start nginx.service
#重啓nginx
systemctl restart nginx.service
2、安裝uwsgi
pip3 install uwsgi
3、確保你的Django的項目是否可以運行
使用python mange.py runserver命令運行你的Django項目,確保Django項目可以正常運行
我的項目文件如下圖所示
4、上圖片中的smpauthen_uwsgi.ini文件是uwsgi的配置文件,裏面的內容如下
[uwsgi]
#項目目錄,目錄爲項目運行時的絕對路徑,部署新的項目後需要修改該路徑爲項目的絕對路徑
chdir = /root/CHSmpSrc/smpauthensrc/
#項目的app下的wsgi
module = SmpAuthenSrc.wsgi
#sock的文件路徑
#socket=/root/CHSmpSrc_cp/smpauthensrc/uwsgi.sock
socket = 127.0.0.1:9090
#啓用主進程
master = true
#運行進程數
processes = 4
#線程數
threads = 2
#啓用線程
enable-threads = True
#設置日誌目錄
daemonize = /var/log/smpauthensrc_uwsgi.log
#緩存大小
buffer-size = 21573
# 自動移除unix Socket和pid文件當服務停止的時候
vacuum = true
uid=root
gid=root
主要參數說明
chdir後面的路徑是項目部署的時候實際的路徑,自己到時候根據自己的實際路徑進行更改
module後的.wsgi前面的名字必須和項目下面的的名字一樣,還區分大小寫,例如本例子的是SmpAuthenSrc
socket後面接uwsgi啓動地址和端口號,到時候nginx就會通過socket連接這個地址和端口號
5、nginx配置文件
新建文件名test_nginx.conf添加如下內容
upstream django {
server 127.0.0.1:9090;
}
server {
listen 8000;
server_name your_ip;
charset utf-8;
client_max_body_size 75M;
location /media {
alias /root/CHSmpSrci_cp/smpauthensrc/media;
}
location / {
uwsgi_pass django;
include /etc/nginx/uwsgi_params;
uwsgi_connect_timeout 30;
}
}
將該文件拷貝到/etc/nginx/sites-available/目錄下面,在該路徑下面就可以看到test_nginx.conf文件
然後鏈接文件到/etc/nginx/sites-enabled/目錄下面
ln -s /etc/nginx/sites-available/test_nginx.conf /etc/nginx/sites-enabled/
主要參數說明:
upstream django裏面的server是的地址是表示nginx接受到外部訪問後,轉發到127.0.0.1:9090,即轉發到本地地址的9090端口,就是剛剛uwsgi配置文件裏面socket的地址和端口,兩者是一一對應的
uwsgi_pass後面寫的是django,表示就是轉接到上面的upstream django裏面的地址去
6、然後就是啓動問題
回到項目目錄下面,執行下面命令啓動uwsgi
uwsgi --ini smpauthen_uwsgi.ini
備註:如果直接使用上面的ini配置文件裏面的內容的話,使用啓動命令後,看不到任何信息,如果想看日誌打印,需要把這行代碼註銷#daemonize = /var/log/smpauthensrc_uwsgi.log,然後再執行啓動命令就可以看到打印日誌
使用以下命令重啓nginx服務器
#停止nginx
systemctl stop nginx.service
#啓動nginx
systemctl start nginx.service
如果沒有錯誤信息,就可以去web或者postman進行API測試了。
7、https的配置方法
前面的步驟是配置出來的http通信,如果需要進行https的話,在前面的步驟中只需要修改nginx的配置文件即可,將第5步的test_nginx.conf文件內容修改如下:
# the upstream component nginx needs to connect to
upstream django {
server 127.0.0.1:9090;
}
server {
listen 443 ssl;
ssl on;
ssl_certificate /root/CHSmpSrc/keycer/certificate.crt;
ssl_certificate_key /root/CHSmpSrc/keycer/private.key;
server_name your_ip;
charset utf-8;
client_max_body_size 75M;
location /media {
alias /root/CHSmpSrc/smpauthensrc/media;
}
location / {
uwsgi_pass django;
include /etc/nginx/uwsgi_params;
uwsgi_connect_timeout 30;
}
}
裏面的證書和密鑰文件
ssl_certificate /root/CHSmpSrc/keycer/certificate.crt;
ssl_certificate_key /root/CHSmpSrc/keycer/private.key;
後面的路徑到時候需要改成自己的證書和密鑰路徑
好了,到這裏都差不多了。有問題我再來改!