如果你想让自己的网站像风一样轻盈、像山一样稳定,Nginx 会是那个值得托付的伙伴。
📖 第一章:开篇·认识 Nginx
1.1 Nginx 是谁?
Nginx(读作 "Engine X")是一位俄罗斯程序员 Igor Sysoev 的匠心之作。它诞生于 2004 年,最初是为了解决 C10K 问题(同时处理一万个并发连接)而设计的。如今,它已成长为全球最受欢迎的 Web 服务器之一------既是高性能的 HTTP 服务器,也是强大的反向代理服务器,还支持 IMAP/POP3/SMTP 代理。
📊 根据 Netcraft 和 W3Techs 的数据,Nginx 占据了全球超过 35% 的 Web 服务器市场份额,与 Apache 并称"双雄"。
1.2 核心特性:为什么 Nginx 如此迷人?
| 特性 | 魅力所在 |
|---|---|
| 🔥 高并发 | 单机可支撑 5 万~10 万 并发连接,背后是高效的事件驱动模型 |
| 💾 低内存 | 2 万并发仅消耗约 2.5 MB 内存(Apache 则需要数百 MB) |
| 🔄 热部署 | 平滑升级、不停机变更配置,业务无感知 |
| 🎭 反向代理 | 像一位守门人,隐藏真实后端服务,提升安全性与灵活性 |
| ⚖️ 负载均衡 | 内置丰富算法,将请求温柔地分发到多台服务器 |
| 🧩 动静分离 | 静态资源 Nginx 直接伺候,动态请求转给后端,各司其职 |
| 🛡️ 高可靠 | 历经淘宝、京东、百度等核心业务洗礼,稳如磐石 |
1.3 横向对比:Nginx vs Apache vs CDN
| 维度 | Nginx | Apache | CDN |
|---|---|---|---|
| 架构模型 | 事件驱动(异步非阻塞) | 进程/线程驱动(阻塞) | 边缘节点分发 |
| 并发能力 | ⭐⭐⭐⭐⭐(5 万+) | ⭐⭐(约 5000) | ⭐⭐⭐⭐⭐(看节点规模) |
| 内存消耗 | 极低(几 MB) | 较高(数百 MB 起) | --- |
| 配置语法 | 简洁、声明式 | 较复杂,支持 .htaccess | 控制台/API |
| 动态内容 | 反向代理至后端 | 内置 PHP/Perl 模块 | 不处理 |
| 静态性能 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 适用场景 | 高并发、反向代理、网关 | 共享主机、传统 LAMP | 全球加速、静态分发 |
| 学习曲线 | 平缓 | 略陡 | 最友好 |
1.4 应用场景:Nginx 的八般武艺
text
Nginx 万能瑞士军刀
┌─────────────┐ ┌──────────┐ ┌──────────┐ ┌─────────────┐
│ ① 静态网站 │ │② 反向代理 │ │③ 负载均衡 │ │④ 动静分离 │
│ HTML/CSS/JS │ │ 隐藏后端 │ │ 请求分发 │ │ 静态Nginx │
│ 图片托管 │ │ 真实服务 │ │ 多台后端 │ │ 动态转后端 │
└─────────────┘ └──────────┘ └──────────┘ └─────────────┘
┌─────────────┐ ┌──────────┐ ┌──────────┐ ┌─────────────┐
│ ⑤ HTTPS网关 │ │⑥ 微服务网关│ │⑦ 限流防护 │ │⑧ 缓存加速 │
│ SSL 终结 │ │ 统一入口 │ │ 防DDoS │ │ 静态/代理 │
│ 证书管理 │ │ 路由转发 │ │ 防爬虫 │ │ 缓存 │
└─────────────┘ └──────────┘ └──────────┘ └─────────────┘
1.5 学习路线:从新手到专家的四重境界
| 阶段 | 目标 |
|---|---|
| 🌱 新手入门 | 安装 → 启动 → 部署第一个静态页面,看懂核心配置 |
| 🧭 初级运维 | 反向代理、跨域处理、HTTPS 配置、Location 路由规则 |
| ⚙️ 中级运维 | 负载均衡、动静分离、缓存策略、Rewrite 重写跳转 |
| 🏛️ 高级架构 | 高可用(Keepalived)、性能调优、限流熔断、故障排查 |
🧠 第二章:基础·磨刀不误砍柴工
2.1 网络知识拾遗
| 概念 | 简要说明 |
|---|---|
| 🌐 IP 地址 | 服务器在网络中的唯一标识(如 192.168.1.100) |
| 🚪 端口 | 服务的"门牌号",HTTP 默认 80,HTTPS 默认 443 |
| 🏷️ 域名 | IP 的易记别名(如 www.example.com) |
| 🔍 DNS | 域名系统,把人类友好的名字变成机器可读的 IP |
| 📦 TCP/IP | 互联网通信的基石协议栈 |
| 🔗 HTTP/HTTPS | Web 世界的语言,应用层协议 |
2.2 HTTP 协议:一问一答的默契
text
客户端(浏览器) Nginx 服务器
│ │
│ ① TCP 三次握手 │
│─────────────────────────────────────▶│
│ ② HTTP 请求 │
│ GET /index.html HTTP/1.1 │
│ Host: www.example.com │
│─────────────────────────────────────▶│
│ ③ HTTP 响应 │
│ HTTP/1.1 200 OK │
│ Content-Type: text/html │
│ <html>...</html> │
│◀─────────────────────────────────────│
常见状态码与 Nginx 的关联瞬间
| 状态码 | 含义 | Nginx 中的常见场景 |
|---|---|---|
| 200 | 一切正常 | 请求被愉快地处理了 |
| 301 | 永久搬家 | 域名迁移、HTTP 强制跳转 HTTPS |
| 302 | 临时离开 | 临时性跳转,比如活动页 |
| 304 | 旧物可用 | 命中缓存,节省带宽 |
| 403 | 拒绝访问 | 权限不够,或 IP 被拉黑 |
| 404 | 找不到了 | 资源失踪,请检查路径 |
| 500 | 服务器犯错了 | 后端服务出了状况 |
| 502 | 网关迷路 | 后端服务根本联系不上 |
| 503 | 服务繁忙 | 触发限流或后端过载 |
| 504 | 响应超时 | 后端处理太慢,Nginx 等不及了 |
2.3 新手避坑指南:前人的眼泪,后人的路标
推荐的学习节奏
- 第 1~2 天:安装 → 启动 → 亲手跑起一个静态 HTML 页面
- 第 3~5 天:理解核心配置 → 玩转 Location 匹配 → 配置反向代理
- 第 6~8 天:负载均衡 → 动静分离 → HTTPS 证书配置
- 长期坚持:性能调优 → 高可用架构 → 限流与安全加固
五大铁律,请刻在心里
-
⚠️ 改前先备份
cp nginx.conf nginx.conf.bak -
🧪 测试再重载
nginx -t && nginx -s reload -
👤 远离 root 运行
创建专属的
www用户 -
🎯 警惕 Location 优先级
后面写的规则不一定覆盖前面的,先理解匹配顺序
-
🔒 生产环境关闭 autoindex
autoindex on会暴露你的目录结构,是安全隐患
🛠️ 第三章:环境·安家落户
3.1 Linux 下安装:两条路,任你选
3.1.1 包管理器安装(省心之选)
bash
# CentOS / RHEL 7+
yum install -y nginx
# CentOS / RHEL 8+
dnf install -y nginx
# Ubuntu / Debian
apt update && apt install -y nginx
# 启动并设为开机自启
systemctl start nginx
systemctl enable nginx
# 验证是否成功
nginx -v # 看看版本
curl http://localhost # 听听回响
3.1.2 源码编译安装(自由定制)
bash
# 1. 安装编译工具链
yum install -y gcc pcre-devel zlib-devel openssl-devel make
# 2. 下载并解压
wget https://nginx.org/download/nginx-1.26.0.tar.gz
tar -zxvf nginx-1.26.0.tar.gz
cd nginx-1.26.0
# 3. 配置想要的模块
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_gzip_static_module \
--with-http_realip_module \
--with-stream \
--with-http_stub_status_module
# 4. 编译并安装
make -j$(nproc) && make install
# 5. 验证
/usr/local/nginx/sbin/nginx -v
3.2 Windows 安装:简单直接
方法一:下载即用
访问 https://nginx.org/en/download.html,下载 nginx/Windows-1.26.0.zip,解压到 C:\nginx,然后打开 CMD:
cmd
cd C:\nginx
start nginx
方法二:Docker 大法(推荐)
bash
docker run -d -p 80:80 --name nginx nginx:1.26
3.3 Docker 部署:开发测试利器
bash
# 最简运行
docker run -d --name nginx -p 80:80 nginx:1.26-alpine
# 挂载配置、静态文件、日志(生产级玩法)
docker run -d --name nginx -p 80:80 -p 443:443 \
-v /data/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
-v /data/nginx/conf.d:/etc/nginx/conf.d:ro \
-v /data/www:/usr/share/nginx/html:ro \
-v /data/nginx/logs:/var/log/nginx \
-v /data/nginx/ssl:/etc/nginx/ssl:ro \
nginx:1.26-alpine
用 Docker Compose 更优雅 (docker-compose.yml)
yaml
version: '3.8'
services:
nginx:
image: nginx:1.26-alpine
container_name: nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./conf.d:/etc/nginx/conf.d:ro
- ./html:/usr/share/nginx/html:ro
- ./logs:/var/log/nginx
- ./ssl:/etc/nginx/ssl:ro
restart: always
network_mode: host # 或自定义网络
启动:docker-compose up -d
3.4 平滑升级:不停机的优雅蜕变
bash
# 查看当前版本
/usr/local/nginx/sbin/nginx -v
# 备份旧二进制
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
# 编译新版本(以新源码目录为例)
cd nginx-1.26.1
make install # 只替换二进制
# 向旧主进程发送 USR2 信号,启动新主进程
kill -USR2 $(cat /run/nginx.pid)
# 优雅退出旧主进程
kill -WINCH $(cat /run/nginx.pid.oldbin)
kill -QUIT $(cat /run/nginx.pid.oldbin)
# 验证新版本
/usr/local/nginx/sbin/nginx -v
3.5 核心命令速查:指尖上的 Nginx
| 管理方式 | 命令 | 含义 |
|---|---|---|
| systemd | systemctl start nginx |
启动 |
systemctl stop nginx |
停止 | |
systemctl restart nginx |
重启 | |
systemctl reload nginx |
不中断服务重载配置 ✨ | |
systemctl status nginx |
查看状态 | |
systemctl enable nginx |
开机自启 | |
| 原生命令 | nginx |
启动 |
nginx -s stop |
立即停止(强杀) | |
nginx -s quit |
优雅停止(处理完当前请求) | |
nginx -s reload |
重载配置(SIGHUP) | |
nginx -s reopen |
重新打开日志文件 | |
nginx -t |
测试配置文件语法 ✨ | |
nginx -T |
测试并打印完整配置 | |
nginx -v |
显示版本号 | |
nginx -V |
显示版本 + 编译参数 |
3.6 环境验收:确认一切就绪
bash
# 1. 看进程
ps aux | grep nginx
# 预期看到 master process 和一个或多个 worker process
# 2. 看端口
netstat -tlnp | grep nginx
# 或
ss -tlnp | grep nginx
# 3. 检查配置
nginx -t
# 理想输出:
# nginx: configuration file /etc/nginx/nginx.conf test is successful
# 4. 本地访问
curl -I http://localhost
# 应该返回 HTTP/1.1 200 OK 和 Server: nginx/1.26.0
# 5. 开放防火墙(如果需要)
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --reload
🌟 写在最后
至此,我们已经完成了 Nginx 的初识、基础知识铺垫和三种主流环境搭建。