flask 框架 前端和後端請求超時問題

部署模式

flask + Gunicorn + nginx 前端

爲何要用Gunicorn + nginx ?python

請看知乎大神們的回答:https://www.zhihu.com/question/38528616nginx

 

場景

有一項業務,前端給後端發送ajax請求後,後端須要執行大約4分鐘的時間纔會給前端返回結果,而這時前端已經沒有任何反應了.ajax

 

 

緣由

1. gunicorn超時flask

2.nginx proxy 超時後端

解決方法:

1.gunicorn須要配置超時時間,若是不配置,默認爲30秒.服務器

意思就是若是後端程序執行時間超過30秒沒有結束, 就不會繼續執行了,也不會返回值給前端,  後端也沒有任何報錯.app

增長參數 timeouttcp

from flask_script import Command, Option


class GunicornServer(Command):
    description = 'Run the app within Gunicorn'

    def __init__(self, host='127.0.0.1', port=5001, workers=50,
                 worker_class="sync", daemon=False):
        self.port = port
        self.host = host
        self.workers = workers
        self.worker_class = worker_class
        self.daemon = daemon

    def get_options(self):
        return (
            Option('-H', '--host',
                   dest='host',
                   default=self.host),

            Option('-p', '--port',
                   dest='port',
                   type=int,
                   default=self.port),

            Option('-w', '--workers',
                   dest='workers',
                   type=int,
                   default=self.workers),

            Option("-c", "--worker_class",
                   dest='worker_class',
                   type=str,
                   default=self.worker_class),

            Option("-d", "--daemon",
                   dest="daemon",
                   type=bool,
                   default=self.daemon)
        )

    def handle(self, app, host, port, workers, worker_class, daemon):

        from gunicorn import version_info

        timeout = 1800

        if version_info < (0, 9, 0):
            from gunicorn.arbiter import Arbiter
            from gunicorn.config import Config

            arbiter = Arbiter(Config({'bind': "%s:%d" % (host, int(port)),
                                      'workers': workers,
                                      'worker_class': worker_class,
                                      'daemon': daemon,
                                      'timeout': timeout}), app)
            arbiter.run()
        else:
            from gunicorn.app.base import Application

            class FlaskApplication(Application):
                def init(self, parser, opts, args):
                    return {
                        'bind': '{0}:{1}'.format(host, port),
                        'workers': workers,
                        'worker_class': worker_class,
                        'daemon': daemon,
                        'timeout': timeout
                    }

                def load(self):
                    return app

            FlaskApplication().run()

 

2.修改nginx proxy超時時間,若是不配置,默認60秒spa

proxy_read_timeout
語法 proxy_read_timeout time 
默認值 60s
上下文 http server location
說明 該指令設置與代理服務器的讀超時時間。它決定了nginx會等待多長時間來得到請求的響應。這個時間不是得到整個response的時間,而是兩次reading操做的時間。

proxy_send_timeout
語法 proxy_send_timeout time 
默認值 60s
上下文 http server location
說明 這個指定設置了發送請求給upstream服務器的超時時間。超時設置不是爲了整個發送期間,而是在兩次write操做期間。若是超時後,upstream沒有收到新的數據,nginx會關閉鏈接

 

根據須要修改時間

 

[root@locolhost ~]# cat /etc/nginx/nginx.conf
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user              nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log;
#error_log  /var/log/nginx/error.log  notice;
#error_log  /var/log/nginx/error.log  info;

pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    proxy_buffer_size   128k;
    proxy_buffers   4 256k;
    proxy_busy_buffers_size   256k;
    proxy_read_timeout 1800;
    proxy_send_timeout 1800;
    fastcgi_read_timeout 1800;
    fastcgi_send_timeout 1800;

    #gzip  on;
    
    # Load config files from the /etc/nginx/conf.d directory
    # The default server is in conf.d/default.conf
    include /etc/nginx/conf.d/*.conf;

}
相關文章
相關標籤/搜索