- 优化 Nginx 配置
关闭不必要的模块:通过编译时配置,禁用不需要的模块,以减小 Nginx 的内存占用和提高性能。比如不需要的 ngx_http_autoindex_module 或 ngx_http_browser_module 等。
开启 worker 进程优化:使用 worker_processes auto 来让 Nginx 自动调整工作进程的数量,通常根据 CPU 核数来调整。
优化 worker_connections:worker_connections 配置参数控制每个 worker 进程可以处理的最大连接数。根据机器性能,合理调整这个参数。
worker_processes auto;
worker_connections 1024;
- 反向代理缓存
提高反向代理性能:可以使用 proxy_cache 来缓存反向代理请求,从而减少服务器负载,提高响应速度。
设置缓存过期时间:通过 proxy_cache_valid 和 expires 来控制缓存内容的过期时间。
location / {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_valid 200 1h;
expires 1h;
}
- 负载均衡
简单负载均衡:Nginx 提供了几种负载均衡策略,如轮询(默认)、加权轮询、最少连接等。
加权负载均衡:通过配置权重来设置不同后端服务器的负载能力。例如:
upstream backend {
server backend1.example.com weight=3;
server backend2.example.com weight=2;
}
基于 IP 的负载均衡:Nginx 可以通过 ip_hash 实现客户端 IP 地址的粘性负载均衡,确保来自相同 IP 的请求始终分发到同一台后端服务器。
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
}
- 日志优化
定制日志格式:Nginx 支持自定义日志格式,可以输出请求的详细信息,方便调试和监控。
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;
禁用日志:对于某些静态文件请求或某些不重要的请求,可以禁用日志来提高性能。
location /favicon.ico {
log_not_found off;
access_log off;
}
- 优化静态文件
启用文件压缩(gzip):Nginx 可以压缩响应体,减小传输数据的大小,从而提高性能。
gzip on;
gzip_types text/plain text/css application/javascript;
gzip_min_length 1000;
配置文件缓存:Nginx 支持通过 expires 指令设置静态文件的缓存时间,减少静态资源的请求次数。
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2)$ {
expires 30d;
access_log off;
}
- SSL/TLS 配置
强制 HTTPS:如果你希望网站强制使用 HTTPS,可以通过重定向 HTTP 请求到 HTTPS 来增强安全性。
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
优化 SSL 设置:Nginx 支持 SSL/TLS 加速,正确配置可以提高 HTTPS 访问性能。
server {
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384';
ssl_prefer_server_ciphers off;
}
- 限流和防止 DDoS 攻击
请求限制:Nginx 可以限制每个 IP 地址的请求频率,从而防止暴力攻击或 DDoS 攻击。
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
location / {
limit_req zone=one burst=5;
}
}
限制连接数:限制每个 IP 地址的连接数,防止滥用。
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location / {
limit_conn addr 10;
}
}
- 防盗链
禁止外部站点引用资源:通过设置 referer 来防止盗链,保护网站资源。
location ~* \.(jpg|jpeg|png|gif|css|js)$ {
valid_referers none blocked yourdomain.com;
if ($invalid_referer) {
return 403;
}
}
- 请求重写和转发
使用正则表达式进行请求重写:Nginx 支持使用正则表达式进行 URL 重写。
location /old-url/ {
rewrite ^/old-url/(.*)$ /new-url/$1 permanent;
}
- 缓存与反向代理
基于 URL 参数的缓存:Nginx 允许根据 URL 参数来缓存不同版本的资源。
location / {
proxy_cache my_cache;
proxy_cache_key "$scheme$request_method$host$request_uri";
}
- 限流和防止 DDoS 攻击
请求限制:Nginx 可以限制每个 IP 地址的请求频率,从而防止暴力攻击或 DDoS 攻击。
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
location / {
limit_req zone=one burst=5;
}
}
限制连接数:限制每个 IP 地址的连接数,防止滥用。
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location / {
limit_conn addr 10;
}
}
- 防盗链
禁止外部站点引用资源:通过设置 referer 来防止盗链,保护网站资源。
location ~* \.(jpg|jpeg|png|gif|css|js)$ {
valid_referers none blocked yourdomain.com;
if ($invalid_referer) {
return 403;
}
}
- 隐藏 Nginx 版本信息
默认情况下,Nginx 会在响应头中返回 Nginx 的版本信息,这可能被攻击者利用。为了避免泄露版本信息,可以在配置文件中禁用这一功能。
server_tokens off;
- 限制访问敏感文件
避免暴露敏感文件(如 .htaccess, .git, .env 等),可以配置 Nginx 阻止对这些文件的访问。
location ~* \.(htaccess|htpasswd|git|env|svn)$ {
deny all;
}
- 禁止目录浏览
默认情况下,Nginx 允许目录浏览(如果目录中没有 index.html 或其他索引文件)。为了避免泄露目录结构,可以禁用目录浏览。
location / {
autoindex off;
}
- 防止 Clickjacking 攻击
可以通过设置 X-Frame-Options 响应头来防止站点被嵌入到 中,从而防止 Clickjacking 攻击。
add_header X-Frame-Options "SAMEORIGIN";
也可以使用 DENY 来完全阻止站点被嵌入在 iframe 中。
add_header X-Frame-Options "DENY";
- 防止跨站脚本攻击 (XSS)
通过设置 X-XSS-Protection 响应头,可以启用浏览器的内建 XSS 防护。
add_header X-XSS-Protection "1; mode=block";
- 防止 MIME 类型嗅探
设置 X-Content-Type-Options 为 nosniff,可以防止浏览器自动推断 MIME 类型,降低攻击风险。
add_header X-Content-Type-Options "nosniff";
- 防止跨站请求伪造(CSRF)
为了防止 CSRF 攻击,通常使用防护令牌来保证请求的合法性。不过,Nginx 本身并不提供 CSRF 防护机制,但可以通过限制来源(如设置 Referer)来增强安全性。
location / {
valid_referers none blocked example.com;
if ($invalid_referer) {
return 403;
}
}