Nginx笔记

发布于:2025-08-02 ⋅ 阅读:(13) ⋅ 点赞:(0)
一、Nginx 基础概念
  1. Nginx 是什么?
    • 一款高性能的HTTP 服务器反向代理服务器负载均衡器
    • 特点:轻量级、高并发(支持 10 万 + 并发连接)、低内存占用、可扩展性强。
  1. Nginx 与 Apache 的核心区别?
对比项 Nginx Apache
并发处理 基于异步非阻塞 IO 模型(事件驱动) 基于多进程 / 多线程模型
内存占用 低(并发 1 万时约 2-3MB / 进程) 高(并发 1 万时内存占用明显更高)
适用场景 高并发静态资源、反向代理、负载均衡 动态内容(如 PHP 模块集成)
  1. Nginx 的工作模式(master-worker 模型)
    • master 进程:管理 worker 进程(启动、重启、关闭),读取配置文件。
    • worker 进程:处理实际请求(并发连接),数量通常设为CPU 核心数(充分利用多核)。
    • 优势:某个 worker 进程异常退出时,master 会自动重启,保证服务可用性。
二、Nginx 核心功能及应用场景
  1. 反向代理
    • 定义:客户端请求 Nginx,Nginx 转发到后端服务器,再将结果返回客户端(客户端不知道后端服务器)。
    • 作用:隐藏后端服务 IP、统一入口管理、实现动静分离。
    • 核心配置:
location /api/ {
    proxy_pass http://backend_server;  # 转发到后端服务
    proxy_set_header Host $host;      # 传递客户端Host头
    proxy_set_header X-Real-IP $remote_addr;  # 传递客户端真实IP
}
  1. 负载均衡
    • 定义:将客户端请求均匀分发到多个后端服务器,避免单点压力过大。
    • 常用策略(upstream模块):
策略 说明 适用场景
轮询(默认) 按顺序依次分发请求 后端服务器性能一致时
权重(weight) server 192.168.1.1 weight=5; 后端服务器性能不均(权重越高分配越多)
ip_hash 同一 IP 请求固定分发到同一服务器 需保持会话的场景(如登录状态)
least_conn 优先分发到连接数最少的服务器 后端负载差异大时
    • 配置示例:
upstream backend {
    ip_hash;  # 启用IP哈希策略
    server 192.168.1.101 weight=3;  # 权重3
    server 192.168.1.102 weight=2;  # 权重2
    server 192.168.1.103 down;      # 标记为不可用
}

server {
    listen 80;
    location / {
        proxy_pass http://backend;  # 引用upstream
    }
}
  1. 静态资源服务
    • 优势:Nginx 处理静态资源(HTML、CSS、JS、图片)效率远高于 Tomcat 等应用服务器。
    • 核心配置:
server {
    listen 80;
    server_name static.example.com;
    root /usr/share/nginx/static;  # 静态资源目录
    
    # 缓存配置(减少重复请求)
    location ~* \.(jpg|jpeg|png|css|js)$ {
        expires 7d;  # 缓存7天
        add_header Cache-Control "public";
    }
}
  1. 动静分离
    • 定义:静态资源(HTML、图片)由 Nginx 直接处理,动态资源(JSP、PHP)转发到后端应用服务器。
    • 作用:减轻后端服务器压力,提高访问速度。
    • 配置示例:
server {
    listen 80;
    server_name example.com;
    
    # 静态资源(Nginx直接处理)
    location ~* \.(html|css|js|jpg)$ {
        root /usr/share/nginx/static;
    }
    
    # 动态资源(转发到Tomcat)
    location /api {
        proxy_pass http://tomcat_server:8080;
    }
}
  1. SSL/TLS 加密(HTTPS)
    • 作用:通过 SSL 证书加密传输,保障数据安全。
    • 核心配置:
server {
    listen 443 ssl;
    server_name example.com;
    
    # SSL证书配置
    ssl_certificate /etc/nginx/ssl/example.crt;
    ssl_certificate_key /etc/nginx/ssl/example.key;
    
    # 加密协议优化
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;
}

# HTTP自动跳转HTTPS
server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}
三、Nginx 配置文件结构
  1. 核心配置文件:/etc/nginx/nginx.conf(主配置)、/etc/nginx/conf.d/(子配置,通过include引入)。

  2. 配置结构(从外到内)

# 1. 全局块(main):影响整个Nginx
user nginx;  # 运行用户
worker_processes auto;  # worker进程数(建议设为CPU核心数)
error_log /var/log/nginx/error.log;  # 错误日志

# 2. 事件块(events):影响Nginx网络连接
events {
    worker_connections 10240;  # 每个worker最大连接数
    use epoll;  # 事件驱动模型(Linux推荐epoll)
}

# 3. HTTP块:HTTP协议相关配置(可包含多个server)
http {
    include mime.types;  # MIME类型
    default_type application/octet-stream;
    
    # 4. 上游服务器(负载均衡)
    upstream backend {
        server 192.168.1.101;
        server 192.168.1.102;
    }
    
    # 5. 服务器块(server):虚拟主机配置
    server {
        listen 80;  # 监听端口
        server_name example.com;  # 域名
        
        # 6. location块:匹配URL路径,处理请求
        location / {
            root /usr/share/nginx/html;
            index index.html;
        }
    }
}
四、Nginx 性能优化核心配置
  1. 并发连接优化
events {
    worker_connections 10240;  # 每个worker最大连接数(默认1024)
    multi_accept on;  # 允许worker同时接收多个连接
}
    • 最大并发数 = worker_processes × worker_connections
  1. 连接超时优化
http {
    keepalive_timeout 65;  # 长连接超时时间(默认75s)
    tcp_nodelay on;  # 禁用Nagle算法,减少延迟
    client_header_timeout 10s;  # 客户端请求头超时
    client_body_timeout 10s;    # 客户端请求体超时
}
  1. 缓存与压缩优化
# 启用gzip压缩(减小传输体积)
gzip on;
gzip_types text/plain text/css application/json;  # 压缩指定类型
gzip_comp_level 5;  # 压缩级别(1-9,5平衡性能和压缩率)

# 静态资源缓存
location ~* \.(jpg|css|js)$ {
    expires 30d;  # 缓存30天
    add_header Cache-Control "public, max-age=2592000";
}
  1. CPU 亲和性(减少进程切换)
worker_processes 4;  # 4核CPU
worker_cpu_affinity 0001 0010 0100 1000;  # 绑定每个worker到不同核心
五、Nginx 常见问题及解决方案
  1. 502 Bad Gateway
    • 原因:后端服务器未启动、后端崩溃、连接超时。
    • 排查:
      1. 检查后端服务器是否正常:curl http://backend_server
      1. 增加超时配置:
location / {
    proxy_pass http://backend;
    proxy_connect_timeout 30s;  # 连接后端超时
    proxy_read_timeout 60s;     # 读取后端响应超时
}
  1. 504 Gateway Timeout
    • 原因:后端处理请求超时(如数据库查询慢)。
    • 解决:
      1. 优化后端业务逻辑(如减少查询耗时)。
      1. 调整 Nginx 超时参数:proxy_read_timeout 120s;
  1. Nginx 启动失败

    • 常见原因:配置文件语法错误(nginx -t检查)、端口被占用(netstat -tulpn | grep 80)。
  1. 如何实现 Nginx 高可用?
    • 方案:结合Keepalived实现主从架构,主节点故障时自动切换到从节点。
    • 核心:双机共享虚拟 IP(VIP),通过健康检查监测 Nginx 状态。
六、Nginx 高频面试题
  1. Nginx 的 worker 进程数为什么设为 CPU 核心数?
    • 答:Nginx 基于异步非阻塞模型,每个 worker 进程可处理多个连接;绑定 CPU 核心能减少进程切换开销,充分利用多核性能。
  1. 反向代理和正向代理的区别?
    • 正向代理:代理客户端(如 VPN),客户端知道目标服务器。
    • 反向代理:代理服务器(如 Nginx),客户端不知道后端服务器。
  1. Nginx 负载均衡的 ip_hash 策略解决了什么问题?
    • 答:解决会话保持问题(如用户登录状态),确保同一用户的请求始终分发到同一后端服务器。
  1. 如何查看 Nginx 的访问日志和错误日志?
    • 访问日志:默认/var/log/nginx/access.log(记录请求来源、URL、状态码)。
    • 错误日志:默认/var/log/nginx/error.log(记录启动、运行错误)。
  1. Nginx 如何实现限流?
    • 用limit_req模块限制请求频率:
http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;  # 每IP每秒10个请求
    
    server {
        location / {
            limit_req zone=one burst=5;  # 允许5个突发请求
        }
    }
}