技术栈:nginx+gunicorn部署Flask项目
#1.安装依赖
# yum -y groupinstall "Development tools"
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
yum install libffi-devel -y
#2.下载安装包
cd #回到用户目录
wget https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tar.xz(当前目录)
# 解压
tar -xvJf Python-3.7.0.tar.xz
#3.编译安装
mkdir /usr/local/python3 #创建编译安装目录
cd Python-3.7.0 #进入解压目录
./configure --prefix=/usr/local/python3 #配置编译
make && make install #安装
#4.创建软连接
ln -s /usr/local/python3/bin/python3 /usr/bin/python3 #全局可用
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
#5.验证是否成功
python3 -V
pip3 -V
将pip3 升级最新版本
pip3 install --upgrade pip3=版本号
#1.使用pip3安装 anaconda 和 virtualenv
pip3 install virtualenv
#2.选定项目存放位置
cd /www/code
# 3.创建虚拟环境
virtualenv -p python3 venv3 #创建了叫venv的虚拟环境
#4.激活虚拟环境
source venv3/bin/activate
#1.在原项目环境下导出开发环境
pip freeze > requirements.txt
#2.在虚拟环境下
pip3 install -r requirements.txt
python3 main.py runserver
#查看是否可以成功启动
Gunicorn 绿色独角兽'是一个Python WSGI UNIX的HTTP服务器,和大多数的web框架兼容,具有实现简单,轻量级,高性能等特点。Gunicorn 是一个 Python 的 WSGI HTTP 服务器。它所在的位置通常是在反向代理(如 Nginx)或者 负载均衡(如 AWS ELB)和一个 web 应用(比如 Django 或者 Flask)之间。它是一个移植自Ruby的Unicorn项目的pre-fork worker模型,即支持eventlet,也支持greenlet。
Flask自带的app.run(host="0.0.0.0", port=7001)
用来调试非常方便,但是用于生产环境无论是处理高并发还是鲁棒性都有所欠缺,一般会配合WGSI容器来进行[生产环境的部署][1]。
在production环境,起停和状态的监控最好用supervisior之类的监控工具,然后在gunicorn的前端放置一个http proxy server, 譬如nginx
引用链接:https://www.jianshu.com/p/fecf15ad0c9a
#激活虚拟环境下
pip3 install gunicorn
gunicorn -w worker数量 -b ip:端口号 运行文件名:flask实例名
例:
gunicorn -w 3 -b 0.0.0.0:80 main:app #这里启动端口改为0.0.0.0:80,可以外网访问
-w后的数字代表worker(工作线程)数量(-w 4代表4个worker进程),通常建议worker数量为 (2 * CPU数量) + 1
-t后的数字代表超时时间,单位 秒
-b后是 ip:端口(0.0.0.0:5000为在服务器ip下的5000端口运行【此处服务器是指物理层面的服务器主机,不是用于请求响应的Web服务器】)
#注:查询cpu数量
import multiprocessing
print(multiprocessing.cpu_count())
- 报错:
gunicorn: command not found,命令找不到
#解决办法
#1.查看系统有没有gunicorn
find /(查找目录) -name gunicorn
#2.存在输出,不存在进行pip安装
/usr/local/python3/lib/python3.7/site-packages/gunicorn
/usr/local/python3/bin/gunicorn
#3.通过全路径命令执行
/usr/local/python3/bin/gunicorn
#4.将gunicorn所在的路径添加到PATH环境变量里:
export PATH=$PATH:/usr/local/python3/bin
#报错,重新安装执行 pip3 install gunicorn
Traceback (most recent call last):
File "/usr/local/python3/bin/gunicorn", line 5, in
from gunicorn.app.wsgiapp import run
ModuleNotFoundError: No module named 'gunicorn'
Nginx是一个使用c语言开发的一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。
Nginx 在官方测试的结果中,能够支持五万个并行连接,而在实际的运作中,可以支持二万至四万个并行连接,并且cpu、内存等资源消耗却非常低,运行非常稳定
#1 下载安装包
wget -c https://nginx.org/download/nginx-1.12.2.tar.gz
#2 解压
tar -xvf nginx-1.12.2.tar.gz
#3 编译
cd nginx-1.12.2
./configure
#4 安装
make && make install
#5 创建软链接
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
#6 启动nginx
nginx
安装时报错:Nginx配置SSL证书时——nginx:[emerg]unknown directive ssl错误[引用](https://blog.csdn.net/weixin_38111957/article/details/81283121)
#1 进入nginx解压目录
#2 执行
./configure --with-http_ssl_module
#3 编译
make
#4 原来nginx文件备份替换
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak #备份
cp objs/nginx /usr/local/nginx/sbin/nginx #替换
#5 查看是否安装成功
cd /usr/local/nginx/
./sbin/nginx -V
#1 进入配置文件目录
cd /usr/local/nginx/conf/
#2 对文件进行备份
cp nginx.conf nginx.conf.bak
#3 Nginx配置文件修改
server
{
listen 80;
server_name 106.14.181.17;#服务器的域名或者公网ip
root /www/wish_wall; #这里特别注意,你的项目放的位置,不然网站样式加载不上,我是放在www下的,wish_wall
error_page 404 /404.html; #可以设置报错网页
access_log logs/host.access.log; #日志
error_log logs/host.error.log;
location /
{
proxy_pass http://127.0.0.1:5000;#这里指定的端口和gunicorn的绑定的端口必须一致
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
Nginx常用命令
nginx -s stop 停止nginx
nginx -s reload 重启nginx
nginx -t 修改完nginx的配置文件之后,检测是否正确
启动:uwsgi –ini /root/uwsgi.ini#(注意,是双短横线,下同)
停止:uwsgi –stop uwsgi.pid#【如果无法停止就使用kill命令】
重启:uwsgi –reload uwsgi.pid
nginx,访问项目链接
例
http://39.105.196.145/index?tType=&proType=&pubTime=&page=1&rows=10
注:调试过程中可以将防火墙端口放开,生产时应改为80
开启端口 命令 : sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
命令含义:
--zone #作用域
--add-port=80/tcp #添加端口,格式为:端口/通讯协议
--permanent #永久生效,没有此参数重启后失效
重启防火墙 命令 :sudo firewall-cmd --reload
查看防火墙通过的端口号: firewall-cmd --list-all
#查看开放端口
netstat -tulpn
#1 Nginx开机自启的配置
cd /etc/systemd/system/
#2 创建nginx.service
vim nginx.service
--->配置信息
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
-------------------------------------------------------------------------------------
#3 设置开机自启
systemctl enable nginx.service
systemctl disable nginx.service
扩展:
#1设置开机启动
systemctl enable nginx.service
#2取消开机启动
systemctl disable nginx.service
#运行服务、停止服务、重启服务、状态查询
systemctl start emperor.uwsgi.service
systemctl stop emperor.uwsgi.service
systemctl restart emperor.uwsgi.service
systemctl status emperor.uwsgi.service
#查看启动项
systemctl list-unit-files
nohup /root/runoob.sh > runoob.log 2>&1 & #输出日志文件
#将标准错误 2 重定向到标准输出 &1 ,标准输出 &1 再被重定向输入到 runoob.log 文件中。
0 – stdin (standard input,标准输入)
1 – stdout (standard output,标准输出)
2 – stderr (standard error,标准错误输出)
技术:flask+nginx+uwsgi
在每一个项目文件根目录中创建uwsgi.ini,进行配置
#如:bids_uwsgi.ini
[uwsgi]
socket=127.0.0.1:5000 #uwsgi启动的地址和端口
pythonpath=/root/venv3/bids_sys #项目根目录
module=main
wsgi-file=/root/venv3/bids_sys/main.py #项目主函数
callable=app #python内用以启动的application名
processes=4 #进程
threading=2 #线程
daemonize=/root/venv3/bids_sys/logs/uwsgi.log
#stats = 127.0.0.1:9193 /状态检测地址
#启动uwsgi
uwsgi --ini bids_uwsgi.ini
更改项目启动端口
#路径 /usr/local/nginx/conf/nginx.conf
#项目一
server {
listen 80; #监听访问端口
#server_name localhost;
server_name 39.105.196.145; #主项目公网IP
client_max_body_size 75M;
#charset koi8-r;
#access_log logs/host.access.log main;
access_log /root/venv3/bids_sys/logs/access.log;#执行日志
error_log /root/venv3/bids_sys/logs/error.log;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:5000; #每一个项目与uwsgi.ini 启动端口一致
uwsgi_param UWSGI_CHDIR /root/venv3/bids_sys;
uwsgi_param UWSGI_SCRIPT main:app;
}
#项目二
server {
listen 5100; #更改项目启动端口号,可以设置公网IP
# server_name abc.yygg.fun; #或者此处使用二级域名,监听端口可以是80
server_name 39.105.196.145;
access_log /root/venv3/RoomShow/logs/access.log;
error_log /root/venv3/RoomShow/logs/error.log;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:5001; #第二个项目uwsgi.ini启动端口
uwsgi_param UWSGI_CHDIR /root/venv3/RoomShow;
uwsgi_param UWSGI_SCRIPT main:app;
}
}
# vim uwsgi_start.sh
#填写内容
#!/bin/sh
#chkconfig: 2345 65 35
#description:autostart
source /root/venv3/bin/activate &
/root/venv3/bin/uwsgi /root/venv3/bids_sys/bids_uwsgi.ini &
/root/venv3/bin/uwsgi /root/venv3/RoomShow/roomuwsgi.ini &
目录
一部署单个flask项目
1安装python3
2 创建虚拟环境
3安装项目依赖
4 测试运行
5安装gunicorn
6使用gunicorn运行项目
6.1扩展
7安装nginx
7.1输入远程IP进行本地访问
7.2扩展
7.3nginx配置文件,实现外网访问
7.4 nginx常用命令
7.5启动访问项目
8开放端口
9设置nginx开机自启项目持久化
10 nohup项目后台持久化运行
二同时部署多个flask项目
1创建uwsgi.ini文件
2配置nginx.conf文件
3设置uwsgi开机启动
4访问项目