阿里云Flask+Gunicorn+Supervisor+Nginx搭建生產(chǎn)環(huán)境服務器

我們在用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)境

在安裝和配置好了virtualenvvirtualenvwrapper之后就可以創(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
  • wworkers的縮寫,表示開啟的進程數(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

這個配置很簡單。常用配置下面會一一說明

  1. [program:missoweb]程序名稱(用于啟動,停止,重啟等)
  2. command=運行程序的命令,表示我用虛擬環(huán)境env_flask里的gunicron來啟動這個項目,監(jiān)聽8001端口。
  3. directory=指定啟動入口的目錄。
  4. stdout_logfile指定輸出日志文件存放在哪里,保存在什么文件里。
  5. stderr_logfile指定錯誤日志文件存放在哪里,保存在什么文件里。
  6. autostart程序是否自動重啟
  7. 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)境后再輸入后面的命令。就像下面這樣,隨君喜好。

image

安裝和配置Nginx

Ubuntu16.04自帶的有Nginx,版本很低。如果我們要用新版本的
就必須自己安裝,各大系統(tǒng)的安裝方式大同小異,這里主要介紹源碼安裝。我們先到nginx.org官網(wǎng)下載我們需要的版本。一般生產(chǎn)環(huán)境建議下載穩(wěn)定版。我自己服務器下載的是nginx-1.16.1.tar.gz

  1. 解壓到指定文件夾下
tar zxvf /usr/local/src/nginx-1.16.1.tar.gz -C /usr/local

這樣在/usr/local目錄下就有個nginx-1.16.1文件夾了。

  1. 安裝Nginx
cd nginx-1.16.1
sudo ./configure --prefix=/usr/local/nginx
sudo make
sudo make install
  1. 配置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;
}
  1. 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ù)上面的步驟,就可以成功的部署了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容