pip3 install virtualenv
cd /data/ops
virtualenv -p /usr/bin/python3 backstage
source backstage/bin/activate
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'
-
- 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