Nginx 常见配置优化及安全防范措施
前言
Nginx 是一个高性能的 HTTP 和反向代理服务器,广泛应用于网站和应用程序的部署。为了确保 Nginx 的高效运行和安全性,我搜集了一些丰富的实际案例,详细介绍如何在工作中优化 Nginx 配置以及采取有效的安全防范措施。
案例一:优化静态文件服务
背景:一个网站主要提供静态文件下载,如图片、CSS 和 JavaScript 文件。
效果:通过启用 Gzip 压缩和设置缓存头,显著减少了传输数据的大小,提高了网站的加载速度,并降低了服务器负载。
优化措施:
server {
listen 80;
server_name static.example.com;
root /var/www/static;
index index.html;
# 启用 Gzip 压缩
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# 设置缓存头
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
# 禁用目录列表
autoindex off;
}
案例二:优化动态内容服务
背景:一个网站主要提供动态内容,如用户生成的内容和个人资料页面。
效果:通过配置反向代理和限制请求速率及并发连接数,提高了动态内容的响应速度,并防止了 DDoS 攻击。
优化措施:
server {
listen 80;
server_name dynamic.example.com;
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# 限制请求速率和并发连接数
limit_req zone=one burst=5 nodelay;
limit_conn addr 10;
}
案例三:优化 HTTPS 配置
背景:一个网站需要通过 HTTPS 提供服务,并确保安全性和性能。
效果:通过启用 HTTP/2 和配置安全的 SSL/TLS 设置,提高了网站的加载速度和安全性。
优化措施:
server {
listen 80;
server_name secure.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name secure.example.com;
ssl_certificate /path/to/certificate.crt;
ssl_certificate_key /path/to/private.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA26';
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
案例四:优化负载均衡
背景:一个网站有多个后端服务器,需要实现负载均衡和高可用性。
效果:通过配置负载均衡和保持长连接,提高了网站的响应速度和可用性。
优化措施:
http {
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
keepalive 32;
}
server {
listen 80;
server_name loadbalanced.example.com;
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
案例五:优化视频流服务
背景:一个网站提供视频流服务,需要确保流畅的视频播放体验。
效果:通过设置限速和限速延迟,确保了视频流的稳定传输,提高了用户的观看体验。
优化措施:
server {
listen 80;
server_name video.example.com;
location /videos/ {
alias /var/www/videos/;
limit_rate_after 5m;
limit_rate 256k;
}
}
案例六:使用缓存提高静态资源加载速度
背景:我们有一个新闻网站,每天更新大量新闻内容和相关图片。为了加快页面加载速度,我们决定对静态资源进行缓存优化。
效果:通过设置缓存路径和使用 proxy_cache
指令,我们显著提高了静态资源的加载速度。页面加载时间减少了约 45%,用户满意度大幅提升。
优化措施:
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
server {
listen 80;
server_name news.example.com;
location /static/ {
alias /var/www/news/static/;
expires 1d;
add_header Cache-Control "public";
}
location / {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_key "$scheme$request_method$host$request_uri";
add_header X-Proxy-Cache $upstream_cache_status;
}
}
}
案例七:限制带宽以防止资源滥用
背景:我们的网站提供免费的下载服务,但有时会遇到恶意用户占用大量带宽,影响其他用户的正常使用。
效果:通过设置带宽限制,我们有效防止了恶意用户占用过多带宽,确保了所有用户都能公平地使用下载服务。
优化措施:
server {
listen 80;
server_name download.example.com;
location /downloads/ {
limit_rate 500k; # 限制每个连接的下载速度为 500KB/s
limit_rate_after 5m; # 开始限速前允许无限制下载 5MB
}
}
案例八:配置防盗链保护资源
背景:我们的网站提供了一些高质量的图片资源,但发现有些其他网站未经许可直接链接到我们的图片,导致资源被盗用。
效果:通过配置防盗链,我们成功阻止了未经授权的网站链接到我们的图片资源,保护了知识产权并减少了服务器负载。
优化措施:
server {
listen 80;
server_name images.example.com;
location ~* \.(jpg|jpeg|png|gif)$ {
valid_referers none blocked server_names ~\.example\.com;
if ($invalid_referer) {
return 403;
}
}
}
案例九:使用 ngx_http_slice_module 进行大文件分片传输
背景:我们的网站需要提供大文件的下载服务,为了提高传输效率和稳定性,我们决定使用分片传输。
效果:通过启用分片传输,大文件的下载速度得到了显著提升,用户下载体验大大改善。
server {
listen 80;
server_name largefiles.example.com;
location /downloads/ {
slice 10m; # 将文件分成 10MB 的块进行传输
}
}
案例十:配置 ngx_http_stub_status_module 监控服务器状态
背景:为了更好地了解服务器的运行状况和性能指标,我们需要实时监控 Nginx 的状态。
效果:通过启用 ngx_http_stub_status_module,我们可以实时查看 Nginx 的活动连接数、接受的请求数等信息,有助于及时发现并解决性能瓶颈。
优化措施:
server {
listen 80;
server_name status.example.com;
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
}
案例十一:优化 WebSocket 服务
背景:我们的网站需要提供实时聊天功能,使用 WebSocket 协议来实现低延迟的双向通信。
效果:通过正确配置 WebSocket 代理,我们确保了实时聊天功能的稳定性和低延迟,提升了用户体验。
优化措施:
server {
listen 80;
server_name chat.example.com;
location /ws {
proxy_pass http://websocket_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
案例十二:实现 IP 黑名单和白名单
背景:为了防止恶意攻击和未经授权的访问,我们需要对特定 IP 地址进行限制。
效果:通过设置 IP 黑名单和白名单,我们有效地阻止了恶意访问,保护了敏感区域的安全。
优化措施:
server {
listen 80;
server_name secure.example.com;
location /admin {
allow 192.168.1.0/24; # 允许特定 IP 范围访问
deny all; # 拒绝其他所有 IP
}
}
案例十三:配置日志轮转以防止日志文件过大
背景:随着网站流量的增加,Nginx 日志文件可能会迅速增长,占用大量磁盘空间。
效果:通过配置日志轮转,我们确保了日志文件不会无限增长,避免了磁盘空间不足的问题。
优化措施:
http {
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;
error_log /var/log/nginx/error.log;
logrotate /etc/logrotate.d/nginx {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 640 nginx adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
}
案例十四:使用 ngx_http_geoip_module 实现基于地理位置的重定向
背景:我们的网站需要根据用户的地理位置提供不同的内容和服务。
效果:通过使用 ngx_http_geoip_module
,我们实现了基于地理位置的重定向,为用户提供了更个性化的服务。
优化措施:
http {
geo $geoip_country_code {
default US;
24.14.0.0/16 US;
24.15.0.0/16 CA;
}
server {
listen 80;
server_name global.example.com;
location / {
if ($geoip_country_code = US) {
proxy_pass http://us_backend;
}
if ($geoip_country_code = CA) {
proxy_pass http://ca_backend;
}
}
}
}
案例十五:配置 ngx_http_ssl_static_variable 模块动态管理 SSL 证书
背景:我们的网站有多个子域名,每个子域名都有不同的 SSL 证书,需要动态管理这些证书。
效果:通过使用 ngx_http_ssl_static_variable
模块,我们实现了 SSL 证书的动态管理,简化了配置过程并提高了灵活性。
server {
listen 80;
server_name *.example.com;
ssl_certificate_by_lua_block {
local ssl = ngx.var.ssl_certificate_by_lua_block
if ssl == "example.com" then
ngx.var.ssl_certificate = "/path/to/example.com.crt"
ngx.var.ssl_certificate_key = "/path/to/example.com.key"
elseif ssl == "subdomain.example.com" then
ngx.var.ssl_certificate = "/path/to/subdomain.example.com.crt"
ngx.var.ssl_certificate_key = "/path/to/subdomain.example.com.key"
end
}
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA26';
ssl_prefer_server_ciphers on;
}
小结
通过这些丰富的实际案例,我们可以看到 Nginx 配置优化和安全防范措施的多样性和实用性。无论是提升性能、保护资源还是实现复杂的业务逻辑,Nginx 都展现出了强大的功能和灵活性。希望这些案例能为你提供更多的灵感和实践指导。