配置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.tpcf.cn/diannao/56301.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;并…