一、基础架构与性能优势
- 事件驱动与异步非阻塞模型
- 采用单线程或多进程(基于配置)的事件驱动架构,通过 epoll(Linux)、kqueue(BSD)等机制高效处理并发连接。
- 异步非阻塞 I/O 模型,避免因等待 I/O 操作阻塞进程,适合高并发场景(如每秒数万请求)。
- 低资源消耗
- 内存占用少,尤其在处理静态文件时,显著优于传统多线程服务器(如 Apache)。
- 多进程模式
- 主进程(Master)负责管理配置和协调工作进程(Worker),Worker 进程处理实际请求,提升稳定性与扩展性。
二、核心功能详解
1. Web 服务器功能
- 静态内容服务
- 高效处理 HTML、CSS、JS、图片等静态文件,支持 sendfile 系统调用,减少内存拷贝。
- 示例配置:
location /static/ {
root /var/www/html;
expires 30d; # 客户端缓存
}
- 动态内容代理
- 通过 FastCGI、uWSGI 等协议将动态请求(如 PHP、Python)转发至后端应用服务器。
- 示例(PHP-FPM):
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
}
2. 反向代理
- 请求转发
- 将客户端请求转发至后端服务器,隐藏后端细节,提升安全性。
- 示例:
location / {
proxy_pass http://backend_servers;
proxy_set_header Host $host;
}
- SSL/TLS 终止
- 在 Nginx 端解密 HTTPS 请求,减轻后端服务器负担。
- 示例:
server {
listen 443 ssl;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
# 代理至HTTP后端
proxy_pass http://backend;
}
- WebSocket 支持
- 通过 Upgrade 头代理 WebSocket 连接:
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
3. 负载均衡
- 算法支持
- 轮询(Round Robin):默认策略,按顺序分配请求。
- 加权轮询(Weighted Round Robin):按权重分配流量。
- IP 哈希(IP Hash):基于客户端 IP 分配固定后端,保持会话一致性。
- 最少连接(Least Connections):优先选择连接数最少的后端。
- 示例配置:
upstream backend_servers {
server 10.0.0.1 weight=3;
server 10.0.0.2;
server 10.0.0.3 backup; # 备用服务器
least_conn;
}
- 健康检查
- 被动检查:通过失败重试机制(max_fails、fail_timeout)标记不可用节点。
- 主动检查(需 Nginx Plus 或第三方模块):定期向后端发送探测请求。
4. 缓存机制
- 代理缓存
- 缓存后端响应,减少重复请求对后端的压力。
- 配置示例:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m;
server {
location / {
proxy_cache my_cache;
proxy_pass http://backend;
proxy_cache_valid 200 302 10m; # 缓存200/302状态码10分钟
}
}
- FastCGI 缓存
- 缓存动态内容(如 PHP 页面):
fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=fcgi_cache:10m;
location ~ \.php$ {
fastcgi_cache fcgi_cache;
fastcgi_cache_valid 200 5m;
}
5. 安全特性
- 访问控制
- IP 黑白名单:
location /admin/ {
deny 192.168.1.100;
allow 10.0.0.0/8;
deny all;
}
-
- HTTP 基础认证:
auth_basic "Restricted Area";
auth_basic_user_file /etc/nginx/.htpasswd;
- 速率限制
- 限制请求频率与并发连接数:
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
location /api/ {
limit_req zone=req_limit burst=20;
limit_conn conn_limit 5;
}
- DDoS 防护
- 结合 limit_req、limit_conn 模块限制异常流量。
6. 高级路由与重写
- URL 重写(Rewrite)
- 修改请求路径或重定向:
rewrite ^/old-url/(.*)$ /new-url/$1 permanent; # 301重定向
- Location 匹配规则
- 支持前缀匹配(/path/)、正则匹配(~* \.jpg$ 不区分大小写)等。
7. 日志与监控
- 访问日志
- 自定义日志格式与存储路径:
log_format main '$remote_addr - $request_time';
access_log /var/log/nginx/access.log main;
- 错误日志
- 记录服务器错误信息:
error_log /var/log/nginx/error.log warn; # 日志级别为警告及以上
8. 压缩与优化
- Gzip 压缩
- 减少传输数据量:
gzip on;
gzip_types text/plain application/json;
- 文件传输优化
- sendfile:零拷贝传输文件。
- tcp_nopush:优化数据包发送效率。
9. 模块化扩展
- 官方模块
- 如 ngx_http_ssl_module(SSL 支持)、ngx_http_geoip_module(IP 地理定位)。
- 第三方模块
- 动态加载模块(Nginx 1.9.11+),如 ngx_http_lua_module(Lua 脚本支持)。
10. 邮件代理
- 支持协议
- SMTP、IMAP、POP3 代理,适用于邮件服务器负载均衡。
三、配置与管理
- 热部署与平滑重启
- 更新配置无需重启服务:nginx -s reload。
- 二进制升级:替换可执行文件后通过信号通知主进程。
- 多虚拟主机
- 通过 server 块支持多域名托管:
server {
listen 80;
server_name example.com;
# 配置...
}
四、典型应用场景
- 静态资源托管:直接高效提供静态文件。
- API 网关:路由、限流、认证一体化。
- 微服务入口:反向代理与负载均衡多个后端服务。
- 内容缓存:加速网站响应,降低后端负载。
- 安全防护:作为 SSL 终端和访问控制层。