1. 程式人生 > >CentOS7部署Flask+Gunicorn+Nginx+Supervisor

CentOS7部署Flask+Gunicorn+Nginx+Supervisor

Flask MongoDB Gunicorn Nginx Supervisor

1. Git客戶端

Win10安裝git for windows

1.1 設置Git全局參數

打開Git Bash

$ git config --global user.name "Alice-HomePC"
$ git config --global user.email "[email protected]"

1.2 生成SSH Key

打開Git Bash,可使用-C選項指定公鑰的說明信息

$ ssh-keygen -t rsa -C "Alice-HomePC"

一直回車確認即可,秘鑰對默認保存在C:\Users\你的Win10用戶名\.ssh目錄下,其中id_rsa是私鑰(Private Key),要小心保管;id_rsa.pub

是公鑰(Public Key),待會要上傳到VPS上,實現基於SSH無密碼登錄VPS。同理,如果你在Github或Coding上有代碼倉庫,也是先要將公鑰上傳過去,才能無密碼使用Git命令操作遠程倉庫。

2. 配置VPS

2.1 修改主機名

# hostnamectl set-hostname CentOS
或者:
# vi /etc/hostname
# hostnamectl

重新登錄.

2.2 修改SSH端口

# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
# vi /etc/ssh/sshd_config
將默認22端口改為你指定的, 例如
Port 12345

# systemctl restart sshd

2.3 禁用SSH密碼認證,改為秘鑰認證

首先需要將步驟1中生成的公鑰上傳到服務器,可以使用xmanager套件中的xftp上傳,假設上傳到/root目錄

1. 添加公鑰
# cd /root
# mkdir ~/.ssh && chmod 700 ~/.ssh
# touch ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys
# cat id_rsa.pub >> ~/.ssh/authorized_keys

2. 修改SSH配置文件
# vi /etc/ssh/sshd_config

修改幾處地方,最終內容如下:
# 禁用root登錄
PermitRootLogin no
# 啟用密鑰驗證
RSAAuthentication yes
PubkeyAuthentication yes
# 指定公鑰數據庫文件
AuthorizedKeysFile .ssh/authorized_keys
# 禁用密碼驗證
PasswordAuthentication no

3. SSH重新加載配置文件
# systemctl reload sshd

此時,Win10可以通過xshell,無密碼登錄VPS了,且只能使用私鑰認證通過。

3. 安裝Python3

CentOS-7.3默認安裝的是Python-2.7, 我的Flask程序是基於Python3寫的,所以要再安裝Python3

1. 準備編譯環境
# yum -y install gcc make readline-devel sqlite-devel openssl openssl-devel zlib*

2. 編譯安裝
# wget -P /root http://python.org/ftp/python/3.6.4/Python-3.6.4.tar.xz
# tar xf Python-3.6.4.tar.xz
# cd Python-3.6.4/
# ./configure --prefix=/usr/local/python-3.6
# make && make install
# ln -s /usr/local/python-3.6/bin/python3.6 /usr/bin/python3
# ln -s /usr/local/python-3.6/bin/pip3.6 /usr/bin/pip3

更改pip安裝源為國內的源,比如aliyun

# mkdir ~/.pip
# vi ~/.pip/pip.conf

添加內容如下:
[global]
index-url = http://mirrors.aliyun.com/pypi/simple/

[install]
trusted-host=mirrors.aliyun.com

(可選)安裝IPython

  • Home Page
  • GitHub Project
  • Installing Jupyter Notebook
1. pip方式安裝(推薦), 該方式會有語法高亮等特性
# pip3 --version
# pip3 install --upgrade pip
# pip3 install ipython
# ln -s /usr/local/python-3.6/bin/ipython3 /usr/bin/ipython3

2. 編譯安裝
# tar xf ipython-0.13.1.tar.gz
# cd ipython-0.13.1/
# python3 setup.py install
# ln -s /usr/local/python-3.6/bin/ipython3 /usr/bin/ipython3

4. 安裝MongoDB

官方文檔

1. 配置repo源
# vi /etc/yum.repos.d/mongodb-org-3.6.repo

內容如下:
[mongodb-org-3.6]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc

2. 安裝並啟動服務
# yum install -y mongodb-org
# systemctl start mongod.service
# systemctl enable mongod.service

5. Git服務端

1. 安裝
# yum install -y git

2. 創建裸倉庫
# mkdir /home/git && cd /home/git
# git init --bare flask_project.git

我在Win10上已經開發好了Flask程序,待會上傳到此git倉庫中,應用程序代碼準備部署到/home/www/flask_project,並通過git的hooks當客戶端每次提交代碼後,自動同步倉庫中的代碼到應用部署的位置 Simple automated GIT Deployment using GIT Hooks

技術分享圖片

1. 創建代碼部署目錄
# mkdir -pv /home/www/flask_project

2. 創建hooks
# vi /home/git/flask_project.git/hooks/post-receive

內容如下:
#!/bin/bash
TRAGET="/home/www/flask_project"
GIT_DIR="/home/git/flask_project.git"
BRANCH="master"

while read oldrev newrev ref
do
    # only checking out the master (or whatever branch you would like to deploy)
    if [[ $ref = refs/heads/$BRANCH ]];
    then
        echo "Ref $ref received. Deploying ${BRANCH} branch to production…"
        git --work-tree=$TRAGET --git-dir=$GIT_DIR checkout -f
    else
        echo "Ref $ref received. Doing nothing: only the ${BRANCH} branch may be deployed on this server."
    fi
done

3. 賦權
# chmod +x /home/git/flask_project.git/hooks/post-receive

6. 上傳代碼

打開Git Bash,準備把服務器上的flask_project.git倉庫(目前為空)克隆下來。Git默認使用SSH協議且端口22,由於我們剛修改了服務器的SSH端口,所以克隆時要指定修改後的端口號

6.1 克隆遠程倉庫

方法1:

$ git clone ssh://root@VPS的IP或域名:VPS的SSH端口號//home/git/flask_project.git

方法2: 在Win10保存SSH秘鑰對的目錄下創建配置文件 C:\Users\你的Win10用戶名\.ssh\config

host VPS的IP或域名
port VPS的SSH端口

然後執行克隆命令:

$ git clone root@VPS的IP或域名:/home/git/flask_project.git

6.2 提交代碼

克隆後會在當前目錄下生成 flask_project 目錄,把開發好的flask代碼拷貝到這裏面,並指定哪些文件不提交到git倉庫,在git bash中運行:

$ cd flask_project
$ vi .gitignore
比如我的規則:
.idea/
__pycache__/
uploads/
venv3/

提交代碼:

$ git add .
$ git commit -m "initial"
$ git push

你會發現/home/www/flask_project目錄下會自動拷貝git倉庫中master分支的最新代碼過來。

7. 調試程序

7.1 準備virtualenv環境

# pip3 install virtualenv
# ln -s /usr/local/python-3.6/bin/virtualenv /usr/bin/virtualenv
# cd /home/www/flask_project
# virtualenv --no-site-packages --python=/usr/bin/python3 venv3

7.2 安裝相關python包

# source venv3/bin/active
(venv3)# pip install flask
依次安裝完所有的依賴包後,
(venv3)# pip freeze > requirements.txt

7.3 測試用Flask自帶的服務器能否運行

(venv3)# python manage.py runserver -h 0.0.0.0 -p 80

如果你能通過VPS的IP正常訪問Flask應用,那麽就可以進行下一步,使用Gunicorn替代Flask自帶的開發服務器

8. Gunicorn

  • 官網
  • 文檔

8.1 安裝

(venv3)# pip install gunicorn

8.2 創建包含應用入口app的模塊文件

一般我們開發時,都是使用manage.py,裏面有flask-script方便調試,生產環境要再創建一個模塊,比如:

# vi wsgi.py

內容如下:
import os

from app import create_app

###
# 調用工廠函數,初始化Flask程序實例,默認使用生產環境配置
###
app = create_app(os.getenv(‘FLASK_CONFIG‘) or ‘production‘)

if __name__ == "__main__":
    app.run(host=‘0.0.0.0‘)

那麽使用gunicorn命令行來啟動Flask非常簡單:

(venv3)# gunicorn -w 3 wsgi:app -b 0.0.0.0:80
說明:
-w 3 是啟用3個進程,建議是CPU核數*2 + 1
wsgi:app 其中wsgi代表當前目錄下的wsgi.py模塊,後面的app代表wsgi.py模塊裏面的Flask應用app

如果你能通過VPS的IP正常訪問Flask應用,那麽通過指定gunicorn配置文件來啟動Flask,比如:

# mkdir deploy
# vi deploy/gunicorn.conf.py

內容如下:
import multiprocessing

# bind = ‘127.0.0.1:8001‘
bind = ‘unix:/run/gunicorn.sock‘
workers = multiprocessing.cpu_count() * 2 + 1
# daemon = True
pidfile = ‘/run/gunicorn.pid‘
loglevel = ‘info‘
errorlog = ‘/tmp/gunicorn-error.log‘
accesslog = ‘/tmp/gunicorn-access.log‘
access_log_format = ‘%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"‘

更詳細的配置可以參考Gunicorn官方示例

那麽,此時啟動Flask變成:

(venv3)# gunicorn wsgi:app -c deploy/gunicorn.conf.py

想查看完整的內容,請訪問我的個人博客: http://www.madmalls.com/blog/post/deploy-flask-gunicorn-nginx-supervisor-on-centos7/?q=gunicorn

CentOS7部署Flask+Gunicorn+Nginx+Supervisor