Nginx学习与应用
摘要: Nginx是一款高性能的HTTP服务器和反向代理服务器,支持高并发、低内存消耗、热部署和模块化扩展。核心功能包括托管静态资源、反向代理、负载均衡、API网关和SSL终结。安装时需注意路径避免中文,通过start nginx启动服务,常用命令包括重载配置(nginx -s reload)和检查语法(nginx -t)。实战案例演示了如何结合Python后端实现反向代理与负载均衡:通过Ngin
文章目录
Nginx 简介
Nginx是一个工作在第七层(应用层)的 高性能的 HTTP 服务器和反向代理服务器,同时也可以作为邮件代理服务器和通用的 TCP/UDP 代理服务器。简单说,Nginx 就是一个能把网页快速发给用户的软件,同时也能把请求转给其他服务器处理。
核心特点
| 特点 | 说明 |
|---|---|
| 🚀 高并发 | 采用异步非阻塞事件驱动架构,单机可处理数十万并发连接 |
| 💾 低内存 | 处理大量请求时内存占用极低(几 MB 即可运行) |
| 🔧 热部署 | 可在不中断服务的情况下升级程序或重载配置 |
| 📦 模块化 | 核心功能精简,扩展功能通过模块按需加载 |
| 🔒 高可靠 | 稳定性极高,可 7×24 小时不间断运行 |
主要应用场景
| 场景 | 说明 |
|---|---|
| 静态资源服务器 | 托管 HTML、CSS、JS、图片等静态文件 |
| 反向代理 | 将客户端请求转发到后端应用服务器(如 Tomcat、Node.js、Gunicorn) |
| 负载均衡 | 将流量分发到多个后端服务器 |
| API 网关 | 请求路由、认证鉴权、限流熔断 |
| SSL 终结 | 集中处理 HTTPS 证书,减轻后端压力 |
| 缓存服务器 | 缓存后端响应,加速访问 |
场景详解
-
📁 静态资源服务器
server { listen 80; location /api/ { proxy_pass http://localhost:3000; } } -
🔄 反向代理
server { listen 80; location /api/ { proxy_pass http://localhost:3000; } } -
⚖️ 负载均衡
upstream backend { server 192.168.1.10:5000 weight=3; server 192.168.1.11:5000 weight=1; } -
🔀 解决跨域
通过将前后端置于同一域名下,避免浏览器跨域限制。
常用管理命令
所有命令都需要在 nginx.exe 文件目录中执行:
| 用途 | 命令 (在nginx目录下执行) | 说明 |
|---|---|---|
| 启动 | start nginx | 推荐使用此命令启动 |
| 快速停止 | nginx -s stop | 立即停止服务 |
| 优雅停止 | nginx -s quit | 处理完当前访问后再停止 |
| 重载配置 | nginx -s reload | 修改配置后使用,无需重启 |
| 检查配置 | nginx -t | 检查配置文件语法是否有误 |
| 查看进程 | tasklist /fi “imagename eq nginx.exe” | 查看Nginx是否在运行 |
下载与安装
在 Windows 上安装 Nginx。
第一步:下载
- 打开 Nginx 官方下载页面:https://nginx.org/en/download.html
- 在 Stable version(稳定版)区域,点击适用于 Windows 的压缩包,例如 nginx/Windows-x.xx.x 。文件是一个 .zip 格式的压缩包
第二步:安装(解压)
- 将下载好的 .zip 文件解压。
关键点:将解压后得到的 nginx-1.xx.x 文件夹,整个移动到没有中文且没有空格的纯英文路径下,例如 D:\demo\nginx 。这是为了避免程序运行时发生未知错误。
第三步:启动与验证
- 在 Nginx 目录的地址栏里(D:\demo\nginx),输入 cmd 并回车,即可在此处打开命令提示符。
- 输入 start nginx 并回车。
验证是否成功:
打开浏览器,在地址栏输入 http://localhost 或 http://127.0.0.1。
如果页面显示 “Welcome to nginx!”,就说明安装启动成功啦!
实战案例:Python + Nginx 实现反向代理与负载均衡
案例架构图:
浏览器 ──→ Nginx:80 ──┬──→ 静态文件 (HTML/CSS/JS)
├──→ Python 服务1:5000 (API服务器)
└──→ Python 服务2:5001 (备份服务器)
🚀 第一步:准备 Python 后端服务
创建两个 Python 文件来模拟不同的后端服务:
-
app1.py - 主服务器(端口5000)
from flask import Flask, jsonify, request import time app = Flask(__name__) @app.route('/api/user') def get_user(): return jsonify({ 'server': '主服务器:5000', 'user': {'id': 1, 'name': '张三'}, 'time': time.time() }) @app.route('/api/hello') def hello(): return jsonify({'message': 'Hello from 主服务器:5000'}) if __name__ == '__main__': app.run(port=5000, debug=True) -
app2.py - 备用服务器(端口5001)
from flask import Flask, jsonify, request import time app = Flask(__name__) @app.route('/api/user') def get_user(): return jsonify({ 'server': '备用服务器:5001', 'user': {'id': 2, 'name': '李四'}, 'time': time.time() }) @app.route('/api/hello') def hello(): return jsonify({'message': 'Hello from 备用服务器:5001'}) if __name__ == '__main__': app.run(port=5001, debug=True) -
启动 Python 服务
```bash
# 安装 Flask(如果没有安装)
pip install flask# 分别打开两个命令行窗口启动 python app1.py # 窗口1 python app2.py # 窗口2 ```
📁 第二步:创建静态文件
index.html - 前端测试页面(放在 D:\demo\nginx\html\)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Nginx 功能演示</title>
<style>
body { font-family: Arial; padding: 20px; }
button { margin: 10px; padding: 10px 20px; font-size: 16px; cursor: pointer; }
.result { margin: 20px; padding: 15px; border: 1px solid #ddd; background: #f9f9f9; }
.success { color: green; }
.error { color: red; }
</style>
</head>
<body>
<h1>Nginx 功能演示 - 跨域解决</h1>
<div>
<button onclick="testApi()">测试反向代理</button>
<button onclick="loadBalance()">测试负载均衡(连续点击)</button>
<button onclick="testHello()">测试API</button>
<button onclick="clearResult()">清空</button>
</div>
<div id="result" class="result">
结果将显示在这里...
</div>
<script>
// 注意:这里请求的是 80 端口(Nginx),而不是直接请求 Python 的 5000/5001 端口
const API_BASE = 'http://localhost';
async function testApi() {
try {
const response = await fetch(`${API_BASE}/api/user`);
const data = await response.json();
showResult('✅ 反向代理成功!<br>' + JSON.stringify(data, null, 2));
} catch(e) {
showResult('❌ 错误:' + e.message, true);
}
}
async function loadBalance() {
try {
const response = await fetch(`${API_BASE}/api/user`);
const data = await response.json();
// 显示响应的服务器,证明请求被分发到了不同的服务器
showResult(`🔄 负载均衡演示<br>响应服务器:${data.server}<br>${JSON.stringify(data, null, 2)}`);
} catch(e) {
showResult('❌ 错误:' + e.message, true);
}
}
async function testHello() {
try {
const response = await fetch(`${API_BASE}/api/hello`);
const data = await response.json();
showResult('✅ API 调用成功<br>' + JSON.stringify(data, null, 2));
} catch(e) {
showResult('❌ 错误:' + e.message, true);
}
}
function showResult(msg, isError = false) {
const resultDiv = document.getElementById('result');
resultDiv.innerHTML = `<div class="${isError ? 'error' : 'success'}">${msg}</div>`;
}
function clearResult() {
document.getElementById('result').innerHTML = '结果将显示在这里...';
}
</script>
</body>
</html>
⚙️ 第三步:配置 Nginx
编辑 D:\demo\nginx\conf\nginx.conf:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
# 负载均衡配置:定义一组后端服务器
upstream backend_servers {
# 负载均衡策略:轮询(默认)
server 127.0.0.1:5000 weight=3; # weight 权重,3表示分配3份流量
server 127.0.0.1:5001 weight=1; # 主服务器和备用服务器的流量比例 3:1
# 其他策略示例(可以取消注释测试):
# ip_hash; # 同一IP固定到同一台服务器
# least_conn; # 最少连接数
}
server {
listen 80;
server_name localhost;
# 1. 静态文件服务器:直接返回 HTML/CSS/JS
location / {
root html; # 对应 C:\nginx\html 目录
index index.html index.htm;
}
# 2. 反向代理 + 负载均衡:将 /api/ 开头的请求代理到后端服务器组
location /api/ {
proxy_pass http://backend_servers; # 转发到 upstream 定义的服务器组
# 设置代理请求头,让后端能获取真实IP
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_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
}
# 3. 解决跨域的配置(可选,如果前后端分离时使用)
# 如果前端是 http://localhost,后端在其他端口,浏览器会报跨域错误
# 通过 Nginx 代理后,同源策略自动解决
# 显示后端状态(可选)
location /nginx_status {
stub_status;
allow 127.0.0.1;
deny all;
}
}
}
🔧 第四步:运行验证
# 1. 确保 Python 服务已启动(两个窗口)
# 窗口1: python app1.py
# 窗口2: python app2.py
# 2. 进入 Nginx 目录测试配置
nginx -t # 检查配置是否正确
# 3. 启动或重载 Nginx
start nginx # 如果未启动
# 或
nginx -s reload # 如果已启动
# 4. 打开浏览器访问
http://localhost
🎯 演示效果说明
- HTTP 静态服务器
- 访问
http://localhost会自动返回html/index.html - Nginx 直接返回静态文件,不经过 Python
- 访问
- 反向代理
- 点击"测试反向代理"按钮
- 前端请求
http://localhost/api/user - Nginx 接收请求,转发给后端的 Python 服务
- 前端不知道后端的具体地址(隐藏了5000端口)
- 负载均衡
- 连续点击"测试负载均衡"按钮
- 观察返回结果中
server字段的变化 - 应该能看到请求在主服务器(5000)和备用服务器(5001)之间分配
- 权重比例是 3:1,主服务器出现的概率更高
- 解决跨域
- 通常前端在 80 端口,后端在 5000 端口,浏览器会阻止跨域请求
- 通过 Nginx 代理后,前后端都在同一个域名端口(localhost:80)下
- 跨域问题自然解决,无需配置 CORS
总结
Nginx 凭借其高性能、低资源消耗、稳定性强的特点,已成为互联网基础设施的核心组成部分。从静态托管到负载均衡,从跨域解决到网关代理,从单机部署到 K8s 集群,它是每个开发者都应该掌握的高性能神器。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)