This repository has been archived on 2026-05-19. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
2026-04-20 22:47:51 +08:00

10 KiB
Raw Permalink Blame History

user nginx;
worker_processes 1;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
}

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;
    types_hash_max_size 2048;

    # Gzip 压缩
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml+rss application/rss+xml font/truetype font/opentype application/vnd.ms-fontobject image/svg+xml;

    server {
        listen 80;
        server_name localhost;

        # 前端静态文件
        root /usr/share/nginx/html;
        index index.html;

        # 前端路由支持
        location / {
            try_files $uri $uri/ /index.html;
        }

        # 后端 API 代理
        location /api/ {
            proxy_pass http://backend:8080;
            proxy_http_version 1.1;

            # 代理请求头
            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;

            # WebSocket 支持(如果需要)
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";

            # 超时设置
            proxy_connect_timeout 60s;
            proxy_send_timeout 60s;
            proxy_read_timeout 60s;
        }
    }
}

这是一个非常标准、功能完善、优化级别很高的 Nginx 配置,通常用于部署一个结合了前端 SPA(单页应用)和后端 API的现代 Web 应用。

我将从以下几个部分为您进行详细的解读:


🚀 整体结构与功能总结

该配置的职责是:

  1. 作为反向代理(Reverse Proxy):它接收所有来自外部(localhost:80)的请求。
  2. 服务前端静态资源:负责提供基于 root 目录的 HTML、CSS、JS 等文件,并支持前端路由(SPA)。
  3. 转发后端 API 请求:将所有以 /api/ 开头的请求,转发给指定的后端服务(http://backend:8080)。
  4. 优化性能:通过设置 Gzip 压缩、HTTP 连接优化和定时器设置,确保传输效率。

🔍 详细配置解读(按代码块)

1. 全局配置(Global Scope)

这部分设置了 Nginx 整个运行环境的参数。

指令 含义 作用和解释
user nginx; 用户权限 指定 Nginx 使用 nginx 系统用户来运行,这是最佳实践,避免使用 root。
worker_processes 1; 工作进程 设置工作进程数量。1 表示使用单个进程。理想情况下,应设置为 auto 或 CPU 核数,以提高并发能力。
error_log ... warn; 错误日志 配置错误日志路径和级别。warn 级别表示只记录警告及以上级别的错误。
pid /var/run/nginx.pid; 进程ID文件 指定存储 Nginx 主进程 ID 的文件路径。
events { ... } 事件处理 负责管理网络连接(Connection)。
worker_connections 1024; 连接数限制 每个工作进程允许打开的最大并发连接数。1024 是一个常见的保守设置。

2. HTTP 块配置(http Block)

这块定义了所有 HTTP 服务通用的配置。

指令 含义 作用和解释
include /etc/nginx/mime.types; 文件类型包含 引入标准的 MIME 类型定义文件,使 Nginx 能够正确识别和发送文件的 Content-Type 头部。
default_type application/octet-stream; 默认类型 如果无法确定文件类型,则默认将其视为二进制流。
log_format main '...' 自定义日志格式 定义了访问日志的详细格式。它记录了请求来源 IP、时间、请求方式/路径、HTTP 状态码、传输字节数等,非常完整。
access_log ... main; 访问日志 指定使用前面定义的 main 格式,并将访问记录写入 /var/log/nginx/access.log。
sendfile on; 性能优化 启用 sendfile 功能,允许 Nginx 直接将内核缓冲区的内容发送给客户端,跳过用户空间的复制,极大地提升文件传输效率。
tcp_nopush on; 性能优化 当发送多个数据包时,确保这些数据包被一次性发送,避免网络延迟和不必要的包分割。
tcp_nodelay on; 性能优化 禁用发送数据包的缓冲机制,数据发送后立即离开,降低延迟,适用于需要低延迟的应用。
keepalive_timeout 65; 连接保持 设置客户端与服务器保持空闲连接的最大秒数(这里是 65 秒)。
gzip on; 压缩开启 启用 Gzip 压缩,减少传输数据量,提升速度。
gzip_vary on; 缓存优化 当启用压缩后,所有响应头都必须包含 Vary: Accept-Encoding,确保缓存服务器不会错误地缓存未压缩或不同压缩级别的内容。
gzip_proxied any; 压缩范围 无论请求是否来自代理,都进行压缩。
gzip_types ... 压缩类型 列出需要被 Gzip 压缩的文件类型(如文本、JS、CSS、JSON)。

3. 服务器配置(server Block)

这部分定义了一个虚拟主机(Virtual Host),决定了 Nginx 在哪个端口和哪个域名上监听请求。

指令 含义 作用和解释
listen 80; 监听端口 表示该服务器实例监听所有进来的 HTTP 流量(端口 80)。
server_name localhost; 虚拟域名 限制此配置只响应 localhost 的请求。

4. 路径匹配配置(location Blocks)

这是最核心的逻辑部分,决定了不同 URL 路径如何被处理。

🅰️ 前端静态文件处理 (SPA 路由支持)

# 前端静态文件
root /usr/share/nginx/html;
index index.html;

# 前端路由支持
location / {
    try_files $uri $uri/ /index.html;
}
  • root /usr/share/nginx/html;: 指定所有静态文件的根目录。
  • location /: 匹配所有路径(所有请求)。
  • try_files $uri $uri/ /index.html;: 这是支持单页应用(SPA)的关键指令。
    1. $uri: Nginx 尝试从 root 目录查找请求的完整文件(例如:/js/main.js)。
    2. $uri/: 如果找不到文件,则尝试查找是否是请求的一个目录。
    3. /index.html: 如果前两者都失败(即,用户访问的是一个不存在的路径,但这个路径应该被 SPA 的前端路由接管,如 /user/profile),则内部重定向(Rewrite)请求到 /index.html。
    • 总结: 确保所有的请求最终都会被 index.html 接收,让前端 JavaScript 框架(Vue/React/Angular)去判断路由,从而实现 SPA 的前端路由。

🅱️ 后端 API 代理处理

location /api/ {
    proxy_pass http://backend:8080;
    # ... 其他配置 ...
}
  • location /api/: 匹配所有以 /api/ 开头的请求(例如:/api/users)。
  • proxy_pass http://backend:8080;: 这是核心代理指令。它将所有匹配的请求,转发到内部网络服务 backend 的 8080 端口。

代理请求头设置 (Headers)

这些指令至关重要,因为它们确保了后端服务(backend)能够获取到客户端的真实信息,而不是代理服务器本身的 IP 地址。

  • proxy_http_version 1.1;: 强制代理使用 HTTP/1.1,确保高级特性(如 Connection 头)可用。
  • proxy_set_header Host $host;: 告诉后端服务客户端实际请求的 Host 名称。
  • proxy_set_header X-Real-IP $remote_addr;: 将客户端的真实 IP 地址传递给后端。
  • proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;: 记录所有代理跳过的 IP 地址链(用于安全审计和日志)。
  • proxy_set_header X-Forwarded-Proto $scheme;: 告知后端服务原始请求是通过 HTTP 还是 HTTPS 传输的。

WebSocket 支持

  • proxy_set_header Upgrade $http_upgrade;
  • proxy_set_header Connection "upgrade";: 这两行代码是专门为了支持 WebSocket 连接的。WebSocket 需要特殊的 HTTP 升级(Upgrade)头,用于从传统的 HTTP 长连接模式切换到双向的 WS 协议。

超时设置

  • proxy_connect_timeout 60s;:连接后端服务时等待的最大时间。
  • proxy_send_timeout 60s;:将请求发送给后端时等待的最大时间。
  • proxy_read_timeout 60s;:从后端服务读取响应数据时等待的最大时间。
  • 目的: 将所有超时设置设置为 60 秒,确保即使后端处理耗时较长(比如复杂的报告生成),Nginx也不会提前中断连接。

🌟 总结与最佳实践点

  1. 职责分离完美体现: 通过 location /api/ 和 location / 的隔离,Nginx完美地将“站内服务(静态资源)”和“后端数据服务(API)”分离,使得架构清晰。
  2. 性能优化到位: 包含了 sendfile、tcp_nopush、tcp_nodelay 以及 gzip 等一系列优化,配置的性能起点很高。
  3. 健壮性高: try_files 的使用确保了即使是客户端路径错误,应用也能重定向到根页面,避免出现“文件找不到”的错误,保证了用户体验。
  4. 反向代理标准配置: 后端代理部分的配置(特别是 X-Real-IP 和 X-Forwarded-* 头)是所有企业级反向代理的标配,非常专业。

建议改进点(如果适用):

  1. Worker Processes: 如果部署在服务器上,建议将 worker_processes 1; 改为 worker_processes auto; 或根据 CPU 核数设置,以充分利用服务器性能。
  2. HTTPS/SSL: 实际生产环境中,server 块应该增加 listen 443 ssl;,并在其中配置 SSL 证书,确保所有的通信都是加密的。