百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

如何将本地的Flask Web项目部署在生产环境(项目上线)

off999 2024-10-15 12:04 23 浏览 0 评论

在介绍正式内容之前,先来介绍一下什么是开发环境,测试环境和生产环境。

  • 开发环境-development: 顾名思义就是开发人员写代码,开发系统的环境,由开发人员配置。
  • 测试环境-testing:开发人员将系统在开发环境完成之后,交给测试人员,在测试环境进行测试,也就是检查系统各个功能有没有啥问题,一般由测试人员进行配置。
  • 生产环境-production:也就是线上环境,用户使用的环境。由特定人员来维护,一般人没有权限去修改。

知道了这三个概念之后,这篇文章就是介绍如何将一个Flask web项目部署到生产环境(前提默认已经做完测试,没有任何问题的情况下,在公司肯定不会开发完就直接上线)

一,配置LNMP软件环境:

L--Linux,N--Nginx,M--MySQL,P--Python,首先在找一台linux服务器(免费,开源,稳定),我用的是Ubuntu20.04 LTS(长期支持版)。没有服务器的可以去阿里云买一个,或者直接用虚拟机代替也是可以的,主要掌握方法最重要。

(一)Nginx 安装:Nginx是一个高性能web服务器,反向代理服务器(这里不详细介绍,请关注我接下来的文章)

(也可以下载源码包进行安装的方式,适合所有linux系统。我用的是apt安装方式,方便点)

1,ubuntu安装nginx

#安装编译工具及库文件(nginx相关文件及依赖)
apt-get install -y(yes) build-essential libssl-dev libpcre3 libpcre3-dev make openssl zlib1g-dev
apt-get install nginx -y 

2,检查效果

netstat -tnulp | grep nginx #查看端口占用情况

3,nginx相关命令

#启动停止(三种命令,用哪个命令启动,就要用那个命令停止)
systemctl  start|stop|reload|status ... nginx

#查看信息
nginx  -V #查看所有信息
nginx  -v #查看版本信息

#检查配置文件
nginx  -t  #检查默认配置文件
nginx  -t  -c file.conf  #指定配置文件进行检查

(二)MySQL安装

(两种方式源码安装,apt-get安装。我用的是apt安装方式,方便点)

1,ubuntu安装MySQL

sudo apt-get update  #更新软件源
sudo apt-get install mysql-server  #安装mysql

安装过程会提示设置mysql root用户的密码,设置完成后等待自动安装即可。默认安装完成就启动了mysql。

2,启动和关闭MySQL

systemctl start mysql.service
systemctl stop mysql.service

确认是否启动成功:

两种查看是否启动成功的方法
#1
systemctl status mysql.service
#2
sudo netstat -tap | grep mysql

3,进入MySQL shell界面

mysql -u root -p

注:先配置一下字符集,不然会导致中文乱码(因为mysql character_set_server默认设置是latin1):

打开配置文件
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

添加一行:
character_set_server=utf8

重启:
systemctl restart mysql.service 

登录mysql查看当前设置的编码:

show variables like "char%";

4,导入本地sql文件

source /xxx目录/movie.sql

(三)Python安装:

(三种方式:源码安装,直接apt-get安装,anaconda安装(推荐))

1,下载Anaconda

1,第一种:官网下载地址:https://www.anaconda.com/products/individual#Downloads
          下载linux版,上传即可(我习惯用官网下载这种,看个人喜好)

2,第二种:sudo wget  https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-5.3.1-Linux-x86_64.sh(直接在linux命令行执行即可下载)

2,解压anaconda压缩包

bash Anaconda3-5.3.1-Linux-x86_64.sh

3,解压过程中可能会遇到输入yes和no的地方

1>进入注册信息页面,输入yes


2>阅读注册信息,然后输入yes;查看文件即将安装的位置,按enter,即可安装;

3>遇到是否将ananconda加入环境变量时,这个看个人选择(因为这个加入的是局部环境变量,即当前用户,如果要加入全局变量选择no),我选择no;

4>遇到需不需要安装VSCode时,看个人选择,我选择no;

4,配置环境变量

在/etc/profile中加入
export PATH="/home/xxx/anaconda3/bin:$PATH"

这样所有用户都可以使用安装的anaconda python环境

5,更新环境变量(让修改的环境变量生效)

source /etc/profile

6,测试是否安装成功

在命令行输入python即可看到
?Python 3.8.5 (default, Sep  4 2020, 07:30:14) 
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 


二,上传本地项目到nginx,安装项目所需要的包:

(一)上传项目到nginx工作目录

如果使用apt-get这种方式安装的nginx,

  • 工作目录在 /etc/nginx
  • 日志目录在:/var/log/nginx/
  • web目录:/var/www/html/

按照nginx配置文件中的配置,应该将项目上传到web目录(html页面(静态文件)存储位置),

但是也可以在工作目录/etc/nginx创建一个html目录来存放项目,这样配置文件和项目在一个文件夹中,比较直观,好管理。只需要在nginx配置文件中改路径即可。(我推荐在nginx工作目录下创建项目存储目录)。

1,在/etc/nginx/目录下创建html目录

sudo mkdir html

2,上传项目到html目录

rz

3,进入到项目根目录进行项目所需要模块的安装

#这里用上了豆瓣镜像,速度比默认源要快
pip install -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com -r requirements.txt

注:这个地方用到了requirements.txt,可能有人会纳闷这个文件哪里来的,怎么直接按照这个文件就可以把项目需要的所有的模块安装上呢?

这个地方使用了一个第三方库,pipreqs:这个库的作用是自动去项目中找项目依赖的那些模块以及对应的版本。

首先我们在本地安装:

pip install pipreqs

进入项目根目录执行下面命令:

pipreqs ./ --encoding=utf-8 即可生成requirements.txt文件

然后打包项目上传,使用上边的豆瓣源进行安装即可。

(二)配置nginx反向代理,和负载均衡

1,进入/etc/nginx/conf.d目录,创建一个*.conf文件:(这个也可以在/etc/nginx/sites-enabled/default下也可以配置,这两者都可以)

cd /etc/nginx/conf.d
vi server.conf

2,在创建的server.conf中配置以下信息

upstream fuzai { #负载均衡
    server 127.0.0.1:5000; #本地启动的Flask服务
    server 127.0.0.1:5001;
}
server {
   listen xxx:xxx:xxx:xx:80; #nginx ip和端口(你的服务器ip是什么就写什么即可)
   location / {
     proxy_pass http://fuzai; #反向代理
  }
}


三,启动nginx,并且在项目根目录启动项目

安装好的nginx其实是自动启动的。

但是配置和文件之后想让配置文件生效就得重启:

sudo nginx -t 检查配置文件有没有错误
sudo nginx -s reload 重启nginx;或者使用sudo systemctl reload nginx都可以

然后进入项目根目录启动项目:

#在后台启动两个flask服务
nohup python run.py runserver -h 127.0.0.1 -p 5000 & 
nohup python run.py runserver -h 127.0.0.1 -p 5001 &

#查看是否启动成功
netstat -tunlp | grep 500*

注:这个地方有的人也会问,直接python run.py不香嘛。非得跟后面一大堆。

如果用python run.py就必须在代码中将ip和端口都给定,无法从命令行传递,当然有人也会用sys.argv或者argparse传参。其实这样也是可以的,但是要是参数一多,后台代码就得进行大的改动。

因此这个地方,用到了flask-script一个flask命令行运行的组件,非常好用。只需要安装在run.py文件中导入即可:

from flask_script import Manager

只需要将app传进入即可,是不是特别简单

app = create_app()

manager = Manager(app)

if __name__ =="__main__":
    manager.run()

这样后台就不用管了,需要加参数,前台直接加就可以。跑服务,设置数据库等等功能,不要太香。(之后的博客介绍Flask时会详细介绍)

其实到这个地方,已经上线完成了,只需要在本地访问nginx ip,他就会反向代理到flask服务中。就可以在本地进行操作了。

可是,我们使用的是flask自带的WSGI服务器(不懂WSGI的看我接下来的博客),不适合在生产环境中使用,在开发过程中作为便利提供,它没有考虑到安全性或性能。所以我们要使用真正的WSGI服务器。WSGI服务器有很多,这个地方我用的是Gunicorn(这也是用的最广泛,Flask官方推荐的服务器)。


四:配置Gunicorn环境

Gunicorn是一个unix上被广泛使用的高性能的Python WSGI UNIX HTTP Server,提供http服务。在文本中不是重点,网上也有很多资料,只要记住,它是用来代替flask自带的wsgi服务器的。

1,安装

安装很简单,只需要:
pip install Gunicorn 

2,安装完就可以直接在源码目录执行

进入到源码目录执行
gunicorn -w 2 -b :5000 run:app

-w指的是处理请求的进程数

-b是指绑定本机ip,可以省略掉不写,使用的端口是5000

run:app指的是run.py中的 flask app

Gunicorn直接用命令启动,一般不需要编写配置文件(当然也可以将所有配置写成一个python文件,这样整齐)

这样配置即可
gunicorn.conf.py:
    bind = '127.0.0.1:8000'      #绑定ip和端口号
    timeout = 30      #超时
    workers = multiprocessing.cpu_count() * 2 + 1    #进程数
    threads = 2 #指定每个进程开启的线程数

gunicorn -c gunicorn.conf.py test:application

这样就完事了,但是有个问题,加入遇到问题就需要单独重启他们,而且,遇到高并发场景时我想开启多进程,要是用gunicorn就得启动多次,很麻烦。有没有一个进程管理工具,直接用他就可以管理nginx和gunicorn呢?

这个是有的,推荐使用Supervisor。一个很好用,很强大的进程管理,监控工具。


五,配置Supervisor环境

在production环境,起停和状态的监控最好用supervisior之类的进程管理,监控工具。

supervisor是一个用python语言编写的进程管理工具,supervisor 能将一个普通的命令行进程变为后台daemon,它可以很方便的监听、启动、停止、重启一个或多个进程。当一个进程意外被杀死,supervisor监听到进程死后,可以很方便的让进程自动恢复,不再需要程序员或系统管理员自己编写代码来控制。可以运行在各种类unix的机器上。

1,安装

sudo apt-get install supervisor #ubuntu下安装

也可以用pip安装,但是推荐用apt-get安装,节省一些配置得步骤。

2,安装完毕,进入配置文件目录

进入/etc/supervisor/conf.d/目录

创建gunicorn.conf和nginx.conf配置文件

3,分别配置gunicorn.conf和nginx.conf

gunicorn.conf 这是gunicorn服务的配置文件

#为必须填写项
[program:gunicorn]
#命令路径
command=/home/xugaoxiang/anaconda3/bin/gunicorn -w 2 -b :50%(process_num)02d run:app
directory=/home/xxx #执行目录
autostart=true #如果是true,当supervisor启动时,程序将会自动启动
autorestart=true #自动重启
process_name=%(program_name)s_%(process_num)02d 
numprocs=2 #启动几个进程,每个进程负责一个服务
numprocs_start=1 #进程id从几开始
user=xugaoxiang #以什么用户执行
redirect_stderr=true #重定向
nginx.conf

[program:nginx]
command=/usr/sbin/nginx -g 'daemon on;'
autostart=true
autorestart=true
user=root
redirect_stderr=true

nginx是需要root权限的,所以user应该设置成root。最后就可以重启supervisor了

4,supervisor 安装后自动会启动,配置完毕后重启所有进程即可应用配置

sudo supervisorctl reload

5,观察进程状态

sudo supervisorctl status

到这才是真正的将Flask部署在了生产环境,用到了flask+nginx+supervisor+gunicorn


总结

将一个flask项目上传到linux服务器生产环境,总结起来分为以下几步:

1,配置LNMP环境:首先得有linux服务器,其次配置python环境,mysql环境,nginx环境。

这样其实就已经可以上线运行了,可是,flask的内置服务器不适合生产环境使用,这个时候需要加入真正的WSGI服务器。

2,配置Gunicorn WSGI服务器环境

有了真正服务器,那么还需要一个统一管理进程的工具,进行启动,重启,开启多进程,集中式管理。

3,配置Supervisor进程管理工具环境

以上就是一个完整的Flask生产环境部署的步骤。

相关推荐

让 Python 代码飙升330倍:从入门到精通的四种性能优化实践

花下猫语:性能优化是每个程序员的必修课,但你是否想过,除了更换算法,还有哪些“大招”?这篇文章堪称典范,它将一个普通的函数,通过四套组合拳,硬生生把性能提升了330倍!作者不仅展示了“术”,更传授...

7 段不到 50 行的 Python 脚本,解决 7 个真实麻烦:代码、场景与可复制

“本文整理自开发者AbdurRahman在Stackademic的真实记录,所有代码均经过最小化删减,确保在50行内即可运行。每段脚本都对应一个日常场景,拿来即用,无需额外依赖。一、在朋...

Python3.14:终于摆脱了GIL的限制

前言Python中最遭人诟病的设计之一就是GIL。GIL(全局解释器锁)是CPython的一个互斥锁,确保任何时刻只有一个线程可以执行Python字节码,这样可以避免多个线程同时操作内部数据结...

Python Web开发实战:3小时从零搭建个人博客

一、为什么选Python做Web开发?Python在Web领域的优势很突出:o开发快:Django、Flask这些框架把常用功能都封装好了,不用重复写代码,能快速把想法变成能用的产品o需求多:行业...

图解Python编程:从入门到精通系列教程(附全套速查表)

引言本系列教程展开讲解Python编程语言,Python是一门开源免费、通用型的脚本编程语言,它上手简单,功能强大,它也是互联网最热门的编程语言之一。Python生态丰富,库(模块)极其丰富,这使...

Python 并发编程实战:从基础到实战应用

并发编程是提升Python程序效率的关键技能,尤其在处理多任务场景时作用显著。本文将系统介绍Python中主流的并发实现方式,帮助你根据场景选择最优方案。一、多线程编程(threading)核...

吴恩达亲自授课,适合初学者的Python编程课程上线

吴恩达教授开新课了,还是亲自授课!今天,人工智能著名学者、斯坦福大学教授吴恩达在社交平台X上发帖介绍了一门新课程——AIPythonforBeginners,旨在从头开始讲授Python...

Python GUI 编程:tkinter 初学者入门指南——Ttk 小部件

在本文中,将介绍Tkinter.ttk主题小部件,是常规Tkinter小部件的升级版本。Tkinter有两种小部件:经典小部件、主题小部件。Tkinter于1991年推出了经典小部件,...

Python turtle模块编程实践教程

一、模块概述与核心概念1.1turtle模块简介定义:turtle是Python标准库中的2D绘图模块,基于Logo语言的海龟绘图理念实现。核心原理:坐标系系统:原点(0,0)位于画布中心X轴:向右...

Python 中的asyncio 编程入门示例-1

Python的asyncio库是用于编写并发代码的,它使用async/await语法。它为编写异步程序提供了基础,通过非阻塞调用高效处理I/O密集型操作,适用于涉及网络连接、文件I/O...

30天学会Python,开启编程新世界

在当今这个数字化无处不在的时代,Python凭借其精炼的语法架构、卓越的性能以及多元化的应用领域,稳坐编程语言排行榜的前列。无论是投身于数据分析、人工智能的探索,还是Web开发的构建,亦或是自动化办公...

Python基础知识(IO编程)

1.文件读写读写文件是Python语言最常见的IO操作。通过数据盘读写文件的功能都是由操作系统提供的,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个...

Python零基础到精通,这8个入门技巧让你少走弯路,7天速通编程!

Python学习就像玩积木,从最基础的块开始,一步步搭建出复杂的作品。我记得刚开始学Python时也是一头雾水,走了不少弯路。现在回头看,其实掌握几个核心概念,就能快速入门这门编程语言。来聊聊怎么用最...

一文带你了解Python Socket 编程

大家好,我是皮皮。前言Socket又称为套接字,它是所有网络通信的基础。网络通信其实就是进程间的通信,Socket主要是使用IP地址,协议,端口号来标识一个进程。端口号的范围为0~65535(用户端口...

Python-面向对象编程入门

面向对象编程是一种非常流行的编程范式(programmingparadigm),所谓编程范式就是程序设计的方法论,简单的说就是程序员对程序的认知和理解以及他们编写代码的方式。类和对象面向对象编程:把...

取消回复欢迎 发表评论: