Nginx 详解 — 安装、配置、核心模块
来源:Egon 林海峰 — Nginx 详解 原始文件:
raw/一、nginx详解 – Egon林海峰.md
内容概要
Egon 的 Nginx 详解是一篇从入门到实践的深度指南,涵盖 Nginx 的角色定位、安装部署、核心配置、模块详解四大板块。全文以生产实践为导向,每个知识点都配有可执行的配置示例。
一、Nginx 的角色与定位
Nginx 可充当五种角色:静态文件服务、反向代理(Web 服务层)、七层负载均衡(HTTP upstream)、四层负载均衡(stream 模块)、动静分离。采用多进程 + 单线程 + epoll 异步非阻塞模型,单机可支撑 2-4 万并发连接。
同类对比:Apache(性能低、操作难)、Tengine(淘宝增强版)、OpenResty(Nginx+Lua)、IIS/lighttpd/GWS/BWS。
二、安装方式
yum 安装
- 配置官方 yum 源(nginx.repo),区分 stable/mainline 通道
- 产生关键目录:
/etc/nginx/(配置)、/var/log/nginx/(日志)、/usr/sbin/nginx(命令) - 代理参数文件:
fastcgi_params、scgi_params、uwsgi_params
源码安装
- 依赖:gcc、pcre-devel、zlib-devel、openssl-devel
- 典型参数:
--prefix、--with-http_stub_status_module、--with-http_ssl_module - 步骤:configure → make → make install
- 后置操作:软连接、环境变量、systemd 服务单元配置
三、常用命令
| 命令 | 作用 |
|---|---|
nginx | 启动 |
nginx -s reload | 优雅重载配置 |
nginx -s stop/quit | 强制停止/优雅停止 |
nginx -t | 测试配置正确性 |
nginx -V | 查看版本和编译模块 |
systemctl enable nginx | 开机自启 |
四、核心配置结构
Nginx 配置采用分块层级结构:
main(全局块)
├── events 块(网络IO配置)
├── http 块(HTTP 协议相关)
│ ├── upstream 块(后端服务器池)
│ ├── server 块(虚拟主机)
│ │ └── location 块(URL 匹配与处理)
│ └── ...
└── stream 块(四层 TCP/UDP 代理)
└── server 块
main 块关键指令
worker_processes:CPU 核心数worker_connections:单 worker 最大连接数worker_rlimit_nofile:文件描述符上限pid:PID 文件路径include:引入其他配置文件
events 块
use epoll:Linux 高效 IO 模型multi_accept on:一次接受所有新连接
http 块关键指令
sendfile:零拷贝文件传输tcp_nopush/tcp_nodelay:TCP 优化keepalive_timeout:长连接超时types_hash_max_size:MIME 类型哈希表大小
server 块(虚拟主机)
listen:监听 IP:端口server_name:域名匹配(支持精确/通配符/正则)index:默认索引文件root/alias:文档根目录error_page:自定义错误页
五、location 匹配规则(核心重点)
匹配优先级(从高到低)
| 优先级 | 语法 | 示例 | 说明 |
|---|---|---|---|
| 1(最高) | = uri | = /logo.png | 精确匹配,命中即止 |
| 2 | ^~ uri | ^~ /static/ | 前缀匹配,命中后不再检查正则 |
| 3 | ~ pattern | ~ \.php$ | 正则匹配(区分大小写) |
| 4 | ~* pattern | ~* \.jpg$ | 正则匹配(不区分大小写) |
| 5(最低) | uri | / / /api/ | 普通前缀匹配,最长的优先 |
完整流程:
- 先检查 精确匹配(
=),命中直接返回 - 再检查 前缀匹配(
^~和普通前缀),记录最长匹配 - 如果有
^~命中,跳过正则检查 - 否则按定义顺序检查正则匹配(
~/~*) - 正则匹配成功则用该 location;否则用第 2 步记录的最长前缀
命名 location
@name 形式,用于内部重定向(类似 goto),不暴露给客户端。
六、root 与 alias 指令
- root:
root /var/www/html+ 请求/egon/xxx→ 查找/var/www/html/egon/xxx(拼接) - alias:
alias /mmm/+ 请求/→ 查找/mmm/(不拼接,直接替换)
alias 末尾必须加斜杠(/),否则路径拼接异常。
七、代理指令
| 指令 | 协议 | 典型下游 |
|---|---|---|
proxy_pass | HTTP | 应用服务器、uWSGI(http 模式) |
fastcgi_pass | FastCGI | PHP-FPM |
uwsgi_pass | uWSGI(uwsgi 协议) | uWSGI(socket 模式) |
scgi_pass | SCGI | SCGI 应用 |
八、upstream 负载均衡
upstream 模块定义后端服务器池,配合代理指令使用。
调度算法:轮询(默认)、weight 权重、ip_hash、least_conn。
参数:
weight:权重max_fails/fail_timeout:故障转移backup:备用服务器down:永久下线
九、动静分离
通过 location 区分动态请求(转给应用服务器)和静态请求(直接由 Nginx 响应),减轻应用层压力。支持按路径分离(/static/)和按扩展名分离(\.(jpg|png|css|js)$)。
十、资源分离(User-Agent 分流)
利用 if ($http_user_agent ~* ...) 判断客户端类型,将 Android/iOS/PC 请求转发到不同的 upstream 池,实现终端适配。
十一、rewrite 重写
URL 重写模块,用于 URL 规范化、跳转等场景。详见 Egon 另一篇文章。
相关页面
- Nginx 概念页 — 核心概念与架构
- 集群部署 — Nginx 部署上下文
- 负载均衡入门 — Nginx stream 代理
- Haproxy 与 IP 透传
- CDN — OpenResty (Nginx+Lua)