我們在用Flask開發(fā)服務端的時候,最終會面臨著生產(chǎn)環(huán)境怎么部署的問題,難道和開發(fā)環(huán)境一樣,啟動入口文件,監(jiān)聽寫定的端口就可以嗎?當然不是,因為Flask自帶的服務器很弱,主要是為了方便開發(fā)調(diào)試用的。而生產(chǎn)環(huán)境不會采用Flask自帶的服務器的。生產(chǎn)環(huán)境應該使用gunicorn或者uWSIG。本文主要介紹的是gunicorn搭建生產(chǎn)環(huán)境。
生產(chǎn)環(huán)境介紹
我會以自己的博客網(wǎng)站生產(chǎn)環(huán)境的搭建為例來說明。
生產(chǎn)環(huán)境
- 系統(tǒng):阿里云Ubuntu 16.04
- Python版本:Python3.7
- 虛擬環(huán)境:virtualenv+virtualenvwrapper
所需工具和模塊
- Flask:Python的服務器框架
- Gunicorn:WSGI的容器
- Supervisor:進程管理工具
- Nginx:反向代理服務器
生產(chǎn)環(huán)境的搭建
下面介紹的是搭建生產(chǎn)環(huán)境的主要步驟和配置,不包括python、virtualenv以及業(yè)務上相關模塊的安裝。這類安裝網(wǎng)上資料很多,可自行進行查閱。
創(chuàng)建虛擬環(huán)境
在安裝和配置好了virtualenv和virtualenvwrapper之后就可以創(chuàng)建虛擬環(huán)境了,當然virtualenvwrapper不是必須的,只是命令更加好用而已。
創(chuàng)建虛擬環(huán)境
mkvirtualenv env_flask
運行成功后我們就創(chuàng)建了一個env_flask的虛擬環(huán)境,你會看到用戶的前綴變成了
(env_flask) root@qiye:~#
再試著運行一下python命令
Python 3.7.4 (default, Sep 29 2019, 10:03:44)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
pip install flask
在安裝好程序運行所需要的包后,再運行
deactivate
就可以退出虛擬環(huán)境
常用的命令
-
mkvirtualenv env_name創(chuàng)建虛擬環(huán)境 -
workon env_name啟動虛擬環(huán)境 -
workon查看虛擬環(huán)境 -
deactivate退出虛擬環(huán)境 -
rmvirtualenv env_name刪除虛擬環(huán)境
當然你也可以根據(jù)自己的喜好選擇pipenv來創(chuàng)建虛擬環(huán)境,它不僅可以創(chuàng)建虛擬環(huán)境,也是一個好用的包管理工具。
注意: 虛擬環(huán)境里的python和環(huán)境外的python是獨立的,你可以想象在成一個獨立的空間。環(huán)境里和環(huán)境外安裝的包互不影響。
安裝和配置Gunicorn
前面說過了Gunicorn是一個WSGI容器。主要用于提供http的請求和響應。他比開發(fā)服務器更強健、性能更高。
注意:這類容器很多,通常有Gunicorn、uWSGI、Gevent、Waitress等,主流的選擇是Gunicorn和uWSGI。使用簡單,容易配置,性能優(yōu)秀。
在進入虛擬環(huán)境后,直接輸入
pip install gunicorn
就可以安裝了。那我們應該怎么使用呢?
最簡單的使用方式如下所示:
gunicorn -w 4 -b 0.0.0.0:8001 test:app
-
w是workers的縮寫,表示開啟的進程數(shù)量,建議該值為CUP數(shù)量*2 + 1,可以參考官網(wǎng)進行配置和設定 -
b指的是監(jiān)聽地址和端口 -
test表示的是入口文件 -
app表示創(chuàng)建的app對象。
這樣就能簡單的開啟服務了。是不是很簡單,但是這樣也并不方便服務的啟停,監(jiān)控等,所以經(jīng)常會和進程管理工具supervisor一起使用,后面會講到怎么和gunicorn搭配使用。
當然這里只是簡單的配置和啟動,還有許多配置項,我們也經(jīng)常會用到。我們最好把配置寫在一個文件里,然后在運行這個文件豈不是更好。它是一個python文件,比如為gunicorn_web.py
import multiprocessing
bind = '127.0.0.1:8000' # 監(jiān)聽的地址和端口。
workers = multiprocessing.cpu_count() * 2 + 1 # 開啟的進程數(shù)
threads = multiprocessing.cpu_count() * 2 # 工作進程中線程的數(shù)量。只適用于gthread 進程工作方式
backlog = 2048 client處于waiting的數(shù)目
worker_class = "gevent" # worker進程的工作方式
worker_connections = 1000 # 客戶端最大同時連接數(shù)。
daemon = False # 應用是否以daemon方式運行
errorlog = './log/gunicorn.log' # 錯誤日志路徑
.
.
.
很多配置可以查看官網(wǎng)配置項
我個人的博客網(wǎng)站因為很簡單,就沒有單獨寫成配置文件。直接在supervisor的配置文件里寫上command=/root/.virtualenvs/env_flask/bin/gunicorn -w4 -b 0.0.0.0:8001 app:app
安裝和配置Supervisor
Supervisor是一個client/server系統(tǒng),是一款運行在類UNIX系統(tǒng)上的進程管理工具。可以很簡單的控制進程的開關,啟停,監(jiān)聽等操作。雖然是基于python開發(fā),可使用范圍卻不局限于python服務。進程管理都可以使用supervisor。
早期的Supervisor版本還只支持Python2,現(xiàn)在版本4發(fā)布后已經(jīng)完美的支持Python3了。
安裝的方式有很多,根據(jù)不同的系統(tǒng)輸入不同的安裝命令,本文都是以Ubuntu 16.04為例來進行說明。
直接用系統(tǒng)安裝命令安裝
apt-get install supervisor
安裝成功后,會在/etc/supervisor生成supervisord.conf配置文件。
root@qiye:/etc/supervisor# ls
conf.d supervisord.conf
當然我們習慣性的不去修改默認的配置文件,而是專門把自己的配置文件單獨寫在指定的文件夾中,我部署的這個博客的配置就是放在conf.d文件夾下的missoweb.conf文件中。
采用pip進行安裝
pip install supervisor
官網(wǎng)有更為詳細的安裝步驟。
配置文件
在安裝成功后,就需要寫配置文件了。前面說過這個博客的配置就是放在conf.d文件夾下的missoweb.conf文件中。
missoweb.conf配置文件內(nèi)容為
[program:missoweb]
command=/root/.virtualenvs/env_flask/bin/gunicorn -w4 -b 0.0.0.0:8001 app:app
directory=/data/MissoWebServer/
stdout_logfile=/logs/gunicorn.log
stderr_logfile=/logs/gunicorn.err
autostart=false ;
autorestart=false
這個配置很簡單。常用配置下面會一一說明
-
[program:missoweb]程序名稱(用于啟動,停止,重啟等) -
command=運行程序的命令,表示我用虛擬環(huán)境env_flask里的gunicron來啟動這個項目,監(jiān)聽8001端口。 -
directory=指定啟動入口的目錄。 -
stdout_logfile指定輸出日志文件存放在哪里,保存在什么文件里。 -
stderr_logfile指定錯誤日志文件存放在哪里,保存在什么文件里。 -
autostart程序是否自動重啟 -
autorestart程序意外退出是否自動重啟
還有很多配置項,比如設置日志文件大小、日志等級、環(huán)境變量、用戶身份等,可以根據(jù)自己的需求參考配置文件進行配置。
常用命令
最常用的命令無非是啟動,停止,重啟等操作了。
supervisorctl reload ;修改完配置后,重新載入配置文件
supervisorctl update ;根據(jù)最新的配置文件,啟動新配置或有改動的進程,配置沒有改動的進程不會受影響而重啟
supervisorctl status ; 查看當前各個應用的狀態(tài)。
supervisorctl restart <application name> ;重啟指定應用
supervisorctl stop <application name> ;停止指定應用
supervisorctl start <application name> ;啟動指定應用
supervisorctl restart all ;重啟所有應用
supervisorctl stop all ;停止所有應用
supervisorctl start all ;啟動所有應用
也可以先在終端輸入supervisorctl進入supervisor的命令交互環(huán)境后再輸入后面的命令。就像下面這樣,隨君喜好。

安裝和配置Nginx
Ubuntu16.04自帶的有Nginx,版本很低。如果我們要用新版本的
就必須自己安裝,各大系統(tǒng)的安裝方式大同小異,這里主要介紹源碼安裝。我們先到nginx.org官網(wǎng)下載我們需要的版本。一般生產(chǎn)環(huán)境建議下載穩(wěn)定版。我自己服務器下載的是nginx-1.16.1.tar.gz
- 解壓到指定文件夾下
tar zxvf /usr/local/src/nginx-1.16.1.tar.gz -C /usr/local
這樣在/usr/local目錄下就有個nginx-1.16.1文件夾了。
- 安裝Nginx
cd nginx-1.16.1
sudo ./configure --prefix=/usr/local/nginx
sudo make
sudo make install
- 配置Nginx
在完成了nginx的安裝后,當然是nginx的配置了。下面是我博客網(wǎng)站nginx的配置。
配置https
server {
listen 443 ssl default_server http2;
server_name www.immisso.com;
ssl_certificate /ssl/1_www.immisso.com_bundle.crt;
ssl_certificate_key /ssl/2_www.immisso.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
location / {
proxy_pass http://0.0.0.0:8001;
}
gzip on;
gzip_buffers 32 4k;
gzip_comp_level 6;
gzip_min_length 200;
gzip_types text/css text/xml application/javascript application/json;
gzip_vary on;
}
其中有些參數(shù)需要重點說明一下。
-
listen監(jiān)聽的端口,開啟ssl,開啟http2。 -
server_name域名。 -
ssl_certificatehttps證書.crt文件的位置 -
ssl_certificate_keyhttps證書.key文件的位置 -
ssl_session_timeout緩存有效期 -
ssl_ciphers加密算法 -
ssl_protocols加密協(xié)議 -
proxy_pass運行的程序監(jiān)聽的端口。參考上面gunicorn監(jiān)聽的端口。
gzip開頭的是配置http2的相關配置。具體可以參考React 首頁加載慢的問題性能優(yōu)化
將http重定向到https
server {
listen 80;
server_name www.immisso.com;
return 301 https://www.immisso.com$request_uri;
}
- Nginx常用命令
-
nginx啟動Nginx -
nginx -t測試配置文件是否有語法錯誤 -
nginx -s reload重新加載Nginx配置文件 -
nginx -s stop強制停止Nginx -
nginx -s quit優(yōu)雅地停止Nginx服務(即處理完所有請求后再停止服務)
經(jīng)過上面的幾大步,就把我們生產(chǎn)環(huán)境需要的配置搭建好了。然后把代碼上傳到服務器,根據(jù)上面的步驟,就可以成功的部署了。