国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

python之gunicorn的配置

這篇具有很好參考價值的文章主要介紹了python之gunicorn的配置。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

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

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

1. 安裝gunicorn

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

2. gunicorn啟動一個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 '請求成功'

@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的應(yīng)用程序(啟動flask文件的同級目錄)
# -D后臺啟動,第一個my_service指的是my_service.py文件,第二個指的是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

#錯誤碼
SUCCESS = 0           #成功
PARA_FAILED = 1       #參數(shù)錯誤
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.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ù)進程 
pidfile = '/home/zyy/log/my-gunicorn.pid'
# 訪問日志路徑
accesslog = '/home/zyy/log/gunicorn_access.log'
# 錯誤信息日志路徑
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 啟動文件? 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 啟動?

./start.sh start  #啟動
./start.sh restart  #重啟
./start.sh stop  #停止

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

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

4.1 參數(shù)

-c CONFIG    : CONFIG,配置文件的路徑,通過配置文件啟動;生產(chǎn)環(huán)境使用;

-b ADDRESS   : ADDRESS,ip加端口,綁定運行的主機;

-w INT, --workers INT:用于處理工作進程的數(shù)量,為正整數(shù),默認(rèn)為1;

-k STRTING, --worker-class STRTING:要使用的工作模式,默認(rèn)為sync異步,可以下載eventlet和gevent并指定

--threads INT:處理請求的工作線程數(shù),使用指定數(shù)量的線程運行每個worker。為正整數(shù),默認(rèn)為1。

--worker-connections INT:最大客戶端并發(fā)數(shù)量,默認(rèn)情況下這個值為1000。

--backlog int:未決連接的最大數(shù)量,即等待服務(wù)的客戶的數(shù)量。默認(rèn)2048個,一般不修改;

-p FILE, --pid FILE:設(shè)置pid文件的文件名,如果不設(shè)置將不會創(chuàng)建pid文件


--access-logfile FILE   :  要寫入的訪問日志目錄

--access-logformat STRING:要寫入的訪問日志格式

--error-logfile FILE, --log-file FILE  :  要寫入錯誤日志的文件目錄。

--log-level LEVEL   :   錯誤日志輸出等級。


--limit-request-line INT   :  HTTP請求頭的行數(shù)的最大大小,此參數(shù)用于限制HTTP請求行的允許大小,默認(rèn)情況下,這個值為4094。值是0~8190的數(shù)字。

--limit-request-fields INT   :  限制HTTP請求中請求頭字段的數(shù)量。此字段用于限制請求頭字段的數(shù)量以防止DDOS攻擊,默認(rèn)情況下,這個值為100,這個值不能超過32768

--limit-request-field-size INT  :  限制HTTP請求中請求頭的大小,默認(rèn)情況下這個值為8190字節(jié)。值是一個整數(shù)或者0,當(dāng)該值為0時,表示將對請求頭大小不做限制


-t INT, --timeout INT:超過這么多秒后工作將被殺掉,并重新啟動。一般設(shè)定為30秒;

--daemon: 是否以守護進程啟動,默認(rèn)false;

--chdir: 在加載應(yīng)用程序之前切換目錄;

--graceful-timeout INT:默認(rèn)情況下,這個值為30,在超時(從接收到重啟信號開始)之后仍然活著的工作將被強行殺死;一般使用默認(rèn);

--keep-alive INT:在keep-alive連接上等待請求的秒數(shù),默認(rèn)情況下值為2。一般設(shè)定在1~5秒之間。

--reload:默認(rèn)為False。此設(shè)置用于開發(fā),每當(dāng)應(yīng)用程序發(fā)生更改時,都會導(dǎo)致工作重新啟動。

--spew:打印服務(wù)器執(zhí)行過的每一條語句,默認(rèn)False。此選擇為原子性的,即要么全部打印,要么全部不打印;

--check-config   :顯示現(xiàn)在的配置,默認(rèn)值為False,即顯示。

-e ENV, --env ENV: 設(shè)置環(huán)境變量;

4.2 配置文件參數(shù)

# gunicorn.conf

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

4.3 由于windows平臺不支持gunicorn,gunicorn安裝成功后,啟動會出現(xiàn)

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

參考:

python之gunicorn的配置_modulenotfounderror: no module named 'pwd_黑色小米粥的博客-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-493513.html

到了這里,關(guān)于python之gunicorn的配置的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • FastAPI + NGINX + Gunicorn:一步一步教你部署一個高性能的Python網(wǎng)頁應(yīng)用

    FastAPI + NGINX + Gunicorn:一步一步教你部署一個高性能的Python網(wǎng)頁應(yīng)用

    部署一個 FastAPI 應(yīng)用到你的服務(wù)器是一項復(fù)雜的任務(wù)。如果你對 NGINX 、 Gunicorn 和 Uvicorn 這些技術(shù)不熟悉,可能會浪費大量的時間。如果你是剛接觸 Python 語言不久或者希望利用 Python 構(gòu)建自己的Web應(yīng)用程序,本文的內(nèi)容可能會讓你第一次部署時更節(jié)省時間。 FastAPI 是用于開發(fā)

    2024年02月05日
    瀏覽(26)
  • 常見網(wǎng)絡(luò)服務(wù)器并發(fā)模型

    常見網(wǎng)絡(luò)服務(wù)器并發(fā)模型

    近些年,隨著互聯(lián)網(wǎng)的大發(fā)展,高并發(fā)服務(wù)器技術(shù)也快速進步,從簡單的循環(huán)服務(wù)器模型處理少量網(wǎng)絡(luò)并發(fā)請求,演進到解決C10K,C10M問題的高并發(fā)服務(wù)器模型。本文主要以TCP為例,總結(jié)了幾種常見的網(wǎng)絡(luò)服務(wù)器模型的實現(xiàn)方式,優(yōu)缺點,以及應(yīng)用實例。 單線程循環(huán) 單線程循

    2024年02月08日
    瀏覽(32)
  • 為了實現(xiàn)上網(wǎng)自由,我做了一個多功能串口服務(wù)器

    為了實現(xiàn)上網(wǎng)自由,我做了一個多功能串口服務(wù)器

    項目作者:小華的物聯(lián)網(wǎng)嵌入式之旅 介紹:從事電氣自動化行業(yè),多次獲得物聯(lián)網(wǎng)設(shè)計競賽,愛好嵌入式設(shè)計開發(fā),物聯(lián)網(wǎng)開發(fā)。 設(shè)計方案思路的由來,是因為我們現(xiàn)在的開發(fā)板基本需要通過串口與WIFI模組或以太網(wǎng)模組連接以實現(xiàn)聯(lián)網(wǎng)功能,如果多個開發(fā)板就要配多個模組

    2024年02月12日
    瀏覽(28)
  • python---js逆向-----為了理想爬到想要的數(shù)據(jù),我們怎能放過它

    python---js逆向-----為了理想爬到想要的數(shù)據(jù),我們怎能放過它

    這是我的gitee倉庫:https://gitee.com/qin-laoda/python-exercises 有興趣的小可愛們可以點進去看看, _________________________________ 下面我們來按照爬蟲思路找一下我們要爬的網(wǎng)頁,并獲取數(shù)據(jù) 下面我以https://ggzyfw.fujian.gov.cn/business/list/來爬取想要的數(shù)據(jù) 首先我們進去找到該網(wǎng)頁,打開開發(fā)者工

    2024年02月08日
    瀏覽(20)
  • 【Redis】Redis 高并發(fā)常見問題

    目前市場上許多軟件產(chǎn)品,其內(nèi)部都采用 Redis 作為數(shù)據(jù)緩存的主要解決方案。隨著業(yè)務(wù)的不斷發(fā)展,在高并發(fā)場景里,Redis 常常會出現(xiàn)一些問題,網(wǎng)絡(luò)上也有很多文章對其做出了總結(jié)。這里主要針對 緩存穿透、緩存雪崩、緩存擊穿 這幾類場景進行分析,并提出可能的處理方

    2023年04月24日
    瀏覽(11)
  • Python3,為了無損壓縮gif動圖,我不得不寫了一個壓縮神器,真香。

    Python3,為了無損壓縮gif動圖,我不得不寫了一個壓縮神器,真香。

    小屌絲 :魚哥, 求助~ 求助~ 求助~ 小魚 :你這是告訴我,重要的事情 說三遍嗎? 小屌絲 :你可以這么理解。 小魚 :好吧… 什么事情,這么慌慌張張。 小屌絲 :我的動圖太大了, 無法上傳到 C站。 小魚 :呦呵… 你也開始寫博文了? 小屌絲 :向魚哥看齊。 小魚 :沒毛

    2024年02月06日
    瀏覽(40)
  • 【Java并發(fā)編程】線程中斷機制(輔以常見案例)

    本文由淺入深介紹了中斷機制、中斷的常見案例和使用場景。 因為一些原因需要取消原本正在執(zhí)行的線程。我們舉幾個栗子: 假設(shè)踢足球點球時,A隊前4輪中了4個球,B隊前4輪只中了2個球,此時勝負(fù)已分,第5輪這個點球就不用踢了,此時需要停止A隊的線程和B隊的線程(共

    2024年02月13日
    瀏覽(32)
  • 加密貨幣量化交易系統(tǒng)的設(shè)計與實現(xiàn)(0.1最初版本,為了應(yīng)付畢設(shè)的版本)

    加密貨幣量化交易系統(tǒng)的設(shè)計與實現(xiàn)(0.1最初版本,為了應(yīng)付畢設(shè)的版本)

    注意: 寫這個程序的目的是進行加密貨幣投資理財,但是我剛好要畢業(yè)了,需要些畢業(yè)設(shè)計,所以和導(dǎo)師商量了一下把原本的《基于表情識別的人工智能睡眠質(zhì)量監(jiān)測助手》換成了我自己的《加密貨幣量化交易系統(tǒng)的設(shè)計與實現(xiàn)》,這個設(shè)計里的后端服務(wù)模塊(基于springbo

    2024年02月02日
    瀏覽(26)
  • 為了防止這個網(wǎng)站被各位爬崩,我連夜用Python下載了上萬張壁紙(附網(wǎng)站JS逆向解密)

    為了防止這個網(wǎng)站被各位爬崩,我連夜用Python下載了上萬張壁紙(附網(wǎng)站JS逆向解密)

    每當(dāng)一個網(wǎng)站崩潰,在座的各位都有一定的責(zé)任。 當(dāng)一個爬蟲教程不火的時候還好,火起來了,就到了考驗網(wǎng)站服務(wù)器的時候了,上一次茶杯狐就是這樣,還好人家頑強… ? 好了話不多說,直接開始。 首先就是必備的軟件和模塊 環(huán)境使用 ? 模塊使用 ? 前兩個是第三方模塊

    2024年02月07日
    瀏覽(23)
  • Python實現(xiàn)常見的排序算法

    當(dāng)涉及到排序算法時,一些常見的排序算法包括插入排序、選擇排序、冒泡排序、快速排序、歸并排序和堆排序。以下是使用Python實現(xiàn)這些常見排序算法的示例代碼: 插入排序(Insertion Sort): 選擇排序(Selection Sort): 冒泡排序(Bubble Sort): 快速排序(Quick Sort): 歸并

    2024年02月11日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包