nginx优化与防盗链

目录

优化:

1.隐藏版本号

2.nginx的日志分割:

3.nginx的页面压缩

4.nginx的图片压缩

5.连接超时:

6.nginx的并发设置:

1、cpu的核心数来进行设置

 2、worker进程绑定到cpu中

7.nginx优化之 TIME_WAIT

防盗链


优化:

1.隐藏版本号

第一种方法:修改配置文件

备份配置文件 加上日期有助于回滚 cp nginx.conf nginx.conf.bak.2023.0805

改配置文件 cd /usr/local/nginx/conf/

在http模块中添加代码,任意位置

 重启服务

第二种方法:直接进源码包中,可以修改版本名字

cd /opt

进入源码包

cd src

cd core

打开nginx.h

回到源码包的主目录,重新编译安装

make -j 4 && make install

如果做了第一种方法,记得改成:server_tokens on;

重启服务

2.nginx的日志分割:

nginx不自带日志分割工具,需要手动以脚本的形式来进行分割。

cd /usr/local/nginx/logs/

cd /opt

vim nginx.sh

#!/bin/bash

d=$(date +%Y-%m-%d) #获取日期

dir="/usr/local/nginx/logs" #定义存储目录

logs_file="/usr/local/nginx/logs/access.log" #分割日志

logs_error='/usr/local/nginx/logs/error.log'

pid_file='/usr/local/nginx/run/nginx.pid' #定义nginx的pid文件

if [ ! -d "$dir" ]

then

mkdir -p $dir

fi

mv $logs_file ${dir}/access_${d}.log #移动日志并且重命名

#mv /usr/local/nginx/logs/access.log /usr/local/nginx/logs/access_2023-08-05.log

mv $logs_error ${dir}/error_${d}.log

#发送信号给nginx的主程序,让他生成一个新的日志文件

kill -USR1 $(cat ${pid_file}) #cat /usr/local/nginx/run/nginx.pid

#日志文件清理的命令

find ${dir} -mtime +30 -exec rm -rf {}\; #清理30天前的日志文件

chmod 777 nginx.sh

./nginx.sh

3.nginx的页面压缩

1.压缩的功能是默认自带的,可以不取消注释的,但是需要添加压缩细节,需要把gzip打开后,进行配置

节约带宽,提升用户的访问速度

配置文件中

http中的gzip on

gzip_min_length_1k;

#如果这个文件小于等于1k,不再进行压缩

gzip_buffers 4 64k;

#压缩的缓冲区,大小为64k,有4个,nginx会使用4个大小的缓冲区,存储压缩后的数据

gzip_http_version 1.1;

#压缩的版本号,可以不写,默认就是1.1

gzip_comp_level 6

#压缩比率 1-9 数字越小,压缩的速度越快,但是比率越低。反之,数字越大,压缩的速度越慢,但是比率越高

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/javascript application/json;

#压缩的类型,开启对这些文档的压缩功能

wq!

systemctl restart nginx

4.nginx的图片压缩

cd conf/

打开配置文件

在server块中添加一个location块

location ~* \ . (gif|jpg|swf|jepg|ico)$ //不要用png格式,否则会陷入死循环

{

root html;

expires 1d;

#设置图片的缓存时间为1天

}

wq!

systemctl restart nginx

 

5.连接超时:

http1.1会有一个keepalive模式,告诉web服务器在处理完一个请求之后,保持当前连接的tcp的状态为打开状态。如果当前连接有新的请求,服务端就会利用这个没有关闭的连接,继续给客户端响应,不需要再建立一个新的连接。

keep alive 在一段时间之内保持打开状态,在这段时间之内还是会占用资源,占用过多会影响性能。

打开nginx配置文件

http模块中的keep alive

keep alive_timeout 60; #tcp连接最多可以保持60秒,60-65都可以,如果设置为0,就是禁用了keep alive功能,只要请求完成立刻关闭tcp连接。有连接保持和长连接功能

client_header_timeout 60 ;#请求头的超时时间,

客户端向服务端发送请求,会有一个完整的request_header的超时时间。如果客户端没有按照配置的60秒内发送一个完整的请求头,nginx会返回一个状态码408,也就是request time out (请求超时),就像网络游戏,挂机时间过长没有操作发送请求,就会被踢出,避免占用服务器资源。

client_body_timeout 60 #请求体的超时时间

客户端没有向服务端在60秒内发送一个完整请求体,nginx 408 request time out (服务器端没有响应/ip无法上网)

6.nginx的并发设置:

在高并发的场景中,需要启动更多的nginx进程以保证响应速度。可以更快的处理用户的请求,避免造成阻塞。

1、cpu的核心数来进行设置

cat /proc/cpuinfo | grep processor |wc -l #查看cpu核心数

cd /usr/local/nginx/conf/

修改配置文件

把全局配置的worker_processes 改为4

systemctl restart nginx

一个进程可以执行worker_connections设置的连接数

记得修改限制最大连接数!!!

 2、worker进程绑定到cpu中

worker_cpu_affinity

设置worker进程绑定到指定的cpu的命令。可以减少cpu切换带来的开销,可以确保woker进程在一个独立的cpu核心上运行。

二进制

0000 0

0001 1

0010 2

0100 3

1000 4

worker_cpu_affinity 01 10

worker_cpu_affinity 单个进程可以不绑定cpu

生产中worker一般设置为4,访问量不大,1也足够了

如果要扩展,最多到8 16个。

8个以上的worker进程就不会再提高性能了,反而会降低性能。

8个足够,一般设置为4个

7.nginx优化之 TIME_WAIT

TIME_WAIT

不是一个报错信息,是tcp连接状态中的一种状态。出现在tcp连接的四次挥手过程中,

当连接的一方发送FIN(断开)报文,而且收到了对方的ack报文之后,就会进入time_wait

tcp处于等待的状态,是有一个持续时间,由keep alive设置的,为60秒。确保网络中的所有数据包都被完全处理完毕。

作用:

1、确保可靠的关闭连接,如果立刻关闭连接,旧的数据包也会被处理,从而会干扰新的连接。

2、避免连接复用,timewait的时间太短,可能会导致旧的连接仍然在网络中,误认为是新连接,就会导致出现连接复用。

在连接的生命周期当中,time_wait占用的资源是非常小的,而且对服务器整体性能的影响也非常有限。

大量的短连接频繁创建和销毁,或者大并发连接时(负载均衡),time_wait连接会积累,服务器会出现大量的time_wait状态的连接,这种情况下,需要优化处理。

此时,需要靠内核设置,进行优化

查看系统的所有tcp连接的状态:

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

closed 表示连接未活动或者关闭

listen 监听,等待连接

syn_recv: syn接收,服务端接收到了来自客户端的syn(连接请求),正在等待确认

syn_sent:syn发送,客户端已经向服务器发送了syn请求,等待服务器确认。

ESTABLISHED: 已经建立了tcp连接,正在传送数据

fin_wait 1: 表示一端已经发送了连接关闭的请求,等待另一端确认

fin_wait 2:表示另一端已经确认了,等待发出端确认关闭请求。

close_wait:表示一端已经关闭连接,但是应用程序还未关闭连接

closing:表示正在关闭

time_wait:连接等待

last_ack:表示应用程序已经发送了最后的确认,等待另一端进入closed状态。

清理:vim /etc/sys

net.ipv4.tcp_syncookies = 1 #表示开启syn的缓存功能,当出现SYN队列溢出,启用cookie处理请求

net.ipv4.tcp_tw_reuse = 1 #让TIME_WAIT状态的连接可以复用,即使time_wait把本地的端口全部占满,它也不会拒绝新的请求

net.ipv4.tcp_tw_recycle = 1 #让time_wait尽快回收

net.ipv4.tcp_tw_fin_timeout = 60 #表示如果端口由本端要求关闭,fin_wait_2状态的保持时间,

sysctl -p #改完内核文件保存后,输入此命令让配置立即生效。

防盗链

location ~* \ . (jpg|gif|swf|ico)$

{

root html;

valid_referers none blocked *.kgc.com

if ( $invalid_referer)

{

rewrite ^/ http:www.kgc.com/error.png;

}

}

systemctl restart nginx

valid_referers:设置信任的网站,*.kgc.com kgc.com都可以访问图片

none:允许没有http_refer的请求访问资源。

www.kgc.com/ls.jpg

www.kgc.com 也可以访问显示图片。www.kgc.com可以直接访问www.kgc.com/ls.jpg

blocked:允许不是http://开头的请求,可以不带协议请求访问资源。

*.kgc.com:只允许域名是kgc的才可以请求资源。

$invalid_referer:只要不是valid_referer设置信任的网站,

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

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

相关文章

STDF - 基于 Svelte 和 Tailwind CSS 打造的移动 web UI 组件库,Svelte 生态里不可多得的优秀项目

Svelte 是一个新兴的前端框架,组件库不多,今天介绍一款 Svelte 移动端的组件库。 关于 STDF STDF 是一个移动端的 UI 组件库,主要用来开发移动端 web 应用。和我之前介绍的很多 Vue 组件库不一样,STDF 是基于近来新晋 js 框架 S…

明年,HarmonyOS不再兼容Android应用!

2023年华为开发者大会,不知道各位老铁们是否观看了,一个震撼的消息就是,首次公开了HarmonyOS NEXT的概念,简而言之就是,这是一款专为开发者打造的预览版操作系统,旨在提供"纯正鸿蒙操作系统"的体…

Flamingo

基于已有的图像模型和文本模型构建多模态模型。输入是图像、视频和文本,输出是文本。 Vision encoder来自预训练的NormalizerFree ResNet (NFNet),之后经过图文对比损失学习。图片经过图像模型的输出是2D grid,视频按1FPS的频率采样后经过图…

【CSS3】CSS3 动画 ② ( 动画序列 | 使用 from 和 to 定义动画序列 | 定义多个动画节点 | 代码示例 )

文章目录 一、动画序列二、代码示例 - 使用 from 和 to 定义动画序列三、代码示例 - 定义多个动画节点 一、动画序列 定义动画时 , 需要设置动画序列 , 下面的 0% 和 100% 设置的是 动画 在 运行到某个 百分比节点时 的 标签元素样式状态 ; keyframes element-move { 0% { tr…

中国金融四十人论坛:2023年第二季度宏观政策报告(附下载)

关于报告的所有内容,公众【营销人星球】获取下载查看 核心观点 • 运行环境:外部环境方面,全球经济景气回落,会酸交作仍在收秀。内部环演方百,公共支出进一步旅爱,真交利本显考上开,社酸塔这创…

无涯教程-Perl - continue 语句函数

可以在 while 和 foreach 循环中使用continue语句。 continue - 语法 带有 while 循环的 continue 语句的语法如下- while(condition) {statement(s); } continue {statement(s); } 具有 foreach 循环的 continue 语句的语法如下- foreach $a (listA) {statement(s); } co…

36.利用解fgoalattain 有约束多元变量多目标规划问题求解(matlab程序)

1.简述 多目标规划的一种求解方法是加权系数法,即为每一个目标赋值一个权系数,把多目标模型转化为一个单目标模型。MATLAB的fgoalattain()函数可以用于求解多目标规划。 基本语法 fgoalattain()函数的用法: x fgoalattain(fun,x0,goal,weig…

MySQL存储引擎

一、存储引擎简介 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可被称为表类型。MySQL默认的存储引擎是InnoDB。 --查询建表语句 show create table 表名; --建表时指定存储引擎…

基于图像形态学处理的目标几何形状检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .................................................... %二进制化图像 Images_bin imbinari…

无脑入门pytorch系列(二)—— torch.mean

本系列教程适用于没有任何pytorch的同学(简单的python语法还是要的),从代码的表层出发挖掘代码的深层含义,理解具体的意思和内涵。pytorch的很多函数看着非常简单,但是其中包含了很多内容,不了解其中的意思…

C语言----字符串操作函数汇总

在C的库函数中,有丰富的字符串操作函数,在平时的coding中灵活运用这些库函数会达到事半功倍的效果 一:str系列 char *strcpy(s, ct)将字符串ct(包括\0)复制到字符串s中,并返回s,需要注意s的长度是否容纳ct。char *st…

使用线性回归预测票房收入 -- 机器学习项目基础篇(10)

当一部电影被制作时,导演当然希望最大化他/她的电影的收入。但是我们能通过它的类型或预算信息来预测一部电影的收入会是多少吗?这正是我们将在本文中学习的内容,我们将学习如何实现一种机器学习算法,该算法可以通过使用电影的类型…

机器视觉赛道持续火热,深眸科技坚持工业AI视觉切入更多应用领域

随着深度学习等算法的突破、算力的不断提升以及海量数据的持续积累,人工智能逐渐从学术界向工业界落地。而机器视觉作为人工智能领域中一个正在快速发展的分支,广泛应用于工业制造的识别、检测、测量、定位等场景,相较于人眼,在精…

揭秘bi数据分析系统:如何轻松掌握商业智能的秘密

在大数据时代的背景下,企业开始越来越重视数据分析的重要性。bi数据分析系统不仅可以帮助企业感知市场变化趋势,还可以实时监测并评估企业经营决策的效果,支持企业的持续发展。在国内,国产数据处理工具如瓴羊Quick BI等崛起&#…

自动化实践-全量Json对比在技改需求提效实践

1 背景 随着自动化测试左移实践深入,越来越多不同类型的需求开始用自动化测试左移来实践,在实践的过程中也有了新的提效诉求,比如技改类的服务拆分项目或者BC流量拆分的项目,在实践过程中,这类需求会期望不同染色环境…

检验代码生成器完成版

写维护页面重复逻辑写烦了,连页面的增、删、改、查、弹窗等代码都不行手写了,为此做成代码生成器成型版1.0.干到10点。。。 代码: Class Demo.CodeGener Extends %RegisteredObject {/// 生成操作表相关的代码,包括M、C#调用代码…

【go-zero】docker镜像直接部署go-zero的API与RPC服务 如何实现注册发现?docker network 实现 go-zero 注册发现

一、场景&问题 使用docker直接部署go-zero微服务会发现API无法找到RPC服务 1、API无法发现RPC服务 用docker直接部署 我们会发现API无法注册发现RPC服务 原因是我们缺少了docker的network网桥 2、系统内查看 RPC服务运行正常API服务启动,通过docker logs 查看日志还是未…

迭代器模式(C++)

定义 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露(稳定)该对象的内部表示。 应用场景 在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代…

BpBinder与PPBinder调用过程——Android开发Binder IPC通信技术

在Android系统中,进程间通信(IPC)是一个非常重要的话题。Android系统通过Binder IPC机制实现进程间通信,而Binder IPC通信技术则是Android系统中最为重要的进程间通信技术之一。本文将介绍Binder IPC通信技术的原理,并…

JMeter处理接口签名之BeanShell实现MD5加密

项目A需要给项目B提供一个接口,这个接口加密了,现在需要测试这个接口,需要怎么编写脚本呢?实现接口签名的方式有两种:BeanShell实现MD5加密和函数助手实现MD5加密,之前已经分享过了函数助手实现MD5加密&…