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 对应。
相关推荐
宠..2 小时前
为单选按钮绑定事件
运维·服务器·开发语言·数据库·c++·qt·microsoft
QC七哥2 小时前
基于vnstat监控服务器的网卡流量
运维·服务器·监控·vnstat
三品吉他手会点灯2 小时前
STM32F103 学习笔记-20-通信的基本概念
笔记·stm32·单片机·嵌入式硬件·学习
悠哉悠哉愿意2 小时前
【嵌入式学习笔记】GPIO与LED
笔记·单片机·嵌入式硬件·学习
怀旧,2 小时前
【Linux系统编程】14. 库使用与原理(上)
linux·运维·服务器
QT 小鲜肉2 小时前
【Linux命令大全】001.文件管理之locate命令(实操篇)
linux·运维·服务器·chrome·笔记
阿方索2 小时前
Docker
运维·docker·容器
Vic101012 小时前
Redis防重复点击与分布式锁实现方案对比笔记
java·redis·笔记·分布式
风好衣轻2 小时前
Ubuntu单卡5090部署VeRL:从安装到运行
linux·运维·ubuntu