python web部署

nginx + gunicorn + flask + supervisor的搭建python

爲何要加nginx。linux

Nginx能更好地直接處理靜態資源(經過一些http request header),而把動態資源轉發給後端服務器nginx

Nginx也能夠緩存一些動態內容web

Nginx能夠進行多臺機器的負載均衡django

Nginx能夠更方便的實施一些安全策略。gunicorn 直接暴露仍是蠻危險的,nginx擋一層,過濾掉一些惡意IP,一樣的gunicorn處理起來就比較麻煩了。flask

nginx常見的兩種代理方式:vim

 

正向代理:{ 客戶端 ---》 代理服務器 } ---》 服務器後端

反向代理:客戶端 ---》 { 代理服務器 ---》 服務器 }centos

{} 表示局域網緩存

gunicorn:

flask自帶的app.run()服務,穩定性等各方面都不足,只適用於測試環境,線上環境仍是要有專門的服務器,gunicorn和uWsgi就是經常使用的兩個解決方案。

guincorn是支持wsgi協議的http server,gevent只是它支持的模式之一 ,是爲了解決django、flask這些web框架自帶wsgi server性能低下的問題。

supervisor:

Linux的後臺進程運行有好幾種方法,例如nohup,screen等,可是,若是是一個服務程序,要可靠地在後臺運行,咱們就須要把它作成daemon,最好還能監控進程狀態,在乎外結束時能自動重啓。

supervisor就是用Python開發的一套通用的進程管理程序,能將一個普通的命令行進程變爲後臺daemon,並監控進程狀態,異常退出時能自動重啓。

 

網絡架構:


 

環境:

Ubuntu 15.10

1. 安裝pip和virtualenv

rot@rot-virtual-machine:~$ sudo apt-get install python-pip python-vitualenv

2. 建立獨立環境。

# home目錄下的操做就不用sudo了

rot@rot-virtual-machine:~$ cd ~  #必須到用戶目錄,不然在之後的安裝gunicorn會因爲權限問題失敗
rot@rot-virtual-machine:~$ sudo mkdir -p pythonapp/dffyb
rot@rot-virtual-machine:~$ cd pythonapp/dffyb
rot@rot-virtual-machine:~/pythonapp/dffyb$ vitualenv venv
rot@rot-virtual-machine:~/pythonapp/dffyb$ source venv/bin/activate  # 使用虛擬環境,看下一步linux提示符的變化,開頭多了一個(venv)

(venv)rot@rot-virtual-machine:~/pythonapp/dffyb$ pip install flask
(venv)rot@rot-virtual-machine:~/pythonapp/dffyb$ pip install gunicorn  #安裝成功後,進入venv/bin/目錄,會有一個gunicorn文件,不然安裝失敗。

(venv)rot@rot-virtual-machine:~/pythonapp/dffyb$ deactivate #退出venv環境

rot@rot-virtual-machine:~/pythonapp/dffyb$ vim runserver.py  #建立一個flask引入文件

#!/usr/bin/python                                                                                                                                                                                       
from flask import Flask
 
app = Flask(__name__)

@app.route('/')
def hello():
   return "hello world"
   
if __name__ == '__main__':
     app.run(debug = True)

3. 配置gunicorn。

rot@rot-virtual-machine:~/pythonapp/dffyb/venv$ vim gunicorn.conf

workers = 3  # 服務器內核數                                                                     
bind = '127.0.0.1:8000'  # gunicorn開啓的服務地址和端口,默認8000

4. 配置supervisor。

rot@rot-virtual-machine:~$ sudo apt-get install supervisor

rot@rot-virtual-machine:~$ whereis supervisor
supervisor: /etc/supervisor
rot@rot-virtual-machine:~$ cd /etc/supervisor
rot@rot-virtual-machine:~/etc/supervisor$ cd conf.d
rot@rot-virtual-machine:~/etc/supervisor/conf.d$ sudo vim dffyb.conf

[program:dffyb]     #進程惟一名稱,操做進程時候用                                                                                                                                                          
command=/home/rot/pythonapp/dffyb/venv/bin/gunicorn runserver:app -c /home/rot/pythonapp/dffyb/venv/gunicorn.conf  # 建立進程的命令
directory=/home/rot/pythonapp/dffyb  # 建立進程時的所在目錄
user=www #所屬用戶
autostart=true #自動開啓
autorestart=true #自動重啓
stdout_logfile=/var/log/supervisor/gunicorn_supervisor.log
stderr_logfile=/var/log/supervisor/gunicorn_supervisor.err

rot@rot-virtual-machine:~$ sudo supervisorctl reread  # 從新讀取配置文件

rot@rot-virtual-machine:~$ sudo supervisorctl update # 更新配置文件

rot@rot-virtual-machine:~$ sudo supervisorctl start dffyb # 啓動 gunicorn

rot@rot-virtual-machine:~$ sudo supervisorctl stop dffyb # 中止 gunicorn

rot@rot-virtual-machine:~$ sudo supervisorctl status # 查看狀態

rot@rot-virtual-machine:~$ curl   # 若是返回hello world,說明服務成功開啓

command=/home/rot/pythonapp/dffyb/venv/bin/gunicorn runserver:app -c /home/rot/pythonapp/dffyb/venv/gunicorn.conf  # 解釋

/home/rot/pythonapp/dffyb/venv/bin/gunicorn  #  gunicorn 安裝路徑

runserver:app  # 跑的文件名,runserver.py  , app  runserver.py  中建立的app變量名,其實runserver.py中的app.run()能夠不要,在這裏會自動執行。

centos下

[root@www web] vim /etc/supervisord.conf
#添加

[program:ny108]
command=/data/www/p_ny108com/venv/bin/gunicorn runserver:app -c /data/www/p_ny108com/venv/gunicorn.conf
directory=/data/www/p_ny108com
user=www
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/gunicorn_supervisor.log
stderr_logfile=/var/log/supervisor/gunicorn_supervisor.err


[root@www web] supervisord -c /etc/supervisord.conf

5. nginx配置。

rot@rot-virtual-machine:~$ sudo apt-get install nginx
rot@rot-virtual-machine:~$ sudo cp /etc/nginx/sites-available/default dffyb.conf 
rot@rot-virtual-machine:~$ sudo vim /etc/nginx/sites-available/dffyb.conf

server {  
    listen   80;  
    server_name dffyb.com;  
      
    root /home/rot/pythonapp/dffyb;  
    access_log /home/rot/logs/access.log;  
    error_log /home/rot/logs/error.log;  
  
    location / {  
        proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;  
        proxy_set_header Host $http_host;  
        proxy_redirect off;  
        if (!-f $request_filename) {  
            proxy_pass http://127.0.0.1:8000;  
            break;  
        }  
    }  
}  

rot@rot-virtual-machine:~$ sudo nginx -t # 測試一下配置文件
rot@rot-virtual-machine:~$ sudo service nginx start
rot@rot-virtual-machine:~$ sudo nginx -s reload # 平滑重啓
rot@rot-virtual-machine:~$ curl   # hello world 就成功了、
相關文章
相關標籤/搜索