安装nginx
sudo apt install nginx
使用pip安装supervisor
pip install supervisor
使用echo_supervisord_conf生成配置文件
echo_supervisord_conf > supervisord.conf
编辑/etc/supervisord.conf
启用supervisor的web ui管理功能
[inet_http_server]
port=0.0.0.0:9001
username=user
password=123
ip
地址必须改为0.0.0.0
否则无法远程访问
gunicorn的配置
在项目根路径下创建gunicorn_demo.py
(文件名任意)
import os
import multiprocessing
# 设置守护进程
daemon=False
# 监听内网端口8000
bind='127.0.0.1:8000'
# 设置进程文件目录
pidfile='./gunicorn.pid'
chdir='./' # 工作目录
# 工作模式
# worker_class = "gevent" # gevent需要自己安装
worker_class='uvicorn.workers.UvicornWorker' # uvicorn是fastapi项目自带的WEB服务
# 并行工作进程数
workers=3 # multiprocessing.cpu_count()+1 # 根据cpu核数设置进程数
# 指定每个工作者的线程数
threads=2
# 设置最大并发量
worker_connections = 2000
loglevel='debug' # 错误日志的日志级别
access_log_format = '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"'
# 设置访问日志和错误信息日志路径
log_dir = "./log"
if not os.path.exists(log_dir):
os.makedirs(log_dir)
accesslog = "./log/gunicorn_access.log"
errorlog = "./log/gunicorn_error.log"
worker_class
:根据实际情况指定
新增项目的supervisor配置文件
查看supervisord.conf
中include
目录,在目录下新增test.ini
[program:test]
directory = /home/hc/codes/huahuiqms-shenglan
command = /home/hc/venvs/shenglan-venv/bin/python -u /home/hc/venvs/shenglan-venv/bin/gunicorn huahuiQMS:app -c gunicorn.py
redirect_stderr=true
stdout_logfile_maxbytes = 20MB
stdout_logfile_backups = 10
stdout_logfile=/var/log/test.log
stderr_logfile=/var/log/test_err.log
autostart = true
autorestart = true
redirect_stderr=true
:不设置这个所有的日志都会被写入/var/log/test_err.log
启动supervisor
supervisord -c /etc/supervisord.conf
supervisor最常见的报错信息
1、supervisor xxx entered FATAL state, too many start retries too quickly
出现这个错误的原因
1.1、gunicorn
开启了守护进程。即:daemon=True
supervisor中command启动方式为后台启动,导致识别不到pid,然后不断重启,而supervisor本身就是后台启动守护进程。
所以,将gunicorn中daemonize设置为False,再次启动,成功。
1.2、以前启动的项目进程没有完全关闭
2、unknown error making dispatchers for 'test': EACCES
出现这个错误的原因
权限问题。需要用创建/etc/supervisord.conf
文件的用户去启动supervisor
supervisor web ui管理界面
正常启动supervisor
后,打开浏览器输入http://ip:9001
输入账号密码,可见
在浏览器中查看项目日志
nginx的配置
nginx.conf 部分配置
server {
listen 80;
server_name sam_rui.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-Forwarded-For $proxy_add_x_forwarded_for;
}
}
扩展
gunicorn、supervisor、NGINX分别起什么作用
gunicorn
:可以提高服务性能。启用多进程,多线程,协程以提高服务性能。supervisor
:管理进程的工具。用来管理gunicorn
进程NGINX
:一般用于服务集群的负载均衡;还可以隐藏服务的真实IP,防止被攻击