Nginx零基础学习手册

第一章 Nginx 核心基础

1.1 Nginx 核心作用

Nginx 是企业通用的高性能网关服务,核心用途:托管静态资源、反向代理后端服务、负载均衡分发流量、网站安全防护、流量限流管控。主打低占用、高并发、稳定不宕机,是所有 Web 项目的统一入口服务。

核心优势:基于 epoll 事件模型、Master+Worker 进程架构,单服务可支撑十万级并发,远超传统 Apache、Tomcat。

1.2 正向代理与反向代理

正向代理:帮客户端上网(例:公司统一上网、翻墙),服务端看不到真实用户。

反向代理(99% 企业场景):帮后端服务接收请求,用户看不到真实后端服务,实现统一入口、隐藏服务地址、防护后端安全。

1.3 四大核心实战功能

  • 静态托管:部署前端页面、图片、JS/CSS 等静态资源,速度远超后端程序

  • 反向代理:转发接口请求至 Java/Go/Python 后端服务

  • 负载均衡:多台后端服务分摊流量,避免单节点宕机、压力过载

  • 网关治理:HTTPS 加密、压缩提速、限流防爬、跨域、日志审计、安全拦截

1.4 进程原理

Master 主进程:只管理配置、管控子进程,不处理用户请求

Worker 工作进程:真正处理用户请求,一般配置等于 CPU 核心数,性能最优

热重载原理:执行 reload 不会中断现有请求,新请求用新配置,业务零停机更新

1.5 长短连接适配

短连接:请求完成立即断开,适合静态资源,频繁握手、性能一般

长连接:一次握手、多次复用,适合接口、WebSocket,生产默认开启,配置合理超时避免资源占用

1.6 版本选型规范

学习/生产一律选用 Stable 稳定版,无未知漏洞、兼容性强;主线版仅测试尝新,禁止上线。

第二章 全平台安装与基础运维

2.1 安装前置依赖

所有 Linux 环境安装前执行,补齐编译、正则、压缩依赖,规避编译报错:

bash 复制代码
# 安装Nginx编译必备依赖:gcc编译工具、pcre正则库、zlib压缩库
yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel make

2.2 快速安装

CentOS/RHEL

bash 复制代码
# yum一键安装稳定版Nginx
yum install -y nginx
# 验证安装是否成功,输出版本号
nginx -v

Ubuntu/Debian

bash 复制代码
# 更新软件源并安装Nginx
apt update && apt install -y nginx
# 验证安装
nginx -v

macOS

bash 复制代码
# Homebrew安装并验证版本
brew install nginx && nginx -v

2.3 源码编译安装

适合企业定制版本、新增第三方模块、固定指定版本场景,可直接复制执行:

bash 复制代码
# 下载官方1.24.0稳定版源码(企业通用稳定版本)
wget http://nginx.org/download/nginx-1.24.0.tar.gz
# 解压源码包
tar -zxvf nginx-1.24.0.tar.gz
# 进入源码目录
cd nginx-1.24.0

# 编译配置:指定安装路径 + 开启生产必备模块
./configure \
--prefix=/usr/local/nginx \          # 指定Nginx安装根目录
--with-http_gzip_module \             # 开启Gzip压缩模块(页面提速必备)
--with-http_ssl_module \              # 开启SSL加密模块(HTTPS必备)
--with-http_stub_status_module \      # 开启状态监控模块(监控QPS、连接数)
--with-http_v2_module                 # 开启HTTP2协议(提升并发访问速度)

# 编译并安装(纯源码编译,无外部依赖)
make && make install
# 配置系统全局命令,任意目录可直接使用nginx命令
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/nginx
# 验证编译安装成果
nginx -v

2.4 Windows 安装注意事项

  1. 仅下载稳定版压缩包;2. 解压至纯英文无空格路径;3. 必须在根目录执行命令
bash 复制代码
start nginx          # 启动Nginx服务
nginx -s reload      # 热重载配置(不中断业务)
nginx -s quit        # 优雅停止服务(等待请求结束再关闭)
nginx -t             # 校验配置文件语法是否正确

2.5 核心目录作用

  • sbin:启动程序目录,存放Nginx主启动二进制文件

  • conf/nginx.conf:主配置文件,全局通用核心配置入口

  • conf.d:子配置目录(多站点拆分专用,规范项目结构)

  • logs:日志目录(存放访问日志、错误日志、切割日志)

  • html:默认静态资源目录,默认页面存放路径

2.6 核心运维命令

bash 复制代码
nginx -t             # 校验配置语法(修改配置后必执行,避免报错)
nginx -s reload      # 热重载配置(生产更新首选,零停机不中断业务)
systemctl start/stop/restart nginx  # 启停重启服务
systemctl enable nginx # 设置开机自启(服务器重启自动恢复服务)

2.7 外网访问故障排查

bash 复制代码
# 防火墙放行HTTP(80)、HTTPS(443)端口,允许外网访问
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
# 重载防火墙规则,生效配置
firewall-cmd --reload
# 临时关闭SELinux(测试环境排障使用,生产可配置放行规则)
setenforce 0

第三章 Nginx 配置语法与规范

3.1 配置层级关系

全局块 → events 块 → http 块 → server 块(站点)→ location 块(路由匹配),下级配置覆盖上级,就近优先生效。

3.2 Location 匹配优先级

优先级从高到低:精准匹配 > 正则匹配 > 前缀匹配 > 通用兜底

  1. location = /xxx 精准匹配(最高优先级,完全匹配路径)

  2. location ~ /xxx 区分大小写正则匹配

  3. location ~* /xxx 不区分大小写正则匹配

  4. location /xxx 前缀最长匹配(匹配开头路径)

  5. location / 通用兜底匹配(所有未匹配路径全部命中)

3.3 语法易错点避坑

  • Nginx 不支持 if 嵌套,多条件禁止嵌套判断,会直接报错

  • root :拼接路径(root+访问路径);alias:替换路径(精准替换目录,静态资源代理首选)

  • try_files:优先匹配静态文件,不存在则跳转指定路径,专门解决 Vue/React 单页项目刷新404问题

3.4 Rewrite 重写规则

用于域名跳转、旧路由兼容、伪静态配置,四大关键字用途:

  • last:终止当前匹配,重新走全局location匹配(站内跳转)

  • break:终止匹配,直接执行当前location剩余配置

  • redirect:302 临时跳转(临时切换域名/路由,浏览器保留旧缓存)

  • permanent:301 永久跳转(域名永久迁移,浏览器永久缓存跳转规则)

nginx 复制代码
# 落地案例:旧路由/old/xxx永久跳转新路由/new/xxx,适配项目路由迭代兼容
location /old {
    # ^/old/(.*)$ 匹配所有old开头的子路径,$1承接原有路径参数
    rewrite ^/old/(.*)$ /new/$1 permanent;
}

3.5 常用内置变量

  • $remote_addr:客户端真实IP地址

  • $host:当前访问的域名/主机名

  • $request_uri:完整原始请求地址(含参数)

  • $proxy_add_x_forwarded_for:多层代理场景,拼接完整真实IP链路

3.6 高频变量深度避坑

这两个变量是路由404、参数丢失、重定向异常的核心诱因,是生产最高频踩坑点,二者核心差异与使用场景严格区分:

  • $request_uri :原始请求完整地址,包含GET参数、不会自动解码、永久不变,适合用于日志记录、重定向跳转、参数透传,生产优先使用

  • $uri :Nginx内部标准化后的URI,自动解码URL、自动去除参数、会被内部rewrite修改,适合用于匹配静态文件、路径判断,禁止用于跳转与日志

nginx 复制代码
# 实战避坑示例:防止重定向参数丢失
# 正确写法:使用$request_uri,保留完整请求参数
return 301 https://$host$request_uri;

# 错误写法:使用$uri,会丢失所有GET参数,导致业务异常
# return 301 https://$host$uri;

第四章 核心实战场景配置

4.1 静态网站部署

nginx 复制代码
# 静态站点服务配置,适配所有前后端分离SPA项目、静态官网
server {
    listen 80;                  # 监听80端口,外网HTTP默认端口
    server_name web.test.com;   # 绑定当前站点域名,多个域名空格分隔
    root /home/nginx/web;       # 静态资源根目录,项目打包文件存放路径
    index index.html index.htm; # 默认访问首页文件优先级

    # 解决Vue/React单页项目刷新404问题
    # 优先匹配真实静态文件,无文件则转发至index.html,由前端路由接管
    location / {
        try_files $uri $uri/ /index.html;
    }

    # 静态资源缓存配置,提升访问速度、减少服务器压力
    # 图片、样式、脚本类资源长期缓存
    location ~* \.(jpg|png|gif|js|css|ico|svg)$ {
        expires 7d;                     # 浏览器缓存7天
        add_header Cache-Control "public"; # 公开缓存,CDN可缓存
    }

    # 禁止访问.开头的隐藏文件(.env、.git、隐藏配置文件),防止信息泄露
    location ~ /\. {
        deny all;
    }
}

4.2 反向代理配置

适配所有后端 Java/Go/Node 项目,含 WebSocket 长连接配置,全生产优化参数,可直接复用:

nginx 复制代码
# 后端接口反向代理服务配置
server {
    listen 80;
    server_name api.test.com;

    # 普通HTTP接口请求反向代理
    location / {
        proxy_pass http://127.0.0.1:8080;        # 后端服务真实地址端口
        proxy_set_header Host $host;             # 向后端传递原始访问域名
        proxy_set_header X-Real-IP $remote_addr; # 向后端传递客户端真实IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递代理链路IP

        # 生产环境缓冲与重定向优化
        proxy_redirect off;                       # 关闭自动重定向,避免路由错乱
        proxy_buffer_size 128k;                   # 响应缓冲区大小
        proxy_buffers 4 128k;                     # 缓冲区数量与单块大小
        proxy_connect_timeout 60s;  # 连接后端超时时间
        proxy_read_timeout 120s;    # 读取后端响应超时时间(适配慢接口)
    }

    # WebSocket长连接配置(适配聊天、实时推送、在线协同场景)
    location /ws {
        proxy_pass http://127.0.0.1:8080/ws;      # 后端WebSocket服务地址
        proxy_http_version 1.1;                   # 启用HTTP1.1,支持长连接升级
        proxy_set_header Upgrade $http_upgrade;   # 声明协议升级
        proxy_set_header Connection "upgrade";    # 开启连接升级
        proxy_set_header Host $host;
        proxy_read_timeout 300s; # 长连接超时时间,避免连接频繁断开
        proxy_send_timeout 300s;
    }
}

4.3 负载均衡策略

包含轮询、权重、会话保持、故障重试、备用节点,可按需开启,适配多节点后端集群:

nginx 复制代码
http {
    # 定义后端服务集群池,统一管理多节点服务
    upstream backend_pool {
        # 普通节点:3次失败判定节点故障,30秒内不再分发流量
        server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
        server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
        # 备用节点:主节点全部故障后自动启用,平时不承载流量
        server 192.168.1.12:8080 backup;

        # 权重模式(默认轮询注释,权重越高,分配流量越多,适配配置不同性能节点)
        # server 192.168.1.10:8080 weight=3;
        # server 192.168.1.11:8080 weight=1;

        # ip_hash会话保持:同一客户端IP固定访问同一后端节点,适配登录态场景
        # ip_hash;

        # least_conn最少连接:优先分发流量至空闲节点,适配请求耗时不均场景
        # least_conn;
    }

    # 负载均衡入口服务
    server {
        listen 80;
        server_name lb.test.com;
        location / {
            proxy_pass http://backend_pool; # 流量转发至集群池
            # 透传客户端信息至后端集群节点
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

4.4 HTTPS 加密配置

nginx 复制代码
# 80端口强制跳转HTTPS,全站加密,杜绝明文传输
server {
    listen 80;
    server_name ssl.test.com;
    # 永久重定向,所有HTTP请求强制跳转HTTPS
    return 301 https://$host$request_uri;
}

# 443加密端口核心配置,全站HTTPS+HTTP2提速
server {
    listen 443 ssl http2; # 监听443加密端口,开启HTTP2多路复用
    server_name ssl.test.com;

    # 配置SSL证书路径(替换为自己的域名证书文件)
    ssl_certificate /home/nginx/ssl/fullchain.pem;  # 公钥证书
    ssl_certificate_key /home/nginx/ssl/private.key; # 私钥证书

    # 安全加密协议配置,禁用老旧不安全协议
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on; # 优先使用服务端加密套件
    ssl_session_cache shared:SSL:10m; # 开启SSL会话缓存,减少握手耗时
    ssl_session_timeout 10m; # 会话缓存有效期

    # 静态站点托管
    location / {
        root /home/nginx/static;
        index index.html;
        try_files $uri $uri/ /index.html;
    }
}

第五章 进阶功能配置

5.1 Gzip 压缩提速

nginx 复制代码
http {
    gzip on;                        # 开启Gzip全局压缩功能
    gzip_min_length 1k;             # 小于1KB的文件不压缩(避免压缩损耗大于传输损耗)
    gzip_comp_level 6;              # 压缩等级1-9,6级兼顾压缩率与CPU性能
    # 指定需要压缩的文件类型(文本类资源压缩收益最高)
    gzip_types text/plain text/css application/javascript application/json;
    gzip_vary on;                   # 响应头标记压缩适配,兼容各类浏览器
}

5.2 Brotli 高阶压缩

nginx 复制代码
http {
    brotli on;                      # 开启Brotli高阶压缩(压缩率比Gzip高15%-20%)
    brotli_min_length 1k;           # 小文件跳过压缩
    brotli_comp_level 6;            # 压缩等级均衡性能与压缩率
    # 适配文本、静态资源、SVG图片压缩
    brotli_types text/plain text/css application/javascript application/json image/svg+xml;
}

5.3 限流风控配置

请求频率限流

nginx 复制代码
http {
    # 限流规则定义:基于客户端IP限流,内存空间10M,单IP每秒10次请求
    # zone=req_limit:10m 开辟10M内存存储限流状态
    # rate=10r/s 每秒最多10次请求
    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;

    server {
        listen 80;
        location / {
            limit_req zone=req_limit burst=20 nodelay;
            # burst=20 允许突发20次请求缓冲
            # nodelay 突发请求不排队,直接放行,超出阈值返回429
            root /home/nginx/static;
        }
    }
}

连接数限流

nginx 复制代码
http {
    # 定义并发连接限流内存区域
    limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
    server {
        listen 80;
        location / {
            limit_conn conn_limit 10; # 单个IP最大允许10个并发连接
            limit_conn_status 429;    # 超出限制返回429状态码
        }
    }
}

5.4 IP 黑白名单

nginx 复制代码
location / {
    allow 127.0.0.1;        # 放行本机回环地址
    allow 192.168.1.0/24;   # 放行内网整段网段,内网设备可自由访问
    deny all;               # 拒绝所有其他外网IP访问
}

5.5 跨域配置

nginx 复制代码
location / {
    add_header Access-Control-Allow-Origin *;      # 允许所有域名跨域访问
    add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS; # 允许的请求方式
    add_header Access-Control-Allow-Headers *;    # 允许所有请求头参数

    # 预处理浏览器OPTIONS预检请求,直接返回成功,不转发后端
    if ($request_method = OPTIONS) {
        return 204;
    }
}

5.6 文件上传大小限制

nginx 复制代码
http {
    client_max_body_size 50M; # 全局限制单请求最大50M,解决大文件上传413报错
}

5.7 动静分离架构

nginx 复制代码
# 动静分离架构:静态资源Nginx直接托管,动态接口转发后端,大幅减轻后端压力
server {
    listen 80;
    server_name ds.test.com;

    # 所有静态资源直接由Nginx处理,长期缓存
    location ~* \.(png|jpg|gif|css|js|html)$ {
        root /home/nginx/static;                # 静态资源存放目录
        expires 15d;                            # 浏览器缓存15天
        add_header Cache-Control "public,max-age=1296000"; # 缓存时长秒数
    }

    # 动态接口、业务请求转发后端服务
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

5.8 多层代理真实IP获取

nginx 复制代码
location / {
    proxy_set_header X-Real-IP $remote_addr;             # 传递直连客户端IP
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 拼接完整代理IP链路
    proxy_trusted_addresses 192.168.1.0/24; # 信任内网代理节点,避免IP伪造
}

5.9 安全加固配置

nginx 复制代码
http {
    server_tokens off; # 隐藏Nginx版本号,防止黑客针对特定版本漏洞攻击

    # 拦截非法请求方式,只允许常规业务请求方法
    if ($request_method !~ ^(GET|POST|PUT|DELETE|OPTIONS)$) {
        return 403;
    }

    # 简易防盗链:仅允许本站域名访问资源,防止恶意盗刷流量
    valid_referers none blocked *.test.com;
    if ($invalid_referer) {
        return 403;
    }
}

5.10 状态监控模块

nginx 复制代码
server {
    listen 80;
    # 开启Nginx原生状态监控页面
    location /status {
        stub_status on;    # 启用状态统计功能,可查看连接数、请求数、QPS
        allow 127.0.0.1;   # 仅本机可访问监控页面,禁止外网暴露
        deny all;
    }
}

5.11 代理缓存配置

Nginx代理缓存是企业核心性能优化方案,可缓存后端接口、静态页面响应,减少后端重复计算、降低CPU/数据库压力、提升接口响应速度,适配首页、列表页、静态接口等高频只读场景。

nginx 复制代码
http {
    # 1. 定义缓存内存空间:路径、缓存大小、内存占用、过期时间、缓存键
    proxy_cache_path /var/nginx/cache 
    levels=1:2                # 缓存文件目录分级存储,提升读写效率
    keys_zone=api_cache:200m  # 开辟200M内存存储缓存索引
    max_size=10g              # 磁盘缓存最大10G,自动淘汰旧缓存
    inactive=7d               # 7天未访问的缓存自动清理
    use_temp_path=off;        # 关闭临时目录,减少IO损耗

    server {
        listen 80;
        server_name cache.test.com;

        location / {
            proxy_pass http://127.0.0.1:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;

            # 2. 启用缓存并绑定缓存空间
            proxy_cache api_cache;
            # 200/301/302状态码响应缓存10分钟
            proxy_cache_valid 200 301 302 10m;
            # 404错误缓存1分钟,避免频繁请求无效资源
            proxy_cache_valid 404 1m;
            # 自定义缓存键,区分不同用户、不同请求
            proxy_cache_key "$host$request_uri";
            # 忽略缓存,携带Cookie、POST请求不缓存
            proxy_cache_bypass $cookie_nocache $arg_nocache $args_post;
            # 禁止缓存动态敏感接口
            proxy_no_cache $cookie_nocache $arg_nocache $args_post;

            # 响应头返回缓存状态,方便调试(HIT命中/MISS未命中)
            add_header X-Proxy-Cache $upstream_cache_status;
        }

        # 动态敏感接口关闭缓存(登录、支付、个人中心)
        location /api/user/ {
            proxy_pass http://127.0.0.1:8080;
            proxy_cache off;
        }
    }
}

5.12 企业级防盗链方案

弥补基础Referer防盗链短板,新增时间戳+签名鉴权防盗链,彻底解决图片、视频、静态资源恶意盗刷、流量窃取问题,适用于图片服务器、视频点播、资源付费场景。

nginx 复制代码
http {
    # 开启防盗链核心模块
    secure_link on;
    # 校验规则:资源路径+时间戳+密钥签名,过期自动失效
    # 格式:资源地址?ts=时间戳&sign=MD5签名
    secure_link_md5 "$uri$arg_ts my_secret_key";

    server {
        listen 80;
        server_name res.test.com;
        root /home/nginx/static;

        # 静态资源防盗链匹配
        location ~* \.(jpg|png|gif|mp4|webm)$ {
            # 校验签名合法性,签名错误直接403
            if ($secure_link = "") {
                return 403;
            }
            # 校验时间戳是否过期(过期返回403)
            if ($secure_link = "0") {
                return 403;
            }
            # 合法资源放行,缓存提速
            expires 7d;
            add_header Cache-Control "public";
        }

        # 后台内部访问直接放行,无需鉴权
        location ~* /admin/ {
            allow 192.168.1.0/24;
            deny all;
        }
    }
}

5.13 无BUG跨域优化配置

修复原通用跨域配置三大生产BUG:多域名跨域失效、重复Header报错、HTTPS跨域拦截,支持指定可信域名、兼容前后端分离全场景,企业生产标准通用。

nginx 复制代码
server {
    listen 80;
    server_name api.test.com;

    # 定义可信跨域域名(按需新增,拒绝*通配符不安全场景)
    set $cors_origin "";
    if ($http_origin ~* ^https?://(www\.test\.com|web\.test\.com)$) {
        set $cors_origin $http_origin;
    }

    location / {
        # 仅对可信域名返回跨域头,规避安全风险
        add_header Access-Control-Allow-Origin $cors_origin always;
        add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS always;
        add_header Access-Control-Allow-Headers Content-Type,Authorization,X-Requested-With always;
        add_header Access-Control-Allow-Credentials true always; # 允许携带Cookie

        # 预检请求直接响应,不转发后端,解决跨域拦截问题
        if ($request_method = OPTIONS) {
            add_header Access-Control-Allow-Origin $cors_origin;
            add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
            add_header Access-Control-Allow-Headers Content-Type,Authorization,X-Requested-With;
            add_header Access-Control-Allow-Credentials true;
            return 204;
        }

        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

5.14 进程自启与崩溃守护

补齐Supervisor守护、开机自启、异常崩溃自动重启方案,解决Nginx意外宕机、进程退出无人恢复的生产问题,实现7*24小时稳定运行。

1、Systemd 开机自启

bash 复制代码
# 新建systemd服务文件
vim /etc/systemd/system/nginx.service

# 写入以下配置
[Unit]
Description=Nginx High Performance Web Server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
Restart=always          # 进程异常退出自动重启
RestartSec=3            # 重启间隔3秒

[Install]
WantedBy=multi-user.target
bash 复制代码
# 生效配置、设置开机自启、启动服务
systemctl daemon-reload
systemctl enable nginx
systemctl start nginx

2、Supervisor 进程守护

bash 复制代码
# 安装守护工具
yum install -y supervisor
systemctl enable supervisord

# 新建Nginx守护配置
vim /etc/supervisord.d/nginx.ini
ini 复制代码
[program:nginx]
command=/usr/local/nginx/sbin/nginx -g "daemon off;"
autostart=true
autorestart=true       # 异常自动重启
startretries=10
user=root
stdout_logfile=/var/log/nginx/supervisor.log
bash 复制代码
# 重启守护进程、生效配置
systemctl restart supervisord

5.15 Docker 容器化部署

补齐企业90%在用的Docker部署方案,包含镜像构建、目录挂载、配置持久化、容器自启、生产最优参数,替代传统虚拟机部署,适配云原生场景。

1、标准化Dockerfile

dockerfile 复制代码
# 基于官方稳定版镜像
FROM nginx:1.24.0-alpine

# 维护者信息
MAINTAINER nginx-dev

# 删除默认配置,准备自定义挂载
RUN rm -rf /etc/nginx/conf.d/default.conf

# 拷贝全局自定义配置
COPY nginx.conf /etc/nginx/nginx.conf

# 暴露80/443端口
EXPOSE 80 443

# 容器前台运行,防止自动退出
CMD ["nginx","-g","daemon off;"]

2、Docker Compose 一键部署

yaml 复制代码
version: '3.8'
services:
  nginx:
    image: nginx:1.24.0-alpine
    container_name: nginx-prod
    restart: always # 容器异常自动重启
    ports:
      - "80:80"
      - "443:443"
    # 目录挂载:配置、静态资源、日志持久化
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./conf.d:/etc/nginx/conf.d
      - ./html:/usr/share/nginx/html
      - ./logs:/var/log/nginx
    # 时区同步
    environment:
      - TZ=Asia/Shanghai
    # 内核优化
    sysctls:
      net.core.somaxconn: 65535
      net.ipv4.tcp_syncookies: 1

3、一键启动命令

bash 复制代码
# 后台启动容器
docker-compose up -d
# 重载Nginx配置(容器内执行)
docker exec -it nginx-prod nginx -s reload
# 校验配置语法
docker exec -it nginx-prod nginx -t

第六章 日志运维与故障排查

6.1 日志定时切割脚本

bash 复制代码
#!/bin/bash
# Nginx日志按天自动切割脚本,配合crontab定时执行,避免单日志文件过大、占用磁盘
LOG_PATH=/var/log/nginx  # Nginx日志默认存放路径
DATE=$(date -d "yesterday" +%Y%m%d) # 获取昨日日期,用于日志命名

# 重命名昨日访问日志、错误日志,按日期归档
mv $LOG_PATH/access.log $LOG_PATH/access_$DATE.log
mv $LOG_PATH/error.log $LOG_PATH/error_$DATE.log

# 通知Nginx重新创建空日志文件,无需重启服务
nginx -s reopen

6.2 慢请求日志配置

nginx 复制代码
http {
    slowlog_enable on;                  # 开启慢请求日志记录功能
    slowlog_threshold 1000;             # 阈值1000ms=1秒,超过1秒的请求判定为慢请求并记录
}

6.3 日志分析常用命令

bash 复制代码
# 统计访问量TOP10客户端IP,排查恶意爬虫、高频访问IP
awk '{print $1}' access.log |sort |uniq -c |sort -nr |head -10

# 筛选所有4xx、5xx异常请求,快速定位业务报错
grep -E " 4[0-9]{2}|5[0-9]{2}" access.log

# 筛选所有慢请求日志,排查超时接口
grep "slow" error.log

6.4 高频报错解决方案

  • 413 上传过大 :请求体超出限制,调大全局 client_max_body_size 参数

  • 429 请求过多:触发限流规则,调低限流频率、增大burst突发阈值

  • 502 网关错误:后端服务未启动、代理IP/端口配置错误、端口未放行

  • 504 超时 :后端接口响应慢,调大 proxy_connect_timeout、proxy_read_timeout 超时时间

  • 刷新404 :SPA单页项目缺失 try_files 路由兜底配置

第七章 生产调优与工程规范

7.1 核心性能调优配置

nginx 复制代码
http {
    worker_rlimit_nofile 65535; # 提升单进程最大文件打开数,适配高并发场景
    keepalive_timeout 30;       # 长连接超时30秒,闲置连接自动释放
    keepalive_requests 1000;    # 单长连接最大复用1000次请求,避免连接老化
    tcp_syncookies on;          # 开启TCP防SYN洪水攻击
    tcp_tw_reuse on;            # 复用TIME_WAIT连接,提升端口利用率
}

7.2 生产落地规范

  • 多站点配置统一放入 conf.d 目录拆分,不堆砌主配置文件,结构清晰易维护

  • 所有配置修改后先 nginx -t 校验语法,无误再 reload,避免服务报错

  • 生产禁止 stop 强制停止,统一使用热重载更新,保证业务零停机

  • 所有对外站点默认开启日志切割、版本隐藏、基础安全拦截配置

7.3 面试考点与避坑总结

核心考点:epoll 高并发原理、热重载无感知机制、负载均衡策略、限流原理、多层代理IP解析、HTTPS 加固

避坑清单:禁止if嵌套、禁止中文路径、超时参数必须配置、文件上传限制必须配置、上线必校验配置语法

附录:Nginx 配置速查表

一、核心运维命令

bash 复制代码
# 校验配置文件语法(修改配置后必执行,提前排查错误)
nginx -t

# 热重载配置(生产零停机更新配置,优先使用)
nginx -s reload

# 优雅停止服务(等待已接入请求处理完毕再关闭)
nginx -s quit

# 强制停止服务(生产禁止使用,会中断正在处理的请求)
nginx -s stop

# 查看Nginx简易版本号
nginx -v

# 查看详细版本+编译模块(排查模块缺失问题)
nginx -V

# 设置开机自启,服务器重启自动恢复Nginx服务
systemctl enable nginx
# 启停重启服务
systemctl start/stop/restart nginx

二、全局通用基础配置

nginx 复制代码
http {
    server_tokens off;                     # 隐藏版本号,安全加固防漏洞扫描
    client_max_body_size 50M;              # 全局限制文件上传最大50M
    keepalive_timeout 30s;                 # 长连接超时时间
    keepalive_requests 1000;               # 单连接最大请求复用次数
    worker_rlimit_nofile 65535;           # 提升高并发文件句柄上限

    # 通用Gzip资源压缩,全站文本资源提速
    gzip on;
    gzip_min_length 1k;
    gzip_comp_level 6;
    gzip_types text/plain text/css application/javascript application/json;
}

三、静态网站通用配置

nginx 复制代码
server {
    listen 80;
    server_name web.test.com;
    root /home/nginx/web;
    index index.html;

    # 解决SPA单页项目刷新404、路由跳转404问题
    location / {
        try_files $uri $uri/ /index.html;
    }

    # 静态资源长期缓存,减少重复加载
    location ~* \.(jpg|png|gif|js|css|ico|svg)$ {
        expires 7d;
        add_header Cache-Control "public";
    }

    # 禁止访问隐藏配置文件,防止信息泄露
    location ~ /\. {
        deny all;
    }
}

四、后端接口反向代理配置

nginx 复制代码
server {
    listen 80;
    server_name api.test.com;

    location / {
        proxy_pass http://127.0.0.1:8080;        # 后端服务地址
        # 透传客户端真实信息至后端
        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_redirect off;
        proxy_connect_timeout 60s;
        proxy_read_timeout 120s;
        proxy_buffer_size 128k;
    }
}

五、WebSocket 长连接配置

nginx 复制代码
# 适配聊天、实时推送、在线协同长连接场景
location /ws {
    proxy_pass http://127.0.0.1:8080/ws;
    proxy_http_version 1.1;                   # 启用HTTP1.1支持协议升级
    proxy_set_header Upgrade $http_upgrade;   # 声明WebSocket协议升级
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_read_timeout 300s;                  # 长连接超时5分钟
    proxy_send_timeout 300s;
}

六、基础限流配置

nginx 复制代码
http {
    # 单IP限流:每秒10次请求,内存缓存10M
    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
    # 单IP并发连接限流内存区域
    limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

    server {
        listen 80;
        location / {
            limit_req zone=req_limit burst=20 nodelay; # 突发20次缓冲
            limit_conn conn_limit 10;                  # 最大10并发连接
            limit_conn_status 429;                     # 超限返回429状态码
        }
    }
}

七、通用跨域配置

nginx 复制代码
location / {
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
    add_header Access-Control-Allow-Headers *;
    if ($request_method = OPTIONS) {
        return 204;
    }
}
相关推荐
難釋懷1 天前
Nginx外置缓存-nginx + memcached
nginx·缓存·memcached
難釋懷1 天前
Nginx外置缓存-nginx + redis
redis·nginx·缓存
☆凡尘清心☆2 天前
CentOS Stream 9 专用 LNMP 全自动一键脚本
linux·运维·mysql·nginx·lnmp·centos stream 9
似的8352 天前
一步一步学习使用FireMonkey动画() 使用TAnimator类创建动画
linux·学习·nginx
Zacks_xdc3 天前
【运维】Nginx 蓝绿部署与流式任务(SSE)不中断架构实战
运维·nginx·架构·nextjs
闪亮的路灯4 天前
威联通QTS使用自带web服务期代理前端(类似nginx)
前端·nginx·威联通
難釋懷4 天前
Nginx外置缓存-error_page
运维·nginx·缓存
怪味趣多4 天前
r创建动画。 . 使用TFloatAnimation通过改变图片的位置创建动车。 . 使用TPathAnimation创建路径动画。 ...
运维·nginx
七七powerful5 天前
为离线的bcliunx euler&龙晰 配置 yum源 nginx代理
nginx·yum·bclinux