centos7 下部署python 多个Flask项目

一部署单个flask项目

技术栈:nginx+gunicorn部署Flask项目

1安装python3

#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=版本号

2 创建虚拟环境

#1.使用pip3安装 anaconda 和 virtualenv
pip3 install virtualenv
#2.选定项目存放位置
cd /www/code
# 3.创建虚拟环境
virtualenv -p python3 venv3		#创建了叫venv的虚拟环境
#4.激活虚拟环境
source venv3/bin/activate

3安装项目依赖

#1.在原项目环境下导出开发环境
pip freeze > requirements.txt
#2.在虚拟环境下
pip3 install -r requirements.txt

4 测试运行

python3 main.py runserver
#查看是否可以成功启动

5安装gunicorn

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]。

  • gunicorn可以结合gevent来进行部署,因此在高并发场景下也可适用,于是决定采用gunicorn进行部署。
  • gunicorn和supervisor会有一定的冲突,即使gunicorn中没有设置为后台启动,supervisor也只会管理gunicorn的master进程;
  • 在production环境,起停和状态的监控最好用supervisior之类的监控工具,然后在gunicorn的前端放置一个http proxy server, 譬如nginx

引用链接:https://www.jianshu.com/p/fecf15ad0c9a

#激活虚拟环境下
pip3 install gunicorn

6使用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())

6.1扩展

- 报错:

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'

7安装nginx

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

7.1输入远程IP进行本地访问

centos7 下部署python 多个Flask项目_第1张图片

7.2扩展

安装时报错: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

7.3nginx配置文件,实现外网访问

#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; 
 
 
        }
 

7.4 nginx常用命令 

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 

7.5启动访问项目

nginx,访问项目链接

http://39.105.196.145/index?tType=&proType=&pubTime=&page=1&rows=10

8开放端口

注:调试过程中可以将防火墙端口放开,生产时应改为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

9设置nginx开机自启项目持久化

#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

10 nohup项目后台持久化运行

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项目

技术:flask+nginx+uwsgi

1创建uwsgi.ini文件

在每一个项目文件根目录中创建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

2配置nginx.conf文件

更改项目启动端口

#路径  /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;

            }
    }

3设置uwsgi开机启动

# 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 &

4访问项目

目录

一部署单个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访问项目


你可能感兴趣的:(flask,python)