Nginx 安全与性能优化
安全性最佳实践
更新 Nginx
保持 Nginx 版本最新能够确保您获得最新的安全补丁和功能改进。定期检查Nginx 官方发布并使用包管理器更新:
sudo apt update
sudo apt upgrade nginx
以非 root 用户运行 Nginx
默认情况下,Nginx 以 root 用户启动,但在运行过程中会切换到指定的非 root 用户。这可以降低潜在的安全风险。在配置文件中设置用户:
user www-data;
确保www-data
用户拥有适当的权限访问必要的目录和文件。
限制请求大小
限制客户端请求的大小可以防止恶意用户发送过大的请求,消耗服务器资源。配置如下:
http {
client_max_body_size 10M;
}
此配置将最大请求体限制为 10MB。
隐藏 Nginx 版本信息
隐藏 Nginx 的版本信息可以减少被攻击者利用已知漏洞的风险。修改配置文件:
http {
server_tokens off;
}
使用 SSL/TLS
启用 SSL/TLS 加密通信,保护数据传输的安全。配置示例如下:
server {
listen 443 ssl;
server_name secure.example.com;
ssl_certificate /etc/ssl/certs/example.crt;
ssl_certificate_key /etc/ssl/private/example.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
root /var/www/secure;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
确保使用强加密协议和密码套件,避免使用过时的协议如 TLSv1 或 SSL。
实施访问控制
通过 IP 白名单或黑名单限制对服务器的访问。例如,仅允许特定 IP 访问管理页面:
location /admin {
allow 192.168.1.0/24;
deny all;
}
防止 DDoS 攻击
限制每个 IP 的连接数和请求速率,减少 DDoS 攻击的影响:
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
listen 80;
server_name example.com;
location / {
limit_conn addr 10;
limit_req zone=one burst=5;
proxy_pass http://backend;
}
}
}
保护配置文件
确保 Nginx 配置文件的权限正确,防止未授权的访问或修改:
sudo chown root:root /etc/nginx/nginx.conf
sudo chmod 644 /etc/nginx/nginx.conf
性能优化策略
启用缓存
配置 Nginx 缓存可以减少后端服务器的负载,提高响应速度:
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;
upstream backend {
server backend1.example.com:8080;
server backend2.example.com:8080;
server backend3.example.com:8080;
}
server {
listen 80;
server_name example.com;
location / {
proxy_cache my_cache;
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
启用 Gzip 压缩
通过 Gzip 压缩减少传输数据量,加快页面加载速度:
http {
gzip on;
gzip_types text/plain application/json application/javascript text/css;
gzip_min_length 256;
gzip_proxied any;
gzip_vary on;
}
优化工作进程
根据服务器的 CPU 核心数配置 Nginx 的工作进程数,提升并发处理能力:
worker_processes auto;
events {
worker_connections 1024;
}
auto
选项会自动检测 CPU 核心数,合理分配工作进程。
调整 Keepalive 设置
优化 Keepalive 设置可以减少连接建立的开销:
http {
keepalive_timeout 65;
keepalive_requests 100;
}
keepalive_timeout
设置保持连接的时间,keepalive_requests
限制每个连接的请求数。
优化缓冲区大小
根据应用需求调整缓冲区大小,避免内存浪费或性能瓶颈:
http {
client_body_buffer_size 16k;
client_header_buffer_size 1k;
large_client_header_buffers 2 1k;
}
启用 HTTP/2
HTTP/2 可以显著提高网页加载速度,特别是在处理多个并发请求时:
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/ssl/certs/example.crt;
ssl_certificate_key /etc/ssl/private/example.key;
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
确保客户端和服务器都支持 HTTP/2。
使用 Brotli 压缩
Brotli 是一种更高效的压缩算法,能够进一步减少传输数据量:
http {
brotli on;
brotli_types text/plain application/json application/javascript text/css;
brotli_comp_level 6;
}
需要确保 Nginx 编译时包含 Brotli 模块。
优化静态文件服务
配置 Nginx 高效地提供静态文件,减少服务器负载:
server {
listen 80;
server_name static.example.com;
root /var/www/static;
index index.html;
location / {
try_files $uri $uri/ =404;
expires 30d;
add_header Cache-Control "public, no-transform";
}
}
expires
指令设置浏览器缓存时间,Cache-Control
优化缓存策略。