Nginx学习之从入门到精通(五万字收藏版)


前言

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器 ,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,公开版本1.19.6发布于2020年12月15日。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。2022年01月25日,nginx 1.21.6发布。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。

一、简介

1.1.正向代理

如果我们把google想象成为一个资源库,则大陆局域网的客户端要访问这个资源库,就需要通过代理服务器来访问,这种代理服务就叫做正向代理。
简单说就是:在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问。

1.2.反向代理

反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。

1.3.负载均衡

当请求变多,单体应用不能满足,我们增加服务器的数量,然后将请求分发到不同服务器上解决高并发,就是负载均衡。

1.3.1.Nginx负载均衡算法有哪些

  1. 轮询(Round Robin)
upstream backend {
    server backend1.example.***;
    server backend2.example.***;
}

特点:按顺序依次将请求分配给后端服务器,默认算法。
适用场景:后端服务器性能相近的场景。

  1. 加权轮询(Weighted Round Robin)
upstream backend {
    server backend1.example.*** weight=5;
    server backend2.example.*** weight=2;
}

特点:根据 weight 参数指定权重,权重越高分配的请求越多。
适用场景:后端服务器性能差异较大时,按性能比例分配请求。

  1. IP 哈希(IP Hash)
upstream backend {
    ip_hash;
    server backend1.example.***;
    server backend2.example.***;
}

特点:根据客户端 IP 的哈希值分配服务器,确保同一客户端始终访问同一服务器。
适用场景:需要 session 会话保持的场景(如购物车、登录状态)。

  1. 最少连接(Least Connections)
upstream backend {
    least_conn;
    server backend1.example.***;
    server backend2.example.***;
}

特点:将请求分配给当前连接数最少的服务器。
适用场景:处理请求耗时差异较大的场景(如动态内容与静态内容混合)。

  1. 加权最少连接(Weighted Least Connections)
upstream backend {
    least_conn;
    server backend1.example.*** weight=5;
    server backend2.example.*** weight=2;
}

特点:在最少连接的基础上考虑权重,优先选择连接数少且权重高的服务器。
适用场景:结合服务器性能差异和连接状态的场景。

  1. 通用哈希(Generic Hash)
upstream backend {
    hash $request_uri consistent;
    server backend1.example.***;
    server backend2.example.***;
}

特点:根据自定义 key(如 URL、用户 ID)的哈希值分配服务器。
参数:
consistent:启用一致性哈希,减少服务器增减时的缓存失效问题。
适用场景:缓存集群、分布式系统中需要固定请求路由的场景。

  1. 随机(Random)
upstream backend {
    random two least_conn;
    server backend1.example.***;
    server backend2.example.***;
}

特点:随机选择两台服务器,再根据 least_conn 或 weight 选择最优。
参数:
two:随机选择两台服务器。
least_conn/weight:进一步筛选的策略。
适用场景:需要随机化且兼顾负载的场景。

  1. 粘性会话(Sticky Session)
upstream backend {
    sticky cookie srv_id expires=1h domain=.example.*** path=/;
    server backend1.example.***;
    server backend2.example.***;
}

特点:通过 Cookie 实现会话保持,需编译 ngx_http_upstream_sticky_module 模块。
适用场景:需要会话保持但不依赖客户端 IP 的场景。

总结:

算法 核心逻辑 适用场景
轮询 按顺序分配 服务器性能相近
加权轮询 按权重比例分配 服务器性能差异大
IP 哈希 同一 IP 固定到同一服务器 需要会话保持
最少连接 优先分配连接数少的服务器 请求耗时差异大
通用哈希 自定义 key 哈希路由 缓存集群、分布式系统
随机 随机 + 筛选 需要随机化的场景
粘性会话 通过 Cookie 固定服务器 不依赖 IP 的会话保持

1.4.动静分离

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。

二、安装

(1)安装 pcre 依赖#1、自行下载pcre依赖包(https://sourceforge.***/projects/pcre/files/pcre/8.37/[root@ldk src]# ll
total 2008
drwxr-xr-x. 2 root root    4096 Apr 11  2018 debug
drwxr-xr-x. 2 root root    4096 Apr 11  2018 kernels
-rw-r--r--  1 root root 2041593 Jun 21 22:38 pcre-8.37.tar.gz#2、解压依赖包
[root@ldk src]# tar -xvf pcre-8.37.tar.gz
#3、进入检查
[root@ldk src]# cd pcre-8.37
[root@ldk pcre-8.37]# ./configurechecking for a BSD-***patible install... /usr/bin/install -***hecking whether build environment is sane... yeschecking for a thread-safe mkdir -p... /usr/bin/mkdir -p
...
#注意:检查过程中,有些小伙伴的服务器可能会报错(缺少c++环境)
configure: error: You need a C++ ***piler for C++ support.
#4、如果报错执行(不报错直接略过本步骤)
[root@ldk pcre-8.37]# yum -y install g***-c++
#5、安装
[root@ldk pcre-8.37]# make && make installrm -f pcre_chartables.cln -s ./pcre_chartables.c.dist pcre_chartables.cmake  all-ammake[1]: Entering directory `/usr/src/pcre-8.37'  ***       libpcre_la-pcre_byte_order.lo  ***       libpcre_la-pcre_***pile.lo  ***       libpcre_la-pcre_config.lo  ***       libpcre_la-pcre_dfa_exec.lo  ***       libpcre_la-pcre_exec.lo  ***       libpcre_la-pcre_fullinfo.lo  ***       libpcre_la-pcre_get.lo
...
make[3]: Leaving directory `/usr/src/pcre-8.37'make[2]: Leaving directory `/usr/src/pcre-8.37'make[1]: Leaving directory `/usr/src/pcre-8.37'[root@ldk pcre-8.37]# 
#查看版本
[root@ldk pcre-8.37]# pcre-config --version8.37[root@ldk pcre-8.37]# 
(2)安装 openssl、zlib 依赖
[root@ldk pcre-8.37]# yum -y install make zlib zlib-devel g***-c++ libtool openssl openssl-develLoaded plugins: fastestmirrorLoading mirror speeds from cached hostfilePackage 1:make-3.82-24.el7.x86_64 already installed and latest versionPackage zlib-1.2.7-18.el7.x86_64 already installed and latest versionPackage g***-c++-4.8.5-39.el7.x86_64 already installed and latest versionPackage 1:openssl-1.0.2k-19.el7.x86_64 already installed and latest versionResolving Dependencies--> Running transaction check---> Package libtool.x86_64 0:2.4.2-22.el7_3 will be installed
...
Dependency Updated:  e2fsprogs.x86_64 0:1.42.9-17.el7         e2fsprogs-libs.x86_64 0:1.42.9-17.el7     krb5-libs.x86_64 0:1.15.1-46.el7           lib***_err.x86_64 0:1.42.9-17.el7        libselinux.x86_64 0:2.5-15.el7            libselinux-python.x86_64 0:2.5-15.el7      libselinux-utils.x86_64 0:2.5-15.el7     libss.x86_64 0:1.42.9-17.el7             
***plete![root@ldk pcre-8.37]# 
(3)安装Nginx#下载nginx:https://nginx.org/download/#解压压缩包
[root@ldk nginx]# tar -xvf nginx-1.12.2.tar.gz
#检查配置
[root@ldk nginx]# ./configure
#安装
[root@ldk nginx]# make && make install
 
#启动测试
[root@ldk /]# cd /usr/local/nginx/sbin/[root@ldk sbin]# ./nginx 
[root@ldk sbin]# ps -ef|grep nginxroot     11280     1  0 23:07 ?        00:00:00 nginx: master process ./nginxnobody   11281 11280  0 23:07 ?        00:00:00 nginx: worker processroot     11283  3063  0 23:08 pts/0    00:00:00 grep --color=auto nginx[root@ldk sbin]#
 
 #注意:如果有的小伙伴不能访问,可能是服务器端口没打开
  阿里云服务器参考:https://blog.csdn.***/Abaneo/article/details/72853513
一般就是:    1、查看开放端口:firewall-cmd --list-all    2、设置开放端口好:firewall-cmd --add-port=80/tcp --perman    3、重启防火墙:firewall-cmd --reload

三、常用基本命令

3.1.基本控制命令

  1. 启动 Nginx
sudo systemctl start nginx    # 适用于 systemd 系统(CentOS 7+、Ubuntu 16.04+)
sudo service nginx start      # 适用于 SysVinit 系统(CentOS 6、Ubuntu 14.04)
sudo /usr/local/nginx/sbin/nginx  # 源码安装方式
  1. 停止 Nginx
sudo systemctl stop nginx
sudo service nginx stop
sudo /usr/local/nginx/sbin/nginx -s stop  # 快速停止
sudo /usr/local/nginx/sbin/nginx -s quit  # 优雅停止(处理完现有请求后停止)
  1. 重启 Nginx
sudo systemctl restart nginx
sudo service nginx restart
  1. 重新加载配置(热重启)
sudo systemctl reload nginx
sudo service nginx reload
sudo /usr/local/nginx/sbin/nginx -s reload

作用:在不中断服务的情况下应用新配置。

3.2.状态检查命令

  1. 查看服务状态
sudo systemctl status nginx
sudo service nginx status
  1. 检查 Nginx 进程
ps -ef | grep nginx

正常运行时会看到 master 和 worker 进程。
3. 检查配置文件语法

nginx -t
nginx -t -c /path/to/nginx.conf  # 指定配置文件路径

3.3.版本与帮助

  1. 查看版本
nginx -v  # 精简版本信息
nginx -V  # 详细版本及编译参数
  1. 查看帮助
nginx -h

3.4.信号控制(高级)

  1. 优雅停止(等同于 -s quit)
sudo kill -QUIT `cat /var/run/nginx.pid`
  1. 快速停止(等同于 -s stop)
sudo kill -TERM `cat /var/run/nginx.pid`
sudo kill -INT `cat /var/run/nginx.pid`  # 同上
  1. 重新加载配置(等同于 -s reload)
sudo kill -HUP `cat /var/run/nginx.pid`
  1. 重新打开日志文件(用于日志切割)
sudo kill -USR1 `cat /var/run/nginx.pid`

3.5.其他实用命令

  1. 测试配置并显示有效配置
nginx -T  # 输出合并后的完整配置(含 include 文件)
  1. 指定配置文件路径
nginx -c /etc/nginx/nginx.conf
  1. 指定工作目录
nginx -p /usr/local/nginx/

3.6.常用场景示例

修改配置后验证并加载

nginx -t && sudo systemctl reload nginx

日志切割(每日零点自动执行)

mv /var/log/nginx/a***ess.log /var/log/nginx/a***ess_$(date +%Y%m%d).log
sudo kill -USR1 `cat /var/run/nginx.pid`  # 重新打开日志文件

查看实时访问日志

tail -f /var/log/nginx/a***ess.log

四、配置详解、问题排查

4.1.Nginx核心架构

  1. 核心模块
# main全局配置段
user nginx;                      # 运行用户
worker_processes auto;           # 工作进程数(建议=CPU核心数)
error_log /var/log/nginx/error.log warn; # 错误日志级别
pid /run/nginx.pid;             # 进程ID文件

events {
    worker_connections 1024;     # 单个进程最大连接数
    use epoll;                   # Linux高性能事件模型
    multi_a***ept on;             # 同时接受多个连接
}

4.2.HTTP核心配置

  1. 基础服务器配置
http {
    include       mime.types;     # 文件扩展名与MIME映射
    default_type  application/octet-stream;
    
    # 日志格式
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    a***ess_log  /var/log/nginx/a***ess.log  main;
    
    sendfile        on;           # 零拷贝传输
    tcp_nopush     on;           # 优化数据包发送
    keepalive_timeout  65;       # 长连接超时
    gzip  on;                    # 启用压缩
}

4.3.核心应用场景配置

  1. 静态资源服务
server {
    listen 80;
    server_name static.example.***;
    
    location / {
        root /data/www;
        index index.html;
        
        # 缓存控制
        expires 30d;
        add_header Cache-Control "public";
        
        # 防盗链
        valid_referers none blocked *.example.***;
        if ($invalid_referer) {
            return 403;
        }
    }
    
    # 禁止访问隐藏文件
    location ~ /\. {
        deny all;
    }
}
  1. 动态代理配置
upstream backend {
    server 10.0.0.1:8080 weight=5;
    server 10.0.0.2:8080;
    server 10.0.0.3:8080 backup;
    
    # 健康检查
    health_check interval=5s fails=3 passes=2;
}

server {
    listen 80;
    server_name api.example.***;
    
    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_connect_timeout 3s;
        proxy_read_timeout 5s;
    }
}
  1. HTTPS安全配置
server {
    listen 443 ssl http2;
    server_name secure.example.***;
    
    ssl_certificate /etc/ssl/certs/example.***.crt;
    ssl_certificate_key /etc/ssl/private/example.***.key;
    
    # 安全协议配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    
    # HSTS增强安全
    add_header Strict-Transport-Security "max-age=63072000" always;
    
    location / {
        root /data/secure;
    }
}

4.4.高级功能配置

  1. 负载均衡策略
upstream app_cluster {
    # 策略选择
    least_conn;                 # 最少连接
    # ip_hash;                 # IP哈希会话保持
    # hash $request_uri;       # URI哈希
    
    server 10.0.1.1:8000 fail_timeout=30s;
    server 10.0.1.2:8000 max_fails=3;
    
    # 长连接优化
    keepalive 32;
}

server {
    location / {
        proxy_pass http://app_cluster;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
}
  1. 流量控制
# 限流配置(每秒10个请求)
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;

server {
    location /api/ {
        limit_req zone=api_limit burst=20 nodelay;
        proxy_pass http://backend;
    }
    
    # 带宽限制
    location /download/ {
        limit_rate_after 10m;    # 10MB后开始限速
        limit_rate 100k;         # 限制为100KB/s
    }
}
  1. 日志分析优化
# 自定义日志格式
log_format json_analytics escape=json
    '{"time":"$time_iso8601",'
    '"host":"$host",'
    '"status":"$status",'
    '"request_time":"$request_time"}';

# 条件日志记录
map $status $loggable {
    ~^[23]  0;  # 不记录2xx/3xx
    default 1;   # 记录其他状态
}

server {
    a***ess_log /var/log/nginx/error_requests.log ***bined if=$loggable;
}

五、性能调优指南

  1. 内核参数优化
# 调整系统参数(/etc/sysctl.conf)
***.core.somaxconn = 65535
***.ipv4.tcp_max_syn_backlog = 65536
***.ipv4.tcp_tw_reuse = 1
  1. Nginx关键参数
# 高效文件传输
sendfile_max_chunk 1m;
aio threads;                    # 异步IO(Linux 4.18+)

# 连接优化
reset_timedout_connection on;   # 关闭超时连接
client_header_timeout 3s;       # 客户端头超时
client_body_timeout 5s;

4.6.故障排查案例

  1. 502 Bad Gateway分析

l

ocation / {
    # 增加调试信息
    proxy_next_upstream error timeout invalid_header http_500;
    proxy_intercept_errors on;
    
    # 显示详细错误
    proxy_set_header X-Debug-IP $upstream_addr;
    add_header X-Backend-Status $upstream_status;
}
  1. 内存泄漏检测
# 监控Nginx内存使用
watch -n 1 "ps -eo pid,rss,***m | grep nginx"

五、案例

5.1.电商案例

5.1.1.业务需求:

我们有一个电商平台,需要配置Nginx作为API网关,实现以下功能:
1.将不同微服务的API路由到不同的后端服务器
2.对商品服务进行负载均衡
3.用户服务的WebSocket连接支持
4.支付服务需要特殊的超时设置
5.静态资源缓存

5.1.2.完整配置示例:

# 全局配置
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    # 负载均衡配置
    upstream product_service {
        least_conn;
        server 10.0.1.10:8000 weight=3;
        server 10.0.1.11:8000;
        server 10.0.1.12:8000 backup;
    }

    upstream user_service {
        server 10.0.2.10:9000;
    }

    upstream payment_service {
        server 10.0.3.10:7000;
    }

    # 共享内存区域用于缓存
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=static_cache:10m inactive=60m;

    server {
        listen 80;
        server_name api.shop.***;
        
        # 商品服务路由 - 带负载均衡
        location /api/products {
            proxy_pass http://product_service;
            
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            
            # 商品查询API需要更长的缓存
            proxy_cache static_cache;
            proxy_cache_valid 200 302 10m;
            proxy_cache_key "$scheme$request_method$host$request_uri";
            
            # 限制请求速率防止刷API
            limit_req zone=product_limit burst=20;
        }

        # 用户服务路由 - 支持WebSocket
        location /api/users/ws {
            proxy_pass http://user_service/ws;
            
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_read_timeout 86400s;  # WebSocket长连接
            
            # 用户认证信息传递
            proxy_set_header Authorization $http_authorization;
        }

        # 支付服务路由 - 特殊超时设置
        location /api/payment {
            proxy_pass http://payment_service;
            
            # 支付需要更长的超时时间
            proxy_connect_timeout 300s;
            proxy_read_timeout 300s;
            proxy_send_timeout 300s;
            
            # 禁止缓存支付相关请求
            proxy_no_cache 1;
            proxy_cache_bypass 1;
            
            # 安全设置
            proxy_set_header X-Secure-Payment "true";
        }

        # 静态资源路由 - 启用缓存
        location /static {
            alias /var/www/static;
            
            # 缓存静态资源
            expires 30d;
            add_header Cache-Control "public";
            
            # 启用gzip压缩
            gzip on;
            gzip_types text/plain text/css application/json application/javascript;
        }

        # 全局错误处理
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root /usr/share/nginx/html;
        }
    }

    # 限流区域定义
    limit_req_zone $binary_remote_addr zone=product_limit:10m rate=10r/s;
}

5.1.3.关键配置解析

商品服务负载均衡:

使用least_conn算法实现更公平的负载分配
主服务器权重设置为3,备份服务器平时不参与负载
启用API响应缓存10分钟
限流设置防止恶意刷API

用户服务WebSocket支持:

配置HTTP 1.1协议
设置Upgrade头实现协议切换
超时设置为24小时维持长连接
传递原始认证头信息

支付服务特殊配置:

超时时间延长至5分钟
禁用缓存确保交易数据实时性
添加自定义安全头

静态资源优化:

本地文件系统直接服务
设置30天浏览器缓存
启用gzip压缩减少传输量

5.2.反向代理 & 负载均衡(高并发必备)

场景:多个后端服务负载不均,大促时部分服务器被压爆
配置目标:让 Nginx 把请求均匀转发到 3 台后端服务器,隐藏真实 IP,还能自动剔除挂掉的节点

# 全局配置:定义Nginx运行的基本参数
user  nginx;  # 运行用户,默认就行
worker_processes  1;  # 工作进程数,一般设为CPU核心数,摸鱼主机设1也行
# 错误日志和PID文件
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
# 负载均衡配置:定义后端服务器列表
upstream backend_servers {
    # 轮询策略:默认按顺序转发请求
    server 192.168.1.10:8080;  # 后端服务器A
    server 192.168.1.11:8080;  # 后端服务器B
    server 192.168.1.12:8080;  # 后端服务器C
    
    # 进阶配置:健康检查(服务器挂了自动踢掉)
    least_conn;  # 最小连接数策略,哪个服务器空闲就转发给谁
    keepalive 32;  # 保持32个长连接,减少TCP三次握手开销
    proxy_next_upstream error timeout http_500;  # 转发失败时,自动重试下一台服务器
}
# 服务器配置:定义Nginx对外提供服务的端口和规则
server {
    listen       80;  # 监听80端口(HTTP)
    server_name  www.yourdomain.***;  # 域名,改成你的域名或IP
    
    # 反向代理规则:所有以/api/开头的请求转发到后端服务器
    location /api/ {
        proxy_pass http://backend_servers/;  # 转发到upstream定义的服务器组
        
        # 传递客户端真实IP(后端需要获取用户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_read_timeout 60s;
        proxy_send_timeout 60s;
    }
}

关键点:

后端服务器 IP 全藏在 Nginx 里,外部只能访问 Nginx 的公网 IP
大促时流量均匀分散到 3 台服务器,再也不用担心自己写的接口被压崩

5.3.静态资源处理 & 动静分离(网页加载速度起飞)

场景:前端小姐姐抱怨图片 / JS 加载慢,甩锅说后端接口卡
配置目标:让 Nginx 直接处理图片、CSS、JS 等静态文件,减轻后端压力

http {
    # 定义上游服务器组
    upstream backend_servers {
        server backend1.example.***;
        server backend2.example.***;
    }

    server {
        listen 80;
        server_name www.yourdomain.***;

        # 静态资源
        location /static/ {
            root /data/; # 根路径,实际文件路径是/data/static/...
            autoindex off; # 禁止列出目录(安全考虑)
            expires 30d;  # 浏览器缓存30天,减少重复请求
            gzip on;  # 开启压缩,减小文件传输大小
            gzip_types text/css application/javascript image/png;
        }

        # 图片服务与防盗链:防止其他网站盗用你的图片
        location /images/ {
            root /data/;
            valid_referers none blocked www.yourdomain.***;
            if ($invalid_referer) {
                return 403;  # 非法引用返回403错误
            }
        }

        ## 动态请求(如登录接口)还是转发给后端
        location /api/ {
            proxy_pass http://backend_servers/;
            # 建议添加的代理头
            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;
        }
    }
}

关键点:

静态文件直接由 Nginx 返回,速度比后端处理快 10 倍以上
浏览器缓存 + 压缩,用户第二次访问秒加载,前端小姐姐再也不甩锅

5.4.限流防刷 & IP 黑白名单(防恶意攻击)

场景:接口被恶意 IP 高频访问,服务器日志爆满
配置目标:限制单个 IP 的并发连接数和请求频率,拉黑恶意 IP

http {
    # 1. 并发连接限制
    limit_conn_zone $binary_remote_addr zone=ip_conn:10m;
    # 2. 请求频率限制
    limit_req_zone $binary_remote_addr zone=ip_req:10m rate=5r/s;
    
    # 3. 精确 IP 白名单(使用 geo 模块)
    geo $allowed_ip {
        default 0;
        192.168.1.0/24 1;  # 允许的内网 IP 段
    }
}

server {
    listen 80;
    server_name www.yourdomain.***;
    
    location /api/login {
        # 并发连接限制:每个 IP 最多 10 个并发连接
        limit_conn ip_conn 10;
        
        # 请求频率限制:每秒 5 个请求,允许突发 10 个
        limit_req zone=ip_req burst=10 nodelay;
        
        # 精确 IP 白名单检查
        if ($allowed_ip = 0) {
            return 403;
        }
        
        # 代理设置
        proxy_pass http://backend_servers/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
    
    # 自定义 503 错误页
    error_page 503 @backend_overload;
    location @backend_overload {
        rewrite ^ /static/overload.html break;
    }
}

关键点:

恶意 IP 频繁刷接口?直接返回 403,服务器日志再也不会爆了
登录接口限流后,再也不用担心被 *** 攻击打崩

5.5.HTTPS 配置(数据加密传输)

场景:用户反馈登录时浏览器提示「不安全」,被产品经理骂哭
配置目标:启用 HTTPS,让数据加密传输,浏览器显示小绿锁

# HTTP 服务器(监听 80 端口):仅用于重定向到 HTTPS
server {
    listen 80;
    server_name www.yourdomain.***;
    return 301 https://$host$request_uri;  # 正确的 HTTP 转 HTTPS
}

# HTTPS 服务器(监听 443 端口)
server {
    listen 443 ssl;
    server_name www.yourdomain.***;
    
    # SSL 证书配置
    ssl_certificate      /etc/nginx/ssl/yourdomain.crt;
    ssl_certificate_key  /etc/nginx/ssl/yourdomain.key;
    
    # 安全协议与加密
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers on;
    
    # 代理设置
    location / {
        proxy_pass http://backend_servers/;
        # 建议添加的代理头(根据需求调整)
        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;
    }
}

# 上游服务器组定义(需在 http 块中)
upstream backend_servers {
    server backend1.example.***;
    server backend2.example.***;
}

关键点:

小绿锁一亮,产品经理再也挑不出毛病
数据加密传输,用户密码不怕被中间人窃取

5.6.总结

反向代理:藏好后端 IP,安心摸鱼不怕攻击
负载均衡:流量均分,再也不用背锅服务器崩了
静态资源:让 Nginx 处理图片 JS,后端专注写接口
限流防刷:恶意请求全拦下,日志清净心情好
HTTPS:小绿锁一挂,产品经理笑哈哈
记住:Nginx 配置不是一次性的!上线后要根据服务器压力、用户反馈动态调整,比如大促时加大限流阈值,发现恶意 IP 及时拉黑。

转载请说明出处内容投诉
CSS教程网 » Nginx学习之从入门到精通(五万字收藏版)

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买