引言
Nginx(发音为 "engine x")是一个高性能的 HTTP 和反向代理服务器,同时也是一个 IMAP/POP3/SMTP 代理服务器。因其稳定性、丰富的功能集、简单的配置文件和极低的资源消耗而闻名于世。如今,Nginx 已成为全球最受欢迎的 Web 服务器之一,承载着互联网上大量最繁忙的网站。本文将带你全面掌握 Nginx,从安装配置到架构原理和深度优化。第一部分:基础概念与安装

- Web 服务器: 像 Apache 一样,Nginx 可以处理 HTTP 请求并返回静态资源(HTML、CSS、JS、图片等),性能极高。
- 反向代理服务器: 这是 Nginx 最核心的功能。它接收客户端请求,并将其转发给后端的内部服务器(如 Tomcat、PHP-FPM、Node.js 等),然后将结果返回给客户端。对外屏蔽了内部结构,提高了安全性和可扩展性。
- 负载均衡器: 作为反向代理,Nginx 可以将流量分发到多个后端服务器,避免单一服务器压力过大,提高整体性能和可靠性。
- 邮件代理服务器: 可以代理 IMAP、POP3、SMTP 协议。
- API 网关: 通过丰富的模块,可以实现路由、认证、限流、日志等 API 管理功能。
- Nginx 采用经典的 Master-Worker 多进程模型,这是一种事件驱动的异步非阻塞架构。
- Master 进程: 主进程,以 root 身份运行。负责:
- 读取和验证配置文件。
- 管理 Worker 进程(启动、停止、平滑升级)。
- 不处理具体的网络请求。
- Worker 进程: 工作进程,以普通用户身份运行(提高安全性)。负责:
- 处理实际的客户端连接和请求。
- 多个 Worker 之间是独立的,互不影响。
- 每个 Worker 都是单线程的,但采用 异步非阻塞(epoll, kqueue) 的方式来处理数万个连接,这是高性能的关键。
- 优势:
- 高并发: 一个 Worker 可以轻松处理数万连接,资源占用极低。
- 高可靠性: 一个 Worker 崩溃,Master 可以立刻拉起新的,不影响其他 Worker。
- 热部署: 修改配置后,可以不停机重载(nginx -s reload)。升级二进制文件时,可以平滑升级。
# 添加 EPEL 仓库(如果需要) sudo yum install epel-release # 安装 Nginx sudo yum install nginx # 启动并设置开机自启 sudo systemctl start nginx sudo systemctl enable nginx在 Ubuntu/Debian 上:
sudo apt updatesudo apt install nginx从源码编译安装(获取最新版本和自定义模块):
sudo systemctl start nginx
sudo systemctl enable nginx
wget http://nginx.org/download/nginx-1.22.1.tar.gz安装完成后,访问服务器 IP,你应该能看到 Nginx 的默认欢迎页面。第二部分:核心配置与语法Nginx 的配置文件通常位于 /etc/nginx/nginx.conf 或 /usr/local/nginx/conf/nginx.conf。其语法遵循特定结构。1. 配置文件结构配置文件由 指令(Directives) 和 上下文(Contexts) 组成。
tar zxvf nginx-1.22.1.tar.gz
cd nginx-1.22.1
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_v2_module # 可以添加很多其他模块
make
sudo make install
# 全局上下文,影响整个Nginx2. 核心功能配置1. 静态资源服务这是 Nginx 最基本也是最擅长的功能。
user nginx; # Worker进程运行的用户
worker_processes auto; # Worker进程数,通常设置为CPU核心数
error_log /var/log/nginx/error.log warn; # 错误日志路径和级别
pid /var/run/nginx.pid; # 主进程PID文件位置events上下文,配置网络连接
events {
worker_connections 1024; # 每个Worker进程的最大连接数
use epoll; # 使用epoll高效事件模型(Linux)
multi_accept on; # 一个worker同时接受多个新连接
}http上下文,配置HTTP服务器相关所有内容
http {
# 引入MIME类型定义
include /etc/nginx/mime.types;
default_type application/octet-stream; # 日志格式
access_log /var/log/nginx/access.log; # 核心服务器配置
server {
listen 80; # 监听端口
server_name example.com www.example.com; # 服务器域名 # location上下文,配置如何响应特定请求URI
location / {
root /usr/share/nginx/html; # 根目录
index index.html index.htm; # 默认索引文件
} location /images/ {
# 别名,将/images/映射到另一个目录
alias /data/images/;
# 开启文件高效传输
sendfile on;
}
} # 可以包含其他server配置文件,方便管理
include /etc/nginx/conf.d/*.conf;
}
server {
listen 80;
server_name static.example.com; location / {
root /data/www;
# 尝试访问URI,如果没找到再尝试URI.html,最后尝试URI/下的index.html
try_files $uri $uri.html $uri/ /index.html;
} location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
root /data/www/static;
# 设置静态资源的浏览器缓存时间
expires 30d;
add_header Cache-Control "public, immutable";
}
}2. 反向代理将请求转发到后端应用服务器。server {
listen 80;
server_name app.example.com; location / {
# 设置反向代理的后端服务器地址
proxy_pass http://localhost:8080; # 传递重要的客户端信息给后端
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme; # 一些超时和缓冲区的优化配置
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
}
}3. 负载均衡Nginx 支持多种负载均衡算法:round-robin(轮询,默认)、least_conn(最少连接)、ip_hash(基于客户端 IP 哈希,实现会话保持)。# 在http上下文中定义一个上游服务器组(upstream)第三部分:高级应用与优化1. 动静分离将动态请求和静态资源请求分开处理,是提升网站性能的关键架构。
http {
upstream backend_servers {
# ip_hash; # 启用IP哈希会话保持
least_conn; # 使用最少连接算法 server 192.168.1.10:8080 weight=3; # weight代表权重,越高分配越多请求
server 192.168.1.11:8080;
server 192.168.1.12:8080 backup; # backup表示备份服务器,只有当主服务器都宕机时才启用
} server {
listen 80;
server_name loadbalancer.example.com; location / {
proxy_pass http://backend_servers;
# ... 其他proxy_set_header等配置
}
}
}
server {
listen 80;
server_name www.example.com; # 所有静态资源请求由Nginx直接处理
location ~* .(jpg|jpeg|png|gif|css|js|ico|woff|ttf)$ {
root /data/www/static;
expires 1y;
add_header Cache-Control "public, immutable";
access_log off; # 静态资源可以不记录访问日志,减少磁盘IO
} # 动态请求代理给后端应用服务器(如Tomcat, Node.js)
location / {
proxy_pass http://backend_servers;
# ... proxy_set_header 等配置
} # 甚至可以将API请求单独代理
location /api/ {
proxy_pass http://api_servers;
}
}2. 缓存优化Nginx 可以作为反向代理缓存,将后端应用的响应缓存起来,极大减轻后端压力。http {
# 在http上下文定义缓存路径和参数
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m
max_size=10g inactive=60m use_temp_path=off; server {
location / {
proxy_pass http://backend_servers;
# 启用缓存,使用上面定义的keys_zone
proxy_cache my_cache;
# 对200和302响应码的请求缓存1小时
proxy_cache_valid 200 302 1h;
proxy_cache_valid 404 1m;
# 定义缓存键(默认会忽略很多参数,这里根据业务调整)
proxy_cache_key $scheme$proxy_host$uri$is_args$args;
# 增加一个响应头,显示缓存命中状态(HIT, MISS, BYPASS)
add_header X-Cache-Status $upstream_cache_status;
}
}
}3. HTTPS 与 SSL 优化使用 SSL 证书加密通信是现代网站的标配。server {
listen 443 ssl http2; # 启用HTTP/2,性能更好
server_name example.com; # SSL证书和密钥路径
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key; # SSL会话缓存优化,减少握手开销
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off; # 安全套件偏好,禁用不安全的协议和加密方式
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:...;
ssl_prefer_server_ciphers on; # 启用OCSP装订,提高SSL验证性能
ssl_stapling on;
ssl_stapling_verify on; # 强制HTTP跳转到HTTPS
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}4. 安全加固隐藏 Nginx 版本号:server_tokens off; # 在http或server块中配置限制访问:
location /admin/ {
allow 192.168.1.0/24; # 只允许内网IP段访问
deny all; # 拒绝所有其他IP
auth_basic "Restricted Area"; # 基础认证
auth_basic_user_file /etc/nginx/.htpasswd;
}防 DDoS/暴力破解: 使用 limit_req_zone 和 limit_conn_zone 限制请求速率和连接数。http {
# 定义限制区域,$binary_remote_addr是客户端IP,zone=10m分配10MB内存存储状态,rate=10r/s每秒10个请求
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; server {
location /login {
# 应用限制区域‘one’,突发请求不超过5个
limit_req zone=one burst=5 nodelay;
proxy_pass http://backend_servers;
}
}
}第四部分:性能调优1. 系统与全局调优Worker 进程数:worker_processes auto; # 通常设置为CPU核心数,auto会自动检测每个 Worker 的最大连接数:
events {
worker_connections 10240; # 根据系统最大打开文件数调整(ulimit -n)
}高效事件模型:events {
use epoll; # 在Linux上使用epoll
}启用 sendfile 和 tcp_nopush: 对于发送静态文件非常高效。http {
sendfile on;
tcp_nopush on; # 需要sendfile为on时才有效
tcp_nodelay on; # 在高延时网络上提高实时性
}2. 日志优化访问日志记录会占用大量磁盘 I/O。对于高流量站点,可以考虑:缓冲日志: 不立即写入磁盘,而是先缓冲。access_log /var/log/nginx/access.log combined buffer=64k flush=1m;关闭不必要的日志: 如静态资源、健康检查请求。
location = /health {
access_log off;
proxy_pass http://backend_servers;
}3. Gzip 压缩减少传输体积,提升加载速度。http {
gzip on;
gzip_vary on;
gzip_min_length 1024; # 小于1k不压缩
gzip_proxied any; # 对所有代理请求都压缩
gzip_types text/plain text/css text/xml application/json application/javascript application/xml+rss;
gzip_comp_level 6; # 压缩级别(1-9),权衡CPU和压缩率
}<br/>
本文最后更新时间 2025-10-01
文章链接地址:https://xzlo.blog/index.php/archives/70/
本站文章除注明[转载|引用|原文]出处外,均为本站原生内容,转载前请注明出处