運維繫列(3)-- Flask Linux部署(項目):Flask+Nginx+Gunicorn+Supervisor

Flask Linux部署(HelloTest):Flask+Nginx+Gunicorn+Supervisor

雲服務器部署Java web項目(JDK, Tomcat, MySQL)

目錄

這篇博客僅爲部署流程,想了解nginx的作用的話推薦一個博客
https://www.cnblogs.com/zhouxinfei/p/7862285.html ,廢話不多說,直接上教程。


打開要部署的項目

cd /home/jianxiang/pycharmSpace/customs_flask/

創建 python 虛擬環境

virtualenv 是 python 的一個神器。用來在一個系統中創建不同的 python 隔離環境。相互之間還不會影響,使用簡單到令人髮指。(我的工作路徑是 /home/jianxiang/pycharmSpace/customs_flask/)

virtualenv venv
source venv/bin/activate   //激活虛擬環境

效果如圖所示:
這裏寫圖片描述

安裝 python web 框架 —flask

pip install flask

啓動我們的項目:

python app.py

這時候會提示因爲缺少一些module報錯,那麼接下來就是pip install *

scipy error

注意在安裝scipy的時候可能會報錯如下:

numpy.distutils.system_info.NotFoundError: no lapack/blas resources found

這個時候要作如下操作:

1、scipy需要依賴numpy包,先pip install numpy

2、用ls /usr/lib | grep blas 查看,缺少了一些libopenblas系統庫(缺少libopenblas庫),用sudo apt-get install libopenblas-dev安裝該庫,安裝後查看如下:
這裏寫圖片描述
3、pip install scipy 一下,還是不行的話,執行sudo apt-get install liblapack-dev
4、pip install scipy 一下,還是不行的話,執行sudo apt-get install libatlas-dev
5、 這時pip install scipy 一下就可以了。

mysqldb error

ImportError: No module named 'MySQLdb'

解決方案:

pip install MySQL-python

接着繼續pip install * 安裝缺少的module,最後pip list 一下:
這裏寫圖片描述

這時候再次啓動我們的項目:

python app.py

這裏寫圖片描述
訪問http://precision:5000/task/,就可以顯示網站了:
這裏寫圖片描述

Gunicorn 部署 Flask

安裝 gunicorn

pip install gunicorn

pip 是一個重要的工具,python 用來管理包。還有一個最佳生產就是每次使用 pip 安裝的庫,都寫入一個 requirement 文件裏面,既能知道自己安裝了什麼庫,也方便別人部署時,安裝相應的庫。

 pip freeze > requirements.txt

以後每次 pip 安裝了新的庫的時候,都需freeze 一次。

當我們安裝好 gunicorn 之後,需要用 gunicorn 啓動 flask,注意 flask 裏面的name裏面的代碼啓動了 app.run(),這個含義是用 flask 自帶的服務器啓動 app。

gunicorn -w8 --threads 12 -b0.0.0.0:5000 app:app

其中 gunicorn 的部署中,,-w 表示開啓多少個 worker,-b 表示 gunicorn 開發的訪問地址。

想要結束 gunicorn 只需執行 pkill gunicorn,有時候還的 ps 找到 pid 進程號才能 kill。可是這對於一個開發來說,太過於繁瑣,因此出現了另外一個神器—supervisor,一個專門用來管理進程的工具,還可以管理系統的工具進程。
這裏寫圖片描述

Supervisor管理

安裝 supervisor

pip install supervisor

生成 supervisor 默認配置文件

echo_supervisord_conf > supervisor.conf   

這裏寫圖片描述
修改 supervisor 配置文件,添加 gunicorn 進程管理

vim supervisor.conf                       

修改爲如下:

#這幾行解註釋(即刪除每行的第一個;),同時將127.0.0.1改爲0.0.0.0
[inet_http_server]         ; inet (TCP) server disabled by default
port=0.0.0.0:9001        ; (ip_address:port specifier, *:port for all iface)
username=user              ; (default is no username (open server))
password=123               ; (default is no password (open server))


[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket
serverurl=http://0.0.0.0:9001 ; use an http:// url to specify an inet socket
username=user              ; should be same as http_username if set
password=123                ; should be same as http_password if set

創建存放log的文件夾

mkdir log

在文件最後加入如下:這裏的[program:app],app爲主程序的文件名。
注意路徑,我這裏爲:/home/jianxiang/pycharmSpace/customs_flask



[program:app]
command=/home/jianxiang/pycharmSpace/customs_flask/venv/bin/gunicorn -w8 --threads 12 -b0.0.0.0:5000 app:app
directory=/home/jianxiang/pycharmSpace/customs_flask
startsecs=0
stopwaitsecs=0
autostart=false
autorestart=true
stdout_logfile=/home/jianxiang/pycharmSpace/customs_flask/log/gunicorn.log
stderr_logfile=/home/jianxiang/pycharmSpace/customs_flask/log/gunicorn.err

現在可以使用 supervsior 啓動 gunicorn啦。
運行命令

supervisord -c supervisor.conf
supervisorctl -c supervisor.conf status          #察看supervisor的狀態
supervisorctl -c supervisor.conf reload                    #重新載入 配置文件
supervisorctl -c supervisor.conf start [all]|[appname]     #啓動指定/所有

訪問 http://precision:5000/task/ 可以看見gunciron 啓動的返回的頁面了
這時候在執行命令:

supervisorctl -c supervisor.conf reload                    重新載入 配置文件
supervisorctl -c supervisor.conf status                    察看supervisor的狀態
supervisorctl -c supervisor.conf start all

訪問 http://127.0.0.1:9001 就可以得到 supervisor的web管理界面如下:(用戶名密碼爲上述配置文件的user 123)
這裏寫圖片描述
這裏寫圖片描述

supervisor的基本使用命令

supervisord -c supervisor.conf                             通過配置文件啓動supervisor
supervisorctl -c supervisor.conf status                    察看supervisor的狀態
supervisorctl -c supervisor.conf reload                    重新載入 配置文件
supervisorctl -c supervisor.conf start [all]|[appname]     啓動指定/所有 supervisor管理的程序進程
supervisorctl -c supervisor.conf stop [all]|[appname]      關閉指定/所有 supervisor管理的程序進程

若是遇到問題:Error: Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before starting

請將配置文件複製到編輯器裏,重新echo_supervisord_conf > supervisor.conf生成新的配置文件,再對之進行修改vim supervisor.conf(即將剛纔複製到編輯器裏的複製過來)。
實在不行的話就重新連接服務器,試一下supervisor的基本使用命令,我就是搞來搞去就好了,,,(說實話剛這個我試了二十多遍,然後寫博客也在不停試錯,程序員總是這樣)

配置 Nginx

採用 apt-get方式安裝最簡單。運行 sudo apt-get install nginx。安裝好的nginx的二進制文件放在 /usr/sbin/文件夾下面。而nginx的配置文件放在 /etc/nginx下面。

使用 supervisor 來管理 nginx。這裏需要注意一個問題,linux的權限問題。nginx是sudo的方式安裝,啓動的適合也是 root用戶,那麼我們現在也需要用 root用戶啓動supervisor。增加下面的配置文件

[program:nginx]
command=/usr/sbin/nginx
startsecs=0
stopwaitsecs=0
autostart=false
autorestart=false
stdout_logfile=/home/ubuntu/flask/myproject-master/log/nginx.log
stderr_logfile=/home/ubuntu/flask/myproject-master/log/nginx.err

同樣是執行上面執行過的命令:

supervisorctl -c supervisor.conf reload                    重新載入 配置文件
supervisorctl -c supervisor.conf status                    察看supervisor的狀態
supervisorctl -c supervisor.conf start all

這時候你可能會看到如下界面(nginx是exited):
這裏寫圖片描述
這時需要在nginx配置文件中修改如下:(注意路徑)
/etc/nginx/sites-available/default

server {
 listen 5001;
 server_name localhost;
 root /home/jianxiang/pycharmSpace/customs_flask;
 access_log /home/jianxiang/pycharmSpace/customs_flask/log/nginx.log;
 error_log /home/jianxiang/pycharmSpace/customs_flask/log/nginx.err;

 location / {
 proxy_pass http://127.0.0.1:8080;
 proxy_redirect off;
 proxy_set_header Host $host:9003;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 }
}

這時就可以通過訪問http://precision:5001訪問網站。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章