【Linux网络服务】Nginx优化

news2024/12/24 22:17:53

Nginx网页优化

  • 一、配置Nginx网页缓存时间
    • 1.1设置方法
  • 二、隐藏Nginx版本号
    • 2.1方法一:修改配置文件
    • 2.2方法二:修改源码文件,重新编译
  • 三、修改用户与组
  • 四、日志切割
  • 五、连接超时
  • 六、更改进程数
  • 七、网页压缩
  • 八、配置防盗链
  • 九、Linux内核参数优化
    • 9.1打开系统文件数量、进程数、内存锁定不限制
    • 9.2解决后端服务产生TIME-WAIT状态
  • 十、Nginx常用模块

一、配置Nginx网页缓存时间

  • 当Nginx将网页数据返回给客户端给客户端之后,可设置缓存的时间,以方便在日后进行相同内容的请求时直接返回,避免重复请求,加快了访问速度

1.1设置方法

  • 修改配置文件

http段:nginx主机所有虚拟主机的站点、网页全部缓存
server段:对一个虚拟主机的所有页面进行缓存
locaruin:根据用户的访问路径,判断缓存页面

vim /usr/local/nginx/conf/nginx.conf
http {
......
	server {
	...... 
		location / {
			root html;
			index index.html index.htm;
		}
		
		location ~ \.(gif|jpg|jepg|png|bmp|ico)$ { 		#加入新的 location,以图片作为缓存对象
			root html;
			expires 1d;									#指定缓存时间,1天
		}
......
	}
}

在这里插入图片描述在这里插入图片描述

二、隐藏Nginx版本号

2.1方法一:修改配置文件

vim /usr/local/nginx/conf/nginx.conf
http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens off;								#添加,关闭版本号
    ......
}

systemctl restart nginx
curl -I http://192.168.80.10

在这里插入图片描述

2.2方法二:修改源码文件,重新编译

vim /opt/nginx-1.12.0/src/core/nginx.h
#define NGINX_VERSION "1.1.1" 					#修改版本号
#define NGINX_VER "IIS" NGINX_VERSION 			#修改服务器类型

cd /opt/nginx-1.12.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
make && make install

vim /usr/local/nginx/conf/nginx.conf
http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens on;
	......
}

systemctl restart nginx
curl -I http://192.168.80.

v
}

systemctl restart nginx
curl -I http://192.168.80.

在这里插入图片描述

三、修改用户与组

vim /usr/local/nginx/conf/nginx.conf
user nginx nginx; 								#取消注释,修改用户为 nginx ,组为 nginx

systemctl restart nginx

ps aux | grep nginx
主进程由root创建,子进程由nginx创建

在这里插入图片描述

四、日志切割

!/bin/bash
#this is fenge.sh
#指定前一天时间
d=$(date -d "-1 day" +%Y-%m-%d)
#指定分割日志存放的地址
logs_path="/var/log/nginx"
#指定nginx,pid号的文件
pid_path="/usr/local/nginx/logs/nginx.pid"
#判断日志存放目录是否存在,不存在就创建目录
if [ ! -d "$logs_path" ];then
  mkdir -p "$logs_path"
fi
#把服务下面的日志文件移动到指定的目录下面,以年月日结尾
mv /usr/local/nginx/logs/access.log  ${logs_path}/access_log.$d
mv /usr/local/nginx/logs/error.log  ${logs_path}/error_log.$d
#生成新的日志文件
kill -USR1 $(cat $pid_path)
#删除30天之前的日志文件
find $logs_path -mtime

五、连接超时

  • HTTP有一个KeepAlive模式,它告诉web服务器在处理完一个请求后保持这个TCP连接的打开状态。若接收到来自同一客户端的其它请求,服务端会利用这个未被关闭的连接,而不需要再建立一个连接。
    KeepAlive 在一段时间内保持打开状态,它们会在这段时间内占用资源。占用过多就会影响性能。
vim /usr/local/nginx/conf/nginx.conf
http {
...... 
    keepalive_timeout 60 60;
	keepalive_requests 10000;
    client_header_timeout 80;
    client_body_timeout 80;
...... 
}
systemctl restart nginx
  • keepalive_timeout
    指定KeepAlive的超时时间(timeout)。指定一个长连接最多可以保持多长时间,服务器将会在这个时间后关闭连接。 Nginx的默认值是65秒,有些浏览器最多只保持 60 秒,所以可以设定为 60 秒。若将它设置为0,就禁止了keepalive 连接。
    第二个参数(可选的)指定了在响应头Keep-- - - Alive:timeout=time中的time值。这个头能够让一些浏览器主动关闭连接,这样服务器就不必去关闭连接了。没有这个参数,Nginx
    不会发送 Keep-Alive 响应头。
  • 它指定了在Keep-Alive连接期间允许的最大请求数。在HTTP Keep-Alive连接中,客户端和服务器之间建立一个长时间的TCP连接,并在此期间保持开放,以便在该连接上发送多个请求和响应。这个指令将允许在一个Keep-Alive连接中发送最多1000个请求,然后连接将被关闭。这可以帮助减少服务器上的连接数,并提高性能。
  • client_header_timeout 客户端向服务端发送一个完整的 request header 的超时时间。如果客户端在指定时间内没有发送一个完整的 request header,Nginx 返回 HTTP 408(Request
    Timed Out)。
  • client_body_timeout 指定客户端与服务端建立连接后发送 request body 的超时时间。如果客户端在指定时间内没有发送任何内容,Nginx 返回 HTTP 408(Request Timed Out)。

在这里插入图片描述
在这里插入图片描述

六、更改进程数

  • 在高并发场景,需要启动更多的Nginx进程以保证快速响应,以处理用户的请求,避免造成阻塞
cat /proc/cpuinfo | grep -c "physical id"	#查看cpu核数
ps aux | grep nginx							#查看nginx主进程中包含几个子进程

vim /usr/local/nginx/conf/nginx.conf
worker_processes  2;				#修改为核数相同或者2倍
worker_cpu_affinity 01 10;			#设置每个进程由不同cpu处理,进程数配为4时0001 0010 0100 1000
#将每个worker子进程与特定CPU物理核心绑定,提升cpu利用率,进而提升性能。避免同一个worker子进程在不同的CPU核心上切换或者多个进程跑在一个CPU上,缓存失效,降低性能。

systemctl restart ngin

在这里插入图片描述

七、网页压缩

Nginx的ngx_http_gzip_module压缩模块提供对文件内容压缩的功能
允许Nginx服务器将输出内容在发送客户端之前进行压缩,以节约网站带宽,提升用户的访问体验,默认已经安装
可在配置文件中加入相应的压缩功能参数对压缩性能进行优

vim /usr/local/nginx/conf/nginx.conf
http {
...... 
   gzip on;							#取消注释,开启gzip压缩功能
   gzip_min_length 1k;      		#最小压缩文件大小
   gzip_buffers 4 64k;      		#压缩缓冲区,大小为4个64k缓冲区
   gzip_http_version 1.1;   		#压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
   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/javascript application/json;		#压缩类型,表示哪些网页文档启用压缩功能
...... 
}

systemctl restart nginx

在这里插入图片描述

八、配置防盗链

vim /usr/local/nginx/conf/nginx.conf
http {
......
	server {
	......
		location ~* \.(jpg|gif|swf)$ {
			valid_referers none blocked *.kgc.com kgc.com;
			if ( $invalid_referer ) {
				rewrite ^/ http://www.kgc.com/error.png;
				#return 403;
            }
        }
	......
	}
}
  • ~* .(jpg|gif|swf)$ :这段正则表达式表示匹配不区分大小写,以.jpg 或.gif 或.swf 结尾的文件;
    valid_referers :设置信任的网站,可以正常使用图片;
    none:允许没有http_refer的请求访问资源(根据Referer的定义,它的作用是指示一个请求是从哪里链接过来的,如果直接在浏览器的地址栏中输入一个资源的URL地址,那么这种请求是不会包含 Referer 字段的),如 http://www.kgc.com/game.jpg
    我们使用 http://www.kgc.com 访问显示的图片,可以理解成 http://www.kgc.com/game.jpg 这个请求是从 http://www.kgc.com 这个链接过来的。
    blocked:允许不是http://开头的,不带协议的请求访问资源;
    *.kgc.com:只允许来自指定域名的请求访问资源,如 http://www.kgc.com

if语句:如果链接的来源域名不在valid_referers所列出的列表中,$invalid_referer为true,则执行后面的操作,即进行重写或返回 403 页面。

网页准备:
Web源主机(192.168.80.10)配置:
cd /usr/local/nginx/html
将game.jpg、error.png文件传到/usr/local/nginx/html目录下
vim index.html
...... 
<img src="game.jpg"/>
</body>
</html>

echo "192.168.80.10 www.kgc.com" >> /etc/hosts 
echo "192.168.80.12 www.benet.com" >> /etc/hosts 

盗链网站主机(192.168.80.12):
cd /usr/local/nginx/html
vim index.html
...... 
<img src="http://www.kgc.com/game.jpg"/>
</body>
</html>

echo "192.168.80.10 www.kgc.com" >> /etc/hosts 
echo "192.168.80.12 www.benet.com" >> /etc/hosts

在这里插入图片描述

九、Linux内核参数优化

9.1打开系统文件数量、进程数、内存锁定不限制

  • Nginx要想实现高并发首先得打开Nginx配置文件的worker_rlinit_nofile 文件数量限制,默认的是1024个,Nginx服务支持的是30000~50000个并发量,可根据自己需求设定。还有上面的进程数限制
  • Nginx服务限制打开系统的文件数量限制,进程数限制、内存锁定不限指也得打开,这样Nginx才能实现高并发
ulimit -n    # 临时修改
/etc/security/limits.conf  
*                soft    nofile          65535			#打开文件数
*                hard    nofile          65535
*                soft    nproc           65535			#打开进程数
*                hard    nproc           65535
*                soft    memlock         unlimited		#内存锁定不限制
*                hard    memlock         unlimited

9.2解决后端服务产生TIME-WAIT状态

  • Nginx是TCP服务,有四次挥手的过程。发起断开连接方会进入time-wait状态,此时处于半连接状态,并没有真正的断开,如果服务的并发量很高,有大量的TCP连接,此时服务器会产生大量的time-wait状态,会占有大量的内存空间

解决方法一:

  • 在Nginx系统配置文件中设置连接超时keepalive_timeout 60 60,第一个数字是服务器的连接超时时间,第二个数字是浏览器的超时时间,设置客户端的超时时间大于服务端的超时时间,此时客户端时发起断开请求方,会进入time-wait状态,服务器则不会可以解决,具体方法看上文。

方法二

  • 在系统内核文件中配置,time-wait状态的快速收回时间与最大连接数
/etc/sysctl.conf
net.ipv4.tcp_syncookies =1			#开启SYNCookies
net.ipv4.tcp_tw_reuse = 1			#允许将TIME-WAIT sockets重新用于新的TCP连接,
net.ipv4.tcp_tw_recycle = 1			#开启TCP连接中TIME-WAIT sockets的快速回收
net.ipv4.tcp_fin_timeout = 30		#修改系统默认的fin TIMEOUT 时间

net.ipv4.ip_local_port_range = 1024 65535   #外向连接的端口范围
net.ipv4.tcp max tw buckets= 5000          # 系统同时保持TIME WAIT最大数量         
net.ipv4.tcp_max_syn_backlog = 8192         #SYN队列长度
net.ipv4.tcp_keepalive_time = 1200        #  发送keepalive探测包消息的频度

十、Nginx常用模块

http_gzip_static_module 网页压缩模块
stub_status_module 状态统计模块
rewrite_module URL重写模块
auth_basic_module 用户认证模块
fastcgi_module fastcgi转发php-fpm模块
ssl_module https 安全加密认证模块
proxy_module 请求转发模块
upstream_module 反向代理负载均衡模块
stream
_module 四层反向代理模块
limit conn module 限制最大连接数模块
limit reg module 限制最大访问频率模块

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为OD机试真题 Java 实现【素数之积】【2022Q4 100分】

一、题目描述 RSA加密算法在网络安全世界中无处不在&#xff0c;它利用了极大整数因数分解的困难度&#xff0c;数据越大&#xff0c;安全系数越高。 给定一个32位正整数&#xff0c;请对其进行因数分解&#xff0c;找出是哪两个素数的乘积。 二、输入描述 一个正整数num …

基于物理信息的神经网络(Physics-informed Neural Networks;PINNs)Part-1(简单介绍)

【摘要】 基于物理信息的神经网络&#xff08;Physics-informed Neural Networks&#xff0c;简称PINNs&#xff09;&#xff0c;是一类用于解决有监督学习任务的神经网络&#xff0c;它不仅能够像传统神经网络一样学习到训练数据样本的分布规律&#xff0c;而且能够学习到数学…

段的概念-汇编复习(3)

本文小节讨论内容&#xff1a;"段地址x16偏移地址物理地址”的本质含义,段 的 概 念 "段地址x16偏移地址物理地址”的本质含义 注意&#xff0c;这里讨论的是 8086CPU 段地址和偏移地址的本质含义&#xff0c;而不是为了解决具体的问题而在本质含义之上引申出来的更…

Node.js基本概念、特点、用途和常用模块,以及Express框架开发一个web应用

目录 一、Node.js的基本概念和特点 二、Node.js的用途 三、Node.js的常用模块 四、使用Node.js进行Web开发 1. 安装Node.js 2. PyCharm配置Node.js 3. 使用http库编写一个web服务 4. 使用Express框架构建Web应用程序 5. 调试代码 6. 发布应用程序 参考文章 Node.js是…

[转载]Nginx 使用 X-Accel-Redirect 实现静态文件下载的统计、鉴权、防盗链、限速等

需求 统计静态文件的下载次数&#xff1b;判断用户是否有下载权限&#xff1b;根据用户指定下载速度&#xff1b;根据Referer判断是否需要防盗链&#xff1b;根据用户属性限制下载速度&#xff1b; X-Accel-Redirect This allows you to handle authentication, logging or …

基于vue3全新后台管理方案vite4+vue3+pinia2+vue-i18n

Vite4-Admin 基于 vue3vite4.xpinia2vue-router4 构建后台管理系统。 支持vue-i18n国际化多语言、动态路由鉴权、4种布局模板及tab页面缓存等功能。 技术框架 编码器&#xff1a;VScode框架技术&#xff1a;vite4vue3piniavue-routerUI组件库&#xff1a;ve-plus (基于vue3自研…

PHP快速实战19-PHP使用IMAP获取QQ邮箱的收件列表及内容

文章目录 前言关于IMAP协议安裝与实现步骤1&#xff1a;安装IAMP扩展1.1 检查IMAP是否已安装1.2 安装IMAP扩展1.3 启用IMAP扩展1.4 重启服务 步骤2&#xff1a;开始功能实现2.1 开始编码2.2 代码执行 常见的20个PHP中IMAP方法总结 前言 本文已收录于PHP全栈系列专栏&#xff1…

详解js中的浅拷贝与深拷贝

详解js中的浅拷贝与深拷贝 1、前言1.1 栈&#xff08;stack&#xff09;和堆&#xff08;heap&#xff09;1.2 基本数据类型和引用数据类型1.2.1 概念1.2.2 区别1.2.3 基本类型赋值方式1.2.4 引用类型赋值方式 2、浅拷贝2.1 概念2.2 常见的浅拷贝方法2.2.1 Object.assign()2.2.…

25 strlen 的调试

前言 同样是一个 很常用的 glibc 库函数 不管是 用户业务代码 还是 很多类库的代码, 基本上都会用到 字符串长度的计算 不过 我们这里是从 具体的实现 来看一下 它的实现 主要是使用 汇编 来进行实现的, 因此 理解需要一定的基础 测试用例 就是简单的使用了一下 strc…

Vscode搭建开发调试STM32/RISC-V环境IDE(最全面)

单片机开发IDE环境如KeilMDK&#xff0c;虽然操作简单&#xff0c;方便调试。但就是代码编辑风格很老套&#xff0c;中文符号乱码还是常有的事。而如今流行的vscode编辑器很不错&#xff0c;免费且相当轻量级&#xff0c;用来代码开发体验很不错&#xff0c;看着都舒服。Clion …

【数学建模实例之SEIR】

学习数学建模: 从基础到实践 引言 在我们日常生活中&#xff0c;数学建模&#xff08;Mathematical Modeling&#xff09;是一个非常重要的工具&#xff0c;它帮助我们理解复杂的问题&#xff0c;并找到解决这些问题的方法。在这篇博客中&#xff0c;我们将探讨数学建模的基本…

深入理解计算机系统——汇编基础

文章目录 寄存器数据格式mov操作 push&#xff0c;popcall&#xff0c;retleave,enter算术和逻辑操作一元操作二元操作移位操作 特殊的算术操作控制条件码访问条件码跳转很好的例题 翻译条件分支循环条件传送指令switch例 函数堆栈递归的过程 数组数据结构结构体联合 使用GDB调…

信息与编码SCUEC DDDD 期末复习整理(1)

1.1948年&#xff0c;美国数学家香农发表了题为“通信的数学原理”的论文&#xff0c;从而创立了信息论。 2.不可能事件的自信息量是&#xff08;∞&#xff09;&#xff0c;必然事件的自信息量是&#xff08;0&#xff09; 3. 4.差错控制的主要方式有前向纠错方式FEC&#x…

线程的创建(Runnable,Future,CompletionService,CompletableFuture的辨析)

直接使用Thread 直接让某个类继承Thread类&#xff0c;复写run方法&#xff0c;外部调用的时候直接调用start方法。 因为java的单继承模式&#xff0c;但是我们一般不直接使用这种方法。 使用Runnable Slf4j public class MyTask implements Runnable {Overridepublic void …

Vue+springboot餐厅美食菜品评价系统4d5g9

餐厅是一个传统的行业。随着当今社会的发展&#xff0c;时代的进步&#xff0c;行业也在发生着变化&#xff0c;单就点菜这一方面&#xff0c;菜品评价正在逐步进入人们的生活。传统的菜品评价&#xff0c;不仅会耗费大量的人力、时间&#xff0c;有时候还会出错。网上可以解决…

ORTP库局域网图传和VLC实时预览

​ 1.ORTP的引入 1.1、视频网络传输的2种方式 (1)基于下载&#xff1a;http or ftp&#xff08;网站播放视频&#xff0c;追求清晰度&#xff0c;哪怕时间晚一点&#xff09; (2)基于实时&#xff1a;RTP/RTSP/RTCP&#xff08;直播、监控&#xff0c;追求实时&#xff0c;…

Linux 实操篇-组管理和权限管理

Linux 实操篇-组管理和权限管理 Linux 组基本介绍 在linux 中的每个用户必须属于一个组&#xff0c;不能独立于组外。在linux 中每个文件有所有者、所在组、其它组的概念。 所有者所在组其它组改变用户所在的组 文件/目录所有者 一般为文件的创建者,谁创建了该文件&#x…

First Order Motion Model for Image Animation 笔记

First Order Motion Model for Image Animation 摘要 Image animation consists of generating a video sequence so that an object in a source image is animated according to the motion of a driving video. Our framework addresses this problem without using any a…

表情识别(从原理到代码安装)

1. 项目介绍 面青识别(face_classification )是一个基于深度学习的面部表情识别项目,它使用 Keras 和 TensorFlow 框架来实现模型的训练和预测。该项目的主要目标是在图像或视频中检测并识别人脸表情,并将其分类为七种不同的情绪类别:生气、厌恶、害怕、高兴、平静、伤心…

JVM学习笔记(完结)

类加载与字节码技术 1、类文件结构 通过 javac 类名.java 编译 java 文件后&#xff0c;会生成一个 .class 的文件&#xff01; 以下是字节码文件&#xff1a; 0000000 ca fe ba be 00 00 00 34 00 23 0a 00 06 00 15 09 0000020 00 16 00 17 08 00 18 0a 00 19 00 1a 07 00…