初学Nginx

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配置对应的接口

反向代理的流程:
image

为了在页面中显示正确内容,可以创建一个控制器来接收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;
    

作为后端,如何分析日志?

  1. 找出慢接口: 搜索 urt(上游响应时间)大于 1 秒的记录。如果是 urt 大,那是你的 Java 代码该优化了;如果是 rt 很大但 urt 很小,那可能是网络抖动。

  2. 常见的状态码:

    • 502 (Bad Gateway):通常是后端挂了。

    • 504 (Gateway Timeout):后端处理超时。

    • 499 (Client Closed Request):客户端主动断开了连接。

32 个赞

感谢分享

很好的笔记,我选择交给AI :rofl:

1 个赞

感谢佬友分享 :folded_hands:

写的真不错

@1parado 应该发到 文档共建 而不是 开发区

这样大家都可以编辑文档, 而且 文档共建 的帖子不会锁帖, 有补充或者更新的地方可以随时修改

开发区的帖子超出一定时间(似乎是一个月), 就不能再次编辑了 如果内容有错误也不能修正

哦哦哦 好的

感谢大佬

1 个赞

感谢分享

复习一下,笔记很好

感谢分享,仿佛回到了大学专业课哈哈哈哈,一模一样的

感谢分享!

记录下nginx

1 个赞

感谢分享

感谢分享

不错不错

感谢分享

nginx啥都好,就是没有自带https免费证书申请,所以有一堆魔改方案,但都用着没有比如caddy或者traefik那么的丝滑,但caddy他们确实在高并发低占用方面又要弱一筹。对我这种选择困难症重度患者来说是真的一想就头痛。