写在开始
背景:生产环境是客户提供的华为虚拟机,经常出现莫名崩溃,而且还TM在内网,所以本文是为了给现场工程师参照部署环境和应用程序使用。
环境:CentOS 6.5 【别问我为啥会这么老,这得问客户】
python 3.7.4
WSGI容器:Gunicorn
反向代理服务器:Nginx
1. 准备工作
此处参考了centos离线安装python3/pip3和项目所需模块 也记录下我们处理的过程
1.1 修改yum配置文件
通过修改联网机yum配置,在使用yum install xxx 的时候直接将这些依赖保存在指定目录中,而不是直接删除,便于后面将这些依赖包拷贝到离线服务器中。具体操作如下:
vim /etc/yum.conf
cachedir=/var/cache/yum # yum install xxx中xxx依赖的存储位置
keepcache=1 # 改为keepcache=1这样yum install xxx下载的rpm包就不会删除
1.2 下载yum 依赖
在联网的服务器上,使用yum install 安装相关依赖
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make -y
yum install libffi-devel -y
1.3 下载python3 离线安装包
到Python官网下载离线安装包
1.4 打包下载python 应用程序需要的包
在开发环境的 Terminal 中运行
pip3 freeze >requirements.txt
工具会自动生成应用程序所需要的依赖文件及版本
然后将需要的依赖安装包下载到你本地的目录中
pip download -r requirements.txt -d yourprojectdir\whls
pip download guniorn -d yourprojectdir\whls
这里特别注意,如果你本机的开发环境是Win的话,需要在联网的CentOS服务器上运行以上语句,否则,你win下的安装包在离线服务器上是无法安装成功的。
download 的时候可以配置国内镜像,速度会快一些,配置方法如下:
cd /opt
mkdir -p ~/.pip
touch ~/.pip/pip.conf
vim ~/.pip/pip.conf
在pip.conf文件中录入
[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
[download]
trusted-host=mirrors.aliyun.com
然后保存退出 pip.conf 文件即可。
2.离线服务器上生产环境安装
2.1 安装yum 依赖
将联网机中缓存在/var/cache/yum目录下的所有rpm包都拷贝至离线服务器。
运行 rpm
rpm -Uvh ./*.rpm --nodeps --force
2.2 安装python3
注意,yum 依赖一定要在本步骤前安装,否则会导致pip3 安装失败
将下载好的python3 安装包拷贝到离线服务器
tar -zxvf Python-3.7.4.tgz # 解压python3安装包
cd Python-3.7.4 # 进入python3安装包目录
./configure --prefix=/usr/local/python3 --with-ssl # 将python3 安装在该目录,-ssl 是为了防止pip3 出问题
make # 编译源码
make install # 安装
安装成功后,设置软链接
ln -s /usr/local/python3/bin/python3 /usr/bin/python3 # 创建python3软连接
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3 # 创建pip3的软连接
2.3 安装应用程序需要的依赖
将离线下载的虚拟环境安装工具和其他安装whl文件拷贝到离线服务器
从3.7版本开始,python已经自带venv工具,因此直接使用内部命令创建
mkdir yourproject/venv
cd yourproject/venv
python3 -m venv myenv
激活虚拟环境
source myenv/bin/activate
之后会看到你的命令行前面全部都有
(myenv) 前缀,就表示激活成功
然后在激活的虚拟环境中安装其他依赖包
cd /yourproject/
pip3 install --no-index --find-links= yourprojectdir\whls -r requirements.txt
安装完成后,生产环境就部署完成了。
3. 部署Flask 应用
3.1 编写应用启动脚本wsgi.py
from app.app import create_app
application = create_app()
if __name__ == '__main__':
application.run(debug=False)
这个启动脚本替换原有的项目启动脚本即可
3.2 编写gunicorn.conf.py 配置文件
在项目根目录处增加gunicorn.conf.py 配置文件
bind = "127.0.0.1:5000"
# 监听队列
backlog = 512
worker_class = 'gevent'
loglevel = "error"
# 设置gunicorn访问日志格式,错误日志无法设置
access_log_format = (
'%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"')
accesslog = '/var/log/gunicorn/gunicorn.access.log'
errorlog = "/var/log/gunicorn/gunicorn.error.log"
3.3 启动 gunicorn
gunicorn -c gunicorn.conf.py wsgi:application
运行脚本后,应用就已经按照配置运行起来了
3.4 配置Nginx
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name _;
location /yourproject-prefix/ {
proxy_redirect off;
proxy_set_header Host $http_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;
proxy_pass http://127.0.0.1:5000/;
}
}
}
启动nginx后,就完成应用程序部署了。