本項目的github
https://github.com/RaccoonDML/ChatChat
本項目的pages地址
http://123.56.117.130
test1 test12345
test2 test12345
常用命令:
本項目名稱ChatChat(以下涉及到的自動替換)
啓動uwsgi | uwsgi --ini uwsgi.ini |
停止uwsgi 重啓uwsgi |
uwsgi --stop uwsgi/uwsgi.pid uwsgi --reload uwsgi/uwsgi.pid |
確認進程狀態(進程號) | ps aux | grep nginx |
以上需要使用配置文件uwsgi.ini,粗暴停止可以直接殺死進程 | kill -9 pid(主進程號) |
啓動nginx | nginx |
重啓/停止/nginx |
nginx -s start/reload/stop |
配置步驟:
- 基本概念:
我們的web應用基於python的Django框架,在服務器端部署時採用nginx和uwsgi架構。nginx作爲服務器最前端,負責接收client的所有請求,統一管理。靜態請求由Nginx自己處理。非靜態請求通過uwsgi傳遞給Django,由Django來進行處理,從而完成一次WEB請求。
WSGI協議(Web Server Gateway Iterface):只要web服務器和web框架滿足WSGI協議,他們就可以互相搭配。
uwsgi:實現了WSGI協議的一個web服務器。
nginx:一個反向代理服務器,用於實現負載均衡(多服務器場景)、靜態請求和動態請求的分離。nginx通過代理的方式,對於靜態的請求,直接返回給用戶相應的靜態文件。對於動態的請求,用nginx的協議將用戶的請求封裝好,發送給uwsgi,uwsgi服務器再把請求交給後端的django處理。
- 部署過程
要將web應用部署到服務器,首先需要有一臺公網服務器,本項目使用的是阿里雲的學生服務器,操作系統爲Ubuntu 16.04,公網ip爲123.56.117.130,服務器詳細信息如下圖:
以下是項目的詳細部署過程:
- 從github上克隆項目到服務器
git clone https://github.com/RaccoonDML/ChatChat.git
- 安裝nginx(版本1.10.3)
apt-get install nginx
安裝成功後,在瀏覽器中輸入服務器ip就可以看到nginx的歡迎界面。
- 安裝uwsgi(版本2.0.18)
apt-get install python-dev
pip install uwsgi
- 測試uwsgi
在項目目錄下新建測試文件test.py
然後執行命令:
uwsgi --http :8000 --wsgi-file test.py
含義是使用uwsgi運行test.py文件,採用http協議,端口號爲8000。這時在瀏覽器中輸入123.56.117.130:8000,如果瀏覽器頁面顯示hello world說明uwsgi安裝成功,能夠正常運行。
- 測試django項目
這一步是爲了保證djanjo項目能夠在服務器端正常運行。進行本測試首先需要安裝項目requirements.txt中的依賴庫,確實環境搭建好後在項目目錄下執行命令:
python manage.py runserver 123.56.117.130:8000
如果這時通過瀏覽器訪問123.56.117.130:8000可以看到項目相應的功能界面說明django項目可以在服務器端正常運行。
- 鏈接django項目和uwsgi
這一步的目的是通過uwsgi來將用戶的請求傳遞給django,再由django來作出相應的響應。要實現這樣的功能,只需要將項目信息放到uwsgi的配置文件的啓動參數中。
在Django項目目錄下新建uwsgi.ini,輸入以下啓動信息:
這裏的socket是分配給與nginx進行通訊的端口號;工作目錄爲/home/dml/ChatChat;選擇主進程和從屬進程(工作進程)工作方式,最大工作進程數爲4。
然後就可以通過以下命令啓動uwsgi:
uwsgi --ini uwsgi.ini
但是此時項目的靜態文件是不會被加載的,需要使用nginx做靜態文件代理纔可以看到寫好的網頁。
- 配置nginx
本服務器中的nginx安裝在/etc/nginx目錄下,在配置文件nginx.conf中增加以下兩行語句,就可以讓nginx訪問conf.d和sites-enables文件夾下的配置信息。
本項目的nginx配置文件爲conf.d/chat.conf,詳細信息見下圖:
upstream django內的套接字表示nginx通過本機的8001端口和uwsgi進行通訊。這與uwsgi啓動配置文件中的端口號是一致的。
Server的內容分別表示,採用http默認的80號端口,如果是媒體文件或靜態文件請求,則直接去項目目錄的相應目錄下尋找,並直接返回給用戶。如果是其他請求,就通過前面設置的套接字遞交給uwsgi服務器處理。
- 收集Django的靜態文件
上一步已經實現了nginx去項目目錄下的static文件夾尋找靜態文件,這裏需要將項目所有的靜態文件都收集到此目錄下。
首先在django的setting.py文件中添加代碼:STATIC_ROOT = os.path.join(BASE_DIR, "static/"),此時setting.py文件中靜態文件配置部分應該是這樣:
然後到項目目錄下執行命令:
python manage.py collectstatic
這條命令在執行時,django默認會去查看定義在STATICFILES_DIRS裏的目錄,以及在INSTALLED_APPS裏定義了的app的static目錄。如果這些目錄下有文件,則把文件全部收集起來,拷貝到STATIC_ROOT目錄下。
至此我們已經可以通過瀏覽器直接訪問本項目的所有靜態文件了。
- 啓動nginx和uwsgi
完成以上配置工作後,就可以重啓nginx和uwsgi,分別輸入以下兩條命令:
nginx -s reload
uwsgi --ini uwsgi.ini
至此本項目就在服務器端部署完成了。
參考鏈接:
https://www.cnblogs.com/jhao/p/6071790.html#_label8
https://segmentfault.com/a/1190000014361352
https://www.jianshu.com/p/f1ed50f22d07
https://blog.csdn.net/lileihappy/article/details/79580291
https://blog.csdn.net/weixin_36296538/article/details/83153070