Ubuntu14.04部署Flak應(yīng)用+WSGI+Nginx(親測(cè))

前言:######

在云主機(jī)上部署之前,我在本地的虛擬機(jī)上進(jìn)行了部署,web服務(wù)器采用uwsgi,它是一個(gè)支持包括WSGI在內(nèi)的多種不同接口的web服務(wù)器。
supervisor用來做常規(guī)啟動(dòng)服務(wù),nginx作為反向代理。將部署過程中遇到的問題記錄一下,供以后部署時(shí)參照。

1、環(huán)境

虛擬機(jī)ubuntu 14.04.0系統(tǒng)

2、部署步驟
. 2.1安裝pip和virtualenv

安裝pip

sudo apt-get install python-pip

** 安裝virtualenv**
為了避免不同項(xiàng)目之間的python環(huán)境相互污染,采用它來解決依賴,使用virtualenv的好處就是,不用的應(yīng)用使用不同的環(huán)境。在該環(huán)境中安裝插件不用管理員權(quán)限安裝。

sudo pip install virtualenv
. 2.2 下載項(xiàng)目并創(chuàng)建虛擬環(huán)境

我的項(xiàng)目是在gitlib上,所以關(guān)于如何將項(xiàng)目從gitlib(github)上下載到本地就不過多說了。下載完后的項(xiàng)目目錄為:

/home/www/webapp

在webapp目錄下創(chuàng)建虛擬環(huán)境

ubuntu@ubuntu:/home/www/webapp$ virtualenv venv # 創(chuàng)建虛擬環(huán)境
ubuntu@ubuntu:/home/www/webapp$  source venv/bin/active # 激活虛擬環(huán)境
(venv)ubuntu@ubuntu:/home/www/webapp$   # 表示已經(jīng)激活了虛擬環(huán)境,退出當(dāng)前環(huán)境可以使用deactivate 
. 2.3安裝uwsgi

uwsgi是一個(gè)很大的C應(yīng)用,所以需要解決一些依賴,我在剛開始安裝的過程中遇到最多的問題就是編譯過程中報(bào)錯(cuò),如引入python.h頭文件出錯(cuò),網(wǎng)上也有很多安裝教程,如果遇到問題搜索一下就能解決。

ubuntu@ubuntu:/home/www/webapp$ sudo apt-get install python-dev
ubuntu@ubuntu:/home/www/webapp$ sudo apt-get install uwsgi

安裝完成之后先不考慮部署問題,先來看看flask應(yīng)用的目錄結(jié)構(gòu)

. 2.4Flask目錄結(jié)構(gòu)
/home/www/webapp
                ---migrations/ 數(shù)據(jù)庫(kù)遷移目錄
                --- venv/  虛擬環(huán)境
                ---webapp/ 程序目錄
                ---__init__.py
                ---manage.py 
                ---requirements.txt
manage.py文件中采用flask_script拓展。
命令行運(yùn)行程序 python manage.py runserver
.2.5安裝Flask依賴

進(jìn)入我們2.2步驟創(chuàng)建的虛擬環(huán)境中,使用requirements.txt文件來安裝所有的依賴

(venv)ubuntu@ubuntu:/home/www/webapp$ pip install -r requirements.txt

注意:在所有的依賴安裝安裝完成之后,我們最后使用在命令行python manage.py runserver驗(yàn)證我們的依賴是否安裝完全。
如果命令行運(yùn)行沒問題就進(jìn)行下一步的配置。

.2.6 配置uwsgi

在項(xiàng)目目錄webapp下新建一個(gè)config.ini用來啟動(dòng)uwsgi

uwsgi]

# uwsgi 啟動(dòng)時(shí)所使用的地址與端口
socket = 127.0.0.1:8001 
# 指向網(wǎng)站目錄
chdir = /home/www/ webapp
# python 啟動(dòng)程序文件
wsgi-file = manage.py 
# python 程序內(nèi)用以啟動(dòng)的 application 變量名
callable = app 
# 處理器數(shù)
processes = 4
# 線程數(shù)
threads = 2
#狀態(tài)檢測(cè)地址
stats = 127.0.0.1:9191

運(yùn)行uwsgi

(venv)ubuntu@ubuntu:/home/www/webapp$ uwsgi config.ini
如果沒有問題,程序會(huì)運(yùn)行起來,
但是我在配置的過程中,在程序運(yùn)行起來之后(程序運(yùn)行起來時(shí)打印出來日志讓我判斷uwsgi已經(jīng)把程序運(yùn)行了),
在本地的8001端口并不能訪問程序首頁,我直接進(jìn)行下一步了。
.2.7 安裝supervisor

我使用supervisor來啟動(dòng)應(yīng)用

sudo apt-get install supervisor

supervisor的全局配置文件在/etc/supervisor/supervisor.conf

我們不用改動(dòng),直接新建一個(gè)*.conf文件拷貝到/etc/supervisor/conf.d目錄下

我們新建一個(gè)用來啟動(dòng)我們應(yīng)用的配置文件(flask_supervisor.conf),這個(gè)文件需要拷貝到上面說的目錄。

[program:webapp]
# 啟動(dòng)命令入口, 使用虛擬環(huán)境中的uwsgi運(yùn)行我們的程序,這句就和剛剛上面我們使用uwsgi config.ini作用一樣
command=/home/www/webapp/venv/bin/uwsgi /home/www/webapp/config.ini 

# 命令程序所在目錄
directory=/home/www/webapp
#運(yùn)行命令的用戶名
user=ubuntu
        
autostart=true
autorestart=true
#日志地址,在supervisor運(yùn)行時(shí),保證這個(gè)目錄和文件是存在的,否則會(huì)報(bào)錯(cuò)
stdout_logfile=/home/www/webapp/logs/uwsgi_supervisor.log      

啟動(dòng)服務(wù)和終止服務(wù)

sudo service supervisor start/stop

問題:我在將自定的配置文件flask_supervisor.conf文件拷貝到相應(yīng)位置后,重啟了supervisor后,提示重啟成功,但是沒有任何報(bào)錯(cuò)(后面步驟會(huì)說得到報(bào)錯(cuò)情況)。
于是我使用下面的命令重新加載supervisor后報(bào)錯(cuò)了。

錯(cuò)誤信息
unix:///var/run/supervisor.sock no such file

解決辦法:https://github.com/Supervisor/supervisor/issues/480

我使用了這個(gè)方法后解決了
sudo touch /var/run/supervisor.sock
sudo chmod 777 /var/run/supervisor.sock
sudo service supervisor restart

改完使用supervisorctl reload來讓supervisor重新加載配置文件,通過supervisor status webapp查看我們webapp應(yīng)用狀態(tài)。
這里你要確認(rèn)你的supervisor配置正確后在進(jìn)行下面的步驟。

.2.8 安裝nginx
sudo apt-get install nginx

安裝完成之后配置nginx
新建一個(gè)default文件,然后將這個(gè)文件拷貝到/ext/nginx/sites-available/下面替換到原來的default文件即可。

    server {
      listen  80;
      server_name xxx.xxx.xxx.xxx; #公網(wǎng)地址
    
      location / {
        include      uwsgi_params;
        uwsgi_pass   127.0.0.1:8001;  # 指向uwsgi 所應(yīng)用的內(nèi)部地址,所有請(qǐng)求將轉(zhuǎn)發(fā)給uwsgi 處理
        uwsgi_param UWSGI_PYHOME /home/www/webapp/venv; # 指向虛擬環(huán)境目錄
        uwsgi_param UWSGI_CHDIR  /home/www/webapp; # 指向網(wǎng)站根目錄
        uwsgi_param UWSGI_SCRIPT manage:app; # 指定啟動(dòng)程序
      }
    }

配置好后重啟服務(wù)

sudo service nginx restart
restart

保證你的nginx在修改完配置后重啟成功[ok]

3、可能遇到的問題
.3.1 nginx都配置好后,訪問公網(wǎng)ip出現(xiàn)502

如果上面的都配置好后,出現(xiàn)502的錯(cuò)誤,說明你的nginx配置沒有問題,但是問題出在了supervisor上,它并沒有把我們的程序運(yùn)行起來,所以你把注意力轉(zhuǎn)移到supervisor配置上。采用2.7步驟中描述的那樣好好檢查配置。
或者手動(dòng)運(yùn)行uwsgi config.ini文件把程序啟動(dòng)起來,然后在訪問公網(wǎng)IP,看看能不能訪問到,正常情況下是可以的,這就驗(yàn)證了supervisor沒有啟動(dòng)程序。

4、總結(jié)

網(wǎng)上有很多關(guān)于這方面的內(nèi)容,不管別人說的再詳細(xì),自己在操作的過程中肯定不會(huì)一次通過,有些人沒有把一些坑寫出來,或者沒遇到,所以想要成功部署還需要自己親自趟一趟。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容