Django+Daphne+Supervisor+Nginx web項目部署流程案例 內網環境

Django Web項目部署流程

大綱

  1. 環境說明
    1. 系統環境:Debian10
    2. 代碼運行環境:Python3.8
    3. 網絡服務器:Daphne(支持wsgi和asgi協議)
    4. 反向代理:Nginx
    5. 進程管理:Supervisor
    6. 項目說明:http+websocket,需要用到asgi協議
  2. 部署的流程
    1. 環境準備
    2. 代碼git同步
    3. 應用服務化
  3. 特殊的說明

一.環境準備

操作系統:Debian10

  1. 系統自行安裝即可

  2. 如果是在內網部署,需要更新源:

   cd etc/apt/
   vi source.list

   # 對內容進行修改,註釋原url
   # deb http//deb.debian.org/debian/ buster-updates man contrib
   # deb-src http://deb,debian.org/debian/ buster-updates man contrib
   # 添加內網源url
   deb [trusted=yes] http://192.168.68.192/debian/ buster-updates main contrib
   deb-src [trusted=yes] http://192.168.68.192/debian buster-updates main contrib

   deb [trusted=yes] http://192.168.68.192/debian/ buster main contrib
   deb-src [trusted=yes] http://192.168.68.192/debian buster main contrib

   deb [trusted=yes] http://192.168.68.192/debian/ buster-backports main contrib
   # 然後保存並退出

   # 執行源檢查,因爲內網源可能會過期等問題,所以我們跳過源驗證
   apt update -o Acquire::Check-Valid-Until=false --allow-insecure-repositories
   apt upgrade --allow-unauthenticated
  1. 檢查ssh是否正常工作systemctl status sshd
   # 配置ssh,使可以root用戶登錄
   vi /etc/ssh/sshd_config
   
   將 #PermitRootLogin prohibit-password 更改爲 PermitRootLogin yes
   將 #PasswordAuthentication yes 前面的#去掉
   
   # 然後保存文件,重啓ssh即可,systemctl restart sshd

項目運行環境:Python3.8

debian10中自帶了python2.7和python3.7,但是我們的項目需要運行在python3.8的環境中。此處我們使用源碼包編譯的方式安裝python3.8

  1. 將源碼包Python-3.8.10.tar上傳至服務器,可使用scp命令:scp 本地路徑  user@ip:/絕對路徑

  2. 解壓源碼包:tar xvf Python-3.8.10.tar,如果是.tar.gz結尾的話就用tar zxvf Python-3.8.10.tar命令解壓,最終會解壓到當前目錄下的Python-3.8.10目錄中

  3. 準備環境

   # 確保 _ctypes
   apt install libffi-dev
   # 確保 _sqlite3
   apt install libsqlite3-dev
   # 確保 _ssl 這一步可以不先執行,出現 No module named '_ssl'再執行也可
   根據博客:my.oschina.net/u/4050197/blog/5553562 操作即可
  1. 進入Python-3.8.10.tar目錄,執行./configure --prefix=/opt/python3.8 ,prefix參數用於指定python安裝路徑

  2. 編譯安裝:make && make install

  3. 如果出現找不到gcc或make命令的問題,那麼執行

   apt install gcc libc6-dev  # 這一步確保gcc
   apt install automake autoconf libtool make # 這一步確保安裝make
  1. 命令行中輸入python3.8 --version查看是否安裝成功

  2. 確認pip已安裝,apt install python3-pip, pip3 --version

網絡服務器

Daphne是python的一個庫,在後續代碼部署時安裝即可

反向代理

  1. 安裝Nginx:apt install nginx

進程管理

  1. 安裝Supervisor:apt install supervisor

二.開始部署

1. 使用git同步代碼

  1. git clone 代碼地址,如果出現權限問題請檢查用戶,如果出現ssh問題請檢查證書(證書問題請查看其他文檔)
  2. 進入項目,切換至目標分支,git checkout 分支名
  3. 配置git,使之不用每次拉代碼都要輸入用戶名和密碼(查閱其他文檔)

2. 準備python虛擬環境

  1. python3.8 -m venv venv,該命令會在當前目錄下創建一個名爲venv的目錄,裏面就是python虛擬環境
  2. source venv/bin/activate, 運行該命令後會進入虛擬環境,此時python命令就能指代python3.8

3. 安裝項目

  1. 在進入虛擬環境的前提下進入項目目錄,執行pip install -r requirements.txt
  2. 安裝項目:python setup.py develop
  3. 測試運行:daphne ly_web_server.asgi:application -b 0.0.0.0 -p 8001 ,如果沒報錯即可;ctrl+c退出

4. 項目服務化

  1. 配置supervisor
   cd etc/supervisor
   vi  supervisord.conf
   
   查看如下對應信息
   [include]
   files = /xxx/*.ini
   
   也可以自己設定讀取路徑
   [include]
   files = /etc/supervisor/supervisord.d/*.ini
  1. 配置自己的配置,vi /etc/supervisor/supervisord.d/asgi.ini
   [program:daphne]
   directory=/home/ly_web_server/ly_web_server # 項目路徑
   command=/home/ly_web_server/ly_web_server/venv/bin/daphne -b 0.0.0.0 -p 8000 --proxy-headers ly_web_server.asgi:application
   # daphne啓動命令 虛擬環境要指定daphne的絕對路徑
   autostart=true
   autorestart=true
   stdout_logfile=/opt/websocket.log # 運行日誌保存路徑
   redirect_stderr=true
  1. 運行服務,supervisord -c /etc/supervisor/supervisord.d/asgi.ini
   supervisorctl status # 查看啓動狀態
   
   有如下消息說明正常啓動
   daphne                           RUNNING   pid 19997, uptime 0:21:53
  1. 服務管理:
   supervisorctl # 進入supervisor環境
   supervisorctl reread # 重載配置
   supervisorctl update # 更新
   supervisorctl start all # 開啓
   supervisorctl status # 查看啓動狀態

6. 配置反向代理

nginx配置如下:

upstream channels-backend {
        server 0.0.0.0:8000; # dephne配置的web服務地址
}
map $http_upgrade $connection_upgrade{
  default upgrade;
  "" close;
}
server {
        listen 80; # 提供客戶端訪問的端口號
        location / {
                proxy_pass http://channels-backend;

                proxy_http_version 1.1;  # 設置websocket網絡協議支持
                proxy_set_header Upgrade $http_upgrade; # 設置websocket網絡協議支持
                proxy_set_header Connection "upgrade"; # 設置websocket網絡協議支持

                proxy_redirect off; # 是否支持重定向
                proxy_set_header Host $host; # 服務器本身的ip
                proxy_set_header X-Real-IP $remote_addr; # 客戶端的ip
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 路由順序
                proxy_set_header X-Forwarded-Host $server_name;
        }
}

systemctl restart nginxnginx -s reload即可

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