Nginx如何实现反向代理和负载均衡器等功能的
一、反向代理(Reverse Proxy)
📖 概念
正向代理:客户端 → 代理 → 目标服务器(如 VPN、科学上网代理)。
反向代理:客户端 → Nginx(代理) → 多个后端服务器(客户端不知道后端的真实地址)。
Nginx 就是常用的反向代理工具。
📂 配置示例
server {listen 80; # 监听80端口server_name mysite.com; # 域名location / {proxy_pass http://127.0.0.1:3000; # 把请求转发到本地3000端口(Node.js)# 可选:保持用户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;}
}
👉 这样,访问 http://mysite.com/ 时,实际上是 Nginx 把请求转发给 http://127.0.0.1:3000。
常用于:前后端分离项目(前端 Vue/React 静态页面在 Nginx,API 请求转发到后端服务)。
二、负载均衡(Load Balancing)
当有多个后端服务时,Nginx 可以把流量分配给不同服务器,提高并发能力和可靠性。
📂 配置示例
http {upstream backend_servers {server 127.0.0.1:3000; # 服务1server 127.0.0.1:3001; # 服务2server 127.0.0.1:3002; # 服务3}server {listen 80;server_name mysite.com;location / {proxy_pass http://backend_servers; # 转发到上面定义的服务器组}}
}
⚖️ 负载均衡策略
Nginx 内置了几种负载均衡方式:
轮询(默认)
按顺序把请求依次分发到不同服务器。
权重(weight)
可以给服务器配置不同权重,比如:
upstream backend_servers {server 127.0.0.1:3000 weight=3;server 127.0.0.1:3001 weight=1;
}
👉 这样 3000 端口的流量是 3001 的 3 倍。
IP Hash
同一用户(IP)固定访问同一台服务器,常用于需要保持 会话状态 的场景。
upstream backend_servers {ip_hash;server 127.0.0.1:3000;server 127.0.0.1:3001;
}
最少连接(least_conn)
把请求分配给当前连接数最少的服务器(Nginx 1.3 以后支持)。
三、结合缓存和 HTTPS
缓存静态资源
location /static/ {
root /var/www/html;
expires 30d; # 缓存30天
}
配置 HTTPS + 反向代理
server {listen 443 ssl;server_name mysite.com;ssl_certificate /etc/nginx/ssl/mysite.crt;ssl_certificate_key /etc/nginx/ssl/mysite.key;location / {proxy_pass http://backend_servers;}
}
📊 总结
反向代理:隐藏后端真实地址,请求先到 Nginx,再转发给后端。
负载均衡:当有多个后端时,Nginx 把请求按策略分发,提高性能和稳定性。
缓存 + HTTPS:进一步提升性能和安全性。