天天看點

【Web服務部署】使用gunicorn部署django程式并一鍵更新Web服務部署前言一、Gunicorn是什麼?二、Gunicorn基本使用三、基于配置和服務Gunicorn啟動django三、Django項目一鍵部署總結

Web服務部署

【Linux防火牆】網絡ip和端口管理

Windows雲伺服器使用IIS搭建Python+Django+Mysql網站,以及如何部署多個網站

Windows+IIS部署多個Django網站

文章目錄

  • Web服務部署
  • 前言
  • 一、Gunicorn是什麼?
  • 二、Gunicorn基本使用
    • 1.引入庫
    • 2.常用指令
    • 3.gunicorn快速啟動
  • 三、基于配置和服務Gunicorn啟動django
    • 1.建立gunicorn_config.py檔案
    • 2.建立gunicorn.service檔案
  • 三、Django項目一鍵部署
    • 1.建立nginx.conf檔案
    • 2.建立deploy.sh檔案
    • 3.Linux部署Django項目
      • 3.1 通過ssh連接配接至linux伺服器
      • 3.2 linux安裝git、nginx
      • 3.3 通過git clone 将代碼拉取到/opt/目錄
      • 3.4 通過軟連接配接建立gunicorn服務
      • 3.5 通過軟連接配接配置nginx
      • 3.6 通過軟連接配接建立sh一鍵更新
      • 3.7 sh一鍵更換django分支項目
  • 總結

前言

Django程式有很多方式部署,不同系統采取的方式也不一樣。使用gunicorn啟動Django的服務可以提高并發能力。

一、Gunicorn是什麼?

Gunicorn是一個 Python 的 WSGI HTTP 伺服器。它所在的位置通常是在反向代理(如 Nginx)和一個 web 應用(如django)之間,支援eventlet也支援greenlet。

Gunicorn啟動項目之後一定會有一個主程序Master和一個或者多個工作程序。工作程序的數量可以指定。工作程序是實際處理請求的程序。主程序維護伺服器的運作。

二、Gunicorn基本使用

1.引入庫

代碼如下(示例):
# gunicorn是python庫,根據參數不同,需要導入的庫會有差别
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple gunicorn 
           

2.常用指令

gunicorn安裝後,可以在指令行使用gunicorn的相關指令,gunicorn -h 可以看到全部指令參數和對應注釋(英文)。指令及配置後邊會用到,配置的内容有很多,參考Gunicorn-配置詳解。

gunicorn -h # 檢視gunicorn的指令參數
gunicorn -v # gunicorn的版本
           

3.gunicorn快速啟動

-w:是workers參數配置的簡寫

-b:是bind參數配置簡寫

projectname是項目目錄中的項目檔案,與manage.py同級

cd django項目目錄(目錄包含manage.py和projectname目錄)
gunicorn -w 4 -b 127.0.0.1:8000 projectname.wsgi:application
           

三、基于配置和服務Gunicorn啟動django

1.建立gunicorn_config.py檔案

在gunicorn -h指令中,參數配置很多,根據項目不同參數的使用也有差距,可以想象參數多的情況下,gunicorn 指令會很長。gunicorn 中有一個參數-c,這個參數允許我們編寫config.py配置檔案,通過指令gunicorn -c config.py啟動。

為了友善與其他檔案區分,配置檔案名字為gunicorn_config.py,位置為django項目目錄,與manage.py同級。

【Web服務部署】使用gunicorn部署django程式并一鍵更新Web服務部署前言一、Gunicorn是什麼?二、Gunicorn基本使用三、基于配置和服務Gunicorn啟動django三、Django項目一鍵部署總結
代碼如下(示例):
# -*- coding:utf-8 _*-
"""
@author:lenovo
@file: gunicorn_config.py
@time: 2023/3/2  9:57
"""
import os
import multiprocessing

bind = '127.0.0.1:8000'  # 指定監聽的位址和端口,用于nginx轉發
backlog = 2048  # 伺服器中排隊等待的最大連接配接數,建議值64-2048,超過2048時client連接配接會得到一個error。

workers = multiprocessing.cpu_count() * 2 + 1  # 用于處理工作的程序數,這裡使用了文檔建議的值
worker_class = 'gthread'  # worker程序的工作方式,有sync、eventlet、gevent、tornado、gthread, 預設值sync, django使用gthread的方式好一些。
worker_connections = 1000  # 最大用戶端并發數量,預設情況下這個值為1000。此設定将影響gevent和eventlet工作模式

threads = int(480 / workers)  # 資料庫連接配接數=workers*threads*2
timeout = 60  # 通路逾時時間,預設30s
graceful_timeout = 60  # 接收到restart信号後,worker可以在graceful_timeout時間内,繼續處理完目前requests。
keepalive = 2  # server端保持連接配接時間,預設情況下值為2。一般設定在1~5秒之間。
limit_request_line = 4094  # HTTP請求行的最大大小,預設值為4094。範圍是0~8190,此參數可以防止任何DDOS攻擊
limit_request_fields = 100  # 限制HTTP請求中請求頭字段的數量,預設值為100,範圍是0~32768,此參數可以防止任何DDOS攻擊
limit_request_field_size = 8190  # 限制HTTP請求中請求頭的大小,預設值為8190

reload = False  # 代碼更新時不重新開機項目
daemon = False  # Gunicorn是否為守護程序(後端程序),預設為False
# max_requests = 1000  # 有記憶體洩露時使用此選項重新開機work
# max_requests_jitter = 50  # 重新開機work的抖動幅度,一般設定為max_requests的5%
pidfile = '/tmp/gunicorn.pid'  # pid檔案的檔案名

# keyfile = '.../server.key'  # ssl證書密鑰檔案路徑
# certfile = '.../server.crt'  # ssl證書檔案路徑

accesslog = '-'  # 通路日志檔案路徑,'-'表示輸出到終端
access_log_format = '%(t)s %(h)s "%(r)s" %(s)s %(b)s "%(f)s" "%(L)s"'  # 通路日志檔案格式

errorlog = '/tmp/gunicorn.log'  # 錯誤日志檔案路徑,'-'表示輸出到終端
# loglevel = '-'  # 錯誤級别,debug(調試)、info(資訊)、warning(警告)、error(錯誤)、critical(危急)

pythonpath = '/home/ubuntu/anaconda3/bin/python -u'  # 逗号分隔的Python執行路徑,可以加上參數,這裡隻有一個路徑,-u表示使用無緩沖的二進制終端輸出流
project_name = 'Discern'
proc_name = 'gunicorn_%s' % project_name  # 設定程序名稱
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '%s.settings' % project_name)  # 設定環境變量指定Django運作使用的配置檔案
os.environ.setdefault('WERKZEUG_RUN_MAIN', 'true')  # 設定環境變量告訴wekzeug這個是用于reload的主程序
           

2.建立gunicorn.service檔案

在Linux系統,我們可以建立自己的服務來管理我們的配置,我們需要建立gunicorn.service檔案。

檔案位置與gunicorn_config.py同級。

【Web服務部署】使用gunicorn部署django程式并一鍵更新Web服務部署前言一、Gunicorn是什麼?二、Gunicorn基本使用三、基于配置和服務Gunicorn啟動django三、Django項目一鍵部署總結

這裡有幾個參數需要注意,User和Group應使用目前登入的linux使用者群組,WorkingDirectory是django項目目錄,ExecStart是步驟1中的參數啟動指令。

代碼如下(示例):
[Unit]
Description=gunicorn daemon
After=network.target

[Service]
Type=simple
pidfile=/tmp/gunicorn.pid
User=ubuntu
Group=ubuntu

RuntimeDirectory=gunicorn
WorkingDirectory=/opt/Mercury/Discern/
ExecStart=/home/ubuntu/anaconda3/bin/gunicorn -c /opt/Mercury/Discern/gunicorn_config.py Discern.wsgi:application
ExecReload=/bin/kill -s hup $mainpid
ExecStop=/bin/kill -s quit $mainpid
PrivateTmp=true

[Install]
WantedBy=multi-user.target

           

三、Django項目一鍵部署

1.建立nginx.conf檔案

nginx.conf的位置為django項目目錄,與manage.py同級。

【Web服務部署】使用gunicorn部署django程式并一鍵更新Web服務部署前言一、Gunicorn是什麼?二、Gunicorn基本使用三、基于配置和服務Gunicorn啟動django三、Django項目一鍵部署總結
代碼如下(示例):
server{
    listen 80;
    listen [::]:80;
    server_name xxx.com;
    # rewrite ^(.*)$ https://$host$1 permanent;
    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_http_version 1.1;
        proxy_redirect off;
        # 後端的Web伺服器可以通過X-Forwarded-For擷取使用者真實IP;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
           

2.建立deploy.sh檔案

deploy.sh的位置為django項目目錄,與manage.py同級。

【Web服務部署】使用gunicorn部署django程式并一鍵更新Web服務部署前言一、Gunicorn是什麼?二、Gunicorn基本使用三、基于配置和服務Gunicorn啟動django三、Django項目一鍵部署總結
代碼如下(示例):
#! /bin/bash

cd /opt/django項目/ && git pull && python3 manage.py makemigrations && python3 manage.py migrate && sudo systemctl restart gunicorn && sudo systemctl restart nginx
           

3.Linux部署Django項目

gunicorn_config.py、gunicorn.service、nginx.conf、deploy.sh4個檔案需要與項目一同上傳git,便于後期更新和修改。

3.1 通過ssh連接配接至linux伺服器

參考:通過SSH連接配接到Linux伺服器

3.2 linux安裝git、nginx

sudo apt update && sudo apt upgrade -y  # 軟體一鍵更新至最新
sudo apt install git nginx
git --version
nginx -v
           

3.3 通過git clone 将代碼拉取到/opt/目錄

cd /opt
git clone https://xx.git
pip3 install xx # 建立項目的環境,安裝python三方庫
# django 項目git更新和資料庫更新指令已寫入deploy.sh檔案
           

3.4 通過軟連接配接建立gunicorn服務

pip3 install gunicorn
sudo rm /etc/systemd/system/gunicorn.service
sudo ln -s /opt/Mercury/Discern/gunicorn.service /etc/systemd/system/gunicorn.service
           

服務建立後可以使用3個指令管理gunicorn,啟動指令已寫入deploy.sh檔案

sudo systemctl start gunicorn # 啟動
sudo systemctl enable gunicorn # 暫停
sudo systemctl status gunicorn  # 檢視狀态
           

3.5 通過軟連接配接配置nginx

sudo ln -s /opt/Mercury/Discern/nginx.conf /etc/nginx/conf.d/nginx.conf
           

可以使用3個指令管理nginx服務,啟動指令已寫入deploy.sh檔案

sudo systemctl start nginx # 啟動
sudo systemctl enable nginx  # 暫停
sudo systemctl status nginx   # 檢視狀态
           

3.6 通過軟連接配接建立sh一鍵更新

sudo ln -s /opt/Mercury/Discern/deploy.sh /home/ubuntu/deploy.sh
           

通過1-6的相關配置,後期git代碼更新後,我們隻需要ssh使用者登入後,一條sh deploy.sh指令即可實作django項目一鍵更新。(更新的時候需要輸入git賬戶密碼和ssh用登陸密碼)

3.7 sh一鍵更換django分支項目

我們平時使用git都會有很多分支,常見分支是master和develop,一般情況下,master分支是線上版本分支,develop是開發或測試分支。我們可以修改deploy.sh檔案,實作測試服務和線上服務的一鍵更新或分支切換。主需要更改git pull 指令。

代碼如下(示例):
#! /bin/bash

cd /opt/django項目/ && git pull origin develop:develop&& git checkout develop && python3 manage.py makemigrations && python3 manage.py migrate && sudo systemctl restart gunicorn && sudo systemctl restart nginx
           

總結

使用gunicorn部署django程式有很多方式,本片部落格是本人用的比較多的方式,一鍵更新主要是為了節省時間。