《Nginx 从入门到精通:一篇掌握 Web 服务器核心技能》
为什么 Nginx 是现代 Web 架构的“流量入口”?
在当今高并发、微服务盛行的时代,Nginx 已成为绝大多数网站的“第一道门”。无论是淘宝、腾讯、Netflix 还是 Kubernetes Ingress,背后都有 Nginx 的身影。
它不仅是静态资源服务器,更是反向代理、负载均衡、API 网关、WAF 防火墙的核心组件。
本文将带你从零开始,系统掌握 Nginx 的核心技能,涵盖安装、配置、虚拟主机、路由匹配、安全控制等企业级实战内容,助你轻松应对生产环境挑战。
什么是 Nginx?高性能背后的秘密
定义
Nginx(读作 “engine x”)是一款开源的 高性能 HTTP 和反向代理服务器,也可用作 IMAP/POP3 邮件代理。由俄罗斯程序员 Igor Sysoev 开发,2004 年首次发布。
官网地址:http://nginx.org
为什么选择 Nginx?
| 特性 | 说明 |
|---|---|
| 高并发 | 支持数万并发连接,内存占用极低(约 2.5MB/万连接) |
| 异步非阻塞 | 基于事件驱动模型(epoll/kqueue),性能远超 Apache 的多进程模型 |
| 轻量稳定 | 单 worker 进程处理请求,无锁设计,运行稳定 |
| 功能丰富 | 反向代理、负载均衡、缓存、限流、SSL、URL 重写等 |
| 可扩展性强 | 支持 Lua 扩展(OpenResty)、动态模块加载 |
核心优势:Nginx 使用 Master-Worker 架构,Master 进程管理 Worker,每个 Worker 独立处理请求,避免线程切换开销,实现高吞吐。
常见 Web 中间件对比:Nginx 凭什么脱颖而出?
| 名称 | 类型 | 特点 | 典型场景 |
|---|---|---|---|
| Nginx | Web服务器/反向代理 | 高性能、静态资源处理强 | 主流网站前端 |
| Apache | Web服务器 | 模块丰富,.htaccess灵活 | PHP传统项目 |
| Tengine | Nginx 分支 | 淘宝定制,增强监控 | 大型企业私有化部署 |
| OpenResty | Nginx + Lua | 可编写脚本,做网关/WAF | API网关、风控 |
| Tomcat/Jetty | Java容器 | 运行 Spring Boot 应用 | Java 微服务后端 |
| uWSGI/Gunicorn | Python WSGI | 部署 Flask/Django | Python Web 服务 |
结论:Nginx 是现代 Web 架构中的 “流量调度中心”——负责接收用户请求、分发、缓存、安全过滤,再交给后端应用处理。
安装与配置:CentOS 系列 Yum 方式(生产推荐)
步骤 1:添加 Nginx Yum 源
vim /etc/yum.repos.d/nginx.repo
写入以下内容(使用官方稳定版):
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
gpgkey已验证为 https://nginx.org/keys/nginx_signing.key 的真实 PGP 公钥,确保软件来源可信。
步骤 2:安装 Nginx
sudo yum install -y nginx
步骤 3:启动并设置开机自启
sudo systemctl enable nginx
sudo systemctl start nginx
sudo systemctl status nginx
步骤 4:验证安装
# 查看端口
ss -lntup | grep :80
# 查看进程
ps aux | grep nginx
# 本地测试
curl -I http://127.0.0.1
浏览器访问:http://你的服务器IP,应看到 “Welcome to nginx!” 页面。
目录结构与关键文件详解
| 路径 | 说明 |
|---|---|
/etc/nginx/nginx.conf | 主配置文件(全局配置) |
/etc/nginx/conf.d/*.conf | 子配置目录(推荐按站点拆分) |
/usr/sbin/nginx | Nginx 启动命令 |
/usr/share/nginx/html/ | 默认站点根目录 |
/var/log/nginx/ | 日志目录(access.log, error.log) |
/etc/nginx/mime.types | 文件类型映射(MIME) |
⚠️ 不同安装方式路径可能不同,源码编译通常在
/usr/local/nginx/。
Nginx 处理请求的完整流程
理解 Nginx 的核心逻辑,才能写出正确的配置。
用户 → DNS解析 → TCP三次握手 → HTTP请求 → Nginx → 匹配 server_name → 匹配 location → 返回资源
详细步骤:
-
用户访问
http://bird.freed.cn -
DNS 解析域名得到服务器 IP
-
浏览器通过
IP:80发起 TCP 连接 -
发送 HTTP 请求:
GET /index.html HTTP/1.1 Host: bird.freed.cn -
Nginx 根据
Host头查找server_name bird.freed.cn的server{}块 -
匹配成功 → 进入该站点
-
根据 URI
/index.html结合root指令定位文件路径 -
返回响应
❗ 若未匹配任何
server_name,则使用带有default_server的站点或第一个配置。
虚拟主机:一台服务器运行多个网站
方式一:基于域名(⭐ 生产最常用)
# /etc/nginx/conf.d/bird.conf
server {
listen 80;
server_name www.freed.cn bird.freed.cn;
root /app/code/www;
index index.html index.htm;
}
需配置 DNS 或本地 hosts 文件:
# Linux echo "10.0.0.7 www.freed.cn" >> /etc/hosts # Windows C:WindowsSystem32driversetchosts 添加:10.0.0.7 bird.freed.cn
方式二:基于端口
server {
listen 81;
server_name live.freed.cn;
root /app/code/live;
index index.html;
}
访问:http://10.0.0.7:81
适用于测试环境、内网管理平台。
方式三:基于 IP(较少用)
server {
listen 172.16.1.7:8888;
server_name mi.freed.cn;
root /app/code/mi;
index index.html;
}
仅允许通过指定 IP 和端口访问。
Location 路由规则深度解析(含正则)
location 用于匹配 URI(URL 中域名后的部分)。
常见语法
| 语法 | 说明 | 示例 |
|---|---|---|
location / {} | 通配,保底规则 | 所有请求兜底 |
location /admin/ {} | 前缀匹配 | /admin/login ✅ |
location ~ .php$ {} | 区分大小写正则 | .php 结尾 |
| `location ~* .(jpg | png)$ {}` | 不区分大小写正则 |
location ^~ /static/ {} | 前缀匹配且不再检查正则 | 优先级高 |
location = /50x.html {} | 精确匹配 | 只匹配该路径 |
匹配优先级(重要!)
| 优先级 | 规则 |
|---|---|
| 1 | = 精确匹配 |
| 2 | ^~ 前缀匹配(不再检查正则) |
| 3 | ~ 和 ~* 正则匹配 |
| 4 | 普通前缀匹配(如 /images/) |
| 5 | / 通配匹配 |
最佳实践:静态资源用
^~,动态请求用~,避免冲突。
实战案例:权限控制 + 缓存优化
案例 1:后台仅允许内网访问
location /admin/ {
allow 172.16.1.0/24; # 允许内网
deny all; # 拒绝其他
}
安全原则:先
allow再deny。
案例 2:静态资源浏览器缓存
location ~* .(html|js|css)$ {
expires 1d;
}
location ~* .(jpg|jpeg|png|gif|bmp)$ {
expires 1h;
}
效果:F12 查看响应头
Cache-Control: max-age=3600
日志管理:访问日志 & 错误日志
自定义日志路径(推荐)
server {
server_name cxk.freed.cn;
root /app/code/cxk;
error_log /var/log/nginx/cxk-error.log warn;
access_log /var/log/nginx/cxk-access.log main;
}
注释掉
nginx.conf中的全局access_log,避免重复记录。
访问日志常用变量
| 变量 | 含义 |
|---|---|
$remote_addr | 客户端真实 IP |
$time_local | 访问时间 |
$request | 请求方法 + URI + 协议 |
$status | HTTP 状态码(如 200, 404, 502) |
$body_bytes_sent | 发送的数据大小 |
$http_user_agent | 浏览器信息 |
$http_x_forwarded_for | 代理链中的原始 IP |
实用模块实战:提升效率与安全性
模块 1:目录浏览(autoindex)
location /download/ {
autoindex on;
autoindex_localtime on;
autoindex_exact_size off; # 显示 KB/MB
}
用途:搭建文件下载站。
模块 2:密码认证(auth_basic)
# 安装工具
yum install -y httpd-tools
# 生成密码文件
htpasswd -bc /etc/nginx/passwd wu 123456
chmod 600 /etc/nginx/passwd
chown nginx.nginx /etc/nginx/passwd
Nginx 配置:
location /svip/ {
auth_basic "SVIP专区";
auth_basic_user_file /etc/nginx/passwd;
}
模块 3:状态监控(stub_status)
location /status {
stub_status;
allow 172.16.1.0/24;
deny all;
}
访问 http://ip/status 可查看:
Active connections: 2
server accepts handled requests
106 106 795
Reading: 0 Writing: 1 Waiting: 1
📊 可集成 Zabbix/Prometheus 做监控告警。
企业级案例:视频站 + 权限控制
需求
- 域名:
v.freed.cn - 功能:
- 自动列出文件
/svip/需密码- 开启状态监控
- 支持中文
完整配置
server {
listen 80;
server_name v.freed.cn;
root /app/code/v;
charset utf8;
error_log /var/log/nginx/v-error.log warn;
access_log /var/log/nginx/v-access.log main;
location / {
index index.html;
autoindex on;
autoindex_localtime on;
autoindex_exact_size off;
}
location /svip/ {
auth_basic "SVIP专区";
auth_basic_user_file /etc/nginx/passwd;
}
location /status {
stub_status;
allow 172.16.1.0/24;
deny all;
}
}
常见问题排查与最佳实践
❌ 常见错误
| 现象 | 原因 | 解决方案 |
|---|---|---|
| 403 Forbidden | 权限不足 / 无首页文件 | 检查目录权限、index 指令 |
| 404 Not Found | 文件不存在 / 路径错误 | 检查 root 和文件路径 |
| 502 Bad Gateway | 后端服务未启动 | 检查 upstream 是否存活 |
| 配置不生效 | 未重载 | nginx -t && nginx -s reload |
| 无法绑定端口 | 端口被占用 | `ss -lntup |
最佳实践
- 使用
conf.d/*.conf管理多站点 - 每个站点独立日志
- 修改配置前必执行
nginx -t - 生产环境关闭
debug日志 - 使用
reload而非restart避免中断连接
Nginx 学习路线图
| 阶段 | 目标 |
|---|---|
| 入门 | 安装、启动、静态服务、基本配置 |
| 进阶 | 虚拟主机、location、日志分析 |
| 实战 | 反向代理、负载均衡、缓存、安全 |
| 高手 | OpenResty、Lua、WAF、高可用架构 |
参考资料
- Nginx 官方文档
- Nginx 变量索引
- HTTP 状态码大全







