29. Flask 部署项目 nginx + gunicorn + flask

2024-08-21 03:58

本文主要是介绍29. Flask 部署项目 nginx + gunicorn + flask,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

部署

当我们执行下面的hello.py时,使用的flask自带的服务器,完成了web服务的启动。在生产环境中,flask自带的服务器,无法满足性能要求。

需要采用uWsgi或者Gunicorn来启动web服务,我们这里采用Gunicorn做wsgi容器,来部署flask程序。

Gunicorn(绿色独角兽)是一个Python WSGI的HTTP服务器。从Ruby的独角兽(Unicorn )项目移植。该Gunicorn服务器与各种Web框架兼容,实现非常简单,轻量级的资源消耗。Gunicorn直接用命令启动,不需要编写配置文件,相对uWSGI要容易很多。

区分几个概念:

WSGI:全称是Web Server Gateway Interface(web服务器网关接口),它是一种规范,它是web服务器和web应用程序之间的接口。它的作用就像是桥梁,连接在web服务器和web应用框架之间。

uwsgi:是一种传输协议,用于定义传输信息的类型。

uWSGI:是实现了uwsgi协议WSGI的web服务器。

本次介绍的部署方式: nginx + gunicorn + flask

# hello.pyfrom flask import Flask
app = Flask(__name__)@app.route('/hello')
def hello():return '<h1>hello world</h1>'if __name__ == '__main__':app.run(debug=True)

使用Gunicorn:

web开发中,部署方式大致类似。简单来说,前端代理使用Nginx主要是为了实现分流、转发、负载均衡,以及分担服务器的压力。Nginx部署简单,内存消耗少,成本低。

Nginx既可以做正向代理,也可以做反向代理。

正向代理:请求经过代理服务器从局域网发出,然后到达互联网上的服务器。

特点:服务端并不知道真正的客户端是谁。

反向代理:请求从互联网发出,先进入代理服务器,再转发给局域网内的服务器。

特点:客户端并不知道真正的服务端是谁。

区别:正向代理的对象是客户端。反向代理的对象是服务端。

下面来写一个完整的部署示例。

安装gunicorn

安装命令如下:

pip3 install gunicorn

安装信息如下:

[root@server01 ~]# pip3 install gunicorn
Looking in indexes: https://mirrors.aliyun.com/pypi/simple/
Collecting gunicornDownloading https://mirrors.aliyun.com/pypi/packages/69/ca/926f7cd3a2014b16870086b2d0fdc84a9e49473c68a8dff8b57f7c156f43/gunicorn-20.0.4-py2.py3-none-any.whl (77kB)|████████████████████████████████| 81kB 7.1MB/s 
Requirement already satisfied: setuptools>=3.0 in /usr/local/python3/lib/python3.7/site-packages (from gunicorn) (39.0.1)
Installing collected packages: gunicorn
Successfully installed gunicorn-20.0.4
WARNING: You are using pip version 19.2.1, however version 19.3.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
[root@server01 ~]# 

配置全局命令:安装完毕之后,全局环境是无法直接执行的,需要找到二进制文件软链接到/usr/bin路径下。

# 安装之后,无法直接执行命令
[root@server01 ~]# gunicorn -h
-bash: gunicorn: command not found

搜索安装之后,gunicorn二进制可执行文件的位置:

[root@server01 ~]# find / -name "*gunicorn*" -ls | grep python3 | grep bin
405121    4 -rwxr-xr-x   1 root     root          236 Dec 12 08:31 /usr/local/python3/bin/gunicorn
[root@server01 ~]# 

设置软链接如下:

[root@server01 ~]# ln -s /usr/local/python3/bin/gunicorn /usr/bin/gunicorn
[root@server01 ~]# 
[root@server01 ~]# ls -ll /usr/bin/gunicorn
lrwxrwxrwx 1 root root 31 Dec 12 08:38 /usr/bin/gunicorn -> /usr/local/python3/bin/gunicorn
[root@server01 ~]# 

配置软链接之后,就可以全局环境使用gunicorn了,例如查看版本如下:

[root@server01 ~]# gunicorn -v
gunicorn (version 20.0.4)
[root@server01 ~]# 
使用gunicorn启动flask项目

首先准备好一个flask项目:启动flask项目之后,测试访问hello视图如下:

[root@server01 ~]# curl 127.0.0.1:5000/hello
<h1>hello world</h1>[root@server01 ~]# 

测试项目能够正常访问之后,停止flask,下面来使用gunicorn启动。

查看命令行选项: 安装gunicorn成功后,通过命令行的方式可以查看gunicorn的使用信息。

[root@server01 ~]# gunicorn -h
usage: gunicorn [OPTIONS] [APP_MODULE]optional arguments:-h, --help            show this help message and exit-v, --version         show program's version number and exit-c CONFIG, --config CONFIGThe Gunicorn config file. [None]-b ADDRESS, --bind ADDRESSThe socket to bind. [['127.0.0.1:8000']]....
[root@server01 ~]# 

通常使用的参数:

-c CONFIG, --config=CONFIG
设定配置文件。
-b BIND, --bind=BIND
设定服务需要绑定的端口。建议使用HOST:PORT。
-w WORKERS, --workers=WORKERS
设置工作进程数。建议服务器每一个核心可以设置2-4个。
-k MODULE
选定异步工作方式使用的模块。

直接运行:

#直接运行,默认启动的127.0.0.1::8000
gunicorn 运行文件名称:Flask程序实例名

启动如下:

13423234-1660ef542fb68ae2.png

测试访问hello视图:

[root@server01 ~]# curl 127.0.0.1:8000/hello
<h1>hello world</h1>[root@server01 ~]# 

可以看到正常访问,下面来看看指定端口号的启动方式,如下。

指定进程和端口号: -w: 表示进程(worker)。 -b:表示绑定ip地址和端口号(bind)。 -D: 后台运行

$ gunicorn -w 4 -b 127.0.0.1:5001 运行文件名称:Flask程序实例名
13423234-3f8c61e1a3385041.png

指定日志文件

  --access-logfile FILEThe Access log file to write to. [None]--access-logformat STRINGThe access log format. [%(h)s %(l)s %(u)s %(t)s--error-logfile FILE, --log-file FILEThe Error log file to write to. [-]

指定access.log和error.log日志文件如下:

gunicorn -w 4 -b 127.0.0.1:5001 --access-logfile access.log --error-logfile error.log main:app

查看access.log日志信息:

13423234-0a1be5c42f8c8f04.png

查看error.log日志信息:

13423234-b550edfdb22e70f4.png

Nginx配置访问gunicorn

Nginx配置:

打开/usr/local/nginx/conf/nginx.conf文件

upstream flask{server 127.0.0.1:5000;server 127.0.0.1:5001;
}server {# 监听80端口listen 80;# 本机server_name localhost; # 默认请求的urllocation / {#请求转发到gunicorn服务器proxy_pass http://flask; #设置请求头,并将头信息传递给服务器端 proxy_set_header Host $host; }
}

可以看到nginx转发gunicorn只需要通过端口号直接proxy_pass代理即可。

13423234-0e3934319aa622f6.png

这篇关于29. Flask 部署项目 nginx + gunicorn + flask的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092060

相关文章

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas

k8s部署MongDB全过程

《k8s部署MongDB全过程》文章介绍了如何在Kubernetes集群中部署MongoDB,包括环境准备、创建Secret、创建服务和Deployment,并通过Robo3T工具测试连接... 目录一、环境准备1.1 环境说明1.2 创建 namespace1.3 创建mongdb账号/密码二、创建Sec

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

Python 中 requests 与 aiohttp 在实际项目中的选择策略详解

《Python中requests与aiohttp在实际项目中的选择策略详解》本文主要介绍了Python爬虫开发中常用的两个库requests和aiohttp的使用方法及其区别,通过实际项目案... 目录一、requests 库二、aiohttp 库三、requests 和 aiohttp 的比较四、requ

SpringBoot项目启动后自动加载系统配置的多种实现方式

《SpringBoot项目启动后自动加载系统配置的多种实现方式》:本文主要介绍SpringBoot项目启动后自动加载系统配置的多种实现方式,并通过代码示例讲解的非常详细,对大家的学习或工作有一定的... 目录1. 使用 CommandLineRunner实现方式:2. 使用 ApplicationRunne

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像

使用IntelliJ IDEA创建简单的Java Web项目完整步骤

《使用IntelliJIDEA创建简单的JavaWeb项目完整步骤》:本文主要介绍如何使用IntelliJIDEA创建一个简单的JavaWeb项目,实现登录、注册和查看用户列表功能,使用Se... 目录前置准备项目功能实现步骤1. 创建项目2. 配置 Tomcat3. 项目文件结构4. 创建数据库和表5.

Python项目打包部署到服务器的实现

《Python项目打包部署到服务器的实现》本文主要介绍了PyCharm和Ubuntu服务器部署Python项目,包括打包、上传、安装和设置自启动服务的步骤,具有一定的参考价值,感兴趣的可以了解一下... 目录一、准备工作二、项目打包三、部署到服务器四、设置服务自启动一、准备工作开发环境:本文以PyChar

多模块的springboot项目发布指定模块的脚本方式

《多模块的springboot项目发布指定模块的脚本方式》该文章主要介绍了如何在多模块的SpringBoot项目中发布指定模块的脚本,作者原先的脚本会清理并编译所有模块,导致发布时间过长,通过简化脚本... 目录多模块的springboot项目发布指定模块的脚本1、不计成本地全部发布2、指定模块发布总结多模

SpringBoot项目删除Bean或者不加载Bean的问题解决

《SpringBoot项目删除Bean或者不加载Bean的问题解决》文章介绍了在SpringBoot项目中如何使用@ComponentScan注解和自定义过滤器实现不加载某些Bean的方法,本文通过实... 使用@ComponentScan注解中的@ComponentScan.Filter标记不加载。@C