通过Nginx作为前端反向代理Apache后端服务,可以充分利用两者的优势,同时提升Web服务的安全性和性能。
客户端 → Nginx(443) → Apache(8080或其他端口)
server {
listen 80;
server_name yourdomain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name yourdomain.com;
# SSL配置
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384...';
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:8080;
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;
}
}
修改Apache的监听端口(例如8080):
Listen 127.0.0.1:8080
在虚拟主机配置中添加:
<VirtualHost 127.0.0.1:8080>
ServerName yourdomain.com
# 其他配置...
# 确保Apache知道原始请求是通过HTTPS
SetEnvIf X-Forwarded-Proto https HTTPS=on
</VirtualHost>
# 禁用不安全的HTTP方法
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444;
}
# 防止点击劫持
add_header X-Frame-Options "SAMEORIGIN";
# 启用XSS保护
add_header X-XSS-Protection "1; mode=block";
# 禁用内容类型嗅探
add_header X-Content-Type-Options "nosniff";
# 内容安全策略
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://cdn.example.com; img-src 'self' data:; style-src 'self' 'unsafe-inline';";
# 限制文件上传大小
client_max_body_size 10M;
# 禁用目录浏览
Options -Indexes
# 防止敏感文件被访问
<FilesMatch "\.(htaccess|htpasswd|ini|log|sh|sql)$">
Require all denied
</FilesMatch>
# 禁用服务器签名
ServerSignature Off
ServerTokens Prod
# 启用gzip压缩
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# 启用缓存
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m use_temp_path=off;
server {
# ...其他配置...
location / {
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
# ...其他代理配置...
}
# 静态文件直接由Nginx处理
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
}
# 自定义日志格式
log_format security '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time '
'$http_x_forwarded_for';
access_log /var/log/nginx/security.log security;
通过这种架构,您可以获得Nginx的高性能SSL/TLS处理和静态文件服务能力,同时保留Apache的动态内容处理功能,并显著提升整体安全性。