配置WSGI 服务器(Gunicorn)和Nginx 反向代理服务器部署Flask项目

        部署 Flask 项目涉及到多个步骤,包括环境设置、依赖管理、配置、Web 服务器配置、数据库管理等。下面是一个详细的部署指南,假设你使用的是 Linux 系统(如 Ubuntu)。

        前三个步骤教你如何在python虚拟环境下搭建项目并给出项目结构示例,如果已有项目或项目已完成,可以直接跳过。

1. 准备工作

1.1 安装必要的软件

确保你的服务器上已经安装了 Python 和 pip:

sudo apt update
sudo apt install python3 python3-pip virtualenv
1.2 创建虚拟环境

创建一个虚拟环境以隔离项目依赖:

mkdir ~/myproject
cd ~/myproject
virtualenv venv
source venv/bin/activate
1.3 安装 Flask 项目依赖

在虚拟环境中安装 Flask 以及项目所需的依赖:

pip install Flask
# 安装其他依赖,假设你有 requirements.txt 文件
pip install -r requirements.txt

2. 配置 Flask 应用

确保你的 Flask 项目结构如下:

myproject/
├── app/
│   ├── __init__.py
│   ├── views.py
│   ├── models.py
│   └── ...
├── config.py
├── run.py
├── requirements.txt
└── ...

run.py 文件内容示例:

from app import create_appapp = create_app()if __name__ == "__main__":app.run()

app/__init__.py 文件内容示例:

from flask import Flaskdef create_app():app = Flask(__name__)# 配置app.config.from_object('config')# 注册蓝图from .views import mainapp.register_blueprint(main)return app

3. 配置生产环境

3.1 配置文件

创建 config.py 文件,设置生产环境配置:

class Config:SECRET_KEY = 'my_secret_key'SQLALCHEMY_DATABASE_URI = 'mysql://user:password@localhost/dbname'SQLALCHEMY_TRACK_MODIFICATIONS = Falseclass ProductionConfig(Config):DEBUG = FalseTESTING = Falseclass DevelopmentConfig(Config):DEBUG = TrueTESTING = True

在 run.py 中设置环境:

app.config.from_object('config.ProductionConfig')

4. 部署到 Web 服务器

使用 Gunicorn 作为 WSGI 服务器来运行 Flask 应用。

        WSGI(Web Server Gateway Interface)是一种 Python 的应用程序接口,用于连接 Web 服务器(如 Apache 或 Nginx)和 Python Web 应用程序或框架。它规定了 Web 服务器与 Python 应用之间的数据交换方式,使得不同的 Web 服务器可以与不同的 Web 应用程序和框架无缝协作。

WSGI 的工作原理

  1. 请求处理

    当 Web 服务器(如 Nginx、Apache 等)接收到 HTTP 请求时,它会将请求传递给 WSGI 服务器(如 Gunicorn、uWSGI 等)。WSGI 服务器将请求处理(数据)转换为 WSGI 请求对象。
  2. 应用程序调用

    WSGI 服务器调用 Python Web 应用程序(如 Flask、Django 等),将 WSGI 请求对象作为参数传入。应用程序处理请求并生成响应。
  3. 响应返回

    应用程序将响应数据返回给 WSGI 服务器。WSGI 服务器将响应数据封装成 HTTP 响应,并发送回原始的 Web 服务器。
  4. 最终发送响应

    最后,Web 服务器将响应返回给客户端(如浏览器)。

4.1 安装 Gunicorn
pip install gunicorn
4.2 运行 Gunicorn
gunicorn --workers 3 run:app

常用 WSGI 服务器

  1. Gunicorn

    一个轻量级 Python WSGI 服务器,特别适用于基于多进程的应用程序。它非常容易使用且性能优越。
  2. uWSGI

    一个功能丰富的 WSGI 服务器,支持多种协议和功能,包括管理多进程和线程,支持各种插件和扩展。
  3. Daphne

    主要用于支持 ASGI(异步服务器网关接口)应用的服务器,但也可以运行 WSGI 应用。
  4. Flask 自带的服务器

    Flask 的内置开发服务器可以用于开发和调试,但不适用于生产环境。

WSGI 的特点和优点

  • 中立性:WSGI 是一个标准接口,不依赖于特定的 Web 服务器或框架,允许开发者自由选择最适合其应用的服务器和框架。
  • 可扩展性:可以轻松添加其他中间件或服务,如身份验证、日志记录、数据缓存等。
  • 异步处理:尽管 WSGI 本身是同步的,但一些 WSGI 服务器(如 Gunicorn)支持使用多个工作进程处理请求,从而提高并发处理能力。
  • 标准化:WSGI 是 Python 社区的一个官方标准,帮助开发者维护更好的代码结构和更容易的部署过程。

5. 配置 Nginx

        Nginx 可以作为反向代理服务器,将客户端请求转发到后端的一个或多个服务器(如应用服务器),并将响应返回给客户端。这种配置可以提高安全性和效率。

即使只有一个后端服务器,使用 Nginx 仍然有很多优点,以下是一些主要原因:

静态文件服务

Nginx 在提供静态文件(如 HTML、CSS、JavaScript、图片等)方面非常高效。如果你的应用有一些静态内容,配置 Nginx 来处理这些静态文件,可以减轻后端服务器的负担,提高整体性能。

SSL/TLS 终止

Nginx 可以作为 SSL/TLS 终止代理,使得后端服务器不需要处理加密和解密。这不仅可以简化后端服务器的配置,还可以提高性能,因为加密解密操作相对来说比较消耗资源。

负载均衡

虽然你当前只有一个后端服务器,但随着业务的发展,你可能需要扩展到多个服务器。Nginx 提供了灵活的负载均衡配置,使得你在需要时可以轻松扩展。即使现在只有一个服务器,提前配置好 Nginx,以后扩展会更加方便。

缓存

Nginx 可以缓存后端服务器的响应,减少对后端服务器的请求次数,从而提高响应速度和节省服务器资源。这对于用户访问频繁的资源尤其有用。

反向代理

Nginx 作为反向代理服务器,可以隐藏真实的服务器地址,提供更高的安全性。它还可以处理诸如 SSL 配置、请求头重写、URL 重定向等功能,使得后端服务器的配置更加简单和集中。

热部署和无缝升级

Nginx 可以配置为处理动态内容的请求,使得在进行应用部署或更新时,不会中断用户请求。这对于确保服务的高可用性非常重要。

日志记录和监控

Nginx 提供了详细的日志记录功能,可以帮助你分析流量、识别问题和优化性能。这对于日常的运维和监控非常有用。

性能优化

Nginx 的设计初衷就是为了处理大量并发请求,它的异步非阻塞I/O模型使得它在高并发环境下性能卓越。即使只有一个后端服务器,Nginx 也能帮助你更好地利用服务器资源,提高响应速度。

5.1 安装 Nginx

sudo apt install nginx

5.2 配置 Nginx

创建一个新的 Nginx 配置文件:

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

内容如下:

server {listen 80;server_name yourdomain.com;location / {proxy_pass http://127.0.0.1:8000;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/static/files;}
}
  • location /static: 这是一个 location 块,当用户请求以 /static 开头的 URL 时,该块中的配置将被应用。比如,当用户请求的 URL 是 http://example.com/static/image.png 时,就会匹配到这个块。
  • alias /path/to/your/static/files;: 这行指定了 Nginx 到哪里去查找对应的静态文件。假设 /path/to/your/static/files 是服务器上的实际目录路径,Nginx 会直接从这个目录中获取请求的文件并返回。例如,如果请求的 URL 是 /static/image.png,Nginx 会在本地查找 /path/to/your/static/files/image.png
  • location /: 这个 location 块指当请求未被其他块处理时,所有不以 /static 开头的请求都将匹配到这里。这通常用于处理动态内容的请求,转发给后端服务器。

  • proxy_pass http://127.0.0.1:8000;: 这行指示 Nginx 将请求转发到运行在本地(即服务器自己)IP 地址为 127.0.0.1,端口为 8000 的后端服务器。这里,8000 通常是一个运行 Python Web 应用(如 Flask 或 Django)的服务器的端口。

  • proxy_set_header: 这几行是设置在转发请求时,Nginx 需要附加的一些 HTTP 头部信息,具体含义如下:

    • Host $host;: 将原始请求中的 Host 头部传递给后端服务器,通常是用户请求时的主机名。
    • X-Real-IP $remote_addr;: 将请求的真实客户端 IP 地址传递给后端服务器,这样后端可以获取客户的真实 IP 而不是 Nginx 的 IP。
    • X-Forwarded-For $proxy_add_x_forwarded_for;: 这行用于传递客户端的 IP 地址链,允许后端服务器了解经由 Nginx 中转的所有客户端的 IP 地址。
    • X-Forwarded-Proto $scheme;: 将请求的协议(HTTP 或 HTTPS)传递给后端服务器,以便后端应用可以根据这一信息做出不同的响应。

启用配置并重启 Nginx:

sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled
sudo nginx -t
sudo systemctl restart nginx

6. 使用 systemd 管理服务

创建一个 systemd 服务文件来管理 Gunicorn:

sudo nano /etc/systemd/system/myproject.service

内容如下:

[Unit]
Description=Gunicorn instance to serve myproject
After=network.target[Service]
User=yourusername
Group=www-data
WorkingDirectory=/home/yourusername/myproject
ExecStart=/home/yourusername/myproject/venv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 run:app[Install]
WantedBy=multi-user.target
  • [Unit]: 这是 systemd 单元文件的第一部分,用于定义单元的一般信息。
  • Description=Gunicorn instance to serve myproject: 描述了这个单元的作用,即使用 Gunicorn 运行你的项目。
  • After=network.target: 表明这个服务应该在网络服务启动之后启动。这样可以确保 Gunicorn 在网络可用时才开始启动。
  • [Service]: 这是定义服务行为的节。
  • User=yourusername: 指定运行 Gunicorn 服务的用户。这样 Gunicorn 将以指定用户的权限运行。
  • Group=www-data: 指定运行 Gunicorn 服务的用户组。www-data 是一个常见的用于 Web 服务的用户组。
  • WorkingDirectory=/home/yourusername/myproject: 指定 Gunicorn 的工作目录,即应用所在的目录。
  • ExecStart=/home/yourusername/myproject/venv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 run:app: 这是启动命令。具体解释如下:
    • /home/yourusername/myproject/venv/bin/gunicorn: 这是 Gunicorn 可执行文件的路径,通常在虚拟环境中。
    • --workers 3: 启动 3 个 Gunicorn 工作进程来处理请求。
    • --bind unix:myproject.sock: 将 Gunicorn 绑定到一个 Unix 域套接字文件 myproject.sock,而不是 TCP 端口。Unix 域套接字通常比 TCP 端口更快,并且更安全。
    • -m 007: 设置 myproject.sock 文件的权限模式为 007,即所有者和组有读写权限,其他用户只有读权限。
    • run:app: 指定应用的入口点,这里的 run 是指应用程序的主文件(通常是 run.py),app 是应用程序实例(通常是 Flask 或 Django 应用实例)。
  • [Install]: 这是安装节,定义了如何启用服务。
  • WantedBy=multi-user.target: 表明这个服务应该在 multi-user.target(即多用户目标)启动时启动。multi-user.target 是 Linux 系统进入多用户模式并准备接受用户登录时的一个目标状态。

启动并启用服务:

sudo systemctl daemon-reload  # 重新加载 systemd 配置
sudo systemctl enable myproject.service  # 启用服务,使其在系统启动时自动启动
sudo systemctl start myproject.service  # 立即启动服务

7. 测试和监控

确保所有服务都已正确启动,并在浏览器中访问 yourdomain.com 进行测试。

8. 其他考虑

  • 安全性:定期更新软件,使用 HTTPS,配置防火墙等。
  • 日志管理:配置日志记录,确保错误和访问日志可用。
  • 备份:定期备份数据库和重要文件。

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

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

相关文章

QT QML 练习8-Simple Transformations

简单的转换(Simple Transformations) 转换操作改变了一个对象的几何状态。QML元素对象通常能够被平移,旋转,缩放。下面我们将讲解这些简单的操作和一些更高级的用法。 我们先从一个简单的转换开始。用下面的场景作为我们学习的开始…

Qt- QSS风格选择器常用属性选择器样式表盒子

1. 风格设置 Qt 提供了 3 种整体风格,使用 QStyleFactory::keys() 来获取 (windowsvista 、Windows 、Fusion) 可以在 main.cpp 中调用 setStyle 方法对应用程序进行全局风格的设置 int main(int argc, char *argv[]) {QApplication a(arg…

Redis协议详解及其异步应用

目录 一、Redis Pipeline(管道)概述优点使用场景工作原理Pipeline 的基本操作步骤C 示例(使用 [hiredis](https://github.com/redis/hiredis) 库) 二、Redis 事务概述事务的前提事务特征(ACID 分析)WATCH 命…

用Python实现图片转ASCII艺术:图像处理与字符艺术的完美结合

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 ASCII艺术是一种通过字符来表现图像的艺术形式,最早用于早期计算机显示器,它仅支持字符显示。如今,尽管图像分辨率和显示技术得到了极大的提升,ASCII艺术作为一种复古而别具一格的图像表现形式,仍然受到许多…

驱动开发系列21 - 编译内核模块的Makefile解释

一:内核模块Makefile #这一行定义了要编译的内核模块目标文件。obj-m表示目标模块对象文件(.o文件), #并指定了两个模块源文件:helloworld-params.c 和 helloworld.c。最终会生成这 #这两个.c文件的.o对象文件。 obj-m := helloworld-params.o helloworld.o#这行定义了内核…

爱快路由器配置腾讯云动态域名DDNS详细说明

直白点说就是让爱快路由器自动配置当前公网IP地址给域名,动态域名DDNS不清楚的请自行百度, 这里就可以看见操作日志,那么我们一步一步来配置它吧,首先登录爱快路由器,如下图: 那么腾讯云我们怎么找到ID和…

koa知否论坛交流系统的设计与实现---附源码53933

目 录 1 绪论 1.1研究背景 1.2研究意义 1.3论文结构与章节安排 2 知否论坛交流系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4本章小…

Spring Boot环境下的大创项目质量保证系统

3系统分析 3.1可行性分析 通过对本大创管理系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本大创管理系统采用SSM框架,JAVA作为开发语言&#…

鸿蒙OS启动流程

启动流程(基于openharmony4.1) 系统上电加载内核后,按照以下流程完成系统各个服务和应用的启动: 内核加载init进程,一般在bootloader启动内核时通过设置内核的cmdline来指定init的位置。init进程启动后,会挂载tmpfs,…

宝塔PHP8.1安装fileinfo拓展失败解决办法

在宝塔面板中安装PHP8.1后,安装fileinfo扩展一直安装不上,查看日志有报错,于是手动来安装也报错。 宝塔报错: 手动命令行编译安装同,也有报错 cd /www/server/php/81/src/ext/fileinfo/ make distclean ./configure …

MongoDB初学者入门教学:与MySQL的对比理解

🏝️ 博主介绍 大家好,我是一个搬砖的农民工,很高兴认识大家 😊 ~ 👨‍🎓 个人介绍:本人是一名后端Java开发工程师,坐标北京 ~ 🎉 感谢关注 📖 一起学习 &…

Oracle 数据库中游标的入门到精通

一、游标入门知识 (一)游标是什么 在 Oracle 数据库中,游标是一种处理结果集的机制。当执行一个查询语句后,结果集可能包含多行数据。游标就像是一个指向这些数据行的指针,允许我们逐行对数据进行操作和处理&#xf…

020 elasticsearch7.10.2 elasticsearch-head kibana安装

文章目录 全文检索流程ElasticSearch介绍ElasticSearch应用场景elasticsearch安装允许远程访问设置vm.max_map_count 的值 elasticsearch-head允许跨域 kibana 商品数量超千万,数据库无法使用索引 如何使用全文检索: 使用lucene,在java中唯一…

MySQL 的数据类型

1.整数类型 1.1 tinyint tinyint 为小整数类型,存储空间为1个字节(8位),有符号范围-128 ~ 127,无符号范围 0 ~ 255,此类型通常在数据库中表示类型的字段,如某一字段 type 表示学科,其中 “type1” 表示语文…

什么是芯片正向设计和芯片反向设计?

什么是芯片反向设计?反向设计其实就是芯片反向设计,它是通过对芯片内部电路的提取与分析、整理,实现对芯片技术原理、设计思路、工艺制造、结构机制等方面的深入洞悉,可用来验证设计框架或者分析信息流在技术上的问题,…

C++学习,标准库 <functional>

C 标准库 <functional> 头文件提供了一组函数模板&#xff0c;这些模板允许使用函数对象&#xff08;function objects&#xff09;作为参数传递给算法&#xff0c;或者作为算法的返回值。函数对象是那些重载了 operator() 的对象&#xff0c;它们可以像普通函数一样被调…

004、合并两个有序数组

0、题目描述 合并两个有序数组 1、法1 数组nums1有m个元素&#xff0c; 直接在下标为m的位置处追加nums2的元素。然后再qsort整体排序。 —— —— qsort函数&#xff0c;&#xff08;数组首元素地址&#xff0c;排序的个数&#xff0c;排序元素大小&#xff0c; 比较函数&…

要创建一个带有vue的uniAPP需要具备什么资质

要创建一个带有Vue的UniApp&#xff0c;主要需要的是技术能力和相关开发经验&#xff0c;而非特定的资质证书。不过&#xff0c;从一般性的角度来看&#xff0c;以下是创建此类应用时可能需要考虑的一些方面&#xff1a; 一、技术能力 Vue.js基础&#xff1a; 熟悉Vue.js的语法…

从零实现高并发内存池

目录 1. 项目介绍1.1 这个项目具体功能是什么&#xff1f;1.2 本项目的知识储备 2. 什么是内存池2.1 池化技术2.2 内存池主要解决的问题2.3 malloc 3. 定长内存池设计4. 高并发内存池整体框架设计4.1 Thread Cache的设计思路4.2 Central Cache的设计思路4.3 Page Cache的设计思…

Vue工程化结构环境安装及搭建教程 : 之nvm

vue需要的环境&#xff1a; node.js : Node.js和Vue.js通常会一起使用。Node.js作为后端服务器&#xff0c;处理服务器端的逻辑和数据访问&#xff0c;而Vue.js则负责前端用户界面的构建和交互。通过Ajax通信&#xff0c;Vue.js应用程序向Node.js服务器发送请求&#xff0c;并…