1. Nginx核心功能与典型应用场景
Nginx作为当前最流行的开源Web服务器之一,其高性能的事件驱动架构使其能够轻松应对C10K问题。在实际生产环境中,Nginx通常承担着以下核心角色:
- HTTP/HTTPS反向代理:实现负载均衡和请求分发
- 静态资源服务器:直接托管CSS/JS/图片等静态文件
- API网关:处理路由转发和协议转换
- 安全防护层:配置WAF规则和限流策略
我管理的多个生产集群中,单台Nginx服务器日常处理QPS可达5000+,内存占用仍能保持在100MB以内。这种高效的资源利用率使其成为高并发场景的首选方案。
2. 环境准备与安装指南
2.1 主流系统安装方法
Ubuntu/Debian系统:
bash复制sudo apt update
sudo apt install nginx
systemctl enable nginx # 设置开机自启
CentOS/RHEL系统:
bash复制sudo yum install epel-release
sudo yum install nginx
sudo systemctl enable nginx
源码编译安装(生产环境推荐):
bash复制wget http://nginx.org/download/nginx-1.25.3.tar.gz
tar zxvf nginx-1.25.3.tar.gz
cd nginx-1.25.3
./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_realip_module
make && sudo make install
提示:生产环境建议添加
--with-http_stub_status_module模块以便监控
2.2 目录结构解析
安装完成后关键目录说明:
code复制/etc/nginx/
├── nginx.conf # 主配置文件
├── conf.d/ # 子配置目录
├── sites-available/ # 可用站点配置
└── sites-enabled/ # 已启用站点(通常软链接到available)
3. 核心配置详解
3.1 主配置文件架构
典型nginx.conf结构示例:
nginx复制user www-data;
worker_processes auto; # 通常设为CPU核心数
events {
worker_connections 1024; # 单个worker最大连接数
use epoll; # Linux系统建议使用epoll
}
http {
include 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"';
access_log /var/log/nginx/access.log main;
# 其他公共配置...
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
3.2 虚拟主机配置示范
基础站点配置示例(/etc/nginx/sites-available/example.com):
nginx复制server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
# 静态资源缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
}
4. 日常运维命令大全
4.1 服务管理命令
bash复制# 启动服务
sudo systemctl start nginx
# 停止服务(强制立即停止)
sudo systemctl stop nginx
# 优雅停止(处理完当前请求)
sudo nginx -s quit
# 重新加载配置(不中断服务)
sudo nginx -s reload
# 检查配置语法
sudo nginx -t
4.2 日志分析技巧
实时监控访问日志:
bash复制tail -f /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr
统计HTTP状态码:
bash复制awk '{print $9}' access.log | sort | uniq -c | sort -rn
5. 性能调优实战
5.1 关键参数优化
nginx复制http {
# 文件传输优化
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# 连接超时设置
keepalive_timeout 65;
keepalive_requests 100;
# 缓冲设置
client_body_buffer_size 10K;
client_header_buffer_size 1k;
client_max_body_size 8m;
large_client_header_buffers 4 8k;
# Gzip压缩
gzip on;
gzip_types text/plain text/css application/json application/javascript;
}
5.2 负载均衡配置
nginx复制upstream backend {
least_conn; # 最少连接算法
server 192.168.1.101:8080 weight=3;
server 192.168.1.102:8080;
server 192.168.1.103:8080 backup; # 备用服务器
}
server {
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
6. 安全加固方案
6.1 基础安全配置
nginx复制server {
# 禁用不必要的HTTP方法
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 405;
}
# 隐藏Nginx版本号
server_tokens off;
# 防止点击劫持
add_header X-Frame-Options "SAMEORIGIN";
# XSS防护
add_header X-XSS-Protection "1; mode=block";
}
6.2 HTTPS最佳实践
使用Let's Encrypt免费证书:
bash复制sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com
自动续期配置:
bash复制sudo certbot renew --dry-run
7. 常见问题排查
7.1 502 Bad Gateway
可能原因及解决方案:
- 后端服务未启动 → 检查upstream服务状态
- 权限问题 → 确保nginx用户有访问权限
- 资源不足 → 检查系统内存和连接数限制
7.2 性能瓶颈分析
使用ngxtop实时监控:
bash复制pip install ngxtop
ngxtop -l /var/log/nginx/access.log
8. 容器化部署方案
8.1 Docker基础部署
dockerfile复制FROM nginx:1.25-alpine
COPY nginx.conf /etc/nginx/nginx.conf
COPY sites/ /etc/nginx/conf.d/
RUN mkdir -p /var/www/html
启动命令:
bash复制docker run -d -p 80:80 -v ./html:/var/www/html my-nginx
8.2 Kubernetes Ingress配置
示例Ingress资源:
yaml复制apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
9. 监控与告警配置
9.1 Prometheus监控
启用stub_status模块:
nginx复制location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
Prometheus配置示例:
yaml复制scrape_configs:
- job_name: 'nginx'
static_configs:
- targets: ['nginx-server:9113']
9.2 日志告警规则
使用fail2ban防御暴力破解:
ini复制[nginx-http-auth]
enabled = true
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3