前一陣本身用flask框架寫了一個博客程序,寫完以後想部署到服務器上,由於是小白,因此本身google了好些資料,講的零零碎碎並且有些地方只是告訴你怎麼配置,但具體爲何這樣配卻沒有說明,因此本身總結了一篇從頭至尾的過程。html
服務器上部署項目說白了就是讓你的項目在這臺服務器上運行而且作到能夠在公網上訪問你的項目。
那麼若是要作到這兩點,須要作的工做有以下幾個方面:前端
服務器的環境搭建,讓服務器具備運行項目的必要環境python
上傳你的項目代碼到服務器nginx
配置服務器代理,處理來自Internet上的請求。web
首先說一下系統的選擇問題,先排除掉Windows系統,在Linux系統下,Ubuntu,Debian,CentOS都很不錯。sql
Ubuntu有強大的軟件源支持,但它更適合於桌面操做系統。Debian穩定,佔硬盤空間小,佔內存小,但發展過快,其安全性和穩定性都沒有CentOS好。因此我選擇了CentOS。對於三者的比較能夠看 http://waynerqiu.com/7/156.html。json
買來的服務器須要用遠程鏈接來操做,這裏推薦使用putty。我使用的是CentOS 6.3 x86_64,不一樣的版本可能在安裝軟件的地址可能會有些不一樣。flask
Linux系統下自帶了低版本的python,能夠經過python -V查看。自帶的python版本會和系統的一些功能有關聯,好比yum。後端
flask項目須要python2.7以上的版本,因此咱們須要在系統中安裝python2.7或python3.5。centos
下載並安裝 Python 2.7.5:
#wget http://www.python.org/ftp/python/2.7.5/Python-2.7.5.tar.bz2
若是此時沒有wget,能夠經過yum install wget來安裝
#tar jxvf Python-2.7.5.tar.bz2 #cd Python-2.7.5 #./configure --prefix=/usr/local #make && make install
這時的python2.7.5還不是咱們系統將會使用的python(如今鍵入python -V後,顯示的還會是低版本的python)。因此須要創建軟鏈接,使系統默認的python指向python2.7.5。
#mv /usr/bin/python /usr/bin/python2.4.3 //你的python版本可能不一樣 #ln -s /usr/local/bin/python27 /usr/bin/python
使用了新版本的python會致使yum安裝軟件報錯,由於yum沒有兼容python2.7,因此咱們要指定yum使用的python版本。
#vi /usr/bin/yum
進入編輯模式,將#!/usr/bin/python
改爲#!/usr/bin/python2.7.5
安裝相關的開發工具盒和一些包
#yum groupinstall "Development tools" #yum install zlib zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel
安裝pip
# wget https://pypi.python.org/packages/source/p/pip/pip-1.3.1.tar.gz --no-check-certificate
因爲下載pip是基於https協議的,故須要在wget url
後面加上--no-check-certificate
,不然不能下載。
解壓和安裝pip
#chmod +x pip-1.3.1.tar.gz #tar xzvf pip-1.3.1.tar.gz #cd pip-1.3.1 #python setup.py install
在最後一步可能會報錯"ImportError: No module named setuptools"
,緣由是沒有安裝setuptools
安裝setuptools
#wget https://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg --no-check-certificate #chmod +x setuptools-0.6c11-py2.7.egg #sh setuptools-0.6c11-py2.7.egg
這一步也有可能報錯"zlib not available"
,可使用#rpm -qa | grep zlib
查看可用的安裝包,將沒有安裝的安裝上(上面咱們已經安裝了zlib和zlib-devel)
再次運行sh setuptools-0.6c11-py2.7.egg,發現仍是報錯?一樣的錯誤?
那麼這應該不是zlib的問題,而是python的問題,咱們須要從新編譯python2.7.5,在編譯以前須要修改一下Modules/Setup.dist文件。找到
#zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz
將註釋去掉,從新編譯python2.7.5
#cd Python-2.7.5 #./configure --prefix=/usr/local #make && make install
這樣zlib應該能夠用了,回到setuptools的安裝,再回到pip的安裝,這回總算把pip安裝上了。你能夠在全局環境下安裝flask相關的包(若是你的服務器中包括未來只想運行一個項目的話),也能夠將包安裝在虛擬環境中。先別急,把項目代碼上傳了再說。
接下來能夠上傳你的flask項目代碼到服務器上,可使用flashFXP或者FileZilla來上傳。
這裏按照個人上傳目錄來介紹接下來的步驟,個人flask項目代碼放在了 /home/www/WebBlogold
(WebBlogold就是個人項目文件夾)。不明白Linux目錄結構?能夠google一下,這裏推薦一篇 http://yangrong.blog.51cto.com/6945369/1288072。
若是你的服務器上有多個項目,那麼建議你安裝virtualenv虛擬環境。virtualenv能夠解決項目與項目之間對同一個包的不一樣版本的依賴問題。
使用pip安裝virtualenv虛擬環境
pip install virtualenv
進入項目目錄,在目錄下鍵入 virtualenv venv
,其中venv是你要建的虛擬環境文件夾的名字,結果會出現下面兩行
New python executable in venv/bin/python Installing setuptools, pip...done.
說明文件夾已經建好,使用 source venv/bin/activate
命令來啓用虛擬環境,啓用後你當前的路徑名的前面會有一個(venv)。
在虛擬環境下安裝flask相關包,你能夠一個一個安裝,也能夠將全部的包寫在一個txt文件裏,一次性安裝。
flaskrelated.txt文件:
Flask==0.10.1 Flask-Login==0.2.11 Flask-Mail==0.9.1 Flask-Moment==0.4.0 Flask-PageDown==0.1.5 Flask-SQLAlchemy==2.0 等等
保存在你的項目文件夾下,在虛擬環境中鍵入 pip install -r flaskrelated.txt
來安裝他們。
個人服務器代理是安裝在全局中的,固然你也能夠在虛擬環境裏安裝。
使用的代理一共有兩個,nginx和uwsgi,先說明一下,若是不用nginx同樣能夠訪問你的項目,使用nginx的目的是爲了安全和負載均衡。配置了nginx作前端代理,uwsgi做後端代理的服務器(這裏所說的先後端都是相對的位置,並沒有實際含義),在處理來自Internet的請求時,要先通過nginx的處理,nginx把請求再交給uwsgi,通過uwsgi才能訪問到項目自己。
沒有nginx而只有uwsgi的服務器,則是Internet請求直接由uwsgi處理,並反饋到咱們的項目中。
nginx能夠實現安全過濾,防DDOS等保護安全的操做,而且若是配置了多臺服務器,nginx能夠保證服務器的負載相對均衡。
而uwsgi則是一個web服務器,實現了WSGI協議(Web Server Gateway Interface),http協議等,它能夠接收和處理請求,發出響應等。因此只用uwsgi也是能夠的。
先安裝uwsgi
pip install uwsgi
在你的項目根目錄下建立一個配置文件uwsgiconfig.ini(uwsgi支持多種配置文件格式,xml,ini,json等)
[uwsgi] socket = 127.0.0.1:8001 //啓動程序時所使用的地址和端口,一般在本地運行flask項目, //地址和端口是127.0.0.1:5000, //不過在服務器上是經過uwsgi設置端口,經過uwsgi來啓動項目, //也就是說啓動了uwsgi,也就啓動了項目。 chdir = /home/www/ //項目目錄 wsgi-file = manage.py //flask程序的啓動文件,一般在本地是經過運行 // python manage.py runserver 來啓動項目的 callable = app //程序內啓用的application變量名 processes = 4 //處理器個數 threads = 2 //線程個數 stats = 127.0.0.1:9191 //獲取uwsgi統計信息的服務地址
保存配置文件,咱們能夠經過鍵入 uwsgi uwsgiconfig.ini
來啓動uwsgi。
安裝nginx:因爲nginx不在yum安裝軟件源裏,因此添加上
#rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm #yum install nginx
nginx的一些命令
啓動: nginx
中止: nginx -s -stop
強制中止: pkill -9 nginx
查看nginx是否應用配置文件: nginx -t
查看版本: nginx -v
先別急着啓動咱們的nginx代理服務器,先來寫一下nginx的配置文件。
nginx的配置文件在/etc/nginx/conf.d/
文件夾下,也有可能在/etc/nginx/sites-enabled/default
。咱們打開默認的配置文件,大部份內容都是加註釋的,須要咱們修改。
events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; //默認的web訪問端口 server_name xxx.xxx.xxx.xxx; //你的公網ip #charset koi8-r; access_log /home/www/WebBlogold/logs/access.log; //服務器接收的請求日誌, //須要在項目文件夾下建立 //logs文件夾,下同。 error_log /home/www/WebBlogold/logs/error.log; //錯誤日誌 location / { include uwsgi_params; //這裏是導入的uwsgi配置 uwsgi_pass 127.0.0.1:8001; //須要和uwsgi的配置文件裏socket項的地址 //相同,不然沒法讓uwsgi接收到請求。 uwsgi_param UWSGI_PYHOME /home/www/WebBlogold/venv; //python的位置(虛擬環境下) uwsgi_param UWSGI_CHDIR /home/www/WebBlogold; //項目根目錄 uwsgi_param UWSGI_SCRIPT manage:app; //啓動項目的主程序(在本地上運行 //這個主程序能夠在flask內置的 //服務器上訪問你的項目) } } } 下面是一堆#,全都是註釋,不用管它。
在啓動nginx時,若是發現報錯"98:Address already in use"
,不要着急,頗有多是由於你的nginx已經啓動了。
經過 netstat -ntlp
查看端口占用狀況,看看是否是你的nginx佔用的80端口。若是發現有其餘程序佔用了nginx的默認的80端口,能夠殺掉這些進程,再啓動nginx。
到此,咱們終於完成了全部的工做,立刻就能夠訪問本身的項目了。
如今,檢查一下nginx的配置文件是否應用 nginx -t 沒有成功應用的話,檢查一下配置文件。
鍵入 nginx
來啓動nginx
鍵入uwsgi uwsgiconfig.ini
啓動uwsgi
這時uwsgi會告訴你你的項目是否有錯誤,若是本地運行良好,通常是沒有錯誤的。
有可能會報的錯是項目相關模塊的引入路徑不對,修改一下即可。沒有報錯的話,打開瀏覽器,輸入你的服務器IP地址,或者若是你有相應的域名,並解析到了你的IP,輸入域名也能夠。
若是一切順利的話,顯示的就是你想要的頁面了,若是不是,首先查看一下日誌文件,他們在你的項目根目錄下logs文件夾裏。