文章目录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 weight3; server 192.168.1.11:5000 weight1; } 解决跨域通过将前后端置于同一域名下避免浏览器跨域限制。常用管理命令所有命令都需要在 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 - 主服务器端口5000fromflaskimportFlask,jsonify,requestimporttime appFlask(__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(port5000,debugTrue)app2.py - 备用服务器端口5001fromflaskimportFlask,jsonify,requestimporttime appFlask(__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(port5001,debugTrue)启动 Python 服务bash# 安装 Flask如果没有安装pip install flask# 分别打开两个命令行窗口启动 python app1.py # 窗口1 python app2.py # 窗口2 第二步创建静态文件index.html - 前端测试页面放在 D:\demo\nginx\html\!DOCTYPEhtmlhtmlheadmetacharsetUTF-8titleNginx 功能演示/titlestylebody{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/headbodyh1Nginx 功能演示 - 跨域解决/h1divbuttononclicktestApi()测试反向代理/buttonbuttononclickloadBalance()测试负载均衡连续点击/buttonbuttononclicktestHello()测试API/buttonbuttononclickclearResult()清空/button/divdividresultclassresult结果将显示在这里.../divscript// 注意这里请求的是 80 端口Nginx而不是直接请求 Python 的 5000/5001 端口constAPI_BASEhttp://localhost;asyncfunctiontestApi(){try{constresponseawaitfetch(${API_BASE}/api/user);constdataawaitresponse.json();showResult(✅ 反向代理成功brJSON.stringify(data,null,2));}catch(e){showResult(❌ 错误e.message,true);}}asyncfunctionloadBalance(){try{constresponseawaitfetch(${API_BASE}/api/user);constdataawaitresponse.json();// 显示响应的服务器证明请求被分发到了不同的服务器showResult( 负载均衡演示br响应服务器${data.server}br${JSON.stringify(data,null,2)});}catch(e){showResult(❌ 错误e.message,true);}}asyncfunctiontestHello(){try{constresponseawaitfetch(${API_BASE}/api/hello);constdataawaitresponse.json();showResult(✅ API 调用成功brJSON.stringify(data,null,2));}catch(e){showResult(❌ 错误e.message,true);}}functionshowResult(msg,isErrorfalse){constresultDivdocument.getElementById(result);resultDiv.innerHTMLdiv class${isError?error:success}${msg}/div;}functionclearResult(){document.getElementById(result).innerHTML结果将显示在这里...;}/script/body/html⚙️ 第三步配置 Nginx编辑 D:\demo\nginx\conf\nginx.confworker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; # 负载均衡配置定义一组后端服务器 upstream backend_servers { # 负载均衡策略轮询默认 server 127.0.0.1:5000 weight3; # weight 权重3表示分配3份流量 server 127.0.0.1:5001 weight1; # 主服务器和备用服务器的流量比例 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.htmlNginx 直接返回静态文件不经过 Python反向代理点击测试反向代理按钮前端请求http://localhost/api/userNginx 接收请求转发给后端的 Python 服务前端不知道后端的具体地址隐藏了5000端口负载均衡连续点击测试负载均衡按钮观察返回结果中server字段的变化应该能看到请求在主服务器5000和备用服务器5001之间分配权重比例是 3:1主服务器出现的概率更高解决跨域通常前端在 80 端口后端在 5000 端口浏览器会阻止跨域请求通过 Nginx 代理后前后端都在同一个域名端口localhost:80下跨域问题自然解决无需配置 CORS总结Nginx 凭借其高性能、低资源消耗、稳定性强的特点已成为互联网基础设施的核心组成部分。从静态托管到负载均衡从跨域解决到网关代理从单机部署到 K8s 集群它是每个开发者都应该掌握的高性能神器。
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 weight3; server 192.168.1.11:5000 weight1; } 解决跨域通过将前后端置于同一域名下避免浏览器跨域限制。常用管理命令所有命令都需要在 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 - 主服务器端口5000fromflaskimportFlask,jsonify,requestimporttime appFlask(__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(port5000,debugTrue)app2.py - 备用服务器端口5001fromflaskimportFlask,jsonify,requestimporttime appFlask(__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(port5001,debugTrue)启动 Python 服务bash# 安装 Flask如果没有安装pip install flask# 分别打开两个命令行窗口启动 python app1.py # 窗口1 python app2.py # 窗口2 第二步创建静态文件index.html - 前端测试页面放在 D:\demo\nginx\html\!DOCTYPEhtmlhtmlheadmetacharsetUTF-8titleNginx 功能演示/titlestylebody{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/headbodyh1Nginx 功能演示 - 跨域解决/h1divbuttononclicktestApi()测试反向代理/buttonbuttononclickloadBalance()测试负载均衡连续点击/buttonbuttononclicktestHello()测试API/buttonbuttononclickclearResult()清空/button/divdividresultclassresult结果将显示在这里.../divscript// 注意这里请求的是 80 端口Nginx而不是直接请求 Python 的 5000/5001 端口constAPI_BASEhttp://localhost;asyncfunctiontestApi(){try{constresponseawaitfetch(${API_BASE}/api/user);constdataawaitresponse.json();showResult(✅ 反向代理成功brJSON.stringify(data,null,2));}catch(e){showResult(❌ 错误e.message,true);}}asyncfunctionloadBalance(){try{constresponseawaitfetch(${API_BASE}/api/user);constdataawaitresponse.json();// 显示响应的服务器证明请求被分发到了不同的服务器showResult( 负载均衡演示br响应服务器${data.server}br${JSON.stringify(data,null,2)});}catch(e){showResult(❌ 错误e.message,true);}}asyncfunctiontestHello(){try{constresponseawaitfetch(${API_BASE}/api/hello);constdataawaitresponse.json();showResult(✅ API 调用成功brJSON.stringify(data,null,2));}catch(e){showResult(❌ 错误e.message,true);}}functionshowResult(msg,isErrorfalse){constresultDivdocument.getElementById(result);resultDiv.innerHTMLdiv class${isError?error:success}${msg}/div;}functionclearResult(){document.getElementById(result).innerHTML结果将显示在这里...;}/script/body/html⚙️ 第三步配置 Nginx编辑 D:\demo\nginx\conf\nginx.confworker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; # 负载均衡配置定义一组后端服务器 upstream backend_servers { # 负载均衡策略轮询默认 server 127.0.0.1:5000 weight3; # weight 权重3表示分配3份流量 server 127.0.0.1:5001 weight1; # 主服务器和备用服务器的流量比例 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.htmlNginx 直接返回静态文件不经过 Python反向代理点击测试反向代理按钮前端请求http://localhost/api/userNginx 接收请求转发给后端的 Python 服务前端不知道后端的具体地址隐藏了5000端口负载均衡连续点击测试负载均衡按钮观察返回结果中server字段的变化应该能看到请求在主服务器5000和备用服务器5001之间分配权重比例是 3:1主服务器出现的概率更高解决跨域通常前端在 80 端口后端在 5000 端口浏览器会阻止跨域请求通过 Nginx 代理后前后端都在同一个域名端口localhost:80下跨域问题自然解决无需配置 CORS总结Nginx 凭借其高性能、低资源消耗、稳定性强的特点已成为互联网基础设施的核心组成部分。从静态托管到负载均衡从跨域解决到网关代理从单机部署到 K8s 集群它是每个开发者都应该掌握的高性能神器。