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; }