流量路径

用户 DNS 解析 网络路由 Nginx(:80) 后端服务

nginx 基础

1. 核心工作机制:异步非阻塞

Nginx 之所以能处理百万级的并发连接(C10K 问题),其核心在于 Event-loop(事件循环) 机制。

  • Master-Worker 进程模型: 一个 Master 进程负责管理,多个 Worker 进程处理请求。

  • 非阻塞 I/O: 与传统的 Apache(每个请求一个线程)不同,Nginx 的一个线程可以处理数千个并发请求,极大地降低了内存开销。

2. 三大核心应用场景

在实际部署中,你几乎总会用到以下功能:

  • 反向代理 (Reverse Proxy): 隐藏真实服务器 IP,用户访问 Nginx,由 Nginx 转发给后端的 Node.js、Java 或 Python 服务。

  • 负载均衡 (Load Balancing): 当后端有多台服务器时,Nginx 可以通过 upstream 模块实现流量分配(轮询、加权轮询、IP Hash 等)。

  • 静态资源服务: Nginx 处理静态文件(HTML/CSS/JS/图片)的效率远高于应用服务器,通常配合 gzip 压缩和 expires 缓存头使用。

3. 配置文件的“潜规则”

Nginx 的配置具有层级性,理解 http -> server -> location 的嵌套关系至关重要:

模块层级作用范围
http全局配置,如日志格式、MIME 类型、连接超时等。
server虚拟主机配置,定义监听端口和域名(Host)。
location路由匹配规则,决定具体的请求由哪个目录或反向代理处理。

专家提示: 务必掌握 location 的匹配优先级(精确匹配 = > 前缀匹配 ^~ > 正则匹配 ~),这是调试 404 或 502 错误时最常出问题的地方。

最佳实践建议

永远不要在生产环境中直接修改配置后盲目重启。养成以下习惯:

  1. macos 安装 brew install nginx
  2. 修改后执行 nginx -t 检查语法错误。
  3. 使用 nginx -s reload 实现热加载,确保服务不断流。

macos 使用

# 启动
brew services start nginx
# 停止
brew servcies stop nginx
 
# 重启
nginx -s reload

配置文件

核心的配置文件

  • /etc/nginx/nginx.conf - 主要配置文件(http, server, location)
  • /etc/nginx/sites-available — 使用 Nginx 托管的每个网站或 Web 应用程序的单独配置文件。此目录中的每个文件代表一个潜在站点,但 Nginx 尚未主动提供服务
  • /etc/nginx/sites-enabled — 虽然sites-available包含潜在的站点配置,但sites-enabled包含指向您希望激活并让Nginx提供服务的配置的符号链接。仅主动提供此目录中链接的站点
  • 小型项目可以直接在 servers 目录中添加配置文件

常见状态码

1. 核心状态码:快速定位故障点

Nginx 返回的状态码能瞬间告诉你:问题出在 Nginx 本身,还是后端的应用服务器。

状态码含义专家解读
403 Forbidden拒绝访问通常是文件权限问题,或者 allow/deny 指令拦截了你的 IP。
404 Not Found找不到资源检查 rootalias 路径配置是否正确,或者是 location 匹配失效。
502 Bad Gateway网关错误最常见。说明后端服务(如 Node.js, PHP, Go)挂了,或者正在重启,Nginx 找不到它。
504 Gateway Timeout网关超时后端服务活着,但处理请求太慢,超过了 Nginx 的 proxy_read_timeout 时间。
499 Client Closed Request客户端主动关闭非标准状态码。通常是后端处理太久,用户等不及刷新页面或断开了连接。

2. 关键响应头(Headers):调试的“听诊器”

在浏览器开发者工具(F12)的 Network 面板中,这几个 Header 是判断 Nginx 行为的关键:

  • Server: 通常显示 nginx/x.x.x

    • 专家建议: 生产环境下建议通过 server_tokens off; 隐藏版本号,防止黑客针对特定版本漏洞攻击。
  • X-Cache (自定义): 如果你配置了 Nginx 缓存,通常会添加这个 Header。

    • HIT: 请求直接命中 Nginx 缓存,速度极快。

    • MISS: 缓存未命中,请求透传给了后端应用。

  • X-Forwarded-For: 虽然它是请求头,但在调试返回结果时,你要确认 Nginx 是否正确传递了客户端的真实 IP,否则后端日志里记录的全是 Nginx 的内网 IP。

3. Nginx 错误日志(Error Log):终极法宝

当你看到 500/502/504 时,不要猜,直接看 Nginx 错误日志。它是 Nginx “内心独白”的记录地:

案例分析:

如果日志显示 (13: Permission denied) while reading upstream,意味着 Nginx 运行账号(通常是 nginx/www-data)没有权限读取你存放网页的目录。

4. 如何自定义返回结果?

为了提升用户体验和安全性,作为专家,我建议你掌握以下高级返回技巧:

  • 自定义 404/50x 页面: 不要让用户看到冷冰冰的默认报错。

    Nginx

    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    
  • 返回 JSON 结果: 在 API 场景下,可以直接让 Nginx 返回 JSON,而不必经过后端。

    Nginx

    location /health {
        default_type application/json;
        return 200 '{"status":"up","message":"Nginx is alive"}';
    }