vlambda博客
学习文章列表

Flask001一云主机搭建Flask环境:Flask+gunicorn+supervisor+nginx部署

查看内核位数

# getconf LONG_BIT

连接远程服务器命令

# ssh [email protected]

云主机安装jdk

从oracle官网下周jdk1.8,我的是 jdk-8u281-linux-x64.tar.gz

在远程主机新建java目录,路径:

/usr/local/java

下载完成后通过FileZilla上传到远程服务器,或者通过scp上传,scp命令如下:

# scp jdk-8u281-linux-x64.tar.gz xyg@117.x.x.x:/etc/local/java

解压tar包:

# tar zxvf jdk-8u281-linux-x64.tar.gz

记下jdk路径如下:

/usr/local/java/jdk1.8.0_281

配置全局环境变量,使jdk全局起作用

编辑/etc/profile:

# vim /etc/profile

在文件末尾增加以下内容:

export JAVA_HOME=/usr/local/java/jdk.1.8.0_281
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

保存退出后,执行以下命令,使修改立即生效:

# source /etc/profile

现在看下是否生效:

# java -version
java version "1.8.0_281"
Java(TM) SE Runtime Environment (build 1.8.0_281-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.281-b09, mixed mode)

云主机安装python

查看当前python版本:

# python --version

我系统预装的是2.7.5。

从网址:https://www.python.org/ftp/python/,下载需要的python版本,我下载的是Python3.9.2:

# wget https://www.python.org/ftp/python/3.9.2/Python-3.9.2.tgz

对于centos,如果没有wget命令,需要安装下:

# yum -y install wget

下载后,解压包:

# tar zxvf ~/Python-3.9.2.tgz

安装python编译依赖包:

1.首先安装yum-utils

# yum install yum-utils

1.使用yum-builddep为Python3构建环境,安装缺失的软件依赖

# yum-builddep python

以上准备好后,进入Python-3.9.2源码路径,编译程序:

# ./configure
# make && make install

云主机配置Python环境

先找到自己的python安装位置,我的安装在/usr/local/lib/python3.9.2,在/usr/local/bin中也有,记着这个路径。开始修改系统python环境,在/usr/bin中创建软连接:

# ln -s /usr/local/bin/python3 /usr/bin/python3 
# ln -s /usr/local/bin/python3.9 /usr/bin/python3.9
# rm -f /usr/bin/python
# ln -s /usr/bin/python3 /usr/bin/python

验证下系统中默认程序是否变了:

# python --version

下面配置下pip环境:

# ln -s /usr/local/bin/pip3 /usr/bin/pip3
# ln -s /usr/bin/pip3 /usr/bin/pip

因为yum命令运行依赖python2,所以需要改下相关依赖文件的python开头声明:

# vim /usr/bin/yum
# vim /usr/libexec/urlgrabber-ext-down

将文件开头声明改下:

#! /usr/bin/python 
改为:
#! /usr/bin/python2

这样yum运行就不会报错了。

安装virtualenv和virtualenvwrapper

安装virtualenv

针对不同项目可能依赖不同的python环境,这里使用virtualenv来管理python虚拟环境。安装virtualenv:

# pip install virtualenv

执行程序在以下路径:

/usr/local/bin/virtualenv

安装virtualenvwrapper

virtualenvwrapper是用来管理virtualenv的扩展包,方便虚拟环境管理。安装命令:

# pip install virtualenvwrapper

安装成功后,配置用户环境变量:

$ vim ~/.bashrc

在.bashrc最后添加以下内容:

export WORKON_HOME=$HOME/.venvs # 所有虚拟环境都在这个目录
source /usr/local/bin/virtualenvwrapper.sh

保存后,运行以下命令使配置生效:

$ source ~/.bashrc

如果嫌virtualenvwrapper命令太长,可以配置命令别名,一样编辑.bashrc文件,添加以下内容:

# virtualenvwrapper cmd
alias mkv='mkvirtualenv' # 创建一个虚拟环境:mkv env
alias rmv='rmvirtualenv' # 删除虚拟环境:rmv env
alias lsv='lsvirtualenv' # 查看所有的虚拟环境

保存退出,使变更生效。之后就可以创建虚拟环境了。这里我创建一个自己网站的虚拟环境:

$ mkv vxyg

进入~/.venvs目录,检查vxyg目录是否存在。如果存在,说明已经成功创建虚拟环境。激活虚拟环境:

$ workon vxyg

退出虚拟环境:

$ deactivate

安装Flask,调试环境

以上环境搭建完毕,接下来调试下环境。首先,切换到虚拟环境,安装Flask:

$ workon vxyg
(vxyg)...$ pip install flask

创建网站目录:

(vxyg)...$ cd 
(vxyg)...$ mkdir apps
(vxyg)...$ cd apps
(vxyg)...$ mkdir xygweb
(vxyg)...$ cd xygweb
(vxyg)...$ touch app.py
(vxyg)...$ vim app.py

编辑app.py内容:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
return '<h1>Hello World</h1>'

if __name__ == '__main__':
app.run()

以上完成后,下面就是部署了,这里我们用gunicorn作为wsgi http服务器。

安装gunicorn,部署网站

进入vxyg虚拟环境,然后安装gunicorn:

$ workon vxyg
(vxyg)...$ pip install gunicorn

进入网站目录,启动服务:

(vxyg)...$ cd ~/apps/xygweb
(vxyg)...$ gunicorn -w4 -b0.0.0.0:5000 app:app
注:最后两个app:第一个appapp.py模块,第二个appapp.py内的Flask实例。

现在执行以下命令,看gunicorn是否启动:

$ ps -ef |grep gunicorn

对于gunicorn其他配置,请参阅https://docs.gunicorn.org/en/stable/run.html

nginx安装与配置

安装nginx

添加yum源,下载安装nginx:

$ cd /etc/yum.repos.d
$ sudo touch nginx.repo
$ sudo vim nginx.repo

添加nginx源:

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

检查nginx源是否添加完成:

$ yum list | grep nginx

安装nginx:

$ sudo yum -y install nginx

配置nginx

安装完成后,添加xygweb项目独有的配置文件:

$ cd /etc/nginx/conf.d
$ sudo touch xygweb.conf
$ sudo vim xygweb.conf

添加以下内容:

server {
listen 8066; # 监听8066端口
server_name xxx.xxx.xxx.xxx; # 公网ip或者域名

location / {
proxy_pass http://127.0.0.1:5000/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwared-Proto $scheme;
}
}

添加后,检查下nginx配置是否正确:

$ sudo nginx -t

显示如下说明配置正确:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

开启端口8066

查看防火墙状态:

$ sudo systemctl status firewalld

如果是disabled的,先启用:

$ sudo systemctl enable firewalld

如果要禁用防火墙,执行以下命令:

$ sudo systemctl disable firewalld

启用后,需要启动下防火墙:

$ sudo systemctl start firewalld

查看端口8066是否开启:

$ sudo firewall-cmd --query-port=8066/tcp

如果开启,会显示

yes

如果没有开启8066端口,执行以下命令开启:

$ sudo firewall-cmd --permanent --add-port=8066/tcp
注:--permanent 永久生效,没有此参数重启后失效

然后重启防火墙,使操作生效:

$ sudo systemctl stop firewalld
$ sudo systemctl start firewalld

再检查下是否开启成功:

$ sudo firewall-cmd --query-port=8066/tcp

启动nginx和gunicorn

(vxyg)...$ nohup gunicorn -w4 -b0.0.0.0:5000 app:app &
(vxyg)...$ ps -ef | grep gunicorn
(vxyg)...$ sudo systemctl stop nginx
(vxyg)...$ sudo systemctl start nginx

外网输入网站域名或者ip:8066,看是否可以访问网站。

注:如果是天翼云,还需要添加端口准入规则。

安装supervisor

先检查系统有没有安装supervisor:

$ find / -name supervisor

没有安装的话,我们使用yum来安装,需要先检查下yum源中有没有supervisor源:

$ yum list|grep supervisor

什么都不显示,说明没有,需要安装下epel源:

$ sudo yum install epel-release

之后执行以下命令安装supervisor:

$ sudo yum install -y supervisor

安装完成后,进入/etc目录:

$ cd /etc
$ ll supervisor*

会显示一个supervisord.conf和一个supervisord.d。先看看supervisord.conf中最后是否有以下内容:

[include]
files = supervisord.d/*.ini

这表示supervisord程序会加载supervisord.d目录下的所有.ini文件,对于一个应用程序可以在该目录下新建项目专有的.ini文件,针对我们的项目xygweb,新建xygweb.ini:

$ cd /etc/supervisord.d
$ sudo touch xygweb.ini

在xygweb.ini中新增项目配置:

[program:xygweb]
#命令执行的目录
directory=/home/xyg/apps/xygweb
#要执行的命令
command=
/home/xyg/.venvs/vxyg/bin/gunicorn -w 4 -b 0.0.0.0:5000 app:app
#是否自动启动
autostart=true
#是否自动重启
autorestart=true
#自动重启间隔 秒
startsecs=1
#标准错误日志
stderr_logfile=
/home/xyg/logs/xygweb/log/xyg.err.log
#标准输出日志
stdout_logfile=
/home/xyg/logs/xygweb/log/xyg.out.log

上面项目的标准输出日志和错误日志目前没有,我们需要新建下,否则启动supervisor会报错:

$ cd /home/xyg/logs/xygweb/log
$ sudo touch xyg.error.log xyg.out.log

接下来就可以启动supervisor了,在启动之前,我们需要修改下两个程序的python依赖版本,由python改为python2:

$ sudo vim /usr/bin/supervisord
$ sudo vim /bin/supervisorctl

执行以下命令启动项目:

$ sudo systemctl enable supervisord
$ sudo systemctl start supervisord
$ sudo supervisorctl start xygweb

以上最后一个命令即启动我们web了,如果有报错,可以执行以下命令看报错信息:

$ journalctl -xe

大家可以根据该命令查看报错的信息,分析定位问题。

环境搭建完成。