Nginx完全指南:从入门到精通(超详细文档)
一、Nginx基础概述
1.1 什么是Nginx?
Nginx是一个高性能的HTTP服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器,由Igor Sysoev开发。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。
1.2 Nginx的历史与发展
- 2004年10月4日,Nginx 0.1.0发布
- 2011年6月1日,Nginx 1.0.0发布
- 2019年3月11日,F5 Networks宣布以6.7亿美元收购Nginx公司
- 截至2023年,Nginx仍是全球最流行的Web服务器之一
1.3 Nginx的应用场景
- Web服务器
- 反向代理服务器
- 负载均衡器
- HTTP缓存
- API网关
二、Nginx核心架构
2.1 模块化架构
Nginx采用模块化设计,核心模块与功能模块分离:
- 核心模块:负责进程管理、内存管理等基础功能
- HTTP模块:处理HTTP请求
- Mail模块:处理邮件服务
- Stream模块:处理TCP/UDP流量
2.2 多进程模型
Nginx默认采用master-worker多进程模型:master process
|
├── worker process 1
├── worker process 2
└── ...
2.3 事件驱动机制
Nginx使用epoll/kqueue等高效事件模型处理并发连接:// 简化的事件处理循环伪代码
while (true) {
events = ngx_process_events();
for (event in events) {
if (event.type == NGX_READ_EVENT) {
ngx_handle_read(event);
} else if (event.type == NGX_WRITE_EVENT) {
ngx_handle_write(event);
}
}
}
三、Nginx安装与配置
3.1 安装Nginx
Ubuntu/Debian系统:sudo apt update
sudo apt install nginx
CentOS/RHEL系统:sudo yum install epel-release
sudo yum install nginx
源码编译安装:wget https://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
make && make install
3.2 配置文件结构
Nginx主配置文件:`/etc/nginx/nginx.conf`
典型配置文件结构:user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
3.3 虚拟主机配置
配置示例(`/etc/nginx/conf.d/example.com.conf`):server {
listen 80;
server_name example.com www.example.com;
location / {
root /var/www/example.com;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
四、Nginx作为Web服务器
4.1 静态文件服务配置
server {
listen 80;
server_name static.example.com;
location / {
root /var/www/static;
autoindex on; # 开启目录浏览
expires 7d; # 设置缓存时间
}
}
4.2 索引文件配置
location / {
root /var/www/html;
index index.php index.html index.htm;
}
4.3 错误页面配置
error_page 404 /404.html;
location = /404.html {
root /var/www/error_pages;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/error_pages;
}
五、Nginx作为反向代理服务器
5.1 基本反向代理配置
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_server:8080;
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;
}
}
5.2 高级反向代理配置
location / {
proxy_pass http://backend_server;
proxy_http_version 1.1;
proxy_set_header Connection ""; # 启用HTTP/1.1的keepalive
proxy_connect_timeout 5s; # 连接超时时间
proxy_read_timeout 60s; # 读取超时时间
proxy_send_timeout 60s; # 发送超时时间
proxy_buffer_size 32k; # 响应头缓冲区大小
proxy_buffers 4 64k; # 响应体缓冲区数量和大小
proxy_busy_buffers_size 128k; # 高负荷下的缓冲区大小
}
六、Nginx负载均衡
6.1 负载均衡基本配置
upstream backend_servers {
server backend1.example.com weight=5;
server backend2.example.com weight=3;
server backend3.example.com weight=2;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_servers;
}
}
6.2 负载均衡算法
- round-robin:轮询(默认)
- least_conn:最少连接
- ip_hash:基于IP哈希
- url_hash:基于URL哈希
- fair:基于响应时间(需安装ngx_http_upstream_fair模块)
upstream backend_servers {
least_conn; # 使用最少连接算法
server backend1.example.com;
server backend2.example.com;
}
6.3 健康检查配置
upstream backend_servers {
server backend1.example.com max_fails=3 fail_timeout=30s;
server backend2.example.com max_fails=3 fail_timeout=30s;
server backend3.example.com backup; # 备份服务器
}
七、Nginx缓存配置
7.1 简单缓存配置
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_server;
proxy_cache my_cache;
proxy_cache_valid 200 302 60m;
proxy_cache_valid 404 1m;
proxy_cache_key $scheme$host$request_uri;
}
}
7.2 缓存清除配置
location ~ /purge(/.*) {
allow 192.168.1.0/24; # 仅允许内部网络清除缓存
deny all;
proxy_cache_purge my_cache $scheme$host$1;
}
八、Nginx安全配置
8.1 HTTPS配置
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
ssl_protocols TLSv1.3 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
location / {
proxy_pass http://backend_server;
}
}
# HTTP重定向到HTTPS
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
8.2 防止DDOS攻击配置
http {
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
server {
location / {
limit_req zone=mylimit burst=20 nodelay;
proxy_pass http://backend_server;
}
}
}
8.3 隐藏Nginx版本信息
server_tokens off;
九、Nginx性能优化
9.1 工作进程优化
worker_processes auto; # 根据CPU核心数自动调整
worker_cpu_affinity auto; # 自动绑定CPU核心
9.2 连接优化
events {
worker_connections 10240; # 每个工作进程的最大连接数
multi_accept on; # 一次性接受所有连接
use epoll; # 使用epoll事件模型(Linux)
}
9.3 文件描述符限制
worker_rlimit_nofile 65535; # 增加文件描述符限制
9.4 内核参数优化
# /etc/sysctl.conf
net.core.somaxconn = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.ip_local_port_range = 1024 65535
十、Nginx监控与维护
10.1 状态页面配置
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
10.2 日志分析工具
- AWStats
- GoAccess
- Nginx Amplify
10.3 平滑重启与升级
# 检查配置文件
nginx -t
# 平滑重启
nginx -s reload
# 平滑升级
kill -USR2 `cat /var/run/nginx.pid`
十一、Nginx常见问题与解决方案
11.1 502 Bad Gateway错误
- 检查后端服务器是否正常运行
- 增加proxy_connect_timeout和proxy_read_timeout值
- 检查后端服务器日志
11.2 504 Gateway Timeout错误
- 增加fastcgi_read_timeout(PHP应用)
- 增加proxy_read_timeout(反向代理)
- 优化后端应用性能
11.3 413 Request Entity Too Large错误
client_max_body_size 100M; # 增加客户端请求体大小限制
十二、Nginx高级应用案例
12.1 微服务API网关
upstream service_a {
server service_a_1:8080;
server service_a_2:8080;
}
upstream service_b {
server service_b_1:8080;
server service_b_2:8080;
}
server {
listen 80;
server_name api.example.com;
location /api/a/ {
proxy_pass http://service_a/;
proxy_set_header X-Service service_a;
}
location /api/b/ {
proxy_pass http://service_b/;
proxy_set_header X-Service service_b;
}
}
12.2 静态资源CDN配置
server {
listen 80;
server_name static.example.com;
location / {
root /var/www/static;
expires 30d;
add_header Cache-Control "public";
# 错误处理
error_page 404 = @backend;
}
location @backend {
proxy_pass http://backend_server;
}
}
十三、Nginx与其他技术对比
13.1 Nginx vs Apache
| 特性 | Nginx | Apache |
|---------------------|---------------------------|---------------------------|
| 架构 | 事件驱动,异步非阻塞 | 多进程或多线程 |
| 内存占用 | 低 | 高 |
| 并发处理能力 | 高(数万连接)| 低(数千连接) |
| 模块扩展方式 | 编译时添加 | 运行时加载 |
| 配置复杂度 | 低 | 高 |
| 静态文件处理 | 优秀 | 一般 |
| 反向代理性能 | 优秀 | 一般 |
13.2 Nginx vs HAProxy
| 特性 | Nginx | HAProxy |
|---------------------|---------------------------|---------------------------|
| 应用层协议支持 | HTTP、HTTPS、SMTP等 | 主要支持TCP、HTTP |
| 负载均衡算法 | 多种算法 | 更丰富的算法 |
| SSL处理性能 | 优秀 | 优秀 |
| Web服务器功能 | 支持 | 不支持 |
| 监控界面 | 简单 | 更详细 |
十四、Nginx未来发展趋势
14.1 云原生集成
- 作为Kubernetes Ingress Controller的主流选择
- 支持Service Mesh架构(如与Envoy集成)
14.2 HTTP/3与QUIC支持
- 逐步支持HTTP/3协议,提升网络传输性能
- 降低连接建立延迟,优化移动网络体验
14.3 高级安全功能
- 集成WAF(Web Application Firewall)功能
- 加强API安全防护能力
14.4 AI驱动优化
- 基于机器学习动态调整负载均衡策略
- 智能流量调度与异常检测
十五、总结
Nginx凭借其高性能、低内存占用和灵活的模块化设计,已成为现代Web架构中不可或缺的一部分。无论是作为Web服务器、反向代理还是负载均衡器,Nginx都能提供出色的性能和稳定性。通过深入理解Nginx的工作原理和配置技巧,开发者和系统管理员可以构建出更高效、更可靠的应用架构。
随着云计算、微服务和边缘计算的发展,Nginx的应用场景将更加广泛,其功能也将不断演进和完善。掌握Nginx技术,将为IT从业者在构建下一代互联网应用中提供强大的竞争力。