Nginx笔记

一、核心底座:Nginx 简介与基础操作

1. 什么是 Nginx?

Nginx(engine x)是一款 高性能、轻量级 的 HTTP 服务器、反向代理服务器,同时支持 IMAP/POP3/SMTP 协议代理。由伊戈尔・赛索耶夫开发,2004 年首次公开版本,因稳定性强、资源消耗低、并发能力突出(支持高达 50,000 并发连接)被广泛应用,国内百度、京东、淘宝等大厂均在使用。

核心定位:作为系统入口,承担反向代理、负载均衡、动静分离等核心职责,是企业级应用架构的必备组件。

2. Nginx 核心优势

优势 说明
高性能 事件驱动 + 异步处理,并发能力强,适合高流量场景
高可靠性 支持 7*24 小时不间断运行,热部署无需重启
低资源消耗 轻量级设计,占用内存少,单机可支撑大量连接
灵活性强 配置文件简洁,支持多种自定义配置
扩展性好 模块化架构,可通过插件扩展功能(如缓存、SSL)
跨平台 支持 Linux、Unix、MacOS 等多种操作系统
安全性高 内置防 DDoS、SQL 注入等基础安全防护
多协议支持 除 HTTP/HTTPS 外,还支持 SMTP、POP3 等协议

3. 下载与基础操作

(1)下载地址

官方网址:nginx.org/download/,提供 Mainline(开发版)、Stable(稳定版)、Legacy(legacy 版),推荐生产环境使用 Stable 版。

(2)目录结构(解压后)
目录 / 文件 说明
conf 配置文件目录(核心为 nginx.conf)
contrib 辅助工具目录
docs 文档目录
html 默认静态资源目录
logs 日志文件目录(访问日志、错误日志)
temp 临时文件目录
nginx.exe Windows 平台启动程序
(3)启动与停止
bash 复制代码
# 启动(Windows 命令行,需切换到解压目录)
nginx.exe

# 启动验证:浏览器访问 http://localhost:80,出现 "Welcome to nginx!" 则成功
# 注意:安装目录不可含中文,否则启动报错

# 停止命令
nginx -s stop  # 快速停止(可能丢失未保存数据)
nginx -s quit  # 有序停止(安全关闭)

# 强制停止(Windows 适用)
taskkill /f /t /im nginx.exe

# 配置修改生效(热重载,无需重启)
nginx -s reload

二、核心功能一:反向代理(Nginx 核心能力)

1. 反向代理定义与对比

(1)正向代理 vs 反向代理
类型 核心特点 用途 访问链路
正向代理 客户端知道目标服务器,代理代表客户端访问 科学上网、缓存加速 客户端 → 正向代理 → 目标网站
反向代理 客户端不知道目标服务器,代理代表后端服务器提供服务 负载均衡、安全防护、统一入口 客户端 → 反向代理(Nginx) → 后端服务器群
(2)反向代理核心价值
  • 隐藏后端服务器地址,提升安全性;
  • 统一入口管理,简化配置;
  • 为后续负载均衡、动静分离奠定基础。

2. 反向代理配置示例

(1)简单反向代理(代理本地应用)
nginx 复制代码
http {
    server {
        listen 80;  # 监听端口
        server_name example.com;  # 域名
        
        location / {
            proxy_pass http://localhost:3000;  # 代理到本地3000端口应用
        }
    }
}
(2)完整基础配置(生产级)
nginx 复制代码
server {
    listen 80;
    server_name api.example.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_set_header X-Forwarded-Proto $scheme;
        
        # 超时配置
        proxy_connect_timeout 60s;  # 连接超时
        proxy_send_timeout 60s;     # 发送超时
        proxy_read_timeout 60s;      # 读取超时
        
        proxy_buffering off;  # 关闭代理缓冲(适用于实时应用)
    }
}
(3)带负载均衡的反向代理
nginx 复制代码
http {
    # 定义后端服务器组(负载均衡核心)
    upstream backend_servers {
        server 192.168.1.101:8080 weight=3;  # 权重3,承担30%请求
        server 192.168.1.102:8080 weight=2;  # 权重2,承担20%请求
        server 192.168.1.103:8080 weight=5;  # 权重5,承担50%请求
        
        max_fails=3;      # 失败3次标记为不可用
        fail_timeout=30s; # 30秒后重试不可用服务器
    }
    
    server {
        listen 80;
        server_name app.example.com;
        
        location / {
            proxy_pass http://backend_servers;  # 代理到服务器组
            
            # 失败重试配置
            proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
            proxy_next_upstream_tries 3;  # 最多重试3次
            
            # 保持长连接
            proxy_http_version 1.1;
            proxy_set_header Connection "";
        }
    }
}

三、核心功能二:负载均衡(高可用核心)

1. 负载均衡定义

将客户端请求智能分发到多台后端服务器,避免单台服务器过载,提升系统吞吐量、可用性和扩展性。

2. 基础配置

nginx 复制代码
http {
    # 1. 定义上游服务器组
    upstream backend_servers {
        server 192.168.1.101:8080;
        server 192.168.1.102:8080;
        server 192.168.1.103:8080;
    }
    
    # 2. 应用负载均衡
    server {
        listen 80;
        server_name app.example.com;
        
        location / {
            proxy_pass http://backend_servers;  # 指向服务器组
        }
    }
}

3. 核心负载均衡算法(5 种常用)

(1)轮询(Round Robin)- 默认
  • 配置:无需额外参数,按顺序分发请求;
  • 特点:简单公平,适用于后端服务器配置一致的场景;
  • 示例:
nginx 复制代码
upstream backend {
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;
    server 192.168.1.103:8080;
}
(2)权重轮询(Weighted Round Robin)
  • 配置:通过 weight 参数指定权重,权重越高处理请求越多;
  • 特点:适配服务器配置差异(CPU、内存不同);
  • 示例:
nginx 复制代码
upstream backend {
    server 192.168.1.101:8080 weight=3;  # 30%请求
    server 192.168.1.102:8080 weight=5;  # 50%请求
    server 192.168.1.103:8080 weight=2;  # 20%请求
}
(3)IP 哈希(IP Hash)- 会话保持
  • 配置:添加 ip_hash; 指令,基于客户端 IP 哈希分配;
  • 特点:同一 IP 始终访问同一服务器,适用于需要 Session 保持的场景;
  • 示例:
nginx 复制代码
upstream backend {
    ip_hash;  # 启用IP哈希
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;
}
(4)最少连接(Least Connections)
  • 配置:添加 least_conn; 指令,请求分发到当前连接数最少的服务器;
  • 特点:适配请求处理时间不均的场景(如长连接应用);
  • 示例:
nginx 复制代码
upstream backend {
    least_conn;  # 启用最少连接算法
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;
}
(5)一致性哈希(Consistent Hash)
  • 配置:hash $request_uri consistent;,基于请求 URI 哈希;
  • 特点:相同 URI 始终访问同一服务器,服务器扩容 / 缩容时影响最小;
  • 示例:
nginx 复制代码
upstream backend {
    hash $request_uri consistent;  # 基于URI的一致性哈希
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;
}

四、核心功能三:动静分离(性能优化关键)

1. 动静分离定义

静态资源请求 (图片、CSS、JS 等)与动态请求(API、业务逻辑、数据库操作)分开处理:

  • 静态资源:由 Nginx 直接处理(无需转发到后端),速度快;
  • 动态请求:转发到后端应用服务器(如 Java、Node.js 服务)处理。

2. 为什么需要动静分离?

  • 性能提升:Nginx 处理静态资源效率是应用服务器的 10-100 倍;
  • 降低负载:减少后端服务器的无效请求(如静态资源读取);
  • 缓存友好:静态资源可设置长时间缓存,减少重复请求。

3. 基础配置示例

nginx 复制代码
server {
    listen 80;
    server_name example.com;
    root /var/www/html;  # 静态资源根目录
    
    # 静态资源处理(正则匹配常见静态文件后缀)
    location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|svg)$ {
        expires 30d;  # 缓存30天
        access_log off;  # 不记录访问日志
        add_header Cache-Control "public, immutable";  # 缓存策略
    }
    
    # 动态API请求转发
    location /api/ {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
    
    # 前端SPA应用转发
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        
        # 支持WebSocket
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

4. 生产级完整配置(含优化)

nginx 复制代码
http {
    # 基础优化配置
    sendfile on;  # 开启高效文件传输
    tcp_nopush on;
    tcp_nodelay on;
    
    # 文件缓存配置
    open_file_cache max=10000 inactive=30s;
    open_file_cache_valid 60s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;
    
    # Gzip压缩(提升传输效率)
    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    gzip_types text/plain text/css text/xml text/javascript application/javascript application/json;
    
    server {
        listen 80;
        server_name www.example.com;
        root /var/www/example.com;
        
        # 1. 图片资源配置
        location ~* \.(jpg|jpeg|png|gif|webp|svg)$ {
            expires 365d;  # 缓存1年
            access_log off;
            add_header Cache-Control "public, immutable";
            
            # 防盗链(仅允许指定域名引用)
            valid_referers none blocked server_names *.example.com;
            if ($invalid_referer) {
                return 403;
            }
        }
        
        # 2. 样式/JS文件配置
        location ~* \.(css|js)$ {
            expires 30d;
            access_log off;
            add_header Cache-Control "public";
            gzip_static on;  # 启用预压缩文件
        }
        
        # 3. 字体文件配置(支持跨域)
        location ~* \.(woff|woff2|ttf|eot|otf)$ {
            expires 365d;
            access_log off;
            add_header Cache-Control "public, immutable";
            add_header Access-Control-Allow-Origin "*";
        }
        
        # 4. 动态API请求
        location /api/ {
            proxy_pass http://api_backend:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_connect_timeout 5s;
            proxy_read_timeout 30s;
            
            # 禁用缓存
            proxy_no_cache 1;
            proxy_cache_bypass 1;
        }
        
        # 5. WebSocket支持(如实时通讯)
        location /ws/ {
            proxy_pass http://websocket_backend:3000;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_read_timeout 3600s;  # 长连接超时
        }
        
        # 6. 禁止访问敏感文件
        location ~ /\. {
            deny all;  # 禁止访问隐藏文件(如.git)
        }
        location ~* \.(log|sql|bak|conf)$ {
            deny all;  # 禁止访问日志、配置等文件
        }
        
        # 7. 错误页面配置
        error_page 404 /404.html;
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root /usr/share/nginx/html;
            internal;
        }
    }
}

五、核心总结与关键注意事项

1. 核心配置口诀

  • 反向代理:proxy_pass 指向后端,真实 IP 头要传递;
  • 负载均衡:upstream 定义服务器组,算法按需选(轮询 / 权重 / IP 哈希);
  • 动静分离:静态资源直接处理,动态请求转发后端;
  • 优化配置:gzip 压缩省带宽,缓存策略减请求。

2. 生产环境关键注意事项

  • 端口占用:默认 80 端口若被占用,需修改 nginx.conf 中 listen 端口;
  • 配置检查:修改配置后,可通过 nginx -t 检查语法正确性;
  • 日志管理:定期清理 logs 目录日志,避免磁盘占满;
  • 安全加固:禁用不必要的模块,限制访问敏感目录,配置 HTTPS 替代 HTTP;
  • 性能调优:根据服务器配置调整 worker_processes(工作进程数)、worker_connections(最大连接数)。

3. 常见问题排查

  • 启动失败:检查端口是否被占用、安装目录是否含中文、配置文件语法错误;
  • 代理失效:确认 proxy_pass 地址正确,后端服务器可访问,防火墙未拦截;
  • 静态资源 404:检查 root 目录配置正确,文件路径与 URL 对应。
相关推荐
用户03284722207011 小时前
如何搭建本地yum源(上)
运维
ping某2 天前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工3 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智4 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_4 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
闪闪发亮的小星星4 天前
高斯光以及高斯光公式解释
笔记
施努卡机器视觉4 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造