Nginx学习与应用
文章目录
- Nginx 简介
- 核心特点
- 主要应用场景
- 场景详解
- 常用管理命令
- 下载与安装
- 第一步:下载
- 第二步:安装(解压)
- 第三步:启动与验证
- 实战案例:Python + Nginx 实现反向代理与负载均衡
- 🚀 第一步:准备 Python 后端服务
- 📁 第二步:创建静态文件
- ⚙️ 第三步:配置 Nginx
- 🔧 第四步:运行验证
- 总结
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)
fromflaskimportFlask,jsonify,requestimporttime app=Flask(__name__)@app.route('/api/user')defget_user():returnjsonify({'server':'主服务器:5000','user':{'id':1,'name':'张三'},'time':time.time()})@app.route('/api/hello')defhello():returnjsonify({'message':'Hello from 主服务器:5000'})if__name__=='__main__':app.run(port=5000,debug=True)app2.py - 备用服务器(端口5001)
fromflaskimportFlask,jsonify,requestimporttime app=Flask(__name__)@app.route('/api/user')defget_user():returnjsonify({'server':'备用服务器:5001','user':{'id':2,'name':'李四'},'time':time.time()})@app.route('/api/hello')defhello():returnjsonify({'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\)
<!DOCTYPEhtml><html><head><metacharset="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><buttononclick="testApi()">测试反向代理</button><buttononclick="loadBalance()">测试负载均衡(连续点击)</button><buttononclick="testHello()">测试API</button><buttononclick="clearResult()">清空</button></div><divid="result"class="result">结果将显示在这里...</div><script>// 注意:这里请求的是 80 端口(Nginx),而不是直接请求 Python 的 5000/5001 端口constAPI_BASE='http://localhost';asyncfunctiontestApi(){try{constresponse=awaitfetch(`${API_BASE}/api/user`);constdata=awaitresponse.json();showResult('✅ 反向代理成功!<br>'+JSON.stringify(data,null,2));}catch(e){showResult('❌ 错误:'+e.message,true);}}asyncfunctionloadBalance(){try{constresponse=awaitfetch(`${API_BASE}/api/user`);constdata=awaitresponse.json();// 显示响应的服务器,证明请求被分发到了不同的服务器showResult(`🔄 负载均衡演示<br>响应服务器:${data.server}<br>${JSON.stringify(data,null,2)}`);}catch(e){showResult('❌ 错误:'+e.message,true);}}asyncfunctiontestHello(){try{constresponse=awaitfetch(`${API_BASE}/api/hello`);constdata=awaitresponse.json();showResult('✅ API 调用成功<br>'+JSON.stringify(data,null,2));}catch(e){showResult('❌ 错误:'+e.message,true);}}functionshowResult(msg,isError=false){constresultDiv=document.getElementById('result');resultDiv.innerHTML=`<div class="${isError?'error':'success'}">${msg}</div>`;}functionclearResult(){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. 启动或重载 Nginxstart nginx# 如果未启动# 或nginx-sreload# 如果已启动# 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 集群,它是每个开发者都应该掌握的高性能神器。