Skip to content

Nginx 入门指南与核心配置实践 ​

Nginx (Engine X) 是一款高性能的 HTTP 和反向代理服务器,同时也是一个 IMAP/POP3/SMTP 代理服务器。它因其稳定性、低资源消耗和高并发处理能力而闻名于世。

1. 核心架构与设计思想 ​

Nginx 采用 事件驱动 (Event-driven) 的异步非阻塞处理方式,这与 Node.js 的机制非常相似。

  • 轻量级:启动极快,单个进程可处理数万并发连接。
  • 稳定性:主进程 (Master) 负责管理配置和子进程 (Worker),单个子进程崩溃不影响整体服务。
  • 热部署:支持在不停止服务的情况下平滑更新配置和升级版本。

Web 服务器 vs. 应用服务器 ​

  • Web 服务器:负责 HTTP 协议解析,处理静态资源(HTML, CSS, JS),如 Nginx, Apache, IIS。
  • 应用服务器:处理业务逻辑,如 Tomcat, Kestrel, Weblogic。现代架构通常将 Nginx 置于前端,应用服务器置于后端。

2. 快速上手:安装与运维 (以 Mac 为例) ​

2.1 安装与卸载 ​

推荐使用 Homebrew 工具进行管理:

bash
# 安装
brew install nginx
# 验证安装
nginx -v
# 卸载
brew uninstall nginx

2.2 基础运维指令 ​

操作指令说明
启动sudo nginx默认监听 80 或 8080 端口
停止sudo nginx -s stop快速关闭
优雅退出sudo nginx -s quit处理完当前请求后关闭
热重启sudo nginx -s reload常用,修改配置后平滑生效
检查配置sudo nginx -t检查配置文件语法是否正确

3. 三大核心应用场景实践 ​

3.1 动静分离 (Static/Dynamic Separation) ​

将静态资源直接由 Nginx 响应,而将动态请求转发给后端服务器,显著减轻应用服务器压力。

配置示例:

nginx
server {
    listen       80;
    server_name  localhost;

    # 1. 静态资源路径 (使用正则匹配)
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css|html)$ {
        root /usr/local/var/www/my-project;
        expires 30d; # 设置缓存
    }

    # 2. 动态请求转发
    location /api/ {
        proxy_pass http://localhost:5000;
    }
}

3.2 反向代理 (Reverse Proxy) ​

3.2.1 什么是反向代理? ​

反向代理其实就类似你去找代购帮你买东西。

  • 正向代理:你(客户端)很明确知道你要买什么,但因为网络限制(如墙)去不了,于是你通过一个代理服务器去访问目标网站。此时,目标服务器不知道真正的访问者是谁,它只知道是代理服务器在访问它。
  • 反向代理:你(客户端)向 Nginx 发送请求,你并不关心 Nginx 后面有多少台服务器,也不关心它是从哪台机器上拿到的数据。此时,Nginx 代表了整个后端集群。

3.2.2 反向代理的核心作用 ​

  • 安全隔离:隐藏后端真实的服务器 IP,外网无法直接攻击内网节点。
  • 负载均衡:作为流量分发的入口。
  • SSL 卸载:在 Nginx 端统一配置 HTTPS,后端应用服务器可以使用轻量级的 HTTP。
nginx
location / {
    proxy_pass http://localhost:8000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

3.3 负载均衡 (Load Balancing) ​

当单台服务器无法支撑流量时,通过集群分发压力。

3.3.1 常用分配策略 ​

  1. 轮询 (Round Robin, 默认):按时间顺序逐一分配到不同的后端服务器。如果后端服务器宕机,能自动剔除。

  2. 权重 (Weight):指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。

    nginx
    upstream backend {
        server 192.168.0.1 weight=2;
        server 192.168.0.2 weight=8; # 80% 的流量会分发到这里
    }
  3. Ip_hash:每个请求按访问 IP 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 Session 共享问题。

  4. Fair (第三方):按后端服务器的响应时间来分配请求,响应时间短的优先分配。

3.3.2 健康检查 ​

Nginx 具备“心跳检查”功能。如果某台后端服务器在一段时间内连接失败次数超过设定值,Nginx 会认为该服务器异常,并暂时停止向其分发请求,直到它恢复正常。


4. Nginx 配置文件结构详解 ​

标准的 nginx.conf 由以下几个块组成:

nginx
# 1. 全局块:配置运行 Nginx 服务器的用户组、worker 进程数、错误日志路径等
worker_processes  1;

# 2. events 块:配置网络连接,如每个 worker 的最大连接数
events {
    worker_connections  1024;
}

# 3. http 块:最核心的部分,包括嵌套的 server 块、负载均衡定义、日志定义等
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile      on;

    # 4. server 块:配置虚拟主机
    server {
        listen       8080;
        server_name  localhost;

        # 5. location 块:配置 URL 路由匹配规则
        location / {
            root   html;
            index  index.html;
        }
    }
}

5. 生产环境安全与性能调优 ​

5.1 性能优化红线 ​

  1. Gzip 压缩:开启 gzip on;。这能显著减少静态资源(JS, CSS)的传输体积,首屏加载速度通常能提升 3-5 倍。
  2. Keepalive 连接:增加 keepalive_timeout,减少频繁创建/销毁 TCP 连接的开销。
  3. Sendfile 模式:开启 sendfile on;,允许 Nginx 直接在内核空间传输文件,不经过用户缓冲区,极大提升 IO 性能。

5.2 安全加固 ​

  1. 限制请求频率 (Rate Limiting):使用 limit_req 模块防止暴力破解和 DDoS 攻击。

  2. 屏蔽敏感路径:通过正则匹配屏蔽 .git, .env 等敏感文件。

    nginx
    location ~ /\.(git|env|svn) {
        deny all;
    }
  3. 隐藏版本号:配置 server_tokens off;,防止攻击者通过 Nginx 版本号寻找已知漏洞。

6. 进阶配置:Rewrite 与模块化管理 ​

6.1 URL 重写 (Rewrite) ​

常用于域名跳转或强制 HTTPS。

nginx
server {
    listen 80;
    server_name example.com;
    # 强制将所有 HTTP 请求重定向到 HTTPS
    return 301 https://$server_name$request_uri;
}

6.2 模块化配置 (Include) ​

当站点变多时,nginx.conf 会变得臃肿。建议使用 include 指令将每个站点的配置独立出来。

nginx
http {
    # 加载 conf.d 目录下所有的 .conf 文件
    include /usr/local/etc/nginx/conf.d/*.conf;
}

7. 常用运维工具与排障 ​

7.1 日志分析 ​

Nginx 默认日志路径通常在 /var/log/nginx/access.log。 可以使用 awk 统计访问量最高的 IP:

bash
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10

7.2 状态码速查 ​

  • 403 Forbidden:通常是文件权限问题,或者 index.html 不存在。
  • 404 Not Found:root 路径配置错误,或者请求的文件确实不存在。
  • 502 Bad Gateway:后端应用服务器挂了,或者 Nginx 转发的端口不对。
  • 504 Gateway Timeout:后端服务器响应太慢。

8. 常见问题 (FAQ) ​

Q: 修改 nginx.conf 后必须重启吗? A: 不需要重启。执行 nginx -s reload 即可实现热更新,Nginx 会启动新的 Worker 进程处理新请求,旧进程处理完当前请求后自动退出。

Q: 为什么配置了反向代理,后端获取不到真实的客户端 IP? A: 因为默认情况下,后端看到的是 Nginx 的 IP。需要在 Nginx 中配置 proxy_set_header X-Real-IP $remote_addr;,并且后端程序也需要从该 Header 中读取。

Q: Nginx 能够支持多大的并发? A: 在硬件资源足够且内核优化到位的情况下,Nginx 的单机并发连接数可以轻松突破 10 万甚至更高。


9. 参考资料 ​

中文资料 ​

英文资料 ​

方舟 · Ark