使用 gunicorn+supervisor+nginx部署 Python Django Web 项目
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
目录
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 介绍。