原文:http://www.catonlinepy.tech/
聲明:原創不易,未經許可,不得轉載
這篇文章,貓姐將討論如何將flask程序部署到ubuntu服務器上。其中,部署過程涉及到Flask,Nginx,Gunicorn,Supervisor的安裝使用。通過學習今天的文章,你將學會部署自己開發的Flask web程序,真正讓自己開發的應用上線運行。
0. Flask Web應用處理請求的過程
1. 安裝相應的依賴環境
使用ssh username@ip 進入雲主機的shell環境,並在雲主機上安裝需要依賴環境,使用如下命令安裝:
sudo apt-get install nginx supervisor python-pip python3-venv
ssh的使用方法:ssh命令,加上@前面是雲主機服務器的用戶名,@後面是雲主機服務器的ip地址。
2. 創建虛擬環境
如果雲主機中沒有創建虛擬環境,那麼我們有必要創建一個。虛擬開發環境的主要作用是爲了將web項目所用的各種庫與操作系統自帶的python庫隔離開來,這樣做的好處是開發環境與系統環境隔離,環境之間不會相互影響,特別是對於多人協作的大型項目開發,建立虛擬環境是非常有必要的。下面開始創建虛擬環境:
# 使用下面命令,創建一個虛擬開發環境
$ python3 -m venv <虛擬環境的名字>
# 激活剛纔建立的虛擬開發環境,(這裏我們創建一個名爲miao_venv的虛擬環境)
$ python3 -m venv miao_venv
$ source maio_venv/bin/activate
# 安裝flask web程序所需要的python包
$ pip installl -r requirement.txt
激活虛擬環境後,進入run.py文件的目錄,在終端中輸入python run.py,就可以將程序運行起來了。但是,這樣生產環境中將flask程序運行起來是不安裝的,並且處理用戶請求的能力也非常不足。所以,我們應該去使用gunicorn這個工具去運行我們的Flask web程序。
3. 設置Gunicorn
Gunicorn(“Green Unicorn”)是一個unix上被廣泛使用的高性能的Python WSGI UNIX HTTP Server。和大多數的web框架兼容,並具有實現簡單,輕量級,自動管理多個worker進程,高性能等多個特點。
採用如下命令安裝gunicorn:
pip install gunicorn
gunicorn運行Flask web程序的方法也非常簡單,如下命令即可達到目的:
gunicorn filename(run):變量名(app) -b localhost:端口號 &
# 解釋:filename指的是能夠將flask程序運行起來的python文件,如run.py的文件名run。冒號後面的是flask實例化的app變量。端口號是在網頁中輸入的url的端口號
查看端口服務是否生效,可以使用下面的命令:
# 在命令行中輸入:
$ ps aux|grep gunicorn
# 下面是效果
(miao_venv) root@vultr:~/flaskblog# ps aux|grep gunicorn
root 4124 0.0 0.0 11020 980 pts/0 S+ 10:35 0:00 grep --color=auto gunicorn
root 11117 0.0 2.1 33308 21400 ? S May28 0:10 /root/blog_venv/bin/python3 /root/blog_venv/bin/gunicorn run:app -b localhost:5006
root 11120 0.0 7.6 160528 77160 ? S May28 0:17 /root/blog_venv/bin/python3 /root/blog_venv/bin/gunicorn run:app -b localhost:5006
這樣就能夠使用gunicorn進程去監聽5006的端口。現在gunicorn進程是工作在後臺的,但只有一個gunicorn進程會處理web請求,當用戶訪問量過大時,網站的併發處理能力非常弱。最理想的方法是,使用supervisor工具去啓動並監控多個gunicorn進程。
4. 配置、啓動Supervisor
supervisor工具可以監視並控制類Unix操作系統的進程。supervisor將gunicorn進程啓動後,會一直監控gunicorn進程的運行情況。當gunicorn進程出現異常掛掉後,supervisor會立刻啓動guincorn進程,確保web程序提供的用戶服務不受影響。
supervisor的使用也非常簡單,只需要完成一個conf文件的編寫,在/etc/supervisor/conf.d/目錄下創建一個flaskblog.conf文件並依據自己的要求去配置它。配置內容如下所示:
# flaskblog.conf 文件內容如下
[program:flaskblog]
# 你的博客程序所在的目錄
directory=/root/flaskblog/.
command=/root/flaskblog/miao_venv/bin/gunicorn run:app -b localhost:5006 # 這個地方的端口號要與nginx.conf文件中一致
autostart=true
autorestart=true
stderr_logfile=/var/log/flaskblog.err.log
stdout_logfile=/var/log/flaskblog.out.log
爲了使以上配置立刻生效,需要運行下面的命令:
$ sudo supervisorctl reread
$ sudo service supervisor restart
#另外一些常用的命令
$ sudo service supervisor stop
$ sudo service supervisor start
這樣, 我們就可以通常supervisor工具來完成對gunicorn進程的監控了,使用下面的命令可以看到flaskblog是否處於運行狀態,及運行進程ID和運行時長:
$ sudo supervisorctl status
# 狀態顯示
(miao_venv) root@vultr:~/flaskblog# sudo supervisorctl status
flaskblog RUNNING pid 11117, uptime 19:18:31
5. 配置、啓動Nginx
Nginx可以作爲HTTP服務器和反向代理服務器,它能夠實現負載均衡,分擔服務器的壓力。
現在,爲我們的flask程序定義一個服務塊,如下所示:
# 在/etc/nginx/nginx.conf文件中添加如下內容
# server添加的位置在http{}裏面
server {
listen 80;
server_name example.org; # 這是HOST機器的外部域名,用地址也行。現在還沒有域名,可以用example.org代替
location / {
proxy_pass http://127.0.0.1:5006; # 這裏是指向 gunicorn host 的服務地址
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# 注意:proxy_pass中,代理傳遞的端口必須與gunicorn進程的端口號相同
現在重啓nginx web服務器,命令如下:
$ sudo nginx -t
$ sudo service nginx restart
此時,你已經可以通過雲主機上的公網IP來訪問你的Flask web程序了,貓姐的博客運行起來後的效果如下:
6. 總結
通過佈署flask程序到ubuntu雲主機服務器上,我們掌握了以下技能:
1.學到了Gunicorn的使用
2.學到了Supervisor的使用
3.學到了Nginx的使用
今天的flask上線佈署教程就到這裏,喜歡的同學們可以在下面點贊留言,或是訪問我的博客地址:http://www.catonlinepy.tech/ 加入我們的QQ羣進一步交流學習!