互联网科技分享技术教程Vivi不懂

目 录CONTENT

文章目录

查收一篇通用的nginx反代、配置SSL证书、自动续签、站点安全防护的详细教程

Vivi
2025-09-12 / 0 评论 / 0 点赞 / 178 阅读 / 0 字

今天写一个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,然后按 YEnter)。


启用站点并测试Nginx配置

创建一个软链接来启用这个新的站点配置,并测试配置是否正确。

ln -s /etc/nginx/sites-available/test.budongkeji.cc.conf /etc/nginx/sites-enabled/
 nginx -t
​

如果输出显示 syntax is oktest 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
​

至此就完成啦!

0

评论区