pip3 install virtualenv
cd /data/ops
virtualenv -p /usr/bin/python3 backstage
source backstage/bin/activate
pip install gunicorn gevent
cd backstage
# 创建管理启动python程序代码: vim gunicorn_flask.py
# gunicorn_test.py
import logging
import logging.handlers
from logging.handlers import WatchedFileHandler
import os
import multiprocessing
# 绑定ip和端口号
bind = '0.0.0.0:8000'
# 监听队列
backlog = 512
# 设置超时时间120s,默认为30s。按自己的需求进行设置timeout = 120
timeout = 120
# 超时重启
graceful_timeout = 300
# 在keep-alive连接上等待请求的秒数,默认情况下值为2。一般设定在1~5秒之间。
keepalive = 3
# HTTP请求行的最大大小,此参数用于限制HTTP请求行的允许大小,默认情况下,这个值为4094。
# 值是0~8190的数字。此参数可以防止任何DDOS攻击
limit_request_line = 5120
# 限制HTTP请求中请求头字段的数量。
# 此字段用于限制请求头字段的数量以防止DDOS攻击,与limit-request-field-size一起使用可以提高安全性。
# 默认情况下,这个值为100,这个值不能超过32768
limit_request_fields = 101
# 限制HTTP请求中请求头的大小,默认情况下这个值为8190。
# 值是一个整数或者0,当该值为0时,表示将对请求头大小不做限制
limit_request_field_size = 8190
# 设置gunicorn使用的python虚拟环境
pythonpath='/data/ops/backstage/bin/python'
# 环境变量
raw_env = 'APE_API_ENV=DEV'
# gunicorn要切换到的目的工作目录
chdir = '/data/ops/backstage'
# 使用gevent模式,还可以使用sync 模式,默认的是sync模式
worker_class = 'gevent'
# 并行工作进程数, int,cpu数量*2+1 推荐进程数
workers = multiprocessing.cpu_count() * 2 + 1
threads = 1000 # 指定每个进程开启的线程数
# 设置最大并发量(每个worker处理请求的工作线程数,正整数,默认为1)
worker_connections = 2000
# 最大客户端并发数量,默认情况下这个值为1000。此设置将影响gevent和eventlet工作模式
max_requests = 2000
# 设置进程文件目录
pidfile = '/data/ops/backstage/run/gunicorn.pid'
# 日志级别,这个日志级别指的是错误日志的级别,而访问日志的级别无法设置
# 日志级别有: debug, info, warning, error, critical.
loglevel = 'info'
# 设置gunicorn访问日志格式,错误日志无法设置
access_log_format = '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"'
# 设置访问日志和错误信息日志路径
accesslog = "/data/ops/backstage/logs/gunicorn_access.log" #访问日志文件
errorlog = "/data/ops/backstage/logs/gunicorn_error.log" #错误日志文件
# 进程名
proc_name = 'gunicorn_process'
"""
其每个选项的含义如下:
h remote address
l '-'
u currently '-', may be user name in future releases
t date of the request
r status line (e.g. ``GET / HTTP/1.1``)
s status
b response length or '-'
f referer
a user agent
T request time in seconds
D request time in microseconds
L request time in decimal seconds
p process ID
"""
mkdir run logs
yum -y install epel-release
yum makecache
yum -y install supervisor
vim /etc/supervisord.d/supervisord_gunicorn.ini
; 项目名
[program:gunicorn]
; 项目目录
directory=/data/ops/backstage
command=/data/ops/backstage/bin/gunicorn -c gunicorn_flask.py main:app ;main:指的是main.py代码文件,app指的是app = Flask(__name__)
; supervisor启动的时候是否随着同时启动,默认True
autostart=true
autorestart=false
; 这个选项是子进程启动多少秒之后,此时状态如果是 running,则我们认为启动成功了。默认值为1
startsecs=1
; 当进程启动失败后,最大尝试的次数。当超过5次后,进程的状态变为FAIL
startretries=5
; 这个东西主要用于,supervisord管理的子进程,这个子进程本身还有子进程。那么我们如果仅仅干掉supervisord的子进程的话,子进程的子进程有可能会变成孤儿进程。所以可以设置这个选项,把整个该子进程的整个进程组干掉。默认false
stopasgroup=true
; 程序运行的用户身份
user = root
# 日志输出
stderr_logfile=/data/ops/backstage/logs/app_err.log
stdout_logfile=/data/ops/backstage/logs/app_stdout.log
#把stderr重定向到stdout,默认 false
redirect_stderr = true
#stdout日志文件大小,默认 50MB
stdout_logfile_maxbytes = 100MB
#stdout日志文件备份数
stdout_logfile_backups = 20
# 启动supervisord并设置开机自启
systemctl enable --now supervisord.service
# nginx配置: vim flask.conf
upstream flask {
ip_hash;
server 127.0.0.1:8000;
server 172.17.0.100:8000;
}
server {
listen 99;
server_name 172.17.0.100 192.168.240.42;
location / {
proxy_pass http://flask;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
# nginx部署在/data/software/nginx
vim /etc/supervisord.d/supervisord_nginx.ini
[program: nginx]
; 管理的子进程。后面的是名字,最好写的具有代表性,避免日后"认错"
; 我们的要启动进程的命令路径,可以带参数。
command=/data/software/nginx/sbin/nginx -g 'daemon off;'
; 进程运行前,会先切换到这个目录
directory=/data/software/nginx/etc
; 设置子进程挂掉后自动重启的情况,有三个选项,false,unexpected和true。false表示无论什么情况下,都不会被重新启动;unexpected表示只有当进程的退出码不在下面的exitcodes里面定义的退出码的时候,才会被自动重启。当为true的时候,只要子进程挂掉,将会被无条件的重启
autostart=true
autorestart=true
# 这个选项是子进程启动多少秒之后,此时状态如果是 running,则我们认为启动成功了。默认值为1
startsecs=1
; 日志,没什么好说的
stderr_logfile=/data/software/nginx/logs/supervisord_nginx_error.log
stdout_logfile=/data/software/nginx/logs/supervisord_nginx_stdout.log
# 把stderr重定向到stdout,默认 false
redirect_stderr = true
#stdout日志文件大小,默认 50MB
stdout_logfile_maxbytes = 100MB
# stdout日志文件备份数
stdout_logfile_backups = 20
; 可以用来管理该program的用户
user=root
; 进程停止信号,可以为TERM, HUP, INT, QUIT, KILL, USR1等,默认为TERM
; stopsignal=INT
; 当进程启动失败后,最大尝试的次数。当超过5次后,进程的状态变为FAIL
startretries=5
; 这个东西主要用于,supervisord管理的子进程,这个子进程本身还有子进程。那么我们如果仅仅干掉supervisord的子进程的话,子进程的子进程有可能会变成孤儿进程。所以可以设置这个选项,把整个该子进程的整个进程组干掉。默认false
stopasgroup=true