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 介绍。
原文始发于微信公众号(基根奋斗营):【项目部署】使用 gunicorn+supervisor+nginx部署 Python Django Web 项目
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/103735.html