全栈手账 订阅 RSS

Nginx 配置知识总结与面试题

Nginx 的配置与运维实践:讲解 master-worker 架构、配置文件层级结构,给出反向代理、负载均衡、HTTPS、静态资源缓存等常用配置示例,并附性能优化要点与面试题。

读了 15 分钟 更新于 8 月 5 日

一、Nginx 基础概念

1. 什么是 Nginx?

  • 高性能的 HTTP 和反向代理服务器
  • 事件驱动、异步非阻塞架构
  • 轻量级、内存占用少、并发能力强
  • 常用于静态资源服务、反向代理、负载均衡

2. Nginx 核心特点

  • 高并发:基于事件驱动,能处理数万级并发连接
  • 高性能:内存占用低,响应速度快
  • 模块化设计:支持多种模块扩展
  • 热部署:支持平滑升级和配置重载

3. Nginx 应用场景

  • 静态资源服务(HTML、CSS、JS、图片)
  • 反向代理(负载均衡、缓存)
  • API 网关
  • HTTPS 证书配置
  • 动静分离

二、Nginx 架构

1. 进程模型

code
┌─────────────────────────────────────────────┐│              Master Process                  ││  - 读取配置文件                              ││  - 管理 Worker 进程                          ││  - 监听信号(如 reload、stop)               │└───────────────────┬─────────────────────────┘                    │        ┌───────────┼───────────┐        ▼           ▼           ▼┌─────────────┐ ┌─────────────┐ ┌─────────────┐│ Worker 1    │ │ Worker 2    │ │ Worker N    ││ - 处理请求   │ │ - 处理请求   │ │ - 处理请求   ││ - 连接管理   │ │ - 连接管理   │ │ - 连接管理   │└─────────────┘ └─────────────┘ └─────────────┘

2. 事件驱动机制

  • 使用 epoll(Linux)或 kqueue(BSD)实现高效的事件监听
  • 每个 Worker 进程可以处理数千个并发连接
  • 非阻塞 I/O,避免线程阻塞

三、核心配置文件结构

1. 主配置文件 nginx.conf

nginx
# 全局配置user nginx;worker_processes auto;  # 工作进程数,通常设为 CPU 核心数error_log /var/log/nginx/error.log;pid /var/run/nginx.pid;# 事件配置events {    worker_connections 1024;  # 每个 Worker 最大连接数    use epoll;                # 使用 epoll 事件模型    multi_accept on;          # 尽可能多地接收连接}# HTTP 配置http {    include       /etc/nginx/mime.types;    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"';        access_log /var/log/nginx/access.log main;        sendfile on;              # 启用零拷贝    tcp_nopush on;            # 发送数据时合并包    tcp_nodelay on;           # 不延迟发送小数据包        keepalive_timeout 65;     # 长连接超时时间        # 包含其他配置文件    include /etc/nginx/conf.d/*.conf;}

2. Server 配置

nginx
server {    listen 80;    server_name example.com www.example.com;        # 根目录和默认页面    root /usr/share/nginx/html;    index index.html index.htm;        # 访问日志    access_log /var/log/nginx/example.access.log main;        # 错误页面    error_page 404 /404.html;    error_page 500 502 503 504 /50x.html;        # 位置匹配    location / {        try_files $uri $uri/ =404;    }}

四、常用配置示例

1. 反向代理

nginx
server {    listen 80;    server_name api.example.com;        location / {        proxy_pass http://127.0.0.1:3000;        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;    }}

2. 负载均衡

nginx
http {    upstream backend {        # 轮询(默认)        server 192.168.1.100:8080;        server 192.168.1.101:8080;        server 192.168.1.102:8080 backup;  # 备份服务器    }        server {        listen 80;        server_name example.com;                location / {            proxy_pass http://backend;            proxy_set_header Host $host;        }    }}

3. 负载均衡策略

策略 说明
round_robin 轮询(默认)
least_conn 最少连接数
ip_hash 基于客户端 IP 哈希
weight 加权轮询
nginx
upstream backend {    ip_hash;  # 基于 IP 哈希    server 192.168.1.100:8080 weight=3;    server 192.168.1.101:8080 weight=2;    server 192.168.1.102:8080;}

4. HTTPS 配置

nginx
server {    listen 443 ssl http2;    server_name example.com;        ssl_certificate /etc/nginx/ssl/example.crt;    ssl_certificate_key /etc/nginx/ssl/example.key;        ssl_session_timeout 1d;    ssl_session_cache shared:SSL:10m;    ssl_session_tickets off;        ssl_protocols TLSv1.2 TLSv1.3;    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;    ssl_prefer_server_ciphers off;        location / {        root /usr/share/nginx/html;        index index.html;    }}# HTTP 重定向到 HTTPSserver {    listen 80;    server_name example.com;    return 301 https://$server_name$request_uri;}

5. 静态资源缓存

nginx
server {    listen 80;    server_name example.com;        location /static/ {        root /var/www;        expires 30d;           # 缓存 30 天        add_header Cache-Control "public, immutable";    }        location ~* \.(jpg|jpeg|png|gif|svg|css|js)$ {        root /var/www;        expires 7d;        add_header Cache-Control "public";    }}

6. Gzip 压缩

nginx
http {    gzip on;    gzip_vary on;    gzip_min_length 1024;    gzip_types text/plain text/css application/json application/javascript               text/xml application/xml application/xml+rss text/javascript;}

7. 限流配置

nginx
http {    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;        server {        location /api/ {            limit_req zone=mylimit burst=20 nodelay;            proxy_pass http://backend;        }    }}

8. 防盗链

nginx
server {    listen 80;    server_name example.com;        location ~* \.(jpg|png|gif)$ {        valid_referers none blocked example.com *.example.com;        if ($invalid_referer) {            return 403;        }    }}

五、常用命令

bash
# 启动 Nginxnginx# 停止 Nginxnginx -s stop# 优雅停止nginx -s quit# 重新加载配置nginx -s reload# 测试配置文件nginx -t# 查看版本nginx -v# 查看详细信息nginx -V

六、Nginx 模块

1. 核心模块

  • ngx_http_core_module:核心 HTTP 功能
  • ngx_http_access_module:访问控制
  • ngx_http_auth_basic_module:基本认证
  • ngx_http_gzip_module:Gzip 压缩

2. 第三方模块

  • ngx_http_rewrite_module:URL 重写
  • ngx_http_proxy_module:反向代理
  • ngx_http_upstream_module:负载均衡
  • ngx_http_ssl_module:SSL/TLS 支持

七、性能优化

1. Worker 进程优化

nginx
worker_processes auto;        # 设置为 CPU 核心数worker_cpu_affinity auto;     # 绑定 CPU 核心worker_rlimit_nofile 65535;   # 增大文件描述符限制

2. 连接优化

nginx
events {    worker_connections 10240;  # 增大连接数    use epoll;    multi_accept on;}

3. 缓存优化

nginx
http {    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;        server {        location /api/ {            proxy_cache my_cache;            proxy_cache_valid 200 302 10m;            proxy_cache_valid 404 1m;        }    }}

八、常见面试题

基础概念

Q1:Nginx 是什么?它的主要特点是什么?

  • 高性能 HTTP 和反向代理服务器
  • 事件驱动、异步非阻塞架构
  • 高并发、低内存占用、热部署

Q2:Nginx 的进程模型是怎样的?

  • Master 进程:管理配置和 Worker 进程
  • Worker 进程:处理实际请求
  • 每个 Worker 进程独立处理连接,避免锁竞争

Q3:Nginx 和 Apache 的区别?

维度 Nginx Apache
架构 事件驱动 多进程/多线程
并发能力 高(万级) 中等(千级)
内存占用 低 高
静态资源 优秀 一般

配置相关

Q4:如何配置反向代理?

  • 使用 proxy_pass 指令
  • 设置 proxy_set_header 传递请求头
  • 配置超时时间和缓冲区

Q5:Nginx 有哪些负载均衡策略?

  • 轮询(默认)
  • 最少连接数(least_conn)
  • IP 哈希(ip_hash)
  • 加权轮询(weight)

Q6:如何配置 HTTPS?

  • 配置 SSL 证书和密钥
  • 设置 SSL 协议版本和加密套件
  • 配置 HTTP 到 HTTPS 的重定向

进阶问题

Q7:Nginx 如何处理请求的?

  1. 接收连接
  2. 解析请求行和请求头
  3. 查找匹配的 Server
  4. 查找匹配的 Location
  5. 处理请求(静态文件或反向代理)
  6. 返回响应

Q8:什么是 Keep-Alive?如何配置?

  • 保持长连接,避免频繁建立 TCP 连接
  • 通过 keepalive_timeout 配置超时时间
  • 通过 keepalive_requests 配置每个连接处理的请求数

Q9:如何实现动静分离?

  • 将静态资源和动态请求分开处理
  • 静态资源直接返回,动态请求转发到后端
  • 使用 location 匹配不同类型的请求

Q10:Nginx 如何实现限流?

  • 使用 limit_req_zone 定义限流规则
  • 使用 limit_req 应用限流规则
  • 配置 burst 和 nodelay 参数处理突发流量

性能优化

Q11:如何优化 Nginx 性能?

  • 调整 Worker 进程数和连接数
  • 启用 sendfile 和 tcp_nopush
  • 配置 Gzip 压缩
  • 使用缓存减少后端压力
  • 优化 SSL 配置

Q12:Nginx 日志分为哪几种?

  • access_log:访问日志,记录所有请求
  • error_log:错误日志,记录服务器错误

实战经验

Q13:如何实现 URL 重写?

  • 使用 rewrite 指令
  • 支持正则表达式匹配
  • 可以重定向或内部重写

Q14:如何配置防盗链?

  • 使用 valid_referers 指令
  • 检查 Referer 请求头
  • 对于非法请求返回 403

Q15:Nginx 如何处理大文件上传?

  • 调整 client_max_body_size
  • 配置 client_body_buffer_size
  • 使用 proxy_request_buffering off 禁用请求缓冲

九、注意事项

  1. 配置语法:Nginx 配置文件使用分号结尾,注意括号匹配
  2. 路径问题:使用绝对路径,避免相对路径
  3. 权限问题:确保 Nginx 进程对文件和目录有访问权限
  4. 日志管理:定期清理日志文件,避免磁盘空间不足
  5. 安全加固:禁用不必要的模块,限制访问权限

十、总结

Nginx 是一个高性能的 Web 服务器和反向代理服务器,广泛应用于现代 Web 架构中。掌握其核心配置、负载均衡、反向代理和性能优化技巧,是成为优秀运维工程师或后端开发者的必备技能。

前端、后端、部署、客服都是我一个人。写这里的东西都是真踩过的坑,不是抄来的教程。