Django+uwsgi+asgi+nginx部署專案
- Uwsgi
- uwsgi.ini 中 http 與socket 區別:
- 檔案目錄位置
- 啟動uwsig
- 啟動 websokcet的ASGI
- 啟動配置
- 踩坑
- nginx 配置
Uwsgi
uWSGI 組態檔中 Magic variables的含義 前綴為百分號:
%v vassals 目錄 (pwd)
%V uWSGI 版本
%H 主機名
%o 在命令列中指定的原始組態檔名
%O 與 %o 相同,但指的是第一個非模板組態檔(版本 1.9.18)
%p 組態檔的絕對路徑
%P 與 %p 相同,但參考第一個非模板組態檔(版本 1.9.18)
%s 組態檔的檔案名
%S 與 %s 相同,但指的是第一個非模板組態檔(版本 1.9.18)
%d 包含組態檔的目錄的絕對路徑
%D 與 %d 相同,但指的是第一個非模板組態檔(版本 1.9.18)
%e 組態檔的擴展名
%E 與 %e 相同,但指的是第一個非模板組態檔(版本 1.9.18)
%n 沒有擴展名的檔案名
%N 與 %n 相同,但參考第一個非模板組態檔(版本 1.9.18)
%C 包含組態檔的目錄的名稱(版本 1.3+)
%C 與 %c 相同,但指的是第一個非模板組態檔(版本 1.9.18)
%t unix 時間(以秒為單位,在實體啟動時收集)(版本 1.9.20-dev+)
%T unix 時間(以微秒為單位,在實體啟動時收集)(版本 1.9.20-dev+)
%x 當前部分識別符號,例如,config.ini:section(版本 1.9-dev+)
%X 與 %x 相同,但參考第一個非模板組態檔(版本 1.9.18)
%i 檔案的 inode 編號(版本 2.0.1)
%I 與 %i 相同,但指的是第一個非模板組態檔
%0..%9 包含組態檔的目錄完整路徑的特定組件(版本 1.3+)
%[ ANSI 轉義符“\033”(用于列印顏色)
%k 檢測到的 CPU 內核(版本 1.9.20-dev+)
%u 運行行程的用戶的 uid(2.0 版)
%U 運行行程的用戶的用戶名(如果可用,否則回退到 uid)(版本 2.0)
%G 運行該行程的用戶的 gid(版本 2.0)
%G 運行行程的用戶的組名(如果可用,否則回退到 gid)(版本 2.0)
%j 完整配置路徑的 djb33x 哈希的十六進制表示
%J 與 %j 相同,但指的是第一個非模板組態檔
先放上配置頁面 uwsgi.ini檔案:
[uwsgi]
#專案目錄
chdir = %d../vs12_service_api
#指定IP埠,如果
;http = :8007
socket = 0.0.0.0:8008
#指定專案的application
module = vs12_service_api.wsgi:application
#行程
#啟動個worker行程數量
processes = 3
#每個worker行程中創建執行緒數量
threads = 3
#設定用于uwsgi包決議的內部快取區大小單位位元組,默認是4k,
buffer-size = 65535
#set cpu affinity 這個地方不太懂 以前老專案這么設定的我也拿過來用了
cpu-affinity = 1
run_dir = %(chdir)/../run
#指定pid檔案
pidfile = %(run_dir)/uwsgi.pid
#指定log檔案
logto = %(run_dir)/uwsgi.log
#設定最大log檔案大小
log-maxsize = 100000000
# 在每個worker而不是master中加載應用,默認為false,表示先加載應用,再fork出worker,這樣做可以讓work盡量共用記憶體,只有當寫時才copy
# 由于先加載再fork,但有些東西是不支持fork的,比如socket連接,所以lazy-apps=false時,不要在加載應用時自動創建資料庫連接等
lazy-apps = true
uwsgi.ini 中 http 與socket 區別:
先說最簡單的 http 這個是作為一個獨立的服務器啟動 ,然后由NGINX
作為一個比如18008埠的中介用來轉發,如上面配置,瀏覽器或著postman, 還是能直接訪問這個8007埠的 socket
是在記憶體中遵循socket協議和NGINX記憶體交換,不可以直接用瀏覽器或者postman直接訪問
http與socket在nginx中的設定也是不一樣的,文章中的nginx設定只是配置的socket的,如果是http則需要另外配置
檔案目錄位置
uwsgi.ini 可以放到專案中的 manage.py 檔案的同級別目錄下,也可以像我一樣放在專案的外面,專案結構如下圖,圖可見 我的uwsgi.ini 放在的專案同級別檔案deploy中了,所以再配置中 指定專案目錄時要 通過 ”%d…/ “ 找到對應的專案

啟動uwsig
uwsgi --ini deploy/uwsgi.ini #啟動命令
[uWSGI] getting INI configuration from deploy/uwsgi.ini
可以通過 ini檔案中配置的log檔案 查看運行狀態:
sudo tail -n 10 -f run/uwsgi.log
[pid: 31725|app: 0|req: 1/1] 192.168.99.134 () {46 vars in 862 bytes} [Fri Sep 10 16:23:27 2021] GET /v1/system/equipment/group => generated 7868 bytes in 314 msecs (HTTP/1.1 200) 5 headers in 177 bytes (1 switches on core 0)
/home/zhao/.virtualenvwrapper/vs12Env/lib/python3.7/site-packages/pymysql/cursors.py:170: Warning: (3135, "'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.")
result = self._query(query)
/home/zhao/.virtualenvwrapper/vs12Env/lib/python3.7/site-packages/pymysql/cursors.py:170: Warning: (3135, "'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.")
result = self._query(query)
station {'uuid': '3525f36db2c14df2a68efef29eaa2647', 'station_id': 1, 'station_name': '本地測驗衛通站', 'station_code': '007', 'manager': None, 'station_type': 1, 'frequency_range': 14, 'longitude': 117.0645, 'latitude': 36.95, 'antenna_power': 40, 'antenna_aperture': 2, 'station_status': 1, 'satellite_id': 101541, 'station_ip': '192.168.99.15', 'station_port': 8007, 'inet_mask': '255.255.255.0 ', 'inet_gateway': '8010'}
[pid: 31724|app: 0|req: 1/2] 192.168.99.134 () {46 vars in 838 bytes} [Fri Sep 10 16:23:29 2021] GET /v1/station/station/info => generated 489 bytes in 223 msecs (HTTP/1.1 200) 5 headers in 150 bytes (1 switches on core 0)
[pid: 31723|app: 0|req: 1/3] 192.168.99.134 () {46 vars in 840 bytes} [Fri Sep 10 16:23:29 2021] GET /v1/system/equipment/topo => generated 518483 bytes in 262 msecs (HTTP/1.1 200) 5 headers in 179 bytes (1 switches on core 0)
[pid: 31724|app: 0|req: 2/4] 192.168.99.134 () {42 vars in 810 bytes} [Fri Sep 10 16:23:30 2021] GET /v1/system/equipment/topo?id=6 => generated 123720 bytes in 35 msecs (HTTP/1.1 200) 5 headers in 179 bytes (1 switches on core 1)
啟動 websokcet的ASGI
因為本次websocket是用的django channles庫,默認用的是asgi ,所以使用官方推薦的asgi服務器daphne來啟動
需要用的庫,django是2.2.2 如果是其他版本可能庫的版本有所區別:
pip install channels==2.4.0
pip install channels-redis==2.3.2
pip install asgiref==3.2.1
pip install daphne==2.5.0
啟動配置
在settings.py同級目錄中添加asgi.py檔案內容如下:
import os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "vs12_service_api.settings")
django.setup()
from channels.auth import AuthMiddlewareStack
from channels.routing import get_default_application
from channels.auth import AuthMiddlewareStack
from channels.sessions import SessionMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
import vs12_system.routing
application = ProtocolTypeRouter({
# "http": get_default_application(),
'websocket': AuthMiddlewareStack(
URLRouter(
vs12_system.routing.websocket_urlpatterns
)
),
})
settings.py檔案中添加配置:
INSTALLED_APPS = [
'channels',
...
]
# 這里對應剛剛創建的asgi檔案中的application
ASGI_APPLICATION = 'vs12_service_api.asgi.application'
在mange.py 同級目錄下運行:
#跟settings檔案中的ASGI_APPLICATION 相對應啟動埠為 8009
#啟動
daphne vs12_service_api.asgi:application -b 0.0.0.0 -p 8009 #啟動命令
[WARNING] DJANGO_SETTINGS_MODULE=vs12_service_api.settings
Will use settings/local.py
2021-09-10 16:12:54,313 INFO Starting server at tcp:port=8009:interface=0.0.0.0
2021-09-10 16:12:54,314 INFO HTTP/2 support not enabled (install the http2 and tls Twisted extras)
2021-09-10 16:12:54,314 INFO Configuring endpoint tcp:port=8009:interface=0.0.0.0
2021-09-10 16:12:54,316 INFO Listening on TCP address 0.0.0.0:8009
具體 websocket 開發可以參考:
Django使用Channels實作WebSocket訊息通知功能
踩坑
如果出現 ***AttributeError: module ‘asyncio.coroutines’ has no attribute ‘_is_coroutine’***這個錯誤有可能是 asgiref 的版本不對 ,安裝 3.2.1版本
pip install asgiref==3.2.1
nginx 配置
server{
#監聽8007埠
listen 18007;
#因為webocket的 url開始是equipment所以監聽 以 /equipment開頭的url
location /equipment {
proxy_pass http://127.0.0.1:8007;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
location /v1 {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#埠要和uwsgi里配置的一樣
uwsgi_pass uwsgi://127.0.0.1:8008;
include uwsgi_params;
}
location / {
root /srv/vs12prj/vs12prj/src/dist;
try_files $uri $uri/ /index.html;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/299152.html
標籤:其他
上一篇:java OA系統 自定義表單 流程審批 電子印章 手寫文字識別 電子簽名 即時通訊
下一篇:linux相關命令及怎么發布檔案
