使用 gunicorn+supervisor+nginx部署 Python Django Web 项目

1. gunicorn

这个服务器 叫做gunicorn(念归尼库尔),它是Python Wsgi http server,通俗说它就是一个Python的服务器。
只支持在 Unix 系统上运行。

https://gunicorn.org/ # 部署,配置方法
pip install gunicorn

1.1 gunicorn 基本配置

文件位置:service/conf.py

# -*- coding: utf8 -*-
import multiprocessing

bind = "127.0.0.1:8080"
# 启动几个实例,启动多少个进程 进程多了能接受更多的并发请求
workers = multiprocessing.cpu_count() * 2
# 使用协程提高效率
worker_class = "gevent"

1.2 静态文件配置

pass

1.3 gunicorn 启动服务

文件位置:service/config/wsgi.py

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'FastConsumer.settings')

application = get_wsgi_application()

gunicorn 启动的路径是在哪儿?
是在我们的 service 目录下去启动它就可以了。

gunicorn --config=conf.py config.wsgi:application

代码解读:
gunicorn 启动用我们的配置文件,用哪个呢?
用我们当前目录下的conf.py。

启动哪个服务呢?
启动我们config目录下的wsgi下的application。

找到我们的Django项目的service/config/wsgi.py 下,
有我们的wsgi下的application就在这里。
实际上就是把它启动起来了。

2. 使用 supervisor 做服务进程管理

当我们启动完 gunicorn 之后,我们需要对gunicorn进行服务器的监控。
因为我们现在的 Python 服务已经起来了,我们需要对我们的服务进行管理,
那么我们应该怎样管理呢?

就是使用supervisor。

那么,什么是supervisor呢?
supervisor是一个用 Python 开发的一套通用的进程管理程序。
能将一个普通的命令行以进程变为后台的demo的方式,并且监控进程的状态。
异常退出的时候,也可以自动重启。

supervisor的官方网站:
http://www.supervisor.org/
安装也很简单,通过

pip install supervisor

安装好之后,在/etc/目录下会生成一个supervisord.conf文件以及supervisord.d的一个文件目录。

那么,如果supervisord.conf文件以及supervisord.d 都没有生成的话,我们要执行以下命令来生成配置文件和文件夹:

# echo A 写入到 B ,输出重定向
echo supervisord_conf > /etc/supervisord.conf
# 创建文件夹
mkdir /etc/supervisord.d/ # sudo ...

2.1 编写 supervisor 配置文件

案例:

# vim yuyuan_consumer.conf
[program:yuyuan_consumer]
# 项目工程的目录
directory=/Users/keagen/yuyuan/python/yuyuan_consumer
# 虚拟环境下的gunicorn
command=/Users/keagen/yuyuan/python/env/bin/gunicorn --config=conf.py config.wsgi:application
# 自启 - 服务启动后,会自动启动监控
autostart=true
# 自重启 - 如果我们的服务出了问题,会自动去重启
autorestart=true
# 我们服务启动会经过1s启动
startsecs=1
# 它是启动我们supervisor的一个进程,数量一般情况下,我们启动一个就可以了
numprocs=1
# 查看我们错误日志的路径
stderr_logfile=/Users/keagen/yuyuan/python/yuyuan_consumer/err-web.log
# 输出错误日志的路径
stdout_logfile=/Users/keagen/yuyuan/python/yuyuan_consumer/out-web.log
# 我们去杀关闭这个服务的时候是允许你可以杀掉的关闭的
stopasgroup=true
# 如果我这个进程里面还有很多的一些子进程,或者说一些子线程的话,
# 那么,我们通过 killasgroup 也可以把它杀掉
killasgroup=true

以上是非常基础的supervisor里监控的一些配置方案,
那么还有很多的参数,我们也可以查阅它的官方文档去看更多的一些配置的一些参数。

2.2 启动 supervisor

在这里完成了 supervisor 的书写之后,我们就可以启动supervisor了。
怎么启动也很简单:

supervisord -c /etc/supervisord.conf

2.3 查看 supervisor 服务状态

# pwd supervisor.d
# 该命令是进入控制台命令模式
supervisorctl
### supervisor>restart yuyuan_consumer

通过 status 来查看服务状态,
通过 restart/stop/start yuyuan_consumer 对服务进行重启、关闭和开启。

服务启动后,在浏览器访问 ip:port 看是否启动成功。

3. Nginx 反向代理 gunicorn 服务

supervisor 服务启动起来之后,实际上我们到这一步,如果是作为一个接口服务器的话,实际上已经够用了,比如说如果我们不是做一个负载的话,我们有一个指定的IP,

通过这种方式就可以去访问了。

那如果我们有自己的域名,或者说我们要对它再去做一些优化,
那么可能我们就需要再去配一些新的东西了,那么是什么呢?

就是nginx,我们可以通过nginx把它反向代理到我们的 gunicorn 服务。

nginx是一个高性能的静态服务器。
它支持很多功能,比如说负载均衡,多进程,多线程,数据压缩,日志监控。限流等很多很多功能,它是目前比较主流的一个服务器。

nginx下载的方式,参考之前的Python Django 项目部署过程笔记。

3.1 Nginx 配置 Django 的方法

每个 Nginx 安装的路径可能都不一样。
所以需要先去找到我们的nginx的这个配置路径,

/usr/local/nginx/conf/nginx.conf
...
server {
    listen 8080;
      location / {
        client_max_body_size 3M;
        proxy_pass http://127.0.0.1:8031;
      }
}

client_max_body_size 是请求的最大尺寸 3 兆。
比如说 POST 请求超过3M,我现在是请求不了的。
proxy_pass 就是代理了,代理到哪儿?

假设 gunicorn 是启动在127.0.0.1:8031,
那我们通过这个地方就可以代理过来了。

实际上,如果你已经有域名了的话,比如 www.consumer.com,
那么我们可以在这加上一句话,比如说service_name www.consumer.com:

/usr/local/nginx/conf/nginx.conf
...
server {
    listen 8080;
      location / {
        #service_name  www.consumer.com;
        client_max_body_size 3M;
        proxy_pass http://127.0.0.1:8031;
      }
}

如果你有域名了,可以把这个域名儿直接放在这儿#service_name www.consumer.com;

那么你请求 www.consumer.com 就可以访问到我们的这个服务了。

然后就可以保存。完成之后,我们找到 sbin。
在 sbin下是有我们的命令工具的,
怎么看我们已经启动了?命令:

ps aux | grep nginx

如果我们现在比如说更改了配置文件,我们要重启,

# .../sbin
./nginx -s reload

那么以上就是我们通过 gunicorn 加 supervisor 再加 nginx 做的启动的方式。

实际上,在我们的 Python 启动的部署方案里,有很多种方案,比如uwsgi,我之前也写过【项目部署】Python Django部署到阿里云

甚至我们也可以不用 supervisor 去做这个进程的管理,我们可以用docker,因为docker现在也是 开发运维的常用一套部署的方案,

随着现在这个运维开发的越来越普及,像纯运维去工作和开发自己去工作这种,在我们这种创业公司会比较少,
那么开发人员也会去面临的这些运维方面的工作,
所以,会 docker 也是比较重要的一件事儿。

关于 docker 平时日常开发工作用到的命令可参考 2.2微服务必备技能Docker 介绍

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

代码写注释

请赞赏我

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

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

打赏作者

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

抵扣说明:

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

余额充值