使用 Nginx 和 Gunicorn 部署 Flask 项目详细教程
使用 Nginx 和 Gunicorn 部署 Flask 项目详细教程
在这篇文章中,我们将介绍如何使用 Nginx 和 Gunicorn 来部署一个 Flask 项目。这种部署方式非常适合在生产环境中使用,因为它能够提供更好的性能和更高的稳定性。
目录
- Flask 项目简介
- 环境准备
- Gunicorn 配置
- 使用 Systemd 管理 Gunicorn 服务
- 配置 Nginx 作为反向代理
- 配置防火墙
- 使用 SSL 启用 HTTPS(可选)
- 总结
1. Flask 项目简介
假设你已经有了一个简单的 Flask 应用。如果还没有,你可以使用以下代码创建一个简单的 Flask 项目:
# 文件名: app.py
from flask import Flaskapp = Flask(__name__)@app.route('/')
def hello():return 'Hello, this is a Flask app!'if __name__ == '__main__':app.run()
这个项目的目标是通过 Nginx 和 Gunicorn 将它部署到生产服务器上,确保它能够高效处理请求,并且在服务器重启时自动启动。
2. 环境准备
在开始部署之前,确保你的服务器已经安装了以下组件:
步骤 1:更新服务器并安装 Python 和 pip
sudo apt update
sudo apt upgrade
sudo apt install python3 python3-pip python3-venv
步骤 2:创建 Python 虚拟环境并激活
在你的项目目录中创建一个虚拟环境,并激活它:
# 进入你的项目目录
cd /path/to/your/flask/project# 创建虚拟环境
python3 -m venv myenv# 激活虚拟环境
source myenv/bin/activate
步骤 3:安装 Flask 和 Gunicorn
在激活的虚拟环境下安装 Flask 和 Gunicorn:
pip install flask gunicorn
3. Gunicorn 配置
Gunicorn 是一个 WSGI 服务器,用于运行 Flask 应用,并将其作为后台服务。我们可以通过以下命令启动 Flask 应用:
gunicorn --workers 3 app:app
参数解释:
--workers 3:表示使用 3 个工作线程来处理请求。app:app:第一个app是指app.py文件的名字,第二个app是 Flask 应用实例的名字。
4. 使用 Systemd 管理 Gunicorn 服务
为了让 Gunicorn 在服务器启动时自动启动,我们可以使用 Systemd 来管理 Gunicorn 服务。
步骤 1:创建 Gunicorn 服务文件
sudo nano /etc/systemd/system/flask_app.service
在文件中添加以下内容:
[Unit]
Description=Gunicorn instance to serve Flask app
After=network.target[Service]
User=your_username # 替换为你的服务器用户名
Group=www-data
WorkingDirectory=/path/to/your/flask/project # 替换为你的 Flask 应用目录
ExecStart=/path/to/your/flask/project/myenv/bin/gunicorn --workers 3 --bind unix:flask_app.sock -m 007 app:app[Install]
WantedBy=multi-user.target
步骤 2:启动 Gunicorn 服务
启动 Gunicorn 服务并将其设置为开机自启:
# 启动服务
sudo systemctl start flask_app# 设置为开机自启
sudo systemctl enable flask_app
步骤 3:检查 Gunicorn 服务状态
sudo systemctl status flask_app
如果服务启动成功,你应该能看到类似如下的输出:
● flask_app.service - Gunicorn instance to serve Flask appLoaded: loaded (/etc/systemd/system/flask_app.service; enabled; vendor preset: enabled)Active: active (running)
5. 配置 Nginx 作为反向代理
Nginx 作为反向代理,将所有来自外部的请求转发到 Gunicorn 来处理。
步骤 1:安装 Nginx
在服务器上安装 Nginx:
sudo apt install nginx
步骤 2:为 Flask 项目创建 Nginx 配置文件
创建 Nginx 配置文件:
sudo nano /etc/nginx/sites-available/flask_app
在文件中添加以下内容:
server {listen 80;server_name your_domain_or_IP; # 替换为你的域名或服务器的IP# 处理静态文件location /static/ {alias /path/to/your/flask/project/static/; # Flask 的静态文件目录}# 处理应用的请求location / {proxy_pass http://unix:/path/to/your/flask/project/flask_app.sock;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}# 日志配置(可选)access_log /var/log/nginx/flask_app.access.log;error_log /var/log/nginx/flask_app.error.log;
}
步骤 3:激活 Nginx 配置
使用符号链接将配置文件链接到 sites-enabled:
sudo ln -s /etc/nginx/sites-available/flask_app /etc/nginx/sites-enabled
步骤 4:检查 Nginx 配置是否正确
sudo nginx -t
步骤 5:重启 Nginx
sudo systemctl restart nginx
现在,你可以通过服务器的 IP 或域名来访问你的 Flask 应用了。
6. 配置防火墙
如果你的服务器使用了 UFW 作为防火墙工具,确保允许 Nginx 的 HTTP 和 HTTPS 流量:
sudo ufw allow 'Nginx Full'
7. 使用 SSL 启用 HTTPS(可选)
为了保护用户数据,可以使用 Let’s Encrypt 配置免费的 SSL 证书。
步骤 1:安装 Certbot
Certbot 是一个自动化工具,用来获取免费的 SSL 证书:
sudo apt install certbot python3-certbot-nginx
步骤 2:获取 SSL 证书
运行以下命令为你的域名获取 SSL 证书:
sudo certbot --nginx -d your_domain
Certbot 会自动更新你的 Nginx 配置并启用 SSL。
步骤 3:设置证书自动更新
Let’s Encrypt 的 SSL 证书默认有效期为 90 天,你可以通过设置自动更新来保持证书有效:
sudo certbot renew --dry-run
8. 总结
通过使用 Gunicorn 和 Nginx,你可以轻松地将 Flask 项目部署到生产服务器中。Gunicorn 作为 WSGI 服务器处理 Python 请求,Nginx 作为反向代理处理静态文件和请求路由。通过 Systemd,你可以管理 Gunicorn 服务,确保它在服务器重启时自动启动。最后,通过 Let’s Encrypt 配置 SSL 证书,你可以启用 HTTPS 提升安全性。
这种方式适用于小型和中型 Flask 应用的生产环境部署,希望这篇文章能帮助你快速、高效地部署 Flask 项目。
相关文章:
使用 Nginx 和 Gunicorn 部署 Flask 项目详细教程
使用 Nginx 和 Gunicorn 部署 Flask 项目详细教程 在这篇文章中,我们将介绍如何使用 Nginx 和 Gunicorn 来部署一个 Flask 项目。这种部署方式非常适合在生产环境中使用,因为它能够提供更好的性能和更高的稳定性。 目录 Flask 项目简介环境准备Gunico…...
linux中bashrc和profile环境变量在Shell编程变量的传递作用
在 Linux 系统中,.bashrc文件和.profile文件都是用于配置用户环境的重要文件,它们之间有以下关联: 一、作用相似性 环境设置:两者都用于设置用户的环境变量和启动应用程序的配置。例如,它们可以定义路径变量…...
数据结构-4.2.串的定义和基本操作
一.串的定义: 1.单/双引号不是字符串里的内容,他只是一个边界符,用来表示字符串的头和尾; 2.空串也是字符串的子串,空串长度为0; 3.字符的编号是从1开始,不是0; 4.空格也是字符&a…...
fastzdp_redis第一次开发, 2024年9月26日, Python操作Redis零基础快速入门
提供完整录播课 安装 pip install fastzdp_redisPython连接Redis import redis# 建立链接 r redis.Redis(hostlocalhost, port6379, db0)# 设置key r.set(foo, bar)# 获取key的值 print(r.get(foo))RESP3 支持 简单的理解: 支持更丰富的数据类型 参考文档: https://blog.c…...
文件名:\\?\C:\Windows\system32\inetsrv\config\applicationHost.config错误:无法写入配置文件
文件名: \\?\C:\Windows\system32\inetsrv\config\applicationHost.config 错误:无法写入配置文件 解决办法: 到C:\inetpub\history中找到最近一次的【CFGHISTORY_00000000XX】文件,点击进去找到applicationHost.config文件,用其覆盖C:\Win…...
Optiver股票大赛Top2开源!
Optiver股票大赛Top2开源! ↑↑↑关注后"星标"kaggle竞赛宝典 作者:杰少 Optiver第二名方案解读 简介 Optiver竞赛已经于今天结束了,竞赛也出现了极端情况,中间断崖式的情况,在Kaggle过往的竞赛中&#…...
Maven 实现依赖统一管理
Maven 实现依赖统一管理主要是通过两个关键机制:pom.xml 文件中的 <dependencies> 节点用于声明项目依赖,以及通过继承(Inheritance)和聚合(Aggregation)功能来统一管理和组织这些依赖。此外…...
【最新】微信小程序连接onenet——stm32+esp8266+onenet实现查看温湿度,控制单片机
微信小程序——stm32esp8266onenet实现查看温湿度,控制单片机 (最新已验证)stm32 新版 onenet dht11esp8266/01s mqtt物联网上报温湿度和控制单片机(保姆级教程) :↓↓👇 👇 👇 👇…...
差分(续前缀和)(含一维二维)
题目引入 开发商小 Q 买下了一条街,他想在这条街的一边盖房子。 街道可以抽象为一条数轴,而小 Q 只会在坐标在 1~n 的范围内盖房子。 首先,小 Q 将街上坐标在 1∼ 𝑛1∼ n 范围内的物体全部铲平。也就是说,在正式动工盖…...
【STM32-HAL库】自发电型风速传感器(使用STM32F407ZGT6)(附带工程下载链接)
一、自发电型风速传感器介绍 自发电型风速传感器,也称为风力发电型风速传感器或无源风速传感器,是一种不需要外部电源即可工作的风速测量设备。这种传感器通常利用风力来驱动内部的发电机构,从而产生电能来供电测量风速的传感器部分。以下是自…...
【计算机毕业设计】springboot就业信息管理系统
就业信息管理系统 摘 要 随着信息化时代的到来,管理系统都趋向于智能化、系统化,就业信息管理系统也不例外,但目前国内仍都使用人工管理,市场规模越来越大,同时信息量也越来越庞大,人工管理显然已无法应对时…...
实用工具推荐---- PDF 转换
直接上链接:爱PDF |面向 PDF 爱好者的在线 PDF 工具 (ilovepdf.com) 主要功能如下: 全免费!!!!...
安宝特案例 | 某知名日系汽车制造厂,借助AR实现智慧化转型
案例介绍 在全球制造业加速数字化的背景下,工厂的生产管理与设备维护效率愈发重要。 某知名日系汽车制造厂当前面临着设备的实时监控、故障维护,以及跨地域的管理协作等挑战,由于场地分散和突发状况的不可预知性,传统方式已无法…...
RabbitMQ基本原理
一、基本结构 所有中间件技术都是基于 TCP/IP 协议基础之上进行构建新的协议规范,RabbitMQ遵循的是AMQP协议(Advanced Message Queuing Protocol - 高级消息队列协议)。 生产者发送消息流程: 1、生产者和Broker建立TCP连接&#…...
【NodeJS】npm、yarn、pnpm当前项目设置国内镜像源
全局设置镜像源,可以参考下这篇文章,还挺详细:《npm、yarn、pnpm 最新国内镜像源设置和常见问题解决》 临时设置镜像源:《npm永久或临时切换源》 有时候可能要同时多个开发项目,又不想修改全局的镜像源(具体场景…自行…...
25考研咨询周开启,西安电子科技大学是否改考408??
学长这几天帮大家问了西安电子科技大学是否会从833、834、953改考为408? 西电老师回复:根据上级文件要求,招生简章以及专业目录会在网上报名开始前公布,专业课不会又大变动! 因为大家安心复习即可,保证今…...
git(1) -- 环境配置
1. 配置文件 编辑~/.gitconfig文件,内容如下。 [user]email xflming163.comname xflm [core]editor vim [color]diff autostatus autobranch autoui true [commit]template /home/xflm/configuser/git-commit.template [diff]tool bc4 [difftool]prompt …...
Windows安装Vim,并在PowerShell中直接使用vim
大家好啊,我是豆小匠。 这期介绍下怎么在windows的PowerShell上使用vim,方便在命令行里修改配置文件等。 先上效果图: 1、下载Vim GitHub传送门:https://github.com/vim/vim-win32-installer/releases 选择win-64的版本下载即可&…...
力扣(leetcode)每日一题 983 最低票价 |动态规划
983. 最低票价 题干 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出。每一项是一个从 1 到 365 的整数。 火车票有 三种不同的销售方式 : 一张 为期一天 的通…...
【漏洞复现】VEXUS多语言货币交易所存在未授权访问漏洞
漏洞描述 java后端,非常完整的一套交易所,UI前端做的也很漂亮,新增了交易跟单功能,前端pc+wap都是uniapp纯源码,前端源码node_modules环境已经安装好了,拿去直接编译就可以. 后端 前端 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
