使用 Nginx 和 Gunicorn 部署 Flask 项目详细教程

news2024/10/2 8:35:55

使用 Nginx 和 Gunicorn 部署 Flask 项目详细教程

在这篇文章中,我们将介绍如何使用 NginxGunicorn 来部署一个 Flask 项目。这种部署方式非常适合在生产环境中使用,因为它能够提供更好的性能和更高的稳定性。

目录

  1. Flask 项目简介
  2. 环境准备
  3. Gunicorn 配置
  4. 使用 Systemd 管理 Gunicorn 服务
  5. 配置 Nginx 作为反向代理
  6. 配置防火墙
  7. 使用 SSL 启用 HTTPS(可选)
  8. 总结

1. Flask 项目简介

假设你已经有了一个简单的 Flask 应用。如果还没有,你可以使用以下代码创建一个简单的 Flask 项目:

# 文件名: app.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello, this is a Flask app!'

if __name__ == '__main__':
    app.run()

这个项目的目标是通过 NginxGunicorn 将它部署到生产服务器上,确保它能够高效处理请求,并且在服务器重启时自动启动。


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 app
     Loaded: 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. 总结

通过使用 GunicornNginx,你可以轻松地将 Flask 项目部署到生产服务器中。Gunicorn 作为 WSGI 服务器处理 Python 请求,Nginx 作为反向代理处理静态文件和请求路由。通过 Systemd,你可以管理 Gunicorn 服务,确保它在服务器重启时自动启动。最后,通过 Let’s Encrypt 配置 SSL 证书,你可以启用 HTTPS 提升安全性。

这种方式适用于小型和中型 Flask 应用的生产环境部署,希望这篇文章能帮助你快速、高效地部署 Flask 项目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2184075.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

停止模式下USART为什么可以唤醒MCU?

在MCU的停止模式下,USART之类的外设时钟是关闭的,但是USART章节有描述到在停止模式下可以用USART来对MCU进行唤醒: 大家是否会好奇在外设的时钟被关闭的情况下,USART怎么能通过接收中断或者唤醒事件对MCU进行唤醒的呢&#xff1…

2024双十一有什么值得买?分享五款优质好物提高幸福感!

双十一购物节即将到来,这是一年中各平台打折力度最大的时期。然而,在众多品牌和款式中,我们往往难以做出选择。今天,我将为大家介绍一些在双十一期间值得入手的高品质商品,让我们一起寻找心仪之选! 1、水陆…

【微服务】初识

基础概念 集群 集群是将一个系统完整的部署到多个服务器,每个服务器提供系统的所有服务,多个服务器可以通过负载均衡完成任务,每个服务器都可以称为集群的节点。 分布式 分布式是将一个系统拆分为多个子系统,多个子系统部署在…

入门案例解析

parent aliyun上下载的却没有parent——但是在下面导入了 这里进行了继承——且继承得里面进行了依赖管理(插件管理也是如此) 不同版本的SpringBoot的依赖版本会有一些不同 starter 这就可以让我使用某个技术开发就可以使用某个技术的starter …

PDSCH(物理下行共享信道)简介

文章目录 PDSCH(物理下行共享信道)简介1. Transport block CRC attachment2. LDPC base graph selection3. Code block segmentation And Code Block CRC Attachment4. Channel Coding5. Rate Matching6. Code Block Concatenation7. Scrambling8. Modul…

DBC差异比较工具DBCCompare_原理介绍(四)

DBC比对工具UI图片 DBC比对工具:功能详解与源码分析 在现代汽车开发和诊断过程中,DBC(Database Container)文件扮演着至关重要的角色。它们详细描述了CAN(Controller Area Network)网络中各消息和信号的详…

JavaScript中的(this)指向问题(如何正确判断this,箭头函数的this是什么)

🐾如何正确判断this 👉我们先运用下面的代码,模拟我们日常生活中常见的三个开发场景,并针对每个场景我们来一 一介绍this的指向 function fun1() {console.log(this.a)}var a 1//场景1fun1()const obj {a: 2,fun1: fun1}//场景…

Arduino UNO R3自学笔记17 之 Arduino为啥要用中断?

注意:学习和写作过程中,部分资料搜集于互联网,如有侵权请联系删除。 前言:学习Arduino中断的概念及其功能。 1.什么是中断? 单片机在执行程序时,发生一些其它紧急的事情,单片机将立即暂停当前…

RD-Agent Windows安装教程

RD-Agent Windows安装教程 QuantML QuantML 2024年09月23日 18:30 Content RD-Agent 是微软亚洲研究院推出的一款自动化研究与开发工具,能够通过LLMs自动构建因子和策略,相关介绍见我们之前的文章:RD-Agent :自动化Quant工厂 然…

Redis: Sentinel哨兵监控架构及环境搭建

概述 在主从模式下,我们通过从节点只读模式提高了系统的并发能力并发不断增加,只需要扩展从节点即可,只要主从服务器之间,网络连接正常主服务器就会将写入自己的数据同步更新给从服务器,从而保证主从服务器的数据相同…

国外电商系统开发-用户第一次需求反馈

一、用户反馈 因用户不懂系统开发,不知道需求应该怎么整理,用户只能从页面端说。 1、首页 a、太花里胡哨啦,不是一目了然; b、主次感不是很强; 2、分类 a、太复杂,前期产品不多 3、详情 a、太多了广…

极端天气道路目标检测数据集 3400张 带标注 VOC YOLO 6类

分类名: (图片张数,标注个数) car: (3210, 13654) truck: (1168,1629) per son: (1517,4359) bicyc le: (334, 589) bus: (381, 439) motorcycle: (164, 214) 总数: (3404, 20884) 总类(nc): 6类 极端天气道路目标检测…

RAG(Retrieval Augmented Generation)及衍生框架:CRAG、Self-RAG与HyDe的深入探讨

近年来,随着大型语言模型(LLMs)的迅猛发展,我们在寻求更精确、更可靠的语言生成能力上取得了显著进展。其中,检索增强生成(Retrieval-Augmented Generation)作为一种创新方法,极大地…

<<机器学习实战>>10-11节笔记:生成器与线性回归手动实现

10生成器与python实现 如果是曲线规律的数据集,则需要把模型变复杂。如果是噪音较大,则需要做特征工程。 随机种子的知识点补充: 根据不同库中的随机过程,需要用对应的随机种子: 比如 llist(range(5)) random.shuf…

Linux 实用工具Axel安装及使用教程(支持多线程下载)

一、Axel 简介 Axel 是一个轻量级的命令行下载加速器,旨在提高文件下载速度。 多线程下载: Axel 可以同时使用多个连接来下载文件,从而加快下载速度。断点续传: 支持中断后继续下载,避免重新开始下载整个文件。轻量级: 资源占用少&#xff0c…

G502 鼠标自定义(配合 karabiner)

朋友送了我一个 G502 多功能鼠标,除了鼠标正常的左键、右键和滑轮外,额外提供了 6 个按键,并且滑轮可以向左、向右、向下按下,共计 9 个自定义的按键。 虽然是 karabiner 的老用户,但一直在使用 TrackPad,所…

SpringBoot上传图片实现本地存储以及实现直接上传阿里云OSS

一、本地上传 概念&#xff1a;将前端上传的文件保存到自己的电脑 作用&#xff1a;前端上传的文件到后端&#xff0c;后端存储的是一个临时文件&#xff0c;方法执行完毕会消失&#xff0c;把临时文件存储到本地硬盘中。 1、导入文件上传的依赖 <dependency><grou…

C++ | Leetcode C++题解之第451题根据字符出现频率排序

题目&#xff1a; 题解&#xff1a; class Solution { public:string frequencySort(string s) {unordered_map<char, int> mp;int maxFreq 0;int length s.size();for (auto &ch : s) {maxFreq max(maxFreq, mp[ch]);}vector<string> buckets(maxFreq 1)…

MySQL--数据库约束(详解)

目录 一、前言二、概念三、数据库约束3.1 约束类型3.1.1 NOT NULL 约束3.1.2 UNIQUE (唯一&#xff09;3.1.3 DEFAULT&#xff08;默认&#xff09;3.1.4 PRIMARY KEY&#xff08;主键&#xff09;3.1.5 FOREIGN KEY&#xff08;外键&#xff09;3.1.6 CHECK 四、总结 一、前言…

Redis篇(最佳实践)(持续更新迭代)

介绍一&#xff1a;键值设计 一、优雅的key结构 Redis 的 Key 虽然可以自定义&#xff0c;但最好遵循下面的几个最佳实践约定&#xff1a; 遵循基本格式&#xff1a;[业务名称]:[数据名]:[id]长度不超过 44 字节不包含特殊字符 例如&#xff1a; 我们的登录业务&#xff0…