当前位置: 首页 > news >正文

Nginx 优化与防盗链全解析:从性能调优到资源保护

Nginx 优化与防盗链全解析:从性能调优到资源保护

文章目录

  • Nginx 优化与防盗链全解析:从性能调优到资源保护
    • 一、基础安全优化:隐藏版本号
      • 1.1 查看当前版本号
      • 1.2 两种隐藏/修改方案
        • 方案一:修改配置文件(快速隐藏)
        • 方案二:修改源码(深度伪装)
    • 二、权限优化:修改运行用户与组
      • 2.1 操作步骤
    • 三、性能优化:缓存时间设置
      • 3.1 配置缓存规则
      • 3.2 验证缓存效果
    • 四、日志管理:日志切割
      • 4.1 编写日志切割脚本
      • 4.2 配置定时执行
    • 五、连接优化:超时参数配置
      • 5.1 核心超时参数说明
      • 5.2 配置超时参数
    • 六、并发优化:调整进程数与CPU亲和性
      • 6.1 查看CPU核数
      • 6.2 配置进程数与CPU亲和性
      • 6.3 调整系统文件描述符限制
    • 七、传输优化:配置网页压缩
      • 7.1 配置压缩参数
      • 7.2 验证压缩效果
    • 八、资源保护:配置防盗链
      • 8.1 防盗链核心原理
      • 8.2 配置防盗链规则
        • 参数说明:
      • 8.3 实操验证(两台服务器对比)
        • 1. 源服务器配置
        • 2. 盗链服务器配置

Nginx 作为高性能的 HTTP 和反向代理服务器,在实际生产环境中需要通过 性能优化提升并发处理能力、降低资源消耗,同时通过 防盗链配置保护服务器上的静态资源(如图片、视频、文档等)不被非法站点盗用。本文将详细拆解 Nginx 的核心优化手段与防盗链配置方案,并附完整实操代码。

一、基础安全优化:隐藏版本号

Nginx 默认会在响应头中暴露服务器版本号(如 Server: nginx/1.24.0),攻击者可能利用特定版本的漏洞发起攻击。隐藏或修改版本号可降低被针对性攻击的风险。

1.1 查看当前版本号

通过 curl 命令查看响应头中的版本信息:

curl -I http://192.168.10.23  # 替换为你的Nginx服务器IP

响应中会包含类似 Server: nginx/1.12.0 的字段,即当前版本号。

1.2 两种隐藏/修改方案

方案一:修改配置文件(快速隐藏)

通过 server_tokens 指令关闭版本号显示,无需重新编译,适合快速部署:

vim /usr/local/nginx/conf/nginx.conf  # 编辑主配置文件

http 块中添加 server_tokens off;

http {include       mime.types;default_type  application/octet-stream;server_tokens off;  # 关闭版本号显示# 其他配置...
}

重启 Nginx 使配置生效:

systemctl restart nginx  # 若使用systemd管理;若无则用 /usr/local/nginx/sbin/nginx -s reload

再次执行 curl -I 命令,响应头中 Server: nginx 将不再显示版本号。

方案二:修改源码(深度伪装)

若需伪装成其他服务器(如 IIS、Apache),需修改 Nginx 源码后重新编译,适合对安全要求极高的场景:

  1. 修改源码定义

    vim /opt/nginx-1.12.0/src/core/nginx.h  # 替换为你的源码路径
    

    修改版本号和服务器类型:

    #define NGINX_VERSION "1.1.1"        // 自定义版本号
    #define NGINX_VER "IIS/" NGINX_VERSION  // 伪装成IIS服务器
    
  2. 重新编译安装

    cd /opt/nginx-1.12.0/  # 进入源码目录
    # 重新配置编译参数(保持与原安装一致)
    ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
    make && make install  # 编译并安装
    
  3. 开启版本显示验证
    编辑配置文件,确保 server_tokens on;(默认开启):

    http {server_tokens on;  # 开启后显示伪装的版本和类型
    }
    

    重启 Nginx 后,curl -I 响应头将显示 Server: IIS/1.1.1,实现深度伪装。

二、权限优化:修改运行用户与组

Nginx 默认以 root 用户启动(主进程),子进程也继承 root 权限,若服务器被入侵,攻击者可能获得高权限。建议创建低权限用户运行 Nginx 子进程。

2.1 操作步骤

  1. 创建nginx用户组(若未创建):

    useradd -r -M -s /sbin/nologin nginx  # 创建系统用户,无登录权限
    
  2. 修改配置文件

    vim /usr/local/nginx/conf/nginx.conf
    

    在配置文件顶部指定运行用户和组:

    user nginx nginx;  #  user 用户名 组名;(默认注释,取消注释并修改)
    worker_processes  1;  # 进程数,后续会优化
    # 其他配置...
    
  3. 重启验证

    systemctl restart nginx
    ps aux | grep nginx  # 查看进程权限
    

    输出中主进程(master process)为 root,子进程(worker process)为 nginx,符合权限最小化原则。

三、性能优化:缓存时间设置

对于静态资源(图片、CSS、JS 等),设置浏览器缓存可减少重复请求,降低服务器带宽消耗,提升用户访问速度。动态资源(如 PHP 生成的页面)不建议设置缓存。

3.1 配置缓存规则

编辑 Nginx 配置文件,在 server 块中添加静态资源缓存规则:

vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  www.kgc.com;  # 替换为你的域名location / {root   html;index  index.html index.htm;}# 对图片类型设置1天缓存location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {root   html;expires 1d;  # 缓存时间:1d(天)、1h(小时)、30m(分钟)}# 对CSS、JS设置12小时缓存location ~ \.(css|js)$ {root   html;expires 12h;}
}

3.2 验证缓存效果

  1. 重启 Nginx

    systemctl restart nginx
    
  2. 浏览器验证

    • 访问 http://www.kgc.com/game.jpg(替换为你的静态资源)。
    • 打开浏览器「开发者工具」→「网络」→ 选中资源,查看「响应头」,若包含 Cache-Control: max-age=86400(86400秒=1天),说明缓存配置生效。

四、日志管理:日志切割

Nginx 日志默认写入单个文件(access.logerror.log),长期运行会导致日志文件过大,难以查看和分析。通过日志切割定期归档旧日志,删除过期日志,可优化磁盘空间占用。

4.1 编写日志切割脚本

创建 fenge.sh 脚本,实现日志归档、重建和清理:

vim /opt/fenge.sh
#!/bin/bash
# 日志切割脚本
# 1. 定义变量
day=$(date -d "-1 day" "+%Y%m%d")  # 前一天的日期(如20241001)
logs_path="/var/log/nginx"         # 日志归档目录
pid_path="/usr/local/nginx/logs/nginx.pid"  # Nginx主进程PID文件# 2. 若归档目录不存在则创建
[ -d $logs_path ] || mkdir -p $logs_path# 3. 移动旧日志到归档目录并命名
mv /usr/local/nginx/logs/access.log ${logs_path}/kgc-access-${day}.log
mv /usr/local/nginx/logs/error.log ${logs_path}/kgc-error-${day}.log# 4. 向Nginx发送USR1信号,重建新日志文件
kill -USR1 $(cat $pid_path)# 5. 删除30天前的旧日志,释放磁盘空间
find $logs_path -name "kgc-*.log" -mtime +30 -exec rm -rf {} \;

4.2 配置定时执行

  1. 添加执行权限

    chmod +x /opt/fenge.sh
    
  2. 测试脚本

    /opt/fenge.sh
    ls /var/log/nginx  # 查看是否生成归档日志
    
  3. 设置crontab定时任务
    每天凌晨1点自动执行脚本:

    crontab -e
    

    添加以下内容:

    0 1 * * * /opt/fenge.sh  # 分 时 日 月 周 脚本路径
    

五、连接优化:超时参数配置

HTTP 的 Keep-Alive 模式可复用 TCP 连接,减少握手开销,但连接长时间闲置会占用服务器资源。合理设置超时参数可平衡性能与资源消耗。

5.1 核心超时参数说明

参数作用建议值
keepalive_timeout保持连接的超时时间,超时后服务器关闭连接65s
client_header_timeout等待客户端发送请求头的超时时间,超时返回408错误80s
client_body_timeout等待客户端发送请求体的超时时间,超时返回408错误80s
send_timeout服务器向客户端发送响应的超时时间,超时后关闭连接60s

5.2 配置超时参数

编辑 Nginx 配置文件,在 http 块中添加超时设置:

vim /usr/local/nginx/conf/nginx.conf
http {include       mime.types;default_type  application/octet-stream;# 连接超时配置keepalive_timeout 65 180;  # 第一个值:连接超时;第二个值:响应头中Keep-Alive: timeout=180client_header_timeout 80;client_body_timeout 80;send_timeout 60;# 其他配置...
}

重启 Nginx 使配置生效。

六、并发优化:调整进程数与CPU亲和性

Nginx 采用「主进程+多子进程」模型,子进程(worker_processes)负责处理客户端请求。合理设置子进程数与 CPU 亲和性,可充分利用多核 CPU 资源,提升并发处理能力。

6.1 查看CPU核数

cat /proc/cpuinfo | grep -c "physical id"  # 查看物理CPU数
cat /proc/cpuinfo | grep -c "core id"      # 查看总核心数(推荐以此为参考)

6.2 配置进程数与CPU亲和性

编辑配置文件,在 user 指令后修改进程相关设置:

vim /usr/local/nginx/conf/nginx.conf
user  nginx nginx;
worker_processes  2;  # 子进程数,建议设置为CPU核心数或2倍(如4核设为4或8)# CPU亲和性:绑定子进程到指定CPU核心(避免进程切换开销)
# 2核CPU:01(第一个核心)、10(第二个核心)
# 4核CPU:0001、0010、0100、1000
worker_cpu_affinity 01 10;# 每个子进程的最大连接数(需结合系统ulimit调整)
events {worker_connections  10240;  # 默认1024,可提升至10240(需系统支持)
}

6.3 调整系统文件描述符限制

Nginx 处理连接需占用文件描述符,默认系统限制可能过低,需调整:

  1. 临时调整

    ulimit -n 65535  # 临时设置最大文件描述符为65535
    
  2. 永久调整

    vim /etc/security/limits.conf
    

    添加以下内容:

    * soft nofile 65535
    * hard nofile 65535
    nginx soft nofile 65535
    nginx hard nofile 65535
    

    重启系统后生效。

七、传输优化:配置网页压缩

Nginx 的 ngx_http_gzip_module 模块可对响应内容(HTML、CSS、JS、图片等)进行 Gzip 压缩,减少传输数据量,提升加载速度。该模块默认已安装。

7.1 配置压缩参数

编辑 Nginx 配置文件,在 http 块中添加压缩设置:

vim /usr/local/nginx/conf/nginx.conf
http {# 开启Gzip压缩gzip on;# 最小压缩文件大小(小于1k不压缩,避免小文件压缩开销大于收益)gzip_min_length 1k;# 压缩缓冲区(4个64k缓冲区)gzip_buffers 4 64k;# 支持的HTTP版本(1.1兼容性更好)gzip_http_version 1.1;# 压缩级别(1-9,级别越高压缩率越高但CPU消耗越大,推荐6)gzip_comp_level 6;# 告诉客户端服务器支持压缩(配合缓存服务器使用)gzip_vary on;# 压缩类型(指定需要压缩的文件格式)gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss image/jpg image/jpeg image/png image/gif application/x-httpd-php application/json;
}

7.2 验证压缩效果

  1. 重启 Nginx

    systemctl restart nginx
    
  2. 浏览器验证

    • 访问 http://www.kgc.com,打开「开发者工具」→「网络」→ 选中资源,查看「响应头」。
    • 若包含 Content-Encoding: gzip,说明压缩生效。

八、资源保护:配置防盗链

防盗链通过验证 Referer 字段(表示请求来源),禁止非法站点盗用服务器上的静态资源(如图片、视频),避免带宽被滥用。

8.1 防盗链核心原理

Referer 字段记录了请求的来源域名,Nginx 通过 valid_referers 指令定义「信任的来源」,若来源不在信任列表中,则执行重定向或返回403错误。

8.2 配置防盗链规则

编辑 Nginx 配置文件,在 server 块中添加防盗链规则:

vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  www.kgc.com;# 对图片、视频等资源设置防盗链location ~* \.(jpg|jpeg|png|gif|swf|mp4|flv)$ {root   html;# 定义信任的来源(允许这些来源访问资源)valid_referers none blocked *.kgc.com kgc.com;# 若来源非法($invalid_referer为true)if ($invalid_referer) {# 方案1:重定向到自定义错误图片rewrite ^/ http://www.kgc.com/error.png;# 方案2:直接返回403禁止访问# return 403;}}# 其他配置...
}
参数说明:
  • ~* \.(jpg|...)$:不区分大小写匹配指定格式的资源;
  • valid_referers:信任的来源列表:
    • none:允许直接在浏览器地址栏输入资源URL(无Referer);
    • blocked:允许Referer为空或被浏览器隐藏的请求;
    • *.kgc.com:允许所有子域名(如 blog.kgc.com);
    • kgc.com:允许主域名;
  • $invalid_referer:内置变量,若来源不在信任列表则为 true

8.3 实操验证(两台服务器对比)

假设存在两台服务器:

  • 源服务器:192.168.10.23(www.kgc.com,存放合法资源 game.jpg 和错误图片 error.png);
  • 盗链服务器:192.168.10.80(www.benet.com,试图盗用 game.jpg)。
1. 源服务器配置
  1. 准备资源:将 game.jpgerror.png 放入 /usr/local/nginx/html
  2. 配置 hosts(本地解析):
    echo "192.168.10.23 www.kgc.com" >> /etc/hosts
    
  3. 重启 Nginx。
2. 盗链服务器配置
  1. 编辑盗链页面:
    vim /usr/local/nginx/html/index.html
    
    <html>
    <body><h1>盗链测试</h1>

文章转载自:

http://v8EvZhm5.dLhxj.cn
http://75z0UcXk.dLhxj.cn
http://qDfjBroR.dLhxj.cn
http://4WqQCpTS.dLhxj.cn
http://h7sG6CeP.dLhxj.cn
http://hryJw5uB.dLhxj.cn
http://Rd2etTZ1.dLhxj.cn
http://VQ4wFQzm.dLhxj.cn
http://u5V4EoxN.dLhxj.cn
http://TTMnRB5A.dLhxj.cn
http://E2txU9kr.dLhxj.cn
http://ZSZvtsyt.dLhxj.cn
http://KVQDhesU.dLhxj.cn
http://lUmoQBLW.dLhxj.cn
http://b17nNlZ4.dLhxj.cn
http://UGMDIkVJ.dLhxj.cn
http://LbIpzX79.dLhxj.cn
http://xkplkQk0.dLhxj.cn
http://dEDHFgX7.dLhxj.cn
http://GJtGC9W4.dLhxj.cn
http://gMr43puQ.dLhxj.cn
http://oRMcHFzd.dLhxj.cn
http://yF3TcOSa.dLhxj.cn
http://8xWlc55a.dLhxj.cn
http://o7kDSA3a.dLhxj.cn
http://XlykAcC2.dLhxj.cn
http://jCpjWrX8.dLhxj.cn
http://RbXxIS0L.dLhxj.cn
http://tkFJzWYp.dLhxj.cn
http://OD7lKOUQ.dLhxj.cn
http://www.dtcms.com/a/375726.html

相关文章:

  • 【AI】Tensorflow在jupyterlab中运行要注意的问题
  • (论文速读)从语言模型到通用智能体
  • 3-9〔OSCP ◈ 研记〕❘ WEB应用攻击▸利用REST API提权
  • Kafka面试精讲 Day 15:跨数据中心复制与灾备
  • 数据库之间如何同步
  • YOLO学习笔记
  • 3.Python高级数据结构与文本处理
  • LeetCode热题 42.接雨水
  • diffusion model(0.2) DDPM
  • 广州物业管理宣传片拍摄:以专业服务传递城市温度
  • 4、Python面向对象编程与模块化设计
  • 服务注册发现高可用设计:从三次典型雪崩事故到故障免疫体系
  • 功率放大器选型指南:从热耗散角度理解交直流电流限制
  • 基于野火F407开发板实现电源管理-睡眠模式
  • 【数组】长度最小的子数组
  • 从生日悖论看哈希函数的冲突问题
  • UDS诊断详解(二)27服务安全访问流程
  • 如何解决Ubuntu下vi编辑器方向键变字母的问题?
  • [硬件电路-172]:浮空、单点接地、多点接地的比较
  • DNS协议
  • 网络编程---UDP
  • 深入了解linux系统—— 线程同步
  • 基于Mysql+SpringBoot+vue框架-桂林旅游景点导游平台源码
  • 案例二:登高千古第一绝句
  • 将「本地仓库」推送(关联)到「远程仓库」 远程仓库的修改 Pull 到关联的本地仓库
  • 玄机--IIS日志分析
  • ART的GC算法
  • 【CAD.NET】dwg存储为png
  • 前端日志回捞系统的性能优化实践|得物技术
  • 基于R语言机器学习方法在生态经济学领域中的实践技术应用