小阿轩yx-Nginx 优化与防盗链

小阿轩yx-Nginx 优化与防盗链

Nginx 服务优化

在企业应用环境中,服务器的安全性和响应速度需要根据实际情况进行相应参数配置,以达到最优的用户体验。

Nginx默认的安装参数

  • 只能提供最基本的服务

需要调整

  • 网页缓存时间
  • 连接超时
  • 网页压缩等相应参数,才能发挥出服务器的最大作用

隐藏版本号之前查看的方式

  • 可使用 Fiddler 工具抓取数据包查看 Nginx 版本
  • 也可使用命令查看
[root@localhost ~]# curl -i http://192.168.10.101
HTTP/1.1 200 OK
# 版本号
Server:nginx/1.12.0
Date: Thu, 09 Jun 2022 07:47:17 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 12
Last-Modified: Thu, 09 Jun 2022 07:46:09 GMT
Connection: keep-alive
ETag: "62a1a541-c"
Accept-Ranges: bytes

www.kgc.com

访问网址,查看版本信息

[root@localhost ~]# nginx -s stop && nginx

[root@localhost ~]# curl -i 127.0.0.1
HTTP/1.1 200 OK
Server: iis/10.12.0
Date: Thu, 09 Jun 2022 07:57:08 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 12
Last-Modified: Thu, 09 Jun 2022 07:46:09 GMT
Connection: keep-alive
ETag: "62a1a541-c"
Accept-Ranges: bytes
www.kgc.com

隐藏版本号

[root@www ~]# cd /usr/local/nginx/conf/
[root@www ~l# vim nginx.conf
# 省略内容
http {
    include    mime.types;
    default type application/octet-stream;
    server tokens off.
# 关闭版本号
# 省略内容
# 测试配置文件语法
[root@www conf]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

好处 

  • 避免泄漏 Nginx 版本
  • 不让攻击者针对特定版本进行攻击
隐藏 Nginx 版本号两种方式
  • 修改 Nginx 主配置文件
  • 修改 Nginx 源码文件,指定不显示版本号

修改配置文件方式

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens off;

设置版本信息

[root@localhost ~]# vim nginx-1.12.0/src/core/nginx.h
#define nginx_version      1012000
#define NGINX_VERSION      "10.12.0"
#define NGINX_VER          "iis/" NGINX_VERSION

[root@localhost ~]# cd nginx-1.12.0
[root@www nginx-1.12.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && make && make install

[root@localhost nginx-1.12.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens on;

修改用户与组

  • 用于支持 Nginx 的运行
  • 实现对网站文件读取时进行访问控制
  • Nginx默认使用 nobody 用户账号与组账号,一般也进行修改

修改 Nginx用户与组有两种方法

  • 在编译安装时指定用户与组
  • 修改配置文件指定用户与组

指定用户与组的参数

[root@ww nginx-1.12.0]# ./configure
--prefix=/usr/local/nginx
# 指定用户名是 nginx
--user=nginx
# 指定组名是 nginx
--group=nginx
.-with-http stub status module && make && make install

配置用户与组

[root@www nginx-1.12.0]# cd /usr/localnginx/conf
[root@www conf]# vim nginx.conf
# 修改用户为 nginx ,组为 nginx 
user nginx nginx;
# 查看worker process的用户
[root@www conf]# ps aux |grep nginx

(注:master process的用户是主进程用户)

配置网页缓存时间

  • 当 Nginx 将网页数据返回给客户端后,可设置缓存时间

好处

  • 以便在日后进行相同内容的请求时直接返回
  • 以避免重复请求,加快访问速度
  • 缓存时间一般针对静态资源进行设置对动态网页不用设置缓存时间

访问网页http://192.168.10.101/logo.jpg

修改 Nginx 的配置文件,在新 location 段加入 expires 参数,指定缓存的时间

location / {
     root   html;
     index  index.html index.htm index.php;
}

location ~ \.(gif|jpg|jepg|png|bmp|ico)$ {
     root html;
     expires 1d;
}

(注:~:表示执行一个正则匹配,区分大小写

           d:天

           M:月

           m:分钟

           s:秒

           h:小时)

重启服务

[root@localhost ~]# systemctl restart nginx

日志切割

Nginx 运行时间增加,产生的日志也会增加

日志增加弊端

  • 不便于分析和排查

(注:需要定期进行日志文件的切割)

Nginx

缺点

  • 没有类似 Apache 的 cronlog 日志分割处理功能

特点

  • 可以通过 Nginx 的信号控制功能脚本来实现日志的自动切割
  • 并将脚本加入到 Linux的计划任务中,让脚本在每天的固定时间执行,便可实现日志切割功能

编写脚本/opt/fenge.sh,Nginx 的日志文件/usr/local/nginx/logs/access.log 移动到目录/var/log/nginx 下面

[root@www ~]# vim /opt/fenge.sh 
#!/bin/bash 
# Filename: fenge.sh 
d=$(date -d "-1 day" "+%Y%m%d") 
logs_path="/var/log/nginx" 
pid_path="/usr/local/nginx/logs/nginx.pid" 
[ -d $logs_path ] || mkdir -p $logs_path 
mv /usr/local/nginx/logs/access.log ${logs_path}/test.com-access.log-$d 
kill -USR1 $(cat $pid_path) 
find $logs_path -mtime +30 |xargs rm -rf

(注:

  • kill -USR1 $(cat $pid_path) ##重建新日志文件
  • find $logs_path -mtime +30 |xargs rm -rf ##删除 30 天之前的日志文件
  • xargs:可以读取标准输入和管道中的数据,用于弥补有些命令(如echo、kill、rm)不能从管道中读取数据的不足。
  • kill -USR1 :停止接受新的连接,等待当前连接停止,重新载入配置文件,重新打开日志文件,重启服务器,从而实现相对平滑的不关机的更改。)

执行/opt/fenge.sh,测试日志文件是否被切割

[root@www ~]# chmod +x /opt/fenge.sh 
[root@www ~]# /opt/fenge.sh 
[root@www ~]# ls /var/log/nginx 
[root@www ~]# ls /usr/local/nginx/logs/access.log

 设置 crontab 任务,定期执行脚本自动进行日志分割 

[root@www ~]# crontab -e 
30 1 * * *   /opt/fenge.sh

设置连接超时

避免用一个用户长时间占用连接,造成资源浪费,可设置相应的连接超时参数,实现控制连接访问时间

keepalive_timeou设置连接超时

[root@www ~]# vim /usr/local/nginx/conf/nginx.conf
http {
    #keepalive_timeout  0;
    keepalive_timeout  65 180;

(注:keepalive_timeout

第一个参数指定了与客户端的 keep-alive 连接超时时间,服务器将会在这个时间后关闭连接。

第二个参数(可选)指定了在响应头 Keep-Alive: timeout=time 中的 time 值。这个头能够让一些浏览器主动关闭连接,这样服务器就不必去关闭连接了。没有这个参数,Nginx 不会发送 Keep-Alive 响应头)

用浏览器访问

Client_header_timeout参数可用于指定等待客户端发送请求头的超时时间,Client_body_timeout 参数可用于指定请求体读超时时间

keepalive_timeout 65 180;
client_header_timeout 80;
client_body_timeout 80;

Nginx 深入优化

更改进程数

高并发环境中,要启动更多的Nginx进程以保证快速响应,用以处理用户的请求

好处

  • 避免造成阻塞

用 ps aux 命令査看 Nginx 运行进程的个数

[root@www ~]# ps aux | grep nginx
root      17328  0.0  0.0  20548   636 ?        Ss   20:32   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx     17330  0.0  0.0  20912  1584 ?        S    20:32   0:00 nginx: worker process
root      17355  0.0  0.0 112824   976 pts/3    R+   20:39   0:00 grep --color=auto nginx

(注:

  • master process 是 Nginx 的主进程,开启了 1 个;worker process 是子进程,子进程也是开启了 1 个。
  • master进程负责管理worker进程,并负责读取配置文件和判断文件语法的工作;是主进程,有且只有一个。
  • worker进程有多个,它负责处理请求。
  • worker进程的数通常与服务器有多少cpu核心有关,比如,nginx所在主机拥有4核cpu,那么worker_ processes的值通常不会大于4,这样做的原因是为了尽力让每个worker进程都有一个cpu可以使用,尽量避免了多个worker进程抢占同一个cpu的情况,我们也可以将worker_ processes的值设置为"auto")

修改 Nginx 的配置文件的 worker_processes 参数

查看主机cpu数量

[root@www ~]# cat /proc/cpuinfo | grep -c "physical"

修改 Nginx 的配置文件的 worker_processes 参数

[root@www ~]# vim /usr/local/nginx/conf/nginx.conf
user  nginx;
worker_processes  4;

[root@www ~]# systemctl restart nginx
[root@www ~]# ps aux | grep nginx
root      17374  0.0  0.0  20548   644 ?        Ss   20:47   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx     17376  0.0  0.0  20912  1344 ?        S    20:47   0:00 nginx: worker process
nginx     17377  0.0  0.0  20912  1344 ?        S    20:47   0:00 nginx: worker process
nginx     17376  0.0  0.0  20912  1344 ?        S    20:47   0:00 nginx: worker process
nginx     17377  0.0  0.0  20912  1344 ?        S    20:47   0:00 nginx: worker process
root      17400  0.0  0.0 112824   980 pts/3    S+   20:47   0:00 grep --color=auto nginx

以设置每个进程分别由不同的 CPU 核心处理,达到 CPU 的性能最大化

[root@www ~]# vim /usr/local/nginx/conf/nginx.conf
user  nginx;
worker_processes  4;
worker_cpu_affinity 0001 0010 0100 1000;

配置网页压缩

Nginx 的 ngx_http_gzip_module 压缩模块提供

  • 对文件内容压缩功能
  • 允许 Nginx服务器将输出内容发送到客户端之前进行压缩

好处

  • 节约网站的带宽
  • 提升用户的访问体验

默认 Nginx 已经安装该模块

修改 Nginx 的配置文件,加入压缩功能参数进行优化

[root@www ~]# vim /usr/local/nginx/conf/nginx.conf
http {
#去掉gzip  on;前面的注释,增加其他的参数
    gzip  on;
    gzip_buffers 4 64k;
    gzip_http_version 1.1;
    gzip_comp_level 2;
    gzip_min_length 1k;
    gzip_vary on;
    gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss image/jpeg image/gif image/png;
[root@www ~]# systemctl restart nginx
  • gzipon:开启 gzip 压缩输出
  • gzip_min_length1k:用于设置允许压缩的页面最小字节数
  • gzip_buffers 4 16k:表示申请4个单位为 16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储 gzip 压缩结果
  • gzip_http_version 1.0:用于设置识别 http 协议版本,默认是 1.1,目前大部分浏览器已经支持 gzip 解压,但处理较慢,也比较消耗服务器 CPU 资源
  • gzip_comp level 2:用来指定 gzip 压缩比,1压缩比最小,处理速度最快;9 压缩比最大,传输速度快,但处理速度最慢,使用默认即可
  • gzip_types text/plain:压缩类型,是对哪些网页文档启用压缩功能;
  • gzip_vary on:选项可以让前端的缓存服务器缓存经过 gzip 压缩的页面

使用浏览器访问网址验证,http://192.168.10.101/

(注:如果看不到压缩,将nginx配置文件中页面缓存的参数去掉,清空一下浏览器,再测试)

配置防盗链

  • 避免网站内容被盗造成损失
  • 也避免不必要的带宽浪费

Nginx

  • 防盗功能也非常强大
  • 默认情况下,只需进行很简单的配置即可实现防盗链处理

服务器恢复到前面的快照

防盗链实验环境

IP地址

域名

用途

192.168.10.101

www.benet.com

源主机

192.168.10.102

www.accp.com

盗链主机

修改客户端hosts文件

  • 192.168.10.101 www.benet.com

  • 192.168.10.102 www.accp.com

修改两台 CentOS hosts 文件

  • 192.168.10.101 www.benet.com

  • 192.168.10.102 www.accp.com

把图片 logo.jpg 放到源主机(benet.com)的工作目录下

[root@www ~]# vim /usr/local/nginx/html/index.html
<html>
<body>
<p>原图网站</p>
<img src="http://www.benet.com/logo.jpg"/>
</body>
</html>

在盗链主机(accp.com)的工作目录编写盗链页面index.html,盗取源主机(benet.com)的图片

[root@accp~]# yum -y install httpd
[root@accp~]# systemctl stop firewalld
[root@accp~]# systemctl start httpd
[root@accp~]#  vim /var/www/html/index.html
<html>
<body>
<p>盗图网站</p>
<img src="http://www.benet.com/logo.jpg"/>
</body>
</html>
[root@accp~]# vim /etc/hosts
192.168.10.101 www.benet.com 
192.168.10.102 www.accp.com

访问盗链的网页 http://www.accp.com/index.html 查看是否盗链成功

配置 Nginx 防盗链

[root@www ~]# vim /usr/local/nginx/conf/nginx.conf
        location / {
            root   html;
            index  index.html index.htm;
        }

        location ~* \.(gif|jpg|jpeg)$ {
            valid_referers *.benet.com benet.com;
            if ($invalid_referer) {
                rewrite ^/ http://www.benet.com/error.png;
            }
        }

(注:去掉页面缓存相关配置)

(注:location ~* \.(gif|jpg|jpeg)$中不要加入png格式,rewrite语句中地址重写到了一个png报错图片。

如果location ~* \.(gif|jpg|jpeg)$中写了png格式,就会被循环重定向,无法看到报错图片。)

(注:valid_referers:nginx会通就过查看referer自动和valid_referers后面的内容进行匹配,如果匹配到了就将$invalid_referer变量置0,如果没有匹配到,则将$invalid_referer变量置为1,匹配的过程中不区分大小写)

  • None      浏览器中referer(Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面连接过来的,服务器基此可以获得一些信息用于处理)为空的情况,就直接在浏览器访问图片
  • Blocked  referrer不为空的情况,但是值被代理或防火墙删除了,这些值不以http://或者https:// 开头。
  • ~* \.(jpg|gif|swf)$:这段正则表达式表示匹配不区分大小写,以.jpg .gif .swf 结尾的文件;
  • Valid_referers:设置信任的网站,可以正常使用图片;
  • 后面的网址或者域名:referer 中包含相关字符串的网址;
  • If 语句:如果链接的来源域名不在 valid_referers 所列出的列表中,$invalid_referer 1,则执行后面的操作,即进行重写或返回 403 页面

测试

重新访问 http://www.accp.com/,无法看到盗图

FPM 参数优化安装带 FPM 模块的 PHP 环境,保证 PHP 可以正常运行

FPM 进程的两种启动方式

  • Static 的方式可以使用 pm.max_children 指定启动的进程数量

  • Dynamic 方式的参数要根据服务器的内存与服务负载进行调整

优化

root@www etc]# cd /usr/local/php5/etc/ 
[root@www etc]# vi php-fpm.conf 
pm=dynamic 
pm.max_children=20 
pm.start_servers=5 
pm.min_spare_servers=2 
pm.max_spare_servers=8

小阿轩yx-Nginx 优化与防盗链

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/721529.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【记录44】【案例】echarts地图

效果&#xff1a;直接上效果图 环境&#xff1a;vue、echarts4.1.0 源码 // 创建容器 <template><div id"center"></div> </template>//设置容器大小&#xff0c;#center { width: 100%; height: 60vh; }这里需注意&#xff1a;笔者在echar…

如何轻松进行照片压缩?5个软件帮助你快速进行照片压缩

如何轻松进行照片压缩&#xff1f;5个软件帮助你快速进行照片压缩 照片压缩是一种常见的图像处理操作&#xff0c;旨在减小图像文件的大小而尽量保持图像质量。有许多软件和工具可供选择&#xff0c;每个工具都有其独特的压缩算法和功能。以下是一些关于照片压缩的详细信息&am…

微信小程序毕业设计-小区疫情防控系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

Python 数据可视化 散点图

Python 数据可视化 散点图 import matplotlib.pyplot as plt import numpy as npdef plot_scatter(ref_info_dict, test_info_dict):# 绘制散点图&#xff0c;ref横&#xff0c;test纵plt.figure(figsize(80, 48))n 0# scatter_header_list [peak_insert_size, median_insert…

多模态大模型通用模式

MM-LLMs&#xff08;多模态大模型&#xff09;是目前比较新的和实用价值越发显著的方向。其指的是基于LLM的模型&#xff0c;具有接收、推理和输出多模态信息的能力。这里主要指图文的多模态。 代表模型&#xff1a;GPT-4o、Gemini-1.5-Pro、GPT-4v、Qwen-VL、CogVLM2、GLM4V、…

JCR一区 | Matlab实现GAF-PCNN、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断

JJCR一区 | Matlab实现GAF-PCNN、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断 目录 JJCR一区 | Matlab实现GAF-PCNN、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断分类效果格拉姆矩阵图GAF-PCNNGASF-CNNGADF-CNN 基本介绍程序设计参考资料 分类效果 格拉姆…

java架构设计-COLA

参考&#xff1a;https://github.com/alibaba/COLA 架构 要素&#xff1a;组成架构的重要元素 结构&#xff1a;要素直接的关系 意义&#xff1a;定义良好的结构&#xff0c;治理应用复杂度&#xff0c;降低系统熵值&#xff0c;改善混乱状态 创建COLA应用&#xff1a; mvn …

Centos8.5安装mysql8.0

1.检查是否有安装mysql数据库&#xff08;如果有mysql或者mariadb数据库&#xff0c;则卸载&#xff09; [rootmyhost ~]# rpm -qa |grep mysql [rootmyhost ~]# rpm -qa | grep mariadb [rootmyhost ~]# ll /etc/my.cnf ls: 无法访问/etc/my.cnf: No such file or directory…

猫头虎分享已解决Bug || 前端领域技术问题解析

原创作者&#xff1a; 猫头虎 作者微信号&#xff1a; Libin9iOak 作者公众号&#xff1a; 猫头虎技术团队 更新日期&#xff1a; 2024年6月6日 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &…

python中scrapy

安装环境 pip install scrapy 发现Twisted版本不匹配 卸载pip uninstall Twisted 安装 pip install Twisted22.10.0 新建scrapy项目 scrapy startproject 项目名 注意&#xff1a;项目名称不允许使用数字开头&#xff0c;也不能包含中文 eg: scrapy startproject scrapy_baidu_…

Redis数据结构学习

Redis 关于redis相关的技术文章我一直没什么思路 直到最近的端午节,我偶然和一个程序员朋友聊到了关于redis数据结构相关的知识点, 所以我决定写一篇文章记录一下 首先我们需要知道redis支持哪些数据类型 Strings (字符串)Lists(列表)Hashes(哈希)Sets(集合)Sorted Sets(有序…

Transformer模型:未来的改进方向与潜在影响

Transformer模型&#xff1a;未来的改进方向与潜在影响 自从2017年Google的研究者们首次提出Transformer模型以来&#xff0c;它已经彻底改变了自然语言处理&#xff08;NLP&#xff09;领域的面貌。Transformer的核心优势在于其“自注意力&#xff08;Self-Attention&#xf…

【C语言习题】31.冒泡排序

文章目录 作业标题作业内容2.解题思路3.具体代码 作业标题 冒泡排序 作业内容 实现一个对整形数组的冒泡排序 2.解题思路 先了解一下冒泡排序&#xff1a; 两两相邻的元素进行比较&#xff0c;如果前面元素大于后面元素就交换两个元素的位置&#xff0c;最终的结果是最大的…

RERCS系统开发实战案例-Part08 FPM 应用程序的表单组件(From UIBB)与列表组件(List UIBB)组合的创建

1、新建From UIBB的FPM Application的快速启动面板 备注&#xff1a;该步骤可第一步操作&#xff0c;也可最后一步操作&#xff0c;本人习惯第一步操作。 1&#xff09;使用事务码 LPD_CUST&#xff0c;选择对应的角色与实例进入快速启动板定制页面&#xff1b; 2&#xff09…

pg表空间和mysql表空间的区别

一、表空间的定义 1、在pg中表空间实际上是为表指定一个存储的目录。并且在创建数据库时可以为数据库指定默认的表空间。创建表和索引时可以指定表空间&#xff0c;这样表和索引就可以存储到表空间对应的目录下了。 在pg中一个库中可以有多个表空间&#xff0c;一个表空间可以…

U盘量产经历二——phisonPS2251-70(PS2270)

写在前面&#xff1a; 量产相关的BBS看了挺多&#xff0c;phison群联的芯片PS2251-70(PS2270)的量产工具比较少&#xff0c;而且很难下载。这里我访问了国外的网站下载来了&#xff0c;也贴出来给童鞋们取用。 以下是记录的量产过程&#xff1a; https://www.usbdev.ru 工具…

Linux操作系统学习:day04

内容来自&#xff1a;Linux介绍 视频推荐&#xff1a;[Linux基础入门教程-linux命令-vim-gcc/g -动态库/静态库 -makefile-gdb调试]( 目录 day0422、通过文字设定法修改用户对文件的操作权限23、通过数字设定法修改文件的权限24、修改文件所有者和所属组25、tree—查看目录内…

国际荐酒师香港协会受邀参加2024年美国独立日庆祝活动

国际荐酒师&#xff08;香港&#xff09;协会受邀参加2024年美国独立日庆祝活动促进世界酒中国菜的全球化发展 2024年6月18日&#xff0c;国际荐酒师&#xff08;香港&#xff09;协会大中华区驻广州办事处荣幸地接受了美国驻广州总领事馆 Nicholas Burns大使和Lisa Heller总领…

python修改pip install 默认安装路径

第一步:通过win菜单,找到Prompt,点击进入 第二步:在cmd里输入 python -m site获得: D:\ProgramData\Anaconda3 ----》是Anaconda安装的位置USER_BASE: C:\Users\kevin… ----》表示默认路径在C盘USER_SITE: C:\Users\kevin… ----》表示默认路径在C盘1.2 修改pip 默认安…

使用Minikube部署Kubernetes环境

使用Minikube部署Kubernetes环境 1. Minikube简介 Minikube是一个轻量级的Kubernetes实现&#xff0c;它在本地运行一个Kubernetes集群&#xff0c;可以是单节点或者集群环境&#xff0c;主要用于开发和测试。Minikube支持Kubernetes的所有主要功能&#xff0c;包括Dashboard…