【Django】如何使用gunicorn部署django程序

原文作者:我辈理想
版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。

Web服务部署

【Linux防火墙】网络ip和端口管理
Windows云服务器使用IIS搭建Python+Django+Mysql网站,以及如何部署多个网站
Windows+IIS部署多个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程序有很多方式,本片博客是本人用的比较多的方式,一键更新主要是为了节省时间。

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Django是一个优秀的Web框架,可以帮助开发者快速构建Web应用程序。但是,当我们需要将Django应用程序部署到生产环境时,我们需要考虑很多方面,例如性能、安全、可靠性等。本文将介绍如何使用Gunicorn和Nginx将Django应用程序部署到生产环境中。 ## 准备工作 在开始之前,我们需要在服务器上安装一些必要的软件包和库。 ### 安装Python和pip 首先,我们需要在服务器上安装Python和pip。如果您已经安装了它们,请跳过此步骤。 ```shell # Ubuntu sudo apt-get update sudo apt-get install python3 python3-pip # CentOS sudo yum update sudo yum install python3 python3-pip ``` ### 创建虚拟环境 为了避免与其他Python应用程序的依赖项冲突,我们建议在服务器上使用虚拟环境。在此过程中,我们将使用venv创建一个虚拟环境。 ```shell python3 -m venv myenv source myenv/bin/activate ``` ### 安装DjangoGunicorn 一旦我们进入虚拟环境,我们可以使用pip安装DjangoGunicorn。 ```shell pip install django gunicorn ``` ## 配置Gunicorn Gunicorn是一个Python WSGI HTTP服务器,可以处理Django应用程序的并发请求。下面是如何配置Gunicorn。 ### 创建Gunicorn配置文件 我们可以为Gunicorn创建一个配置文件。在此过程中,我们将创建一个名为`gunicorn_config.py`的文件。 ```python bind = "127.0.0.1:8000" workers = 3 user = "myuser" ``` 在这个配置文件中,我们定义了以下几个参数: - `bind`:指定Gunicorn绑定的IP地址和端口号。 - `workers`:指定Gunicorn启动的工作进程数。 - `user`:指定Gunicorn运行的用户。 请注意,我们将Gunicorn绑定到`127.0.0.1`地址,这意味着它只能在本地访问。如果您想让Gunicorn在公共IP地址上运行,请使用`0.0.0.0`。 ### 启动Gunicorn 一旦我们创建了配置文件,我们可以使用以下命令启动Gunicorn。 ```shell gunicorn myproject.wsgi:application -c gunicorn_config.py ``` 在这个命令中,我们指定了Django的WSGI入口点`myproject.wsgi:application`,以及Gunicorn配置文件`gunicorn_config.py`。 ## 配置Nginx 现在我们已经成功启动了Gunicorn,我们需要将Nginx配置为反向代理,以便客户端可以通过Nginx访问我们的应用程序。 ### 安装Nginx 如果您还没有安装Nginx,请按照以下步骤进行安装。 ```shell # Ubuntu sudo apt-get update sudo apt-get install nginx # CentOS sudo yum update sudo yum install nginx ``` ### 创建Nginx配置文件 我们需要为Nginx创建一个配置文件。在此过程中,我们将创建一个名为`myproject.conf`的文件。 ```nginx server { listen 80; server_name example.com; access_log /var/log/nginx/access.log; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } ``` 在这个配置文件中,我们定义了以下几个参数: - `listen`:指定Nginx监听的端口号。 - `server_name`:指定Nginx的域名。 - `access_log`:指定Nginx的访问日志路径。 - `location`:指定Nginx的URL匹配规则和反向代理设置。 请注意,我们将Nginx绑定到`example.com`域名,并将所有请求转发到Gunicorn运行的`127.0.0.1:8000`地址。 ### 重启Nginx 一旦我们创建了配置文件,我们可以使用以下命令重新启动Nginx。 ```shell sudo service nginx restart ``` ## 结论 现在我们已经成功地将Django应用程序部署到生产环境中。我们使用Gunicorn处理并发请求,并使用Nginx作为反向代理,以提高性能和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我辈李想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值