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同級。

代碼如下(示例):
# -*- 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同級。
這裡有幾個參數需要注意,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同級。
代碼如下(示例):
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同級。
代碼如下(示例):
#! /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程式有很多方式,本片部落格是本人用的比較多的方式,一鍵更新主要是為了節省時間。