概述
本章,您将了解到如何将 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 服务器
**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;
}
}
}
版权声明:「自由转载-保持署名-非商业性使用-禁止演绎 3.0 国际」(CC BY-NC-ND 3.0)
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论










