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://www.pswp.cn/bicheng/96325.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96325.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/96325.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HOT100--Day20--39. 组合总和,22. 括号生成,79. 单词搜索

HOT100–Day20–39. 组合总和&#xff0c;22. 括号生成&#xff0c;79. 单词搜索 每日刷题系列。今天的题目是《力扣HOT100》题单。 题目类型&#xff1a;回溯。 关键&#xff1a;掌握排列&#xff0c;组合。记得回溯。可以重复选的话&#xff0c;下一层index从哪里开始&#x…

高并发场景下的“命令执行”注入绕道记

环境&#xff1a;CentOS 8 OpenResty 1.21 PHP-FPM 8.0 背景&#xff1a;营销团队上线了一个“图片裁剪”接口&#xff0c;参数直接拼进 shell_exec&#xff0c;结果被打成“矿机”。1. 发现&#xff1a;流量突增 30 倍&#xff0c;却不见数据库慢查询 iftop -i eth0出站 1.8…

【modbus学习】

Modbus通信&#xff08;源于施耐德&#xff09;串行链路&#xff1a;RTU&#xff08;传输大量数据&#xff0c;适合工业&#xff09;、ASCII&#xff08;少量数据&#xff0c;适合计算机&#xff09;TCP/IP&#xff1a;TCP&#xff08;传输严谨&#xff0c;效率低&#xff09;、…

Redis单线程模型为什么快?

Redis的单线程模型指的是redis只使用一个线程来出来所有的命令式指令&#xff0c;但是不是意味着redis内部就只使用一个线程来处理所有的任务。都知道redis是一个客户端-服务器的程序&#xff0c;那么redis就只有一个服务器&#xff0c;但是有多个客户端&#xff0c;就像mysql一…

前端安全攻防:XSS, CSRF 等常见威胁的防范与检测指南

在如今高度互联的 Web 应用世界里&#xff0c;前端安全不再是可有可无的选项&#xff0c;而是构建可信赖、健壮应用的基石。随着 Web 技术的发展&#xff0c;攻击者们也变得越来越狡猾&#xff0c;前端遭受的攻击手段层出不穷。其中&#xff0c;跨站脚本攻击 (XSS) 和跨站请求伪…

Scikit-learn Python机器学习 - 特征降维 压缩数据 - 特征选择 - 移除低方差特征(VarianceThreshold)

锋哥原创的Scikit-learn Python机器学习视频教程&#xff1a; 2026版 Scikit-learn Python机器学习 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 课程介绍 本课程主要讲解基于Scikit-learn的Python机器学习知识&#xff0c;包括机器学习概述&#xff0c;特征工程(数据…

C#(链表创建与原地反转)

链表创建&#xff08;C#&#xff09; 在C#中&#xff0c;链表可以通过自定义节点类实现。每个节点包含数据域和指向下一个节点的引用。 public class ListNode {public int val;public ListNode next;public ListNode(int val0, ListNode nextnull) {this.val val;this.next…

Android --- AOSP源码导入Android Studio

AOSP代码量庞大&#xff0c;为了开发的方便&#xff0c;我们需要导入到android studio中&#xff0c;其中关键的一 项就是配置跳转。尤其是对于Framework开发来说生成 ipr,iml 工程文件make idegen ./development/tools/idegen/idegen.sh会生成如下文件首先需要修改ipr和iml文件…

游戏中的设计模式——第一篇 设计模式简介

前言 对于设计模式&#xff0c;相信很多开发者并不陌生&#xff0c;我在学习过程中希望把自己的一些总结和心得体会与你分享。 本专栏主要将重点放在设计模式在游戏中的应用&#xff0c;会结合大家熟悉的游戏场景和功能阐述设计模式在该处应用的好处。因为设计模式很多&#xf…

SpringBoot + RustFS 实现文件切片极速上传技术

本文将手把手教你如何通过 SpringBoot 和 RustFS 构建高性能文件切片上传系统&#xff0c;解决大文件传输的痛点&#xff0c;实现秒传、断点续传和分片上传等高级功能。 目录 一、为什么选择 RustFS SpringBoot&#xff1f; 二、环境准备与部署 2.1 安装 RustFS 2.2 Sprin…

在Word和WPS文字中便捷切换英文段落大小写

在Word和WPS文字中编辑英文段落时&#xff0c;有时候英文字母的大小写不规范&#xff0c;或者需要把某一段全部改为大写字母怎么办&#xff1f;使用ShiftF3组合键即可快速在三种模式中切换&#xff1a;全部大写、全部小写、首字母大写——其中首字母大写的Word是每一句话的第一…

成都金牛区哪里租好办公室?国际数字影像产业园享税收优惠

在成都金牛区租赁优质办公室&#xff0c;国际数字影像产业园凭借其享有的税收优惠政策&#xff0c;成为了许多企业的首选之地。税收优惠对于租赁办公室的企业来说&#xff0c;是一笔不小的成本节省。国际数字影像产业园针对入驻企业提供的税收优惠政策&#xff0c;能在企业运营…

CSS `:is()` `:where()` 实战指南:简化选择器,提升可维护性

&#x1f3af; CSS :is() & :where() 实战指南&#xff1a;简化选择器&#xff0c;提升可维护性你是否在项目中写过一大串重复的选择器&#xff1f;比如&#xff1a; h1, h2, h3, h4, h5, h6 { margin-bottom: 1rem; }这样的代码既冗长又难维护。 现在 CSS 提供了 :is() 和…

Linux I/O 访问架构深入分析

Linux I/O 访问架构深入分析 目录 概述I/O 架构层次核心数据结构I/O 处理流程VFS 虚拟文件系统块设备I/O字符设备I/O内存映射I/O异步I/O机制I/O调度器调试工具与方法性能优化策略 概述 Linux I/O 系统是一个多层次、高度抽象的架构&#xff0c;旨在为应用程序提供统一的文件访问…

Linux:6_基础IO

基础IO 一.理解"文件" 文件分类 1.内存级(被打开)文件 2.磁盘级文件 1. 狭义理解 文件在磁盘里磁盘是永久性存储介质&#xff0c;因此文件在磁盘上的存储是永久性的磁盘是外设 (即是输出设备也是输入设备)磁盘上的文件本质是对文件的所有操作&#xff0c;都是对外…

Coze源码分析-资源库-删除插件-前端源码-核心逻辑

删除插件逻辑 1. 删除操作入口组件 删除插件操作主要通过 usePluginConfig hook 中的 renderActions 方法实现&#xff0c;该方法返回 TableAction 组件来处理表格行的操作。 文件位置&#xff1a;frontend/packages/studio/workspace/entry-base/src/pages/library/hooks/u…

第一代:嵌入式本地状态(Flink 1.x)

最初的架构将状态以 JVM Heap 对象的形式存储在 TaskManager 的内存中。对于小规模数据集&#xff0c;这种方式效果良好&#xff0c;但随着状态大小的增长超出内存&#xff0c;将所有状态保存在内存中变得成本高昂且不稳定。 为了解决状态规模增长的问题&#xff0c;引入了一种…

跨境金融数据对接实践:印度NSE/BSE股票行情API集成指南

跨境金融数据对接实践&#xff1a;印度NSE/BSE股票行情API集成指南 关键词&#xff1a;印度股票数据对接 NSE实时行情 BSE证券接口 金融API开发 Python请求示例一、印度股市数据源技术解析&#xff08;核心价值&#xff09; 印度两大交易所数据获取难点&#xff1a; 时区差异&a…

AFSim2.9.0学习笔记 —— 1、AFSim及完整工具介绍(文末附:完整afsim2.9.0源码、编译好的完整工具包、中文教材等)

&#x1f514; AFSim2.9.0 相关技术、疑难杂症文章合集&#xff08;掌握后可自封大侠 ⓿_⓿&#xff09;&#xff08;记得收藏&#xff0c;持续更新中…&#xff09; AFSim介绍 AFSim&#xff08;Advanced Framework for Simulation Integration & Modeling【高级仿真集成与…

ArcGIS学习-18 实战-降雨量空间分布插值分析

设置环境加载要素投影查看要素&#xff0c;发现均不是投影数据&#xff0c;但都是地理坐标都是WGS1984使用工具进行批量投影然后新建空地图&#xff0c;重新加载确认图层的投影与栅格数据一致插值样条法得到反距离权重法插值得到克里金法插值得到