使用Nginx反向代理Flask站點

Nginx實際上只能處理靜態資源請求,那麼對於動態請求怎麼作呢。這就須要用到Nginx的upstream模塊對這些請求進行轉發,即反向代理。這些接收轉發的服務器能夠是Apache、Tomcat、IIS等。示意圖以下:html

輸入圖片說明

如今對一個Python Flask的站點進行反向代理設置,站點的源碼存放在Github。在本機Min17中目錄以下:python

/
+- srv/
  +- www/
    +- GoLink/       <-- Web App根目錄
      +- www/        
      |  +- static/  <-- 存放靜態資源文件
      |  +- index.py <-- Python源碼

部署方式

因爲flask是單進程處理請求的,不像Tornado的異步,同時訪問的人數稍微過多,就會出現阻塞的狀況,致使Nginx出現502的問題。而Gunicorn能夠指定多個工做進程,這樣就能夠實現併發功能。nginx

輸入圖片說明

Nginx能夠做爲服務進程直接啓動,但Gunicorn還不行。能夠使用Supervisor管理Gunicorn進行自啓動。git

總結一下咱們須要用到的服務有:github

Nginx:高性能Web服務器+負責反向代理;flask

gunicorn:高性能WSGI服務器;瀏覽器

gevent:把Python同步代碼變成異步協程的庫;服務器

Supervisor:監控服務進程的工具;併發

在Linux服務器上能夠直接安裝上述服務:app

$ sudo apt-get install nginx gunicorn python-gevent supervisor

配置Nginx

Nginx配置文件位於/usr/local/nginx/conf/nginx.conf,爲了便於管理,新建一個site文件夾存放咱們對配置的添加更改。在site中新建app.conf配置文件。

nginx.conf中添加

http {
    include       sites/*.conf;
    # ...
}

app.conf中添加

server {
    listen      80; # 監聽80端口

    root        /srv/www/GoLink/www; 
    server_name localhost; # 配置域名

    # 處理靜態資源:
    location ~ ^\/static\/.*$ {
        root /srv/www/GoLink/www;
    }

    # 動態請求轉發到8000端口(gunicorn):
    location / {
        proxy_pass       http://127.0.0.1:8000;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

從新加載Nginx配置文件:

$ sudo .nginx -s reload

##配置Supervisor

編寫一個Supervisor的配置文件golink.conf,存放到/etc/supervisor/conf.d/目錄下

[program:golink]
command     = /usr/bin/gunicorn --bind 127.0.0.1:8000 --workers 3 --worker-class gevent index:app
directory   = /srv/www/GoLink/www
user        = www-data
startsecs   = 3

redirect_stderr         = true
stdout_logfile_maxbytes = 50MB
stdout_logfile_backups  = 10

參數解釋

--workers: The number of worker processes for handling requests. A positive integer generally in the 2-4 x $(NUM_CORES) range.

--worker-class: The type of workers to use.

啓動後臺服務

$ sudo supervisorctl reload
$ sudo supervisorctl start golink
$ sudo supervisorctl status
golink    RUNNING    pid 13636, uptime 0:00:27

這時在瀏覽器中輸入 http://127.0.0.1:80便可訪問網站。

參考

http://rfyiamcool.blog.51cto.com/1030776/1276364

http://spacewander.github.io/explore-flask-zh/14-deployment.html

http://docs.gunicorn.org/en/latest/settings.html#settings

相關文章
相關標籤/搜索