当前位置: 首页 > article >正文

生产环境中安装和配置 Nginx 以部署 Flask 应用的详细指南

在生产环境中部署 Flask 应用时,Nginx 常被用作反向代理服务器,与 WSGI 服务器(如 Gunicorn)协同工作。Nginx 可以处理静态文件、提供 SSL/TLS 加密、实现负载均衡等功能。本文将详细介绍如何在 Ubuntu/Debian 系统上安装 Nginx,并配置它以反向代理 Flask 应用。


一、安装 Nginx

1. 使用包管理器安装 Nginx

在 Ubuntu 或 Debian 系统上,可以使用 apt-get 包管理器来安装 Nginx。执行以下命令:

sudo apt-get update                    # 更新软件包列表
sudo apt-get install nginx             # 安装 Nginx

解释:

  • sudo apt-get update
    • 更新本地的软件包列表,确保获取最新的软件包信息。
  • sudo apt-get install nginx
    • 安装 Nginx 服务器的软件包。
  • 安装完成后,Nginx 服务会自动启动,默认监听 80 端口。

2. 验证 Nginx 是否安装成功

在浏览器中输入服务器的 IP 地址,或者在本地服务器上运行:

curl http://localhost

如果 Nginx 安装成功,您应当看到包含 “Welcome to nginx!” 的默认欢迎页面。


二、配置 Nginx

为了使 Nginx 反向代理您的 Flask 应用,需要创建或修改 Nginx 的配置文件。

1. 创建新的 Nginx 配置文件

在目录 /etc/nginx/sites-available/ 下创建一个新的配置文件,例如 myapp

sudo nano /etc/nginx/sites-available/myapp

解释:

  • sudo:以超级用户权限执行命令。
  • nano:文本编辑器,可以根据喜好替换为 vivim 等。
  • 创建或打开名为 myapp 的配置文件。

2. 配置文件内容详解

在打开的文件中,输入以下内容:

server {listen 80;server_name your_domain.com;  # 或者服务器的 IP 地址# 配置反向代理到 Gunicorn 服务location / {proxy_pass http://127.0.0.1:5001;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;}# 处理静态文件location /static/ {alias /path/to/your/app/static/;}
}
详细解释:
  • server { ... }:定义一个服务器块,其中包含与特定域名或 IP 地址相关的配置。
1. 基本设置
  • listen 80;
    • 监听服务器的 80 端口,即 HTTP 的默认端口。
  • server_name your_domain.com;
    • 指定服务器的域名或 IP 地址。
    • 替换为您的实际域名或服务器的公网 IP
    • 如果没有域名,可以使用 _default_server,表示匹配所有请求。
2. 反向代理配置
  • location / { ... }

    • 匹配所有以 / 开头的请求,即除其他 location 配置外的所有路径。
  • proxy_pass http://127.0.0.1:5001;

    • 将匹配的请求转发到运行在本地 5001 端口的服务,即 Gunicorn 服务器。
    • 确保 Gunicorn 正在监听 127.0.0.1:5001
  • 设置请求头信息(解决请求头丢失的问题):

    • proxy_set_header Host $host;
      • 将原始请求的主机头转发给后端服务器。
    • proxy_set_header X-Real-IP $remote_addr;
      • 将客户端的 IP 地址传递给后端服务器。
    • proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      • 用于识别经过代理的原始客户端 IP 地址,支持多级代理。
    • proxy_set_header X-Forwarded-Proto $scheme;
      • 将客户端使用的协议(HTTP 或 HTTPS)传递给后端服务器。
3. 静态文件处理
  • location /static/ { ... }
    • 匹配以 /static/ 开头的请求,通常用于请求静态文件(如 CSS、JavaScript、图片等)。
  • alias /path/to/your/app/static/;
    • 指定静态文件的实际存储路径。
    • 请将 /path/to/your/app/static/ 替换为您 Flask 应用中静态文件所在的实际路径

为什么需要 Nginx 处理静态文件?

  • Nginx 对静态文件的处理效率高于 Gunicorn。
  • 减轻 WSGI 服务器的负担,提高整体性能。
完整的配置示例:
server {listen 80;server_name your_domain.com;  # 替换为您的域名或服务器 IPlocation / {proxy_pass http://127.0.0.1:5001;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;}location /static/ {alias /home/username/myproject/static/;  # 替换为实际的静态文件路径}error_log /var/log/nginx/myapp_error.log;access_log /var/log/nginx/myapp_access.log;
}

可选配置:

  • 错误页面定制:您可以定义自定义的错误页面,以提升用户体验。
  • 日志文件:指定专门的日志文件,方便调试和监控。

3. 创建符号链接以启用配置

Nginx 默认从 /etc/nginx/sites-enabled/ 目录加载配置文件。为了启用新创建的配置,需要创建符号链接:

sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/

解释:

  • ln -s:创建符号链接(软链接)。
  • /etc/nginx/sites-available/myapp:原始配置文件。
  • /etc/nginx/sites-enabled/:Nginx 加载配置的目录。

4. 测试 Nginx 配置并重启服务

在重新加载 Nginx 之前,确保配置文件没有错误。

sudo nginx -t

解释:

  • nginx -t:测试 Nginx 配置文件的语法和有效性。
  • 如果输出显示 syntax is oktest is successful,表示配置没有问题。

重启 Nginx:

sudo systemctl restart nginx

或在某些系统中:

sudo service nginx restart

确保 Nginx 已成功重启并加载新的配置。


三、验证配置

1. 启动您的 Flask 应用

确保您的 Flask 应用正在运行,并且 Gunicorn 正在监听 127.0.0.1:5001。示例命令:

gunicorn -w 4 -b 127.0.0.1:5001 app:app

解释:

  • -w 4:启动 4 个工作进程。
  • -b 127.0.0.1:5001:绑定到本地的 5001 端口。
  • app:appapp.py 文件中的 Flask 实例名为 app

2. 访问应用程序

在浏览器中输入您的域名或服务器的 IP 地址:

http://your_domain.com/

您应该能够看到您的 Flask 应用返回的内容。

3. 测试静态文件

访问一个静态文件的 URL,例如:

http://your_domain.com/static/your_static_file.css

验证 Nginx 是否正确提供静态文件。


四、常见问题及解决方案

1. Nginx 无法启动或重新加载失败

症状:

  • 执行 sudo nginx -t 时出现错误。
  • Nginx 无法启动或重启。

解决方案:

  • 检查配置文件的语法错误,特别是缺少分号、花括号等。

  • 确认配置文件中的路径和文件是否存在。

  • 查看 Nginx 错误日志:

    sudo cat /var/log/nginx/error.log
    

2. 访问应用时出现 502 Bad Gateway 错误

原因:

  • Nginx 作为反向代理,无法连接到后端的 Gunicorn 服务。

解决方案:

  • 确认 Gunicorn 正在运行,并且监听的地址和端口与 Nginx 配置中的 proxy_pass 一致。
  • 检查防火墙设置,确保本地端口是开放的。

3. 静态文件无法加载或返回 404 错误

原因:

  • Nginx 的 alias 配置路径不正确。
  • 静态文件实际存储的位置与配置不匹配。

解决方案:

  • 确认静态文件的实际路径,并在 Nginx 配置中正确设置 alias
  • 检查文件权限,确保 Nginx 对静态文件目录有读取权限。

五、进阶配置与优化

1. 配置 HTTPS

为保证数据传输的安全性,建议使用 SSL/TLS 加密。

  • 获取 SSL 证书:

    • 可以使用 Let’s Encrypt 免费获取证书:

      sudo apt-get install certbot python3-certbot-nginx
      sudo certbot --nginx -d your_domain.com
      
  • 自动配置 Nginx:

    • Certbot 会自动修改 Nginx 配置,添加 SSL 配置和自动重定向。

2. 设置防火墙

  • 使用 UFW 管理防火墙规则:

    sudo ufw allow 'Nginx Full'
    sudo ufw delete allow 'Nginx HTTP'
    
  • 确保仅开放必要的端口(如 80、443)。

3. 优化 Nginx 配置

  • 启用 Gzip 压缩:

    http 块中添加:

    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    
  • 设置缓存头:

    在静态文件的 location 块中添加:

    location /static/ {alias /path/to/your/app/static/;expires 30d;add_header Cache-Control "public, max-age=2592000";
    }
    
  • 限制请求速率:

    防止恶意请求导致的服务器压力过大:

    http {limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;...
    }
    server {...location / {limit_req zone=one burst=20 nodelay;...}
    }
    

4. 日志分割与管理

  • 设置日志切割

    使用 logrotate 管理 Nginx 日志文件,防止日志文件过大。

  • 自定义日志格式

    http 块中定义新的日志格式:

    log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';
    

    然后在 server 块中使用:

    access_log /var/log/nginx/access.log main;
    

六、总结

通过以上步骤,您已经成功在生产环境中安装并配置了 Nginx,以反向代理您的 Flask 应用。Nginx 的强大功能不仅提高了应用的性能和安全性,还提供了灵活的配置选项,满足不同的部署需求。

关键点回顾:

  • 安装 Nginx:使用包管理器方便快捷。
  • 配置 Nginx:创建专用的配置文件,详细理解每一项配置的含义。
  • 处理静态文件:让 Nginx 接管静态文件的服务,提高效率。
  • 启用配置并重启 Nginx:确保新的配置生效。
  • 验证配置:通过访问应用和静态资源,确认配置正确。
  • 解决常见问题:掌握故障排查的方法,保证服务的稳定运行。

后续建议:

  • 持续监控:使用监控工具(如 Prometheus、Grafana)监测服务器性能和应用状态。
  • 安全更新:定期更新 Nginx 和系统软件,修复已知的安全漏洞。
  • 备份配置:保存 Nginx 的配置文件,便于恢复或迁移。

通过合理配置和优化,您的 Flask 应用将在生产环境中高效、安全地运行,提供可靠的服务。

相关文章:

生产环境中安装和配置 Nginx 以部署 Flask 应用的详细指南

在生产环境中部署 Flask 应用时,Nginx 常被用作反向代理服务器,与 WSGI 服务器(如 Gunicorn)协同工作。Nginx 可以处理静态文件、提供 SSL/TLS 加密、实现负载均衡等功能。本文将详细介绍如何在 Ubuntu/Debian 系统上安装 Nginx&a…...

Axure高保真LayUI框架 V2.6.8元件库

点击下载《Axure高保真LayUI框架 V2.6.8元件库》 原型效果:https://axhub.im/ax9/bf36e6dd89bc4c9f/#g1 摘要 本文详细阐述了在 Axure 环境下打造的一套高度还原 LayUI 框架的组件元件集。通过对 LayUI 框架组件的深入剖析,结合 Axure 的强大功能&…...

通讯录实现(Linux+Cpp)

通讯录实现(LinuxCpp) 产品底层思考: 人员如何存储 -> 链表 (增删改 但是排序不适合) 文件存储 -> 人员数据的格式 name:xxx,phone:xxx 人员信息 -> 姓名、电话 引出2 name: xxx,phone: xxx,age: xxx,addr…...

K8S主机漏洞扫描时检测到kube-服务目标SSL证书已过期漏洞的一种永久性修复方法

1、背景 PaaS平台102xx、102xx端口检测到目标SSL证书已过期漏洞,分别对应kube-controller-manager证书、kube-scheduler证书。 2、系统版本 1.0、2.0版本均涉及。 k8s 1.19、1.23版本均涉及。 3、故障现象 PaaS平台部署1年以后,在主机漏洞扫描时&a…...

质检 LIMS 系统数据防护指南 三级等保认证与金融级加密方案设计

面对频发的数据泄露事件,企业亟需构建一套 “防得住、追得回、打得赢” 的防护体系。质检 LIMS 系统通过三级等保认证与金融级加密的结合,为这一目标提供了可行路径。 一、金融级加密:构建数据防护的 “铜墙铁壁” 金融级加密技术通过协议加密…...

Spring Boot 从Socket 到Netty网络编程(上):SOCKET 基本开发(BIO)与改进(NIO)

前言 无论是软件还是硬件的本质都是要解决IO问题(输入、输出),再说回网络编程本质上都是基于TCP/UP的开发,socket是在此基础上做的扩展与封装,而Netty又是对socket做的封装。本文旨在通过相关案例对socket进行探讨。 一…...

79. Word Search

题目描述 79. Word Search 回溯 代码一&#xff0c;使用used数组 class Solution {vector<pair<int,int>> directions{{0,1},{0,-1},{1,0},{-1,0}};vector<vector<bool>> used; public:bool exist(vector<vector<char>>& board, st…...

结构性设计模式之Facade(外观)设计模式

结构性设计模式之Facade&#xff08;外观&#xff09;设计模式 前言&#xff1a; 外观模式&#xff1a;用自己的话理解就是用户看到是一个总体页面&#xff0c;比如xx报名系统页面。里面有历年真题模块、报名模块、教程模块、首页模块… 做了一个各个模块的合并&#xff0c;对…...

ICML 2025 Spotlight | 机器人界的「Sora」!让机器人实时进行未来预测和动作执行!

标题&#xff1a;Video Prediction Policy: A Generalist Robot Policy with Predictive Visual Representations 作者&#xff1a;Yucheng Hu, Yanjiang Guo, Pengchao Wang, Xiaoyu Chen, Yen-Jen Wang, Jianke Zhang, Koushil Sreenath, Chaochao Lu, Jianyu Chen 机构&am…...

CSP严格模式返回不存在的爬虫相关文件

文章目录 说明示例&#xff08;返回404&#xff09;示例&#xff08;创建CSP例外&#xff09; 说明 日期&#xff1a;2025年6月4日。 CSP严格模式是default-src none&#xff0c;但有些web应用中&#xff0c;在爬虫相关文件不存在的情况下&#xff0c;依旧返回了对应文件&…...

https(SSL)证书危机和可行的解决方案

证书危机 20250411,CAB 论坛服务器证书工作组&#xff08; SCWG &#xff09;投票通过一项重大提案《 SC-081v3: 引入缩短有效期和数据重复使用期的时间表》&#xff0c;最终决定&#xff1a;从 2026 年起 SSL/TLS 证书的最大有效期将从 398 天逐步缩短至 47 天&#xff0c;并…...

C#获取磁盘容量:代码实现与应用场景解析

C#获取磁盘容量&#xff1a;代码实现与应用场景解析 在软件开发过程中&#xff0c;尤其是涉及文件存储、数据备份等功能时&#xff0c;获取磁盘容量信息是常见的需求。通过获取磁盘的可用空间和总大小&#xff0c;程序可以更好地进行资源管理、预警提示等操作。在 C# 语言中&a…...

2359. 找到离给定两个节点最近的节点

2359. 找到离给定两个节点最近的节点 题目链接&#xff1a;2359. 找到离给定两个节点最近的节点 代码如下&#xff1a; class Solution { public:int closestMeetingNode(vector<int>& edges, int node1, int node2) {auto calc_dis [&](int x) {vector<in…...

前端导入Excel表格

前端如何在 Vue 3 中导入 Excel 文件&#xff08;.xls 和 .xlsx&#xff09;&#xff1f; 在日常开发中&#xff0c;我们经常需要处理 Excel 文件&#xff0c;比如导入数据表格、分析数据等。文章将在 Vue 3 中实现导入 .xls 和 .xlsx 格式的文件&#xff0c;并解析其中的数据…...

AI生态警报:MCP协议风险与应对指南(下)——MCP Host安全

AI生态警报&#xff1a;MCP协议风险与应对指南&#xff08;上&#xff09;——架构与供应链风险https://blog.csdn.net/WangsuSecurity/article/details/148335401?sharetypeblogdetail&sharerId148335401&sharereferPC&sharesourceWangsuSecurity&spm1011.24…...

基于VLC的Unity视频播放器(四)

上篇文章中提到的问题 播放某个m3u8地址时会嘎掉&#xff0c;想办法解决了一下&#xff0c;很粗暴的&#xff0c;先SetFormat&#xff0c;再Stop&#xff0c;最后再Play&#xff0c;能用…… if (player ! null && player.GetSize() 0) {player.GetSize((w, h) >…...

pixel刷入Android15 userdebug版本

最近入手一个pixel7,想着刷个userdebug版本&#xff0c;就不用模拟器调试开发了&#xff0c;结果按照网上的教程&#xff0c;每次刷机后都是卡在goole logo界面&#xff0c;卡了一天多我才找到问题所在&#xff0c;想着记录下&#xff0c;给自己做个备份。 1. 前期准备&#x…...

【Go-补充】ioReader + ioWriter + bufio

一、io.Reader 和 io.Writer 接口介绍 在 Go 语言中&#xff0c;io 包定义了两个最基础和最重要的接口&#xff1a;io.Reader 和 io.Writer。它们是 Go 语言中进行输入/输出操作的核心抽象&#xff0c;实现了极大的灵活性和可组合性。 io.Reader 接口 io.Reader 接口定义了一…...

leetcode 3403. 从盒子中找出字典序最大的字符串 I 中等

给你一个字符串 word 和一个整数 numFriends。 Alice 正在为她的 numFriends 位朋友组织一个游戏。游戏分为多个回合&#xff0c;在每一回合中&#xff1a; word 被分割成 numFriends 个 非空 字符串&#xff0c;且该分割方式与之前的任意回合所采用的都 不完全相同 。所有分…...

C# 一个解决方案放一个dll项目,一个dll测试项目 ,调试dll项目的源码

一个解决方案&#xff08;sln&#xff09;中放入2个项目(project&#xff0c;通常是一个文件夹)&#xff0c;一个dll项目&#xff0c;一个dll测试项目 右键dll测试项目&#xff0c;设为启动项目。 在dll测试项目添加引用 1&#xff09;右键测试项目 → 添加 → 引用 → 项目…...

【PmHub面试篇】PmHub 整合 TransmittableThreadLocal(TTL)缓存用户数据面试专题解析

你好&#xff0c;欢迎来到本次关于PmHub整合TransmittableThreadLocal (TTL)缓存用户数据的面试系列分享。在这篇文章中&#xff0c;我们将深入探讨这一技术领域的相关面试题预测。若想对相关内容有更透彻的理解&#xff0c;强烈推荐参考之前发布的博文&#xff1a;【PmHub后端…...

unity随机生成未知符号教程

目录 前言方法1方法2脚本后言示例代码 前言 在某些游戏中&#xff0c;有一些让人感到意味不明的未知符号&#xff0c;例如在游戏《巴别塔圣歌》中&#xff0c;就有这样一些能让人在初次就看不懂的未知符号。 或者在其他时候&#xff0c;这些未知符号如果跟粒子系统结合在一起的…...

基于RK3576+FPGA+AI工业控制器的工地防护检测装备解决方案

1.2.1 工地防护检测技术研究现状 在建筑施工的过程中&#xff0c;工人被要求暴露在危险的环境中作业 [2]。因此&#xff0c;防护装备 对于工人的安全与健康具有非常重要的意义[3]。工地工人必须佩戴适当的防护装备&#xff0c; 以降低意外伤害的风险。在过去的几十年里&#x…...

推荐一款PDF压缩的工具

今天一位小伙伴找来&#xff0c;问我有没有办法将PDF变小的办法。 详细了解了一下使用场景&#xff1a; 小伙伴要在某系统上传一个PDF文件&#xff0c;原文件是11.6MB&#xff0c;但是上传时系统做了限制&#xff0c;只能上传小于10MB的文件&#xff0c;如图&#xff1a; 我听…...

混沌映射(Chaotic Map)

一.定义 混沌映射是指一类具有混沌行为的离散时间非线性动力系统&#xff0c;通常由递推公式定义。其数学形式为 &#xff0c;其中 f 是非线性函数&#xff0c;θ 为参数。它们以简单的数学规则生成复杂的、看似随机的轨迹&#xff0c;是非线性动力学和混沌理论的重要研究对象…...

MySQL对数据库用户的操作

注&#xff1a;‘%’&#xff1a;表示允许远程连接&#xff0c;‘localhost’ &#xff1a;限制本地登陆 – 根据用户名、权限查询用户 SELECT USER FROM mysql.user WHERE USER‘your_name’ AND HOST‘%’; – 彻底删除用户 DROP USER ‘appuser’‘%’; – 刷新使其生效 FL…...

《PyTorch Hub:解锁深度学习模型的百宝箱》

走进 PyTorch Hub 在当今的深度学习领域,模型的复用和共享已成为推动技术飞速发展的关键力量。随着深度学习在计算机视觉、自然语言处理、语音识别等众多领域取得突破性进展,研究人员和开发者们不断探索更高效、更强大的模型架构。然而,从头开始训练一个深度学习模型往往需要…...

数据结构 堆与优先级队列

文章目录 &#x1f4d5;1. 堆(Heap)✏️1.1 堆的概念✏️1.2 堆的存储方式✏️1.3 堆的创建✏️1.4 堆的插入✏️1.5 堆的删除 &#x1f4d5;2. 优先级队列(PriorityQueue)✏️2.1 堆与优先级队列的关系✏️2.2 优先级队列的构造方法✏️2.3 优先级队列的常用方法 3. Java对象的…...

Leetcode 3569. Maximize Count of Distinct Primes After Split

Leetcode 3569. Maximize Count of Distinct Primes After Split 1. 解题思路2. 代码实现 题目链接&#xff1a;3569. Maximize Count of Distinct Primes After Split 1. 解题思路 这一题的话思路倒是还好&#xff0c;显然&#xff0c;要找出所有distinct的质数的切分&…...

用好 ImageFX,解锁游戏素材生成新姿势:从入门到进阶

用好 ImageFX&#xff0c;解锁游戏素材生成新姿势&#xff1a;从入门到进阶 (备注)大陆ip无法访问到imagefx 地址:https://labs.google/fx/zh/tools/image-fx 对于独立游戏开发者和小型团队而言&#xff0c;美术资源往往是项目推进中的一大痛点。预算有限、专业美术人员缺乏…...