Nginx集成篇02—与Python集成

概述

本章,您将了解到如何将 Nginx 与 Python 关联在一起,构建高性能、可扩展的动态网站。

工作原理

Nginx 作为反向代理的代理服务器,而 Python 语言编写的应用程序(如 Flask、Django、FastAPI 等)运行在后端的 WSGI/ASGI 服务器(如 Gunicorn、Uvicorn)上。

这里需要说明下 Python 应用程序(或框架)和 WSGI/ASGI 服务器之间的关系:

  • Python 应用程序(或框架) - 这是开发者编写的代码部分,这些应用程序并不直接监听网络端口,也不处理 TCP/IP 连接。Python 应用程序遵循 WSGI 或 ASGI 规范,会暴露出一个标准的 "入口函数" 或 "可调用对象"
  • WSGI/ASGI 服务器 - 运行在 Python 解释器之上的服务进程,负责处理网络通信、并发管理和请求分发。WSGI/ASGI 服务器会将请求转换为 Python 对象,并调用 Python 应用程序的 "入口函数" 或 "可调用对象" ,将返回结果转换回 HTTP 响应发送给客户端

聪明的你应该知道了,这就是标准的解耦操作,Python 应用程序负责实际的业务逻辑,但 WSGI/ASGI 服务器则负责解析协议、网络通信、请求调度相关的内容。

WSGI/ASGI 的双重含义
**WSGI/ASGI 协议标准**:指 Web Server Gateway Interface (WSGI) 或 Asynchronous Server Gateway Interface (ASGI) 规范,定义了服务器与应用之间的接口标准。
**WSGI/ASGI 服务器**:指代遵循 WSGI/ASGI 协议标准的服务器软件,如 Gunicorn 是 WSGI 服务器,Uvicorn 是 ASGI 服务器
⏳

正在加载 Flowchart 图表...

环境说明

环境说明如下:

角色 IP 地址 OS 安装方式 版本
Web 服务器(Nginx) 192.168.100.20/24 RL 8.10 源码编译安装 1.31.5
编程语言(Python) 192.168.100.21/24 RL 10.2 存储库 3.12.15

Python 和 Uvicorn

安装 Python 和 Uvicorn

上一篇 php 采用的是源码编译安装的方式,本次安装 Python 采用从存储库安装的方式。

# 执行以下命令安装 Python
Shell > dnf5 -y install python

# RL 10.2 中的 Python 版本为 3.12.15
Shell > python --version
Python 3.12.15

# 安装 Python 的软件包管理工具 python3-pip
Shell > dnf5 -y install python3-pip

# 利用 Python 的虚拟环境安装 Uvicorn 和 Fastapi
## 创建虚拟环境
Shell > cd /root/ && mkdir myvenv && cd myvenv && python -m venv /root/myvenv/
## 激活虚拟环境,激活成功后注意终端提示符的最左边会有 "((myvenv) ) "
Shell > source /root/myvenv/bin/activate
## 安装 Uvicorn 和 Fastapi
((myvenv) )  Shell > pip3 install uvicorn fastapi

# 创建一个简单的 Python Web 应用程序
((myvenv) )  Shell > vim /root/application.py
from fastapi import FastAPI

app = FastAPI(title="Hello World App")

@app.get("/")
async def root():
    return {"message": "Hello! World"}

# 开发测试专用
if __name__ == "__main__":
    import uvicorn
    # 使用 uvicorn 运行应用,支持热重载
    uvicorn.run("application:app", host="192.168.100.21", port=8000, reload=True)

# 运行应用程序之后,界面会处于持续监控的前台状态,若要退出这种状态,需要按 ctrl + c
## 更加推荐的做法是放入后台,如 "python /root/application.py &"
((myvenv) )  Shell > python /root/application.py
INFO:     Will watch for changes in these directories: ['/root']
INFO:     Uvicorn running on http://192.168.100.21:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [2112] using StatReload
INFO:     Started server process [2114]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

# 要退出 Python 虚拟环境,键入 deactivate 命令即可

代码说明如下:

  • 使用 FastAPI 框架定义了一个根路由 /,返回 JSON 格式的 "Hello! World" 消息
  • 在代码内容的底部集成了 uvicorn.run(),允许直接通过 python application.py 启动服务,无需额外输入命令行参数
友情提示
在您的 Python 项目目录中(如 /my-project/),Python 虚拟环境目录(如 /my-project/.venv/)应该与 application.py 等源代码文件(如 /my-project/application.py、/my-project/main.py 等)属于同一结构层级。

Nginx

配置 Nginx

若您的 Python 应用程序实例运行在多台机器上(或同一台机器的不同端口上),可使用 Nginx 作为反向代理的代理服务器,达到负载均衡的效果。Nginx 的配置示例如下:

...
events {
    ...
}

http {
    ...
    # 定义了名为 python_app 的一组后端服务器(未指定任何负载策略,默认使用轮询)
    upstream python_app {
        server 192.168.100.21:8000 max_fails=3 fail_timeout=30s;
        server 192.168.100.22:8000 max_fails=3 fail_timeout=30s;
        server 192.168.100.40:8000 max_fails=3 fail_timeout=30s;
    }
    ...
    # 代理缓存核心配置
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:50m inactive=1h max_size=1g use_temp_path=off;
    ...

    server {
        listen 192.168.100.20:80;
        server_name my-tests.com www.my-tests.com;
        # 重定向跳转
        return 301 https://www.my-tests.com$request_uri;
    }

    server {
        listen 192.168.100.20:443 ssl http2 backlog=8000 reuseport;
        server_name www.my-tests.com;

        # SSL/TLS 证书相关的配置
        ssl_certificate /usr/local/nginx/ssl/fullchain.pem;
        ssl_certificate_key /usr/local/nginx/ssl/my_privkey.key;
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;
        ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 15m;
        ssl_stapling on;
        ssl_stapling_verify on;
        resolver 8.8.8.8 8.8.4.4 valid=300s;
        resolver_timeout 5s;

        # 在代理层统一设置压缩响应
        gzip on;
        gzip_vary on;
        gzip_buffers 32 4K;
        gzip_comp_level 5;
        gzip_types text/plain text/css text/xml application/json application/javascript application/xml application/xhtml+xml image/svg+xml application/x-font-ttf application/x-font-opentype application/vnd.ms-fontobject font/woff;
        gzip_min_length 256;

        # 在请求转发给后端服务器之前对 HTTP 请求头进行统一设置
        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;
        proxy_set_header Accept-Encoding "";  # 禁止后端压缩

        # 连接优化相关统一设置
        proxy_connect_timeout 20s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
        proxy_next_upstream error timeout http_502 http_504;

        # 安全风险控制统一设置
        proxy_hide_header X-Powered-By;
        proxy_hide_header Server;

        location / {
            ...
            proxy_cache my_cache;
            proxy_cache_key "$scheme$host$request_uri";

            proxy_cache_valid 200 302 10m;
            proxy_cache_valid 404 1m;
            proxy_cache_valid 500 502 503 504 10s;

            proxy_cache_lock on;
            proxy_cache_lock_timeout 5s;
            proxy_cache_background_update on;
            proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;

            add_header X-Cache-Status $upstream_cache_status always;

            # 指向一组服务器
            proxy_pass http://python_app;
        }
    }
}
Avatar photo

关于 陸風睿

GNU/Linux 从业者、开源爱好者、技术钻研者,撰写文档既是兴趣也是工作内容之一。Q - "281957576";WeChat - "jiulongxiaotianci",Github - https://github.com/jimcat8
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇