跳到主要内容

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优化缓存策略。