今天写一个Nginx的反代通用教程,主要实现程序配置Nginx反向代理、SSL证书、自动续签和基础安全设置。
安装必要的软件
安装Nginx和Certbot,Certbot是用于自动获取和续签SSL证书的工具。
apt update && apt install nginx certbot python3-certbot-nginx配置Nginx反向代理
创建一个新的Nginx配置文件。我们以您的域名 test.budongkeji.cc 和程序端口 3456 为例。
(如果你是docker安装,建议映射127.0.0.1:3456:3456,这样的话配置好反代后用户只能通过https来访问而不是端口了。)
nano /etc/nginx/sites-available/test.budongkeji.cc.conf然后把下方内容粘贴进去。
server {
listen 80;
listen [::]:80;
server_name 你的域名例如test.budongkeji.cc;
location / {
proxy_pass http://127.0.0.1:3456;
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;
}
}
保存并退出文件(Ctrl+X,然后按 Y 和 Enter)。
启用站点并测试Nginx配置
创建一个软链接来启用这个新的站点配置,并测试配置是否正确。
ln -s /etc/nginx/sites-available/test.budongkeji.cc.conf /etc/nginx/sites-enabled/
nginx -t
如果输出显示 syntax is ok 和 test is successful,则说明配置没有问题。然后,重启Nginx以应用更改。
sudo systemctl restart nginx
现在,通过访问 http://test.budongkeji.cc 应该能看到程序页面了。
获取和配置SSL证书
接下来使用Certbot来获取一个免费的Let's Encrypt SSL证书,并让Certbot自动为Nginx配置SSL。
certbot --nginx -d test.budongkeji.cc
在运行这个命令后,Certbot会引导步骤:
输入一个邮箱地址,用于接收证书过期提醒。
是否同意服务条款。
它会自动修改刚才创建的Nginx配置文件,添加SSL所需的配置。
检查自动续签
Certbot会自动在系统中创建一个定时任务(cron job或systemd timer)来自动续签证书。通常会在到期前30天内运行。可以手动测试一下续签功能是否正常工作。
certbot renew --dry-run
如果命令运行成功,说明自动续签已经配置好。
基础安全设置
为了增强安全性,最好在Nginx配置中添加一些安全相关的设置。
打开配置文件编辑:
nano /etc/nginx/sites-available/test.budongkeji.cc
server {
server_name test.budongkeji.cc;
# 隐藏nginx版本信息
server_tokens off;
# 添加安全标头
add_header X-Frame-Options DENY always;
add_header X-Content-Type-Options nosniff always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' data:; connect-src 'self'; frame-ancestors 'none';" always;
add_header Permissions-Policy "geolocation=(), microphone=(), camera=(), payment=(), usb=(), magnetometer=(), gyroscope=(), accelerometer=()" always;
# HSTS (HTTP Strict Transport Security) - 强制HTTPS访问
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# 限制请求大小
client_max_body_size 10M;
# 防止缓冲区溢出攻击
client_body_buffer_size 1K;
client_header_buffer_size 1k;
large_client_header_buffers 2 1k;
# 请求超时设置
client_body_timeout 10;
client_header_timeout 10;
keepalive_timeout 5 5;
send_timeout 10;
# 速率限制 (需要在http块中定义limit_req_zone)
# limit_req zone=api burst=20 nodelay;
location / {
# 反向代理配置
proxy_pass http://127.0.0.1:3456;
# 传递客户端信息
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;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
# 断点续传(下载站可以启用)
# proxy_set_header Range $http_range;
# proxy_set_header If-Range $http_if_range;
# 代理超时设置
proxy_connect_timeout 5s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# 缓冲区设置
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
proxy_busy_buffers_size 8k;
# 禁用代理重定向
proxy_redirect off;
# 隐藏后端服务器错误信息
proxy_intercept_errors on;
}
# 禁止访问隐藏文件和敏感文件
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
location ~ \.(ini|conf|config|log|sql|bak|backup|old)$ {
deny all;
access_log off;
log_not_found off;
}
# 安全的错误页面
error_page 400 401 403 404 /40x.html;
error_page 500 502 503 504 /50x.html;
# SSL配置
listen [::]:443 ssl http2 ipv6only=on;
listen 443 ssl http2;
ssl_certificate /etc/letsencrypt/live/test.budongkeji.cc/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/test.budongkeji.cc/privkey.pem;
# SSL会话缓存 (其他SSL设置由options-ssl-nginx.conf管理)
ssl_session_cache shared:SSL:10m;
# OCSP装订
ssl_stapling on;
ssl_stapling_verify on;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
# HTTP重定向到HTTPS
server {
listen 80;
listen [::]:80;
server_name test.budongkeji.cc;
# 隐藏nginx版本信息
server_tokens off;
# 添加HSTS头部(即使在HTTP上也建议添加)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# 重定向到HTTPS
return 301 https://$host$request_uri;
}
安全性总结
⚡ 安全优化
1. HTTP安全标头防护
X-Frame-Options: DENY - 防止页面被嵌入iframe,阻止点击劫持攻击
X-Content-Type-Options: nosniff - 防止浏览器MIME类型嗅探,避免XSS攻击
X-XSS-Protection: "1; mode=block" - 启用浏览器内置XSS过滤器
Content-Security-Policy - 严格的内容安全策略,防止XSS和代码注入
Referrer-Policy - 控制HTTP引用头信息泄露
Permissions-Policy - 禁用不必要的浏览器API访问权限
Strict-Transport-Security (HSTS) - 强制HTTPS访问,防止降级攻击
2. 访问控制和文件保护
隐藏nginx版本 (server_tokens off) - 避免暴露服务器信息
禁止访问隐藏文件 - 阻止访问 . 开头的敏感文件
禁止访问配置文件 - 保护 .ini、.conf、.log、.sql、.bak 等敏感文件
自定义错误页面 - 避免暴露服务器详细错误信息
3. DDoS和缓冲区攻击防护
请求大小限制 (client_max_body_size: 10M) - 防止大文件上传攻击
缓冲区大小控制 - 防止缓冲区溢出攻击
超时时间优化 - 防止慢速攻击和连接耗尽
4. SSL/TLS安全优化
启用HTTP/2 - 提高性能和安全性
SSL会话缓存 - 提高HTTPS连接效率
OCSP装订 - 实时验证SSL证书有效性
强制HTTPS重定向 - 确保所有连接都使用加密传输
5. 反向代理安全增强
完整的代理头设置 - 正确传递客户端信息给后端
代理超时控制 - 防止后端服务响应延迟影响
代理错误拦截 - 隐藏后端服务器错误信息
缓冲区优化 - 提高代理性能和稳定性
⚡ 性能优化
1.连接和传输优化
HTTP/2支持 - 多路复用,减少连接数
Keep-alive优化 - 减少连接建立开销
SSL会话缓存 - 减少SSL握手时间
代理缓冲 - 提高反向代理效率
2.资源管理优化
合理的超时设置 - 平衡性能和安全性
缓冲区大小调优 - 优化内存使用和传输效率测试并重启Nginx
nginx -t
systemctl restart nginx
至此就完成啦!
评论区