Nginx完全指南 - 从入门到精通(加强版)
目录
1. Nginx简介与架构原理
1.1 什么是Nginx?
1.2 Nginx的核心优势
1.2.1 高并发处理能力
1.2.2 内存占用极低
1.2.3 模块化架构
1.3 Nginx工作原理详解
1.3.1 Master-Worker模型
1.3.2 事件驱动模型
1.4 Nginx vs 其他Web服务器
2. Nginx安装与环境准备
2.1 安装前准备
2.1.1 系统要求
2.1.2 依赖包安装
2.2 安装方式详解
2.2.1 包管理器安装(推荐新手)
2.2.2 官方仓库安装(推荐生产环境)
2.2.3 源码编译安装(自定义需求)
2.3 安装后配置
2.3.1 目录结构
2.3.2 权限设置
2.3.3 防火墙配置
3. Nginx基本概念与工作原理
3.1 请求处理流程详解
3.2 配置上下文层级
3.3 变量系统
3.3.1 内置变量
3.3.2 自定义变量
3.4 正则表达式
4. 配置文件完全解析
4.1 配置文件语法规则
4.2 全局配置详解
4.3 Events配置详解
4.4 HTTP配置详解
5. 域名配置详解
5.1 域名解析基础
5.1.1 DNS记录类型
5.1.2 配置DNS解析
5.2 Server块配置
5.2.1 基本域名配置
5.2.2 多域名配置
5.2.3 泛域名配置
5.2.4 默认服务器
5.3 域名跳转和重定向
5.3.1 www跳转
5.3.2 旧域名到新域名
5.3.3 HTTP到HTTPS
5.4 域名配置最佳实践
5.4.1 分离配置文件
5.4.2 配置文件模板
6. 静态资源服务深入
6.1 高效静态文件服务
6.1.1 基础配置
6.1.2 文件类型处理
6.2 高级缓存策略
6.2.1 缓存控制头
6.2.2 条件请求处理
6.3 目录浏览功能
6.4 带宽控制
6.5 断点续传支持
7. 反向代理与正向代理
7.1 反向代理基础
7.1.1 基本反向代理
7.1.2 路径重写
7.1.3 请求体处理
7.2 高级代理功能
7.2.1 WebSocket代理
7.2.2 gRPC代理
7.2.3 缓存代理
7.3 正向代理配置
7.4 代理优化
7.4.1 连接池
7.4.2 故障处理
8. API网关配置详解
8.1 API网关基础架构
8.2 API路由配置
8.2.1 基础路由
8.2.2 公共代理配置
8.3 API认证和授权
8.3.1 Basic认证
8.3.2 Token认证
8.3.3 API Key认证
8.4 API限流和熔断
8.4.1 请求速率限制
8.4.2 并发连接限制
8.4.3 熔断机制
8.5 API网关高级功能
8.5.1 请求聚合
8.5.2 协议转换
8.5.3 响应转换
8.6 API监控和日志
8.6.1 访问日志
8.6.2 监控端点
9. 负载均衡高级配置
9.1 负载均衡算法详解
9.1.1 轮询(Round Robin)
9.1.2 加权轮询
9.1.3 IP哈希
9.1.4 最少连接
9.1.5 随机算法
9.1.6 一致性哈希
9.2 健康检查配置
9.2.1 被动健康检查
9.2.2 主动健康检查(Nginx Plus功能)
9.3 会话保持
9.3.1 IP哈希会话保持
9.3.2 Cookie会话保持
9.4 动态负载均衡
9.4.1 基于请求内容
9.4.2 基于客户端特征
9.5 负载均衡优化
9.5.1 连接池优化
9.5.2 缓冲区优化
9.6 蓝绿部署和灰度发布
9.6.1 蓝绿部署
9.6.2 灰度发布
10. HTTPS/SSL完全配置指南
10.1 SSL/TLS基础知识
10.1.1 工作原理
10.1.2 证书类型
10.2 获取SSL证书
10.2.1 Let's Encrypt免费证书
10.2.2 自签名证书(开发环境)
10.3 基本HTTPS配置
10.4 高级SSL配置
10.4.1 多证书配置
10.4.2 客户端证书验证
10.4.3 SSL性能优化
10.5 SSL安全最佳实践
10.5.1 安全配置模板
10.5.2 HSTS配置
10.5.3 证书透明度
10.6 SSL故障排查
10.6.1 测试SSL配置
10.6.2 常见SSL问题
11. URL重写与重定向进阶
11.1 重写规则详解
11.1.1 rewrite指令语法
11.1.2 基础重写示例
11.2 高级重写技巧
11.2.1 条件重写
11.2.2 复杂重写逻辑
11.3 重定向配置
11.3.1 基本重定向
11.3.2 批量重定向
11.4 URL美化
11.4.1 隐藏技术细节
11.4.2 URL标准化
11.5 动态URL处理
11.5.1 RESTful API重写
11.5.2 版本化API
11.6 错误处理和回退
12. 安全配置最佳实践
12.1 基础安全设置
12.1.1 隐藏版本信息
12.1.2 安全响应头
12.2 访问控制
12.2.1 IP访问控制
12.2.2 用户认证
12.3 请求限制
12.3.1 请求速率限制
12.3.2 连接限制
12.4 防止常见攻击
12.4.1 SQL注入防护
12.4.2 XSS防护
12.4.3 文件上传安全
12.5 DDoS防护
12.5.1 基础DDoS防护
12.5.2 高级DDoS防护
12.6 日志和监控
12.6.1 安全日志
12.6.2 实时监控
13. 性能优化与调优
13.1 系统级优化
13.1.1 内核参数优化
13.1.2 文件描述符限制
13.2 Nginx配置优化
13.2.1 Worker进程优化
13.2.2 文件缓存优化
13.2.3 网络优化
13.3 缓存优化
13.3.1 FastCGI缓存
13.3.2 代理缓存优化
13.4 压缩优化
13.4.1 Gzip压缩
13.4.2 Brotli压缩
13.5 负载均衡优化
13.5.1 上游优化
13.6 监控和分析
13.6.1 性能监控
13.6.2 性能测试
14. 日志管理与监控
14.1 日志格式配置
14.1.1 自定义日志格式
14.1.2 条件日志记录
14.2 日志轮转配置
14.2.1 使用logrotate
14.2.2 按时间分割日志
14.3 日志分析
14.3.1 使用GoAccess
14.3.2 ELK Stack集成
14.4 监控配置
14.4.1 Prometheus监控
14.4.2 自定义监控端点
14.5 告警配置
14.5.1 错误监控脚本
14.5.2 性能告警
15. 常用模块深入
15.1 核心模块
15.1.1 ngx_http_core_module
15.1.2 ngx_http_rewrite_module
15.2 访问控制模块
15.2.1 ngx_http_access_module
15.2.2 ngx_http_auth_request_module
1. Nginx简介与架构原理
1.1 什么是Nginx?
Nginx(发音为"engine-x")是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。
形象比喻:
- Nginx就像一个超级智能的"交通指挥中心"
- 它不仅指挥交通(分配请求),还能变身为快递员(提供静态文件)
- 同时还是安保人员(防护攻击)和优化专家(压缩、缓存)
1.2 Nginx的核心优势
1.2.1 高并发处理能力
传统服务器:一个请求 = 一个进程/线程(像餐厅一个客人配一个服务员)
Nginx:事件驱动 = 一个进程处理多个请求(像一个服务员同时服务多桌)
1.2.2 内存占用极低
- 10,000个非活跃HTTP keep-alive连接仅占用2.5MB内存
- 相比Apache等传统服务器,内存使用降低10倍以上
1.2.3 模块化架构
核心模块:提供基础功能
标准HTTP模块:处理HTTP请求
可选HTTP模块:提供额外功能
邮件模块:处理邮件代理
第三方模块:扩展功能
1.3 Nginx工作原理详解
1.3.1 Master-Worker模型
Master进程(老板)|┌────────────┬───────┴────────┬─────────────┐| | | |
Worker进程1 Worker进程2 Worker进程3 Worker进程N
(员工1) (员工2) (员工3) (员工N)
Master进程职责:
- 读取和验证配置文件
- 创建、绑定和关闭套接字
- 启动、终止和维护Worker进程
- 无中断服务升级
- 重新打开日志文件
Worker进程职责:
- 接收客户端连接
- 处理客户端请求
- 与后端服务器通信
- 缓存操作
1.3.2 事件驱动模型
# 事件处理流程
1. Worker进程等待事件(epoll/kqueue)
2. 事件到来(新连接/数据到达/超时)
3. 处理事件(非阻塞)
4. 返回继续等待下一个事件
1.4 Nginx vs 其他Web服务器
特性 | Nginx | Apache | IIS | Tomcat |
---|---|---|---|---|
并发模型 | 事件驱动 | 进程/线程 | 线程池 | 线程池 |
内存占用 | 极低 | 高 | 中等 | 高 |
静态文件 | 极快 | 快 | 快 | 慢 |
动态内容 | 需反向代理 | 模块支持 | 原生支持 | 原生支持 |
配置复杂度 | 简单 | 复杂 | 中等 | 复杂 |
2. Nginx安装与环境准备
2.1 安装前准备
2.1.1 系统要求
# 检查系统版本
cat /etc/os-release# 检查内核版本(建议3.9+)
uname -r# 检查可用内存
free -h# 检查磁盘空间
df -h
2.1.2 依赖包安装
# Ubuntu/Debian
sudo apt update
sudo apt install -y build-essential libpcre3 libpcre3-dev \zlib1g zlib1g-dev libssl-dev libgd-dev libxml2 libxml2-dev \uuid-dev libxslt1-dev libgeoip-dev libpam0g-dev# CentOS/RHEL
sudo yum groupinstall -y "Development Tools"
sudo yum install -y pcre pcre-devel zlib zlib-devel \openssl openssl-devel gd gd-devel libxml2 libxml2-devel \libxslt libxslt-devel perl-ExtUtils-Embed GeoIP GeoIP-devel
2.2 安装方式详解
2.2.1 包管理器安装(推荐新手)
# Ubuntu/Debian
sudo apt update
sudo apt install nginx# CentOS 7
sudo yum install epel-release
sudo yum install nginx# CentOS 8/Rocky Linux
sudo dnf install nginx
2.2.2 官方仓库安装(推荐生产环境)
# Ubuntu/Debian
# 添加官方仓库
echo "deb http://nginx.org/packages/ubuntu/ $(lsb_release -cs) nginx" | \sudo tee /etc/apt/sources.list.d/nginx.list# 添加签名密钥
curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add -# 安装
sudo apt update
sudo apt install nginx# CentOS/RHEL
# 创建仓库文件
sudo tee /etc/yum.repos.d/nginx.repo << EOF
[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
EOF# 安装
sudo yum install nginx
2.2.3 源码编译安装(自定义需求)
# 下载源码
cd /tmp
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0# 配置编译选项(完整版)
./configure \--prefix=/usr/local/nginx \--sbin-path=/usr/local/nginx/sbin/nginx \--conf-path=/usr/local/nginx/conf/nginx.conf \--error-log-path=/var/log/nginx/error.log \--http-log-path=/var/log/nginx/access.log \--pid-path=/var/run/nginx.pid \--lock-path=/var/run/nginx.lock \--http-client-body-temp-path=/var/cache/nginx/client_temp \--http-proxy-temp-path=/var/cache/nginx/proxy_temp \--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \--http-scgi-temp-path=/var/cache/nginx/scgi_temp \--user=nginx \--group=nginx \--with-compat \--with-file-aio \--with-threads \--with-http_addition_module \--with-http_auth_request_module \--with-http_dav_module \--with-http_flv_module \--with-http_gunzip_module \--with-http_gzip_static_module \--with-http_mp4_module \--with-http_random_index_module \--with-http_realip_module \--with-http_secure_link_module \--with-http_slice_module \--with-http_ssl_module \--with-http_stub_status_module \--with-http_sub_module \--with-http_v2_module \--with-mail \--with-mail_ssl_module \--with-stream \--with-stream_realip_module \--with-stream_ssl_module \--with-stream_ssl_preread_module# 编译和安装
make -j$(nproc)
sudo make install# 创建用户和目录
sudo useradd -r -s /sbin/nologin nginx
sudo mkdir -p /var/cache/nginx/{client_temp,proxy_temp,fastcgi_temp,uwsgi_temp,scgi_temp}
sudo chown -R nginx:nginx /var/cache/nginx# 创建systemd服务文件
sudo tee /etc/systemd/system/nginx.service << EOF
[Unit]
Description=The nginx HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP \$MAINPID
ExecStop=/bin/kill -s QUIT \$MAINPID
PrivateTmp=true[Install]
WantedBy=multi-user.target
EOF# 启动服务
sudo systemctl daemon-reload
sudo systemctl enable nginx
sudo systemctl start nginx
2.3 安装后配置
2.3.1 目录结构
/etc/nginx/ # 配置文件目录
├── nginx.conf # 主配置文件
├── conf.d/ # 额外配置文件目录
├── sites-available/ # 可用站点配置(Debian系)
├── sites-enabled/ # 已启用站点配置(Debian系)
├── modules-available/ # 可用模块
├── modules-enabled/ # 已启用模块
├── mime.types # MIME类型定义
├── fastcgi_params # FastCGI参数
├── scgi_params # SCGI参数
└── uwsgi_params # uWSGI参数/var/log/nginx/ # 日志目录
├── access.log # 访问日志
└── error.log # 错误日志/usr/share/nginx/html/ # 默认网站根目录
/var/cache/nginx/ # 缓存目录
2.3.2 权限设置
# 设置目录权限
sudo chown -R nginx:nginx /var/log/nginx
sudo chown -R nginx:nginx /var/cache/nginx
sudo chmod 755 /var/log/nginx
sudo chmod 755 /var/cache/nginx# SELinux设置(如果启用)
sudo setsebool -P httpd_can_network_connect on
sudo setsebool -P httpd_can_network_relay on
2.3.3 防火墙配置
# firewalld(CentOS/RHEL)
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload# ufw(Ubuntu/Debian)
sudo ufw allow 'Nginx Full'
sudo ufw status# iptables
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo service iptables save
3. Nginx基本概念与工作原理
3.1 请求处理流程详解
客户端请求 → DNS解析 → TCP连接 → Nginx接收↓
Nginx处理流程:
1. 接收请求(Accept)
2. 读取请求头(Read Header)
3. 处理请求URI
4. 查找配置(Server块匹配)
5. Location匹配
6. 访问控制检查
7. 内容生成/获取:- 静态文件:读取文件系统- 动态内容:代理到后端
8. 发送响应
9. 记录日志
10. 关闭连接(或保持连接)
3.2 配置上下文层级
main # 全局配置
├── events # 事件配置
└── http # HTTP配置├── upstream # 上游服务器组└── server # 虚拟主机└── location # 路径配置└── if # 条件判断
3.3 变量系统
3.3.1 内置变量
# 请求相关
$request_method # GET/POST等
$request_uri # 完整URI(包含参数)
$uri # 不含参数的URI
$args # 查询字符串
$arg_name # 特定参数值
$is_args # 有参数则为"?",否则为空# 客户端相关
$remote_addr # 客户端IP
$remote_port # 客户端端口
$remote_user # Basic认证用户名
$http_user_agent # User-Agent
$http_referer # Referer
$http_cookie # Cookie
$http_host # Host头# 服务器相关
$host # 服务器名
$server_name # 配置的server_name
$server_addr # 服务器地址
$server_port # 服务器端口
$server_protocol # HTTP/1.0或HTTP/1.1# 时间相关
$time_local # 本地时间
$time_iso8601 # ISO 8601时间格式
$msec # 毫秒精度的时间戳# 响应相关
$status # 响应状态码
$body_bytes_sent # 发送的body字节数
$bytes_sent # 发送的总字节数
$connection # 连接序号
$connection_requests # 连接上的请求数# 性能相关
$request_time # 请求处理时间
$upstream_response_time # 上游响应时间
$upstream_connect_time # 上游连接时间
$upstream_header_time # 接收上游响应头时间
3.3.2 自定义变量
# 设置变量
set $mobile "no";
if ($http_user_agent ~* "mobile") {set $mobile "yes";
}# 使用map设置变量
map $http_user_agent $device_type {default "desktop";~*mobile "mobile";~*tablet "tablet";
}
3.4 正则表达式
# 位置修饰符
= # 精确匹配
^~ # 前缀匹配(停止正则搜索)
~ # 区分大小写的正则匹配
~* # 不区分大小写的正则匹配
/ # 通用匹配# 正则表达式符号
. # 匹配任意字符
* # 匹配0次或多次
+ # 匹配1次或多次
? # 匹配0次或1次
^ # 字符串开始
$ # 字符串结束
[] # 字符类
() # 分组捕获
| # 或# 示例
location ~ ^/api/v[0-9]+/users/([0-9]+)$ {# 匹配 /api/v1/users/123# $1 = 123
}
4. 配置文件完全解析
4.1 配置文件语法规则
# 1. 指令格式
指令名 参数1 参数2 ... 参数N;# 2. 块指令格式
块指令名 参数 {指令1 参数;指令2 参数;
}# 3. 注释
# 单行注释# 4. 包含其他文件
include /path/to/file;
include /path/to/*.conf;# 5. 变量使用
set $variable_name value;
root /var/www/$host;
4.2 全局配置详解
# 运行用户和组
user nginx nginx;# Worker进程数
# auto = CPU核心数
worker_processes auto;# CPU亲和性绑定
worker_cpu_affinity auto;# Worker进程优先级(-20到19,越小优先级越高)
worker_priority -5;# Worker进程最大打开文件数
worker_rlimit_nofile 65535;# Worker进程核心转储文件大小
worker_rlimit_core 50M;# 核心转储文件目录
working_directory /var/tmp/cores/;# 错误日志
# 级别:debug, info, notice, warn, error, crit, alert, emerg
error_log /var/log/nginx/error.log warn;
error_log syslog:server=192.168.1.1 debug;# PID文件
pid /var/run/nginx.pid;# 动态加载模块
load_module modules/ngx_http_geoip_module.so;# 环境变量
env MALLOC_OPTIONS;
env PERL5LIB=/data/site/modules;
4.3 Events配置详解
events {# 单个Worker进程最大连接数worker_connections 65535;# 事件驱动模型# Linux: epoll, poll, select# FreeBSD: kqueue# Solaris: eventportuse epoll;# 是否接受多个连接multi_accept on;# 是否使用accept_mutexaccept_mutex off;# accept_mutex延迟时间accept_mutex_delay 500ms;# 调试连接debug_connection 192.168.1.0/24;debug_connection 127.0.0.1;
}
4.4 HTTP配置详解
http {### 基本设置### MIME类型include /etc/nginx/mime.types;default_type application/octet-stream;# 服务器标识server_tokens off; # 隐藏版本号server_name_in_redirect off;# 字符集charset utf-8;source_charset utf-8;### 日志设置### 日志格式log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';log_format json escape=json'{''"time_local":"$time_local",''"remote_addr":"$remote_addr",''"remote_user":"$remote_user",''"request":"$request",''"status": $status,''"body_bytes_sent":$body_bytes_sent,''"request_time":$request_time,''"http_referrer":"$http_referer",''"http_user_agent":"$http_user_agent"''}';# 访问日志access_log /var/log/nginx/access.log main;# 日志缓冲access_log /var/log/nginx/access.log main buffer=32k flush=5s;### 连接设置### TCP设置sendfile on;tcp_nopush on;tcp_nodelay on;# 连接超时keepalive_timeout 65;keepalive_requests 100;# 客户端设置client_header_timeout 10;client_body_timeout 10;client_max_body_size 100M;client_body_buffer_size 128k;client_header_buffer_size 1k;large_client_header_buffers 4 4k;# 发送超时send_timeout 10;# 重置超时连接reset_timedout_connection on;### Hash表设置##types_hash_max_size 2048;types_hash_bucket_size 64;server_names_hash_max_size 512;server_names_hash_bucket_size 64;variables_hash_max_size 2048;variables_hash_bucket_size 64;### 文件缓存设置##open_file_cache max=10000 inactive=30s;open_file_cache_valid 60s;open_file_cache_min_uses 2;open_file_cache_errors on;### Gzip压缩##gzip on;gzip_vary on;gzip_proxied any;gzip_comp_level 6;gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml+rss application/rss+xml application/atom+xml image/svg+xml;gzip_min_length 1000;gzip_disable "msie6";### 限速设置### 限制请求速率limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;limit_req_zone $server_name zone=perserver:10m rate=100r/s;# 限制连接数limit_conn_zone $binary_remote_addr zone=addr:10m;limit_conn_zone $server_name zone=servers:10m;# 限制带宽limit_rate_after 10m;limit_rate 100k;### 代理设置##proxy_buffering on;proxy_buffer_size 4k;proxy_buffers 8 4k;proxy_busy_buffers_size 8k;proxy_temp_path /var/cache/nginx/proxy_temp;proxy_connect_timeout 60s;proxy_send_timeout 60s;proxy_read_timeout 60s;proxy_http_version 1.1;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_set_header X-Forwarded-Host $host;proxy_set_header X-Forwarded-Port $server_port;# 代理缓存proxy_cache_path /var/cache/nginx/proxy_cache levels=1:2 keys_zone=cache_zone:10m max_size=10g inactive=60muse_temp_path=off;### FastCGI设置##fastcgi_buffering on;fastcgi_buffer_size 4k;fastcgi_buffers 8 4k;fastcgi_connect_timeout 60s;fastcgi_send_timeout 60s;fastcgi_read_timeout 60s;### SSL设置##ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;ssl_session_cache shared:SSL:10m;ssl_session_timeout 10m;ssl_session_tickets off;ssl_stapling on;ssl_stapling_verify on;### 包含其他配置##include /etc/nginx/conf.d/*.conf;include /etc/nginx/sites-enabled/*;
}
5. 域名配置详解
5.1 域名解析基础
5.1.1 DNS记录类型
A记录:域名 → IPv4地址
AAAA记录:域名 → IPv6地址
CNAME记录:域名 → 另一个域名
MX记录:邮件服务器
TXT记录:文本信息(SPF、DKIM等)
5.1.2 配置DNS解析
# 在DNS服务商配置
example.com. A 192.168.1.100
www.example.com. CNAME example.com.
api.example.com. A 192.168.1.101
*.example.com. A 192.168.1.100 # 泛域名解析
5.2 Server块配置
5.2.1 基本域名配置
server {listen 80;listen [::]:80; # IPv6# 服务器名称(域名)server_name example.com www.example.com;# 根目录root /var/www/example.com;# 默认文件index index.html index.htm index.php;# 字符集charset utf-8;# 错误页面error_page 404 /404.html;error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;}
}
5.2.2 多域名配置
# 方式1:多个server块
server {listen 80;server_name site1.com www.site1.com;root /var/www/site1;
}server {listen 80;server_name site2.com www.site2.com;root /var/www/site2;
}# 方式2:同一server块多域名
server {listen 80;server_name site1.com site2.com site3.com;# 根据域名设置不同根目录set $root_path /var/www/default;if ($host = site1.com) {set $root_path /var/www/site1;}if ($host = site2.com) {set $root_path /var/www/site2;}root $root_path;
}
5.2.3 泛域名配置
# 匹配所有子域名
server {listen 80;server_name *.example.com;# 提取子域名if ($host ~* ^([^.]+)\.example\.com$) {set $subdomain $1;}root /var/www/subdomains/$subdomain;
}# 正则匹配域名
server {listen 80;server_name ~^(?<user>.+)\.users\.example\.com$;root /var/www/users/$user;
}
5.2.4 默认服务器
# 设置默认服务器(处理未匹配的请求)
server {listen 80 default_server;listen [::]:80 default_server;server_name _; # 匹配所有域名# 返回444(关闭连接)return 444;# 或重定向到主站# return 301 https://example.com$request_uri;
}
5.3 域名跳转和重定向
5.3.1 www跳转
# www到非www
server {listen 80;server_name www.example.com;return 301 $scheme://example.com$request_uri;
}# 非www到www
server {listen 80;server_name example.com;return 301 $scheme://www.example.com$request_uri;
}
5.3.2 旧域名到新域名
server {listen 80;server_name old-domain.com www.old-domain.com;return 301 $scheme://new-domain.com$request_uri;
}
5.3.3 HTTP到HTTPS
server {listen 80;server_name example.com www.example.com;return 301 https://$server_name$request_uri;
}
5.4 域名配置最佳实践
5.4.1 分离配置文件
# 创建站点配置目录
mkdir -p /etc/nginx/sites-available
mkdir -p /etc/nginx/sites-enabled# 每个站点一个配置文件
/etc/nginx/sites-available/
├── example.com.conf
├── api.example.com.conf
├── blog.example.com.conf
└── shop.example.com.conf# 启用站点
ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/
5.4.2 配置文件模板
# /etc/nginx/sites-available/example.com.conf
server {listen 80;listen [::]:80;server_name example.com www.example.com;# 安全头add_header X-Frame-Options "SAMEORIGIN" always;add_header X-Content-Type-Options "nosniff" always;add_header X-XSS-Protection "1; mode=block" always;# 日志access_log /var/log/nginx/example.com.access.log;error_log /var/log/nginx/example.com.error.log;# 根目录root /var/www/example.com/public;index index.html index.htm;# 静态文件缓存location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {expires 1y;add_header Cache-Control "public, immutable";}# 禁止访问隐藏文件location ~ /\. {deny all;}# 主要处理location / {try_files $uri $uri/ =404;}
}
6. 静态资源服务深入
6.1 高效静态文件服务
6.1.1 基础配置
server {listen 80;server_name static.example.com;root /var/www/static;# 开启sendfilesendfile on;sendfile_max_chunk 1m;# TCP优化tcp_nopush on;tcp_nodelay on;# 目录索引location / {try_files $uri $uri/ =404;}
}
6.1.2 文件类型处理
# 图片文件
location ~* \.(jpg|jpeg|gif|png|webp|svg|ico)$ {expires 1y;add_header Cache-Control "public, immutable";add_header Vary "Accept-Encoding";# 图片防盗链valid_referers none blocked server_names*.example.com example.com~\.google\. ~\.baidu\. ~\.bing\.;if ($invalid_referer) {return 403;}
}# CSS/JS文件
location ~* \.(css|js)$ {expires 7d;add_header Cache-Control "public";# 开启gzipgzip_static on;
}# 字体文件
location ~* \.(eot|ttf|woff|woff2)$ {expires 1y;add_header Cache-Control "public";add_header Access-Control-Allow-Origin *;
}# 媒体文件
location ~* \.(mp4|mp3|mov|avi|wmv|flv|ogg|webm)$ {expires 1y;add_header Cache-Control "public";# 支持视频拖动mp4;mp4_buffer_size 1m;mp4_max_buffer_size 5m;
}
6.2 高级缓存策略
6.2.1 缓存控制头
# 强缓存
location /assets/ {expires 1y;add_header Cache-Control "public, immutable";
}# 协商缓存
location /api/ {expires -1;add_header Cache-Control "no-cache, must-revalidate";
}# 根据文件修改时间设置缓存
location ~* \.(html|htm)$ {add_header Cache-Control "public, max-age=3600";add_header Last-Modified $date_gmt;etag on;
}
6.2.2 条件请求处理
# 启用ETag
etag on;# 处理If-Modified-Since
if_modified_since exact;# 处理If-None-Match
location / {try_files $uri $uri/ =404;# 返回304如果未修改add_header Last-Modified $date_gmt;add_header Cache-Control "public, max-age=3600";
}
6.3 目录浏览功能
location /downloads/ {# 开启目录浏览autoindex on;# 显示文件大小autoindex_exact_size off; # off显示KB/MB,on显示字节# 显示时间autoindex_localtime on; # on本地时间,off GMT时间# 输出格式autoindex_format html; # html, xml, json, jsonp# 自定义头部/尾部add_before_body /autoindex/header.html;add_after_body /autoindex/footer.html;
}# JSON格式输出
location /api/files/ {autoindex on;autoindex_format json;# JSONP支持if ($arg_callback) {autoindex_format jsonp;}
}
6.4 带宽控制
# 全局限速
limit_rate 200k; # 每个连接200KB/s
limit_rate_after 10m; # 10MB后开始限速# 根据条件限速
location /downloads/ {# 根据时间限速set $limit_rate 1m;if ($time_iso8601 ~ "T(0[0-7]|2[0-3]):") {set $limit_rate 5m; # 凌晨到早上8点速度快些}limit_rate $limit_rate;# 根据用户限速if ($remote_addr ~ "