Nginx 是一个高性能的 开源 Web 服务器、反向代理服务器 和 负载均衡器
下载地址:Nginx
打开方式:解压之后直接点击nginx.exe,在浏览器中输入: http://localhost
显示该页面即为成功。
常见的命令行操作:
tasklist /fi "imagename eq nginx.exe" # 查看正在运行的Nginx
后端开发需要了解的内容
反向代理:
修改nginx.conf文件,这里将原来的红色内容修改为下面绿色内容,将本地运行的8080端口交给nginx反向代理。
在命令行输入nginx -t 看看是否测试成功,然后进行重新加载 nginx -s reload
出现下面的内容说明代理成功,这是因为我的后端项目并没有为http:8080配置对应的接口
反向代理的流程:
![]()
为了在页面中显示正确内容,可以创建一个控制器来接收http:8080的请求,并返回给前端内容
@RestController
@RequestMapping("/")
public class NginxController {
@GetMapping("/")
public String index() {
return "这是首页内容";
}
}
刷新页面可以看到展示内容
负载均衡
负载均衡需要用到 upstream 模块。需要修改配置文件
负载均衡的策略有三种:
A. 轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器。如果后端服务器挂了,Nginx 会自动剔除。
- 适用场景: 后端服务器配置差不多。
B. 权重 (Weight)
通过weight指定轮询几率,权重越高,被访问的次数越多。
upstream my_backend_cluster {
server 127.0.0.1:8080 weight=5; # 这台机器性能好,接 5 份活
server 127.0.0.1:8081 weight=1; # 这台机器旧,接 1 份活
}
C. IP Hash (固定访问)
每个访客固定访问一个后端服务器,可以解决 Session 共享 问题。
upstream my_backend_cluster {
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
对于分布式session,需要注意,如果一个用户将session存入8080服务器,但是下一次请求被nginx分发到8081了,就会出现掉线的情况。
解决办法:
-
使用
ip_hash:让同一个 IP 的人永远访问同一台机器。 -
使用 Redis:把 Session 存入 Redis,让微服务都去 Redis 校验登录状态。
动静分离
分离后端项目中的静态资源和动态资源,然后在Nginx 配置中添加专门的 location 块处理静态资源请求。比如:
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css|js|ico)$ {
root html; # 静态资源存放路径
expires 30d; # 缓存30天
access_log off; # 关闭静态资源访问日志
}
location / {
proxy_pass http://backend;
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;
}
跨域CORS
跨域的根源是域名、协议或端口不同,如果能够统一通过 Nginx 暴露服务,直接通过反向代理就不会出现跨域问题。
如果前端和后端分别部署在不同的服务器/端口,则需要Nginx 在响应头里添加允许跨域的指令,浏览器看到这些指令后,就会放行请求。比如:
location / {
# 1. 允许的来源(* 表示所有,生产环境建议写具体域名)
add_header 'Access-Control-Allow-Origin' '$http_origin' always;
# 2. 允许的请求方法
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always;
# 3. 允许的自定义 Header(如 Token)
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always;
# 4. 允许携带 Cookie
add_header 'Access-Control-Allow-Credentials' 'true' always;
# 5. 处理浏览器的“预检”请求 (OPTIONS)
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Max-Age' 1728000; # 预检结果缓存20天
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 204; # 直接返回“无内容”,不转发给后端
}
proxy_pass http://127.0.0.1:8080;
}
Nginx 集群是为了防止“单点故障”和应对“超大规模流量”,而部署的多台 Nginx 服务器组。
限流配置 (Rate Limiting)
限流是为了防止恶意刷票、爬虫或者突发流量把后端冲垮。
Nginx 使用“漏桶算法”。
定义限流区域(在 http 块中):
```Nginx
# binary_remote_addr:按客户端 IP 限流
# zone=mylimit:10m:开辟 10MB 内存存 IP 状态
# rate=1r/s:限制每个 IP 每秒只能发 1 个请求
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
```
应用限流(在 location 块中):
location /api/ {
# burst=5:允许缓冲区排队 5 个请求(处理突发流量)
# nodelay:如果不加这个,排队的请求会很慢;加了则会立即处理,超过排队的直接 503
limit_req zone=mylimit burst=5 nodelay;
proxy_pass http://127.0.0.1:8080;
}
2. HTTPS 安全配置
-
准备工作: 你需要
.crt(证书) 和.key(私钥) 文件。 -
标准配置:
server { listen 443 ssl; # 监听 443 端口 server_name www.yourdomain.com; ssl_certificate D:/nginx/conf/ssl/server.crt; ssl_certificate_key D:/nginx/conf/ssl/server.key; # 优化安全性(禁用旧协议,只用 TLS 1.2/1.3) ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; location / { proxy_pass http://127.0.0.1:8080; } } # 强制跳转:把 80 端口的 HTTP 请求自动转到 HTTPS server { listen 80; server_name www.yourdomain.com; return 301 https://$host$request_uri; }
3. 日志深度分析 (Log Analysis)
- 自定义日志格式(在
http块中):log_format main_plus '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" ' 'rt=$request_time urt=$upstream_response_time'; # 关键:RT是总耗时,URT是后端响应耗时 access_log logs/access.log main_plus;
作为后端,如何分析日志?
-
找出慢接口: 搜索
urt(上游响应时间)大于 1 秒的记录。如果是urt大,那是你的 Java 代码该优化了;如果是rt很大但urt很小,那可能是网络抖动。 -
常见的状态码:
-
502 (Bad Gateway):通常是后端挂了。
-
504 (Gateway Timeout):后端处理超时。
-
499 (Client Closed Request):客户端主动断开了连接。
-








