返回顶部
首页 > 资讯 > 后端开发 > Python >python之gunicorn的配置
  • 682
分享到

python之gunicorn的配置

gunicorn 2023-09-11 21:09:59 682人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

为了实现并发,python常见的WEB部署搭配nginx + gunicorn, flask + gunicorn 本文介绍gunicorn的配置和使用。 1. 安装gunicorn pip install gunicorngunicorn

为了实现并发python常见的WEB部署搭配nginx + gunicorn, flask + gunicorn

本文介绍gunicorn的配置和使用。

1. 安装gunicorn

pip install gunicorngunicorn -h  # 查看使用的命令直接使用 gunicorn 命令可能会报,可以查找到gunicorn文件以绝对路径添加环境变量 vi /etc/profile最底下添加:PATH="$PATH:/usr/local/bin"  export PATH引用环境变量:source /etc/profile

2. gunicorn启动一个flask的应用程序  

1. 配置flask路由 (my_service.py )

# my_service.py# !/usr/bin/env Python# -*- coding:utf8 -*-# Desc:  Http路由import JSONfrom flask import Flask from MyLoGobj import *   #日志app = Flask(__name__)app.config['DEBUG'] = Truemy_methods=["GET","POST"]@app.route('/')def index():    print("--------1----------")    return '请求成功'@app.route('/error')def index_error():    print("--------error----------")    a = 'assss'    json.loads(a)    return '请求失败'@app.route('/logtest')def index_logtest():    try:        print("--------logtest----------")        a = 'assss111'        json.loads(a)    except Exception as e:        mlog.error('read conffile[%s] except' % CONF_FILE)        mlog.info('read conffile[%s] except info ' % CONF_FILE)    return '请求失败logtest'if __name__ == '__main__':    app.run(host='127.0.0.1',port=8001)
  • 在flask的项目的目录下启动flask的应用程序(启动flask文件的同级目录)
# -D后台启动,第一个my_service指的是my_service.py文件,第二个指的是py里flask应用的名字; gunicorn -D -w 4 -b 0.0.0.0:8000 my_service:app 

3. 配置文件的方式

1 全局配置文件 

# config.ini [Mysql]DB_HOST=127.0.0.1DB_PORT=3306DB_USER=rootDB_PASSWRD=pwd123DB_DATABASE=dbtestMAX_USAGE=10MIN_CACHED=1MAX_CACHED=10CHARSET=utf8[RUN]thread=10processor=20[LOG_CONF]log_level = DEBUGstdin=0datefmt = %a, %d %b %Y %H:%M:%Slog_file = log.logmaxSize = 10*1024*1024

2 读取配置文件

# MySetting.py# !/usr/bin/env python# -*- coding=utf-8 -*-import platfORMimport cgiimport configparser#错误码SUCCESS = 0           #成功PARA_FAILED = 1       #参数错误USER_INFO_ERROR = 3 #用户信息错误Access_Control ='http://localhost:8001'if platform.system() == 'linux':    base_path = '/home/guntest/'    CONF_FILE = base_path + 'conf/config.ini'    Dir_partition = '/'    UPLOADS_PATH=base_path + 'uploads/'    IMG_PATH=base_path + 'img/'else:    base_path = 'G:\\guntest\\'    CONF_FILE = base_path + 'conf\\config.ini'    Dir_partition = '\\'    UPLOADS_PATH = base_path + 'uploads\\'    IMG_PATH=base_path + 'img\\'

3 配置flask路由 (gunicorn_service.py )

# gunicorn_service.py# !/usr/bin/env python# -*- coding:utf8 -*-# Desc: linux start self service by gunicorn# !/usr/bin/env python# -*- coding:utf8 -*-from werkzeug.middleware.proxy_fix import ProxyFixfrom my_service import *import geventapp.wsgi_app = ProxyFix(app.wsgi_app)

4 配置 my-gun.conf 

import osbind = '127.0.0.1:8001'#bind = '0.0.0.0:8001'workers = 2user="root"worker_class="gevent" #sync, geventbacklog = 2048daemon = Truedebug = Trueproc_name = 'gunicorn-self.proc'# 服务进程 pidfile = '/home/zyy/log/my-gunicorn.pid'# 访问日志路径accesslog = '/home/zyy/log/gunicorn_access.log'# 错误信息日志路径errorlog = '/home/zyy/log/gunicorn_error.log'# 设置日志记录水平loglevel = 'info'   #warning

5 日志配置

#MyLogObj.py #globlsfrom MyLog import *mlog = my_logger().GetInstance(None, "guntest-service")
# MyLog.py#!/usr/bin/env python#-*- coding:utf-8 -*-#Author: zyy#Date:2023-06-18#Desc:log classimport loggingfrom MySetting import *instance_logger = Noneclass  my_logger:    def __init__(self):        pass    def GetInstance(self, confile, modname):        global instance_logger        if None == instance_logger:            if None == confile or '' == confile:                confile = CONF_FILE            conf = configparser.ConfigParser()            conf.read(confile)            file_path = "%slog%s%s"%(base_path, Dir_partition, conf.get('LOG_CONF', 'log_file'))            logger=logging.getLogger(modname)            fh = logging.FileHandler(file_path)            stdin = conf.get('LOG_CONF', 'stdin')            if stdin == '1':                ch = logging.StreamHandler()            level = conf.get('LOG_CONF','log_level')            if level == None or level == '' or level == 'DEBUG':                logger.setLevel(logging.DEBUG)                fh.setLevel(logging.DEBUG)            if level == 'INFO':                logger.setLevel(logging.INFO)                fh.setLevel(logging.INFO)            if level == 'WARNING':                logger.setLevel(logging.WARNING)                fh.setLevel(logging.WARNING)            if level == 'ERROR' :                logger.setLevel(logging.ERROR)                fh.setLevel(logging.ERROR)            if level == 'CRITICAL':                logger.setLevel(logging.CRITICAL)                fh.setLevel(logging.CRITICAL)            formatter = logging.Formatter("[%(asctime)s][%(filename)s:%(lineno)d][%(levelname)s]:%(message)s")            if stdin == '1':                ch.setFormatter(formatter)            fh.setFormatter(formatter)            logger.addHandler(fh)            if stdin == '1':                logger.addHandler(ch)            instance_logger = logger        return instance_loggerif __name__ == '__main__':    log1 = my_logger().GetInstance(None, "log1")    log2 = my_logger().GetInstance(None, "log2")    log3 = my_logger().GetInstance(None, "log3")    log1.debug('this is debug')    log2.debug('this is debug')

6 启动文件  start.sh  (chmod 777 start.sh)

#!/bin/sh#coding:utf8#gunicorn envsource /etc/profileSERVER_HOME="/home/zyy/zyy_test"echo '---1----'SELF_SERVER_EXECUTE="my-gun.conf my_service:app"SELF_SERVER_NAME="my_service"SELF_EXECUTE="gunicorn -c my-gun.conf my_service:app"echo '---2----'check_self_pid(){        echo ` ps -efww | grep -v 'grep' | grep "${SELF_SERVER_EXECUTE}" | awk '{print $2}' `}start_self(){        pid=$(check_self_pid)        if [ -n "$pid" ]; then                echo "Warning: $SELF_SERVER_NAME already started! (pid: $pid)"        else                echo -n "Starting $SELF_SERVER_NAME ..."                cd $SERVER_HOME                $SELF_EXECUTE                sleep 1                pid=$(check_self_pid)                if [ -n "$pid" ]; then                        echo "(pid: $pid) [OK]"                else                        echo "[Failed]"                fi        fi}start(){        start_self}stop_self(){        pid=$(check_self_pid)        if [ -n "$pid" ]; then                echo -n "Stopping $SELF_SERVER_NAME ...(pid: $pid)"                kill $pid &>/dev/null                sleep 1                pid=$(check_self_pid)                if [ -z "$pid" ]; then                        echo "[OK]"                else                        echo "[Failed]"                fi        else                echo "Warning: $SELF_SERVER_NAME is not running"        fi}stop(){        stop_self}case "$1" in        'start')                start                ;;        'stop')                stop                ;;        'restart')                stop                start                ;;        *)                echo "Usage: $0 {start|stop|restart}"                exit 1esac

7 启动 

./start.sh start  #启动./start.sh restart  #重启./start.sh stop  #停止

到这里就结束了,以下部分是参数详解,可根据需要自行配置

4. gunicorn的参数详解

1 参数

-c CONFIG    : CONFIG,配置文件的路径,通过配置文件启动;生产环境使用;-b ADDRESS   : ADDRESS,ip加端口,绑定运行的主机;-w INT, --workers INT:用于处理工作进程的数量,为正整数,默认为1;-k STRTING, --worker-class STRTING:要使用的工作模式,默认为sync异步,可以下载eventlet和gevent并指定--threads INT:处理请求的工作线程数,使用指定数量的线程运行每个worker。为正整数,默认为1。--worker-connections INT:最大客户端并发数量,默认情况下这个值为1000。--backlog int:未决连接的最大数量,即等待服务的客户的数量。默认2048个,一般不修改;-p FILE, --pid FILE:设置pid文件的文件名,如果不设置将不会创建pid文件--access-logfile FILE   :  要写入的访问日志目录--access-logformat STRING:要写入的访问日志格式--error-logfile FILE, --log-file FILE  :  要写入错误日志的文件目录。--log-level LEVEL   :   错误日志输出等级。--limit-request-line INT   :  HTTP请求头的行数的最大大小,此参数用于限制HTTP请求行的允许大小,默认情况下,这个值为4094。值是0~8190的数字。--limit-request-fields INT   :  限制HTTP请求中请求头字段的数量。此字段用于限制请求头字段的数量以防止DDOS攻击,默认情况下,这个值为100,这个值不能超过32768--limit-request-field-size INT  :  限制HTTP请求中请求头的大小,默认情况下这个值为8190字节。值是一个整数或者0,当该值为0时,表示将对请求头大小不做限制-t INT, --timeout INT:超过这么多秒后工作将被杀掉,并重新启动。一般设定为30秒;--daemon: 是否以守护进程启动,默认false;--chdir: 在加载应用程序之前切换目录;--graceful-timeout INT:默认情况下,这个值为30,在超时(从接收到重启信号开始)之后仍然活着的工作将被强行杀死;一般使用默认;--keep-alive INT:在keep-alive连接上等待请求的秒数,默认情况下值为2。一般设定在1~5秒之间。--reload:默认为False。此设置用于开发,每当应用程序发生更改时,都会导致工作重新启动。--spew:打印服务器执行过的每一条语句,默认False。此选择为原子性的,即要么全部打印,要么全部不打印;--check-config   :显示现在的配置,默认值为False,即显示。-e ENV, --env ENV: 设置环境变量;

2 配置文件参数

# gunicorn.conf# 并行工作进程数workers = 4# 指定每个工作者的线程数threads = 2# 监听内网端口5000bind = '127.0.0.1:5000'# 设置守护进程,将进程交给supervisor管理daemon = 'false'# 工作模式协程worker_class = 'gevent'# 设置最大并发量worker_connections = 2000# 设置进程文件目录pidfile = '/var/run/gunicorn.pid'# 设置访问日志和错误信息日志路径accesslog = '/var/log/gunicorn_acess.log'errorlog = '/var/log/gunicorn_error.log'# 设置日志记录水平loglevel = 'warning'

3 由于windows平台不支持gunicorn,gunicorn安装成功后,启动会出现

‘ImportError: No module named _curses / fcntl’错误;需要下载fcntl.py文件;

参考:

python之gunicorn的配置_modulenotfounderror: no module named 'pwd_黑色小米粥的博客-CSDN博客

来源地址:https://blog.csdn.net/cocos2dGirl/article/details/131305329

--结束END--

本文标题: python之gunicorn的配置

本文链接: https://lsjlt.com/news/403726.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python之gunicorn的配置
    为了实现并发,python常见的web部署搭配nginx + gunicorn, flask + gunicorn 本文介绍gunicorn的配置和使用。 1. 安装gunicorn pip install gunicorngunicorn...
    99+
    2023-09-11
    gunicorn
  • 安装配置gunicorn和NGINX的
    博客写得差不多了,打算部署到云上因为速度的关系,不打算部署在AWS上,于是申请了阿里云,环境是上篇文章提到的CentOS 7 64位安装和配置好Python3和MySQL,又稍微了解点web服务器的知识后,打算按这里的方法进行部署,思路是...
    99+
    2023-01-31
    gunicorn NGINX
  • Gunicorn运行与配置方法
    Gunicorn“绿色独角兽”是一个被广泛使用的高性能的python WSGI UNIX HTTP服务器,移植自Ruby的独角兽(Unicorn )项目,使用pre-fork worker模式,具有使用非常简单,轻量级的...
    99+
    2022-06-04
    Gunicorn运行 配置
  • Gunicorn Django部署配置方法
    1. 简单部署 1. sudo pip3 install gunicorn 2. cd 到django项目中 sudo python3 manage.py migrate 3.启动服务:sudo python3 m...
    99+
    2022-06-04
    Gunicorn Django 部署 Django部署
  • 在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
    Python基础环境搭建 CENTOS 6.X 系列默认安装的 Python 2.6 ,目前开发中主要是使用 Python 2.7 ,这两个版本之间还是有不少差异的,程序在 Python 2.6 下经常会出...
    99+
    2022-06-04
    环境 教程 Nginx
  • python中Gunicorn的作用是什么
    今天就跟大家聊聊有关python中Gunicorn的作用是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据...
    99+
    2023-06-14
  • python之环境变量配置
    Python 是一种高级编程语言,它是一种解释性的语言,它有一些常用的环境变量配置。在本文中,我们将详细探讨这些配置。这些配置包括: PATH 环境变量 PATH 环境变量是最重要的环境变量之一,因为它告诉操作系统可执行文件所在的位置。当你...
    99+
    2023-10-21
    python 开发语言
  • Emacs之Python编程环境配置 -
    由于之前一直使用Emacs+Jedi来进行Python的编程环境,最近又尝试了Emacs+Elpy的方式。接下来直接开始吧,少些废话。首先系统当中要安装pip等工具,方便安装python的一些工具包(在CentOS6.5 64位系统上进行的...
    99+
    2023-01-31
    环境 Emacs Python
  • Python入门教程之Python的安装下载配置
    目录一、Python 下载三、配置环境变量四、pip下载模块慢安装模块两种方式一、Python 下载 Python是运行的环境,必不可少,如果你是Linux系统的话,不用安装,自带了...
    99+
    2023-05-14
    Python入门 Python安装 Python下载 Python配置
  • VI3之vCenterServer配置的
              在Vmware Infrastruacture 3中,vCenter Server起到非常重要的角色。在VMware给出的一些解决方案中,常见的是针对Esx主机高用性的VMware HA等的解决方案,但好像并没有提到如何...
    99+
    2023-01-31
    vCenterServer
  • python学习之读取配置文件
    前言: 最近在接触利用python来写测试框架,本人也是个刚接触python,所以是个小菜鸟,今天开始,一点点的记录学习中的积累,方便以后的学习以及回顾,也希望能帮助跟我一样的小菜鸟...
    99+
    2024-04-02
  • 详解python之配置日志的几种方式
    作为开发者,我们可以通过以下3中方式来配置logging: 1)使用Python代码显式的创建loggers, handlers和formatters并分别调用它们的配置函数; 2)创建一个日志配置文件...
    99+
    2022-06-04
    几种 详解 方式
  • Python框架之Django的数据库配置问题
    准备开始python的环境,用django框架其默认的数据库是sqlite3 ,要改用mysql来存储数据在执行migrate的时候出现问题(错误见末尾):Unhandled exception in th...
    99+
    2024-04-02
  • Java_Spring之XML 的 AOP 配置
    目录1 环境搭建1.1 第一步:准备必要的代码1.2 第二步:拷贝必备的 jar 包到工程的 lib 目录1.3 第三步:创建 spring 的配置文件并导入约束1.4 第四步:配置...
    99+
    2023-05-14
    Java Spring基于XML的AOP注解 Spring基于XML的AOP注解 基于XML的AOP注解
  • IDEA之配置Gradle
    最近研究git上一些项目,用到的是gradle,所以了解了gradle的安装和配置,记录一下。 目录 一、下载Gradle二、安装Gradle2.1 解压Gradle2.2 配置环境变量 ...
    99+
    2023-09-06
    intellij-idea java gradle
  • Spring的注解配置与XML配置之间的比较
    注释配置相对于 XML 配置具有很多的优势:它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作。如使用 JPA 注释配置 ORM 映射时,我们就不需要...
    99+
    2022-11-15
    spring 注解配置 XML配置
  • mysql5.7.28之主主配置
    1 简介 1.1 主从同步 MySQL的主从复制是一个异步的复制过程(虽然一般情况下感觉是实时的),数据将从一个MySQL数据库复制到另一个MySQL数据库,在master与Slave之间实现整个主从复制的过程是有三个线程参与完成的。其中...
    99+
    2015-03-07
    mysql5.7.28之主主配置 数据库入门 数据库基础教程 数据库 mysql
  • Redis之-主从配置
    集群的作用:1,主从备份 防止主库down机2,读写分离,分担master压力3,任务分离,如从服务器分担备份的工作 大概同步原理:1,slave启动发现需要连接master,那么sync自动同步一下2,m...
    99+
    2024-04-02
  • Android studio之 build.gradle配置
    在使用Android studio创建项目会出现两个build.gradle: 一. Project项目级别的build.gradle (1)、buildscript{}闭包里是gradle脚本执行所...
    99+
    2023-09-24
    android studio android ide
  • CentOS7安装完之后的配置
    静态IP地址设置 查找网卡名称,通过在控制台使用ip a,查看到网卡名称,例如:eno16777984 使用vim打开相关配置文件:/etc/sysconfig/network-scripts/ifcfg-eno16777984 按照以下内...
    99+
    2023-06-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作