標籤:
Flask本身就可以直接啟動HTTP伺服器,但是受限於管理、部署、效能等問題,在生產環境中,我們一般不會使用Flask自身所帶的HTTP伺服器。
從現在已有的實踐來看,對於Flask,比較好的部署方式是使用uWSGI做WSGI容器,Nginx做前端伺服器。這樣做的好處在於:
1. uWSGI效能好,提供的功能也很多,營運方便。
2. Nginx對於靜態檔案處理較好,而且預設支援uWSGI協議,在負載平衡和壓力控制上都可以很方便的實現。
現在說一下具體的部署步驟:
因為本人比較喜歡Ubuntu Server做伺服器作業系統,所以這些操作只適於Ubuntu系統。在Ubuntu中我們就應該安裝Ubuntu的方式進行部署營運,而不是進行編譯安裝,通過ubuntu apt源安裝部署,不僅在整體風格上符合系統風格,而且提供給配置和營運巨大方便。
首先更新軟體源:
sudo apt-get update
安裝Nginx:
sudo apt-get install nginx
安裝uWSGI以及uWSGI對於Python的支援:
sudo apt-get install uwsgi uwsgi-plugin-python
安裝virtualenv:
這裡是一個個人選擇問題,因為眾多python包也可以通過apt源安裝。
我個人習慣是,一些python工具通過源安裝,比如supervisor,管理和升級都比較方便,而python一些第三方庫還是在virtualenv中通過pip安裝,像是virtualenv這樣的基礎工具還是通過源安裝。
sudo apt-get install python-virtualenv
建立Python環境:
mkdir -p /var/virenvs
cd /var/virenvs
virtualenv myenv
安裝Flask:
cd myenv
. bin/activate
pip install flask
建議使用pip的freeze和install -r requirement_file進行環境部署。
假設我們的項目路徑在 /var/virenvs/myenv/myproject,這時我們可以通過git或者其他什麼方式把程式部署上來。
給項目目錄配置許可權,nginx和uwsgi預設是以www-data使用者和組來運行:
chown -R www-data:www-data /var/virenvs/myenv/myproject
chmod -R 775 /var/virenvs/myenv/myproject
對於nginx和uwsgi我們可以使用vhost方式進行部署,這樣既能保證每個項目使用獨立的virtualenv又可以,共用一個uWSGI池,這樣在使用、部署和管理上都比較方便。
vim /etc/nginx/site-available/myproject
server {listen 80;server_name hostname; location /static {alias /var/virenvs/myenv/myproject/static;} location / {include uwsgi_params;uwsgi_pass 127.0.0.1:9001;uwsgi_param UWSGI_PYHOME /var/virenvs/myenv;uwsgi_param UWSGI_CHDIR /var/virenvs/myenv/myproject;uwsgi_param UWSGI_MODULE mywebsite;uwsgi_param UWSGI_CALLABLE app;} error_page 404 /404.html;}
其中mywebsite為項目目錄下的mywebsite.py檔案,UWSGI_CALLABLE為其中的Flask執行個體名。
建立軟串連到enabled目錄
ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/myproject
uwsgi配置
vim /etc/uwsgi/apps-available/myuwsgi.ini
[uwsgi]plugins=pythonvhost=truesocket=127.0.0.1:9001
uwsgi還有很多其他配置項,產生環境中需要好好配置。
建立軟串連到enabled目錄
ln -s /etc/uwsgi/apps-available/myuwsgi.ini /etc/uwsgi/apps-enabled/myuwsgi.ini
重啟服務
service nginx restart
service uwsgi restart
部署完成
nginx有許多配置方式,他的載入過程如下:
啟動nginx服務,他會載入nginx.conf,這個檔案會載入/etc/nginx/site-enabled中的配置,這個配置講相關參數傳給uwsgi,uwsgi來管理app 應用
並將結果返回給nginx伺服器,最後以html的形式顯示。
如果出現nginx中upstream錯誤,則是nginx與uwsgi通訊出現問題,看看配置是否有問題
如果出現python .egg許可權問題,則需要設定python-egg-cache路徑:http://blog.csdn.net/watsy/article/details/9665339,這裡需要注意的是,第三方包的cache儲存地點許可權問題
調試
應用app的調試主要是看log檔案,這裡有幾個Log檔案需要注意:
nginx:access.log,error.log,主要記錄的是web請求的記錄以及相關錯誤
uwsgi:myuwsgi.log,主要記錄的是應用程式內部錯誤
nginx+uwsgi+flask搭建python-web應用程式