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配置文件位於/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