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 就成功了、