最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python中的gunicorn配置和使用教程

 更新時(shí)間:2023年06月24日 11:33:53   作者:cocosgirl  
這篇文章主要介紹了python中的gunicorn配置和使用教程,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

為了實(shí)現(xiàn)并發(fā),python常見的web部署搭配nginx + gunicorn, flask + gunicorn

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

1. 安裝gunicorn

pip install gunicorn
gunicorn -h  # 查看使用的命令
直接使用 gunicorn 命令可能會(huì)報(bào),可以查找到gunicorn文件以絕對(duì)路徑
添加環(huán)境變量 vi /etc/profile
最底下添加:PATH="$PATH:/usr/local/bin"
		  export PATH
引用環(huán)境變量:source /etc/profile

2. gunicorn啟動(dòng)一個(gè)flask的應(yīng)用程序  

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

# my_service.py
# !/usr/bin/env python
# -*- coding:utf8 -*-
# Desc:  http路由
import json
from flask import Flask 
from MyLogObj import *   #日志
app = Flask(__name__)
app.config['DEBUG'] = True
my_methods=["GET","POST"]
@app.route('/')
def index():
    print("--------1----------")
    return '請(qǐng)求成功'
@app.route('/error')
def index_error():
    print("--------error----------")
    a = 'assss'
    json.loads(a)
    return '請(qǐng)求失敗'
@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 '請(qǐng)求失敗logtest'
if __name__ == '__main__':
    app.run(host='127.0.0.1',port=8001)

在flask的項(xiàng)目的目錄下啟動(dòng)flask的應(yīng)用程序(啟動(dòng)flask文件的同級(jí)目錄)

# -D后臺(tái)啟動(dòng),第一個(gè)my_service指的是my_service.py文件,第二個(gè)指的是py里flask應(yīng)用的名字; 
gunicorn -D -w 4 -b 0.0.0.0:8000 my_service:app 

3. 配置文件的方式

3.1 全局配置文件 

# config.ini 
[MySQL]
DB_HOST=127.0.0.1
DB_PORT=3306
DB_USER=root
DB_PASSWRD=pwd123
DB_DATABASE=dbtest
MAX_USAGE=10
MIN_CACHED=1
MAX_CACHED=10
CHARSET=utf8
[RUN]
thread=10
processor=20
[LOG_CONF]
log_level = DEBUG
stdin=0
datefmt = %a, %d %b %Y %H:%M:%S
log_file = log.log
maxSize = 10*1024*1024

3.2 讀取配置文件

# MySetting.py
# !/usr/bin/env python
# -*- coding=utf-8 -*-
import platform
import cgi
import configparser
#錯(cuò)誤碼
SUCCESS = 0           #成功
PARA_FAILED = 1       #參數(shù)錯(cuò)誤
USER_INFO_ERROR = 3 #用戶信息錯(cuò)誤
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.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 ProxyFix
from my_service import *
import gevent
app.wsgi_app = ProxyFix(app.wsgi_app)

3.4 配置 my-gun.conf 

import os
bind = '127.0.0.1:8001'
#bind = '0.0.0.0:8001'
workers = 2
user="root"
worker_class="gevent" #sync, gevent
backlog = 2048
daemon = True
debug = True
proc_name = 'gunicorn-self.proc'
# 服務(wù)進(jìn)程 
pidfile = '/home/zyy/log/my-gunicorn.pid'
# 訪問日志路徑
accesslog = '/home/zyy/log/gunicorn_access.log'
# 錯(cuò)誤信息日志路徑
errorlog = '/home/zyy/log/gunicorn_error.log'
# 設(shè)置日志記錄水平
loglevel = 'info'   #warning

3.5 日志配置

#MyLogObj.py 
#globls
from 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 class
import logging
from MySetting import *
instance_logger = None
class  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_logger
if __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')

3.6 啟動(dòng)文件  start.sh  (chmod 777 start.sh)

#!/bin/sh
#coding:utf8
#gunicorn env
source /etc/profile
SERVER_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 1
esac

3.7 啟動(dòng) 

./start.sh start  #啟動(dòng)
./start.sh restart  #重啟
./start.sh stop  #停止

到這里就結(jié)束了,以下部分是參數(shù)詳解,可根據(jù)需要自行配置

4. gunicorn的參數(shù)詳解

4.1 參數(shù)

-c CONFIG    : CONFIG,配置文件的路徑,通過配置文件啟動(dòng);生產(chǎn)環(huán)境使用;
-b ADDRESS   : ADDRESS,ip加端口,綁定運(yùn)行的主機(jī);
-w INT, --workers INT:用于處理工作進(jìn)程的數(shù)量,為正整數(shù),默認(rèn)為1;
-k STRTING, --worker-class STRTING:要使用的工作模式,默認(rèn)為sync異步,可以下載eventlet和gevent并指定
--threads INT:處理請(qǐng)求的工作線程數(shù),使用指定數(shù)量的線程運(yùn)行每個(gè)worker。為正整數(shù),默認(rèn)為1。
--worker-connections INT:最大客戶端并發(fā)數(shù)量,默認(rèn)情況下這個(gè)值為1000。
--backlog int:未決連接的最大數(shù)量,即等待服務(wù)的客戶的數(shù)量。默認(rèn)2048個(gè),一般不修改;
-p FILE, --pid FILE:設(shè)置pid文件的文件名,如果不設(shè)置將不會(huì)創(chuàng)建pid文件
--access-logfile FILE   :  要寫入的訪問日志目錄
--access-logformat STRING:要寫入的訪問日志格式
--error-logfile FILE, --log-file FILE  :  要寫入錯(cuò)誤日志的文件目錄。
--log-level LEVEL   :   錯(cuò)誤日志輸出等級(jí)。
--limit-request-line INT   :  HTTP請(qǐng)求頭的行數(shù)的最大大小,此參數(shù)用于限制HTTP請(qǐng)求行的允許大小,默認(rèn)情況下,這個(gè)值為4094。值是0~8190的數(shù)字。
--limit-request-fields INT   :  限制HTTP請(qǐng)求中請(qǐng)求頭字段的數(shù)量。此字段用于限制請(qǐng)求頭字段的數(shù)量以防止DDOS攻擊,默認(rèn)情況下,這個(gè)值為100,這個(gè)值不能超過32768
--limit-request-field-size INT  :  限制HTTP請(qǐng)求中請(qǐng)求頭的大小,默認(rèn)情況下這個(gè)值為8190字節(jié)。值是一個(gè)整數(shù)或者0,當(dāng)該值為0時(shí),表示將對(duì)請(qǐng)求頭大小不做限制
-t INT, --timeout INT:超過這么多秒后工作將被殺掉,并重新啟動(dòng)。一般設(shè)定為30秒;
--daemon: 是否以守護(hù)進(jìn)程啟動(dòng),默認(rèn)false;
--chdir: 在加載應(yīng)用程序之前切換目錄;
--graceful-timeout INT:默認(rèn)情況下,這個(gè)值為30,在超時(shí)(從接收到重啟信號(hào)開始)之后仍然活著的工作將被強(qiáng)行殺死;一般使用默認(rèn);
--keep-alive INT:在keep-alive連接上等待請(qǐng)求的秒數(shù),默認(rèn)情況下值為2。一般設(shè)定在1~5秒之間。
--reload:默認(rèn)為False。此設(shè)置用于開發(fā),每當(dāng)應(yīng)用程序發(fā)生更改時(shí),都會(huì)導(dǎo)致工作重新啟動(dòng)。
--spew:打印服務(wù)器執(zhí)行過的每一條語(yǔ)句,默認(rèn)False。此選擇為原子性的,即要么全部打印,要么全部不打??;
--check-config   :顯示現(xiàn)在的配置,默認(rèn)值為False,即顯示。
-e ENV, --env ENV: 設(shè)置環(huán)境變量;

4.2 配置文件參數(shù)

# gunicorn.conf
# 并行工作進(jìn)程數(shù)
workers = 4
# 指定每個(gè)工作者的線程數(shù)
threads = 2
# 監(jiān)聽內(nèi)網(wǎng)端口5000
bind = '127.0.0.1:5000'
# 設(shè)置守護(hù)進(jìn)程,將進(jìn)程交給supervisor管理
daemon = 'false'
# 工作模式協(xié)程
worker_class = 'gevent'
# 設(shè)置最大并發(fā)量
worker_connections = 2000
# 設(shè)置進(jìn)程文件目錄
pidfile = '/var/run/gunicorn.pid'
# 設(shè)置訪問日志和錯(cuò)誤信息日志路徑
accesslog = '/var/log/gunicorn_acess.log'
errorlog = '/var/log/gunicorn_error.log'
# 設(shè)置日志記錄水平
loglevel = 'warning'

4.3 由于windows平臺(tái)不支持gunicorn,gunicorn安裝成功后,啟動(dòng)會(huì)出現(xiàn)

‘ImportError: No module named _curses / fcntl’錯(cuò)誤;需要下載fcntl.py文件;

參考資料:

python之gunicorn的配置_modulenotfounderror: no module named 'pwd

到此這篇關(guān)于python中的gunicorn配置的文章就介紹到這了,更多相關(guān)python gunicorn的配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 教你使用Python從文件中提取IP地址

    教你使用Python從文件中提取IP地址

    Python提供了高效的高級(jí)數(shù)據(jù)結(jié)構(gòu),還能簡(jiǎn)單有效地面向?qū)ο缶幊?下面這篇文章主要給大家介紹了關(guān)于如何使用Python從文件中提取IP地址的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • Pytorch環(huán)境搭建與基本語(yǔ)法

    Pytorch環(huán)境搭建與基本語(yǔ)法

    這篇文章主要介紹了Pytorch環(huán)境搭建與基本語(yǔ)法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • python numpy 顯示圖像陣列的實(shí)例

    python numpy 顯示圖像陣列的實(shí)例

    今天小編就為大家分享一篇python numpy 顯示圖像陣列的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • python 基于opencv實(shí)現(xiàn)高斯平滑

    python 基于opencv實(shí)現(xiàn)高斯平滑

    這篇文章主要介紹了python 基于opencv實(shí)現(xiàn)高斯平滑,幫助大家更好的理解和使用python處理圖片,感興趣的朋友可以了解下
    2020-12-12
  • Python?time模塊之時(shí)間戳與結(jié)構(gòu)化時(shí)間的使用

    Python?time模塊之時(shí)間戳與結(jié)構(gòu)化時(shí)間的使用

    這篇文章主要為大家詳細(xì)介紹了Python中的time模塊以及如何利用time模塊實(shí)現(xiàn)時(shí)間戳與結(jié)構(gòu)化時(shí)間,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-06-06
  • Python實(shí)現(xiàn)多格式文本轉(zhuǎn)為word

    Python實(shí)現(xiàn)多格式文本轉(zhuǎn)為word

    在現(xiàn)代工作中,我們常常需要處理不同格式的文件,其中Word文檔是最為常見的一種,本文主要介紹了如何使用Python創(chuàng)建一個(gè)全能的文件處理工具,能夠?qū)⒍喾N格式的文件轉(zhuǎn)換為Word文檔,需要的可以參考下
    2023-11-11
  • Flask如何獲取用戶的ip,查詢用戶的登錄次數(shù),并且封ip

    Flask如何獲取用戶的ip,查詢用戶的登錄次數(shù),并且封ip

    這篇文章主要介紹了Flask如何獲取用戶的ip,查詢用戶的登錄次數(shù),并且封ip問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 用Pytorch實(shí)現(xiàn)線性回歸模型的步驟

    用Pytorch實(shí)現(xiàn)線性回歸模型的步驟

    線性關(guān)系是一種非常簡(jiǎn)單的變量之間的關(guān)系,因變量和自變量在線性關(guān)系的情況下,可以使用線性回歸算法對(duì)一個(gè)或多個(gè)因變量和自變量間的線性關(guān)系進(jìn)行建模,本文主要介紹了如何利用Pytorch實(shí)現(xiàn)線性模型,需要的朋友可以參考下
    2024-01-01
  • Django使用uwsgi部署時(shí)的配置以及django日志文件的處理方法

    Django使用uwsgi部署時(shí)的配置以及django日志文件的處理方法

    今天小編就為大家分享一篇Django使用uwsgi部署時(shí)的配置以及django日志文件的處理方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • 使用Pandas處理時(shí)間序列數(shù)據(jù)Time Series詳解

    使用Pandas處理時(shí)間序列數(shù)據(jù)Time Series詳解

    SQLAlchemy是Python中最流行的ORM(對(duì)象關(guān)系映射)框架之一,它提供了高效且靈活的數(shù)據(jù)庫(kù)操作方式,本文將介紹如何使用SQLAlchemy ORM進(jìn)行數(shù)據(jù)庫(kù)操作,有需要的可以了解下
    2025-11-11

最新評(píng)論

长白| 杭锦旗| 灌南县| 常熟市| 奉新县| 竹山县| 岢岚县| 监利县| 青田县| 吴堡县| 德钦县| 柳林县| 兖州市| 金湖县| 汝城县| 寿光市| 修武县| 钟祥市| 十堰市| 弥勒县| 日喀则市| 庄浪县| 伊川县| 忻城县| 怀远县| 东兰县| 苍溪县| 綦江县| 台湾省| 珠海市| 墨竹工卡县| 澎湖县| 陇南市| 化州市| 耿马| 许昌市| 廊坊市| 清远市| 东乡族自治县| 九龙坡区| 特克斯县|