目录
一、背景说明
网站上线后,受限于服务器配置和网络带宽等因素,致使用户每次访问网站首页,加载速度都非常的慢。尤其是首页如果需要加载大量图片和文件资源进行页面渲染时,这种卡顿感就会无限放大,如下图所示,加载时间最长的图片,都需要近16秒,平均6~7秒,这是不能够接受的。
如果不进行优化,则会降低访问者的浏览体验,最终导致网站访问量的流失。那么如何在有限的资源条件下,做到最极致的优化呢?本文将从多个方面进行实践和验证,最终实现网站访问速度的提高。
二、Nginx性能优化
(一)文件句柄
在linux或Unix系统上,一切皆文件,每一次用户发起请求就会生成一个文件句柄,文件句柄可以理解为就是一个索引。随着请求量的增多,进程调用的频率增加,文件句柄的产生就越多。系统对文件句柄默认的限制是1024个,对Nginx来说非常小了,需要改大一点,设置方式有以下几种。
1.系统全局性修改和用户局部性修改
输入以下命令,打开用于设置Linux系统中用户和进程的资源限制的配置文件。这个文件允许系统管理员设定用户和进程的资源使用限制,包括打开文件的数量、线程数和内存用量等。
vim /etc/security/limits.conf
在文件末尾添加以下4个参数配置。
root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535
参数说明:
soft:软控制,到达设定值后,操作系统不会采取措施,只是发提醒
hard:硬控制,到达设定值后,操作系统会采取机制对当前进程进行限制,这个时候请求就会受到影响
root:这里代表root用户(系统全局性修改)
*:代表全局,即所有用户都受此限制(用户局部性修改)
nofile:指限制的是文件数的配置项。后面的数字即设定的值,一般设置10000左右
ps:这个地方应该根据实际情况进行设置,可以设置全局的,也可以设置用户级别的
2.进程局部性修改
使用以下命令,查看系统打开文件的最大数量限制。
ulimit -n
接着打开nginx配置文件。
vim /usr/local/nginx/conf/nginx.conf
在配置文件中添加以下配置项,设置每个进程的最大文件打开数。这个参数对于Nginx的性能优化至关重要,因为它直接影响到Nginx能够处理的文件句柄数量,进而影响其并发处理能力,最好与ulimit -n查出的值保持一致,以确保Nginx能够充分利用系统资源。
worker_rlimit_nofile 65535; #进程限制
(二)CPU亲和配置
cpu的亲和能够使nginx对于不同的work工作进程绑定到不同的cpu上去。这能够减少在work间不断切换cpu,使得进程通常不会在处理器之间频繁迁移,进程迁移的频率小,以此来减少性能损耗。
1.设置工作进程数
Nginx运行工作进程个数一般设置CPU的核心或者核心数x2,输入以下命令可查询服务器的cpu数量和核心数。
lscpu | grep '^CPU(s):' #获取逻辑CPU数量
nproc #获取CPU的逻辑核心总数
工作进程数worker_processes最多开启8个,8个以上性能提升就有限了,而且稳定性变得更低,所以8个进程够用了,核心数和对应配置如下:
2核:
worker_processes 2; #工作进程数
worker_cpu_affinity 01 10; #指定每个工作进程绑定的CPU核心
4核:
worker_processes 4; #工作进程数
worker_cpu_affinity 0001 0010 0100 1000; #指定每个工作进程绑定的CPU核心
8核:
worker_processes 8; #工作进程数
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; #指定每个工作进程绑定的CPU核心
根据自己的实际情况,将配置添加到nginx配置文件中。
2.设置连接数
在Nginx中,work_connections参数是关键配置项之一,它指定了每个worker进程可以同时处理的客户端连接的最大数量。这个数值的设置通常基于服务器的性能和内存状况来决定,以确保Nginx能够高效地处理来自客户端的请求。实际上,Nginx的最大并发连接数是由worker进程的数量和每个进程允许的最大连接数共同决定的。
具体配置如下:
worker_connections 1024; #设置每个工作进程的线程数
(三)事件处理模型优化
nginx的连接处理机制在于不同的操作系统会采用不同的I/O模型,Linux下,nginx使用epoll的I/O多路复用模型,在freebsd使用kqueue的IO多路复用模型,在solaris使用/dev/pool方式的IO多路复用模型,在windows使用的icop等等。要根据系统类型不同选择不同的事务处理模型,博主服务器操作系统是Centos,因此将nginx的事件处理模型调整为epoll模型。
epoll模型是Linux内核为处理大批量文件描述符而设计的多路复用IO接口,它是select和poll的增强版本。 epoll模型能够显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它不需要遍历整个被侦听的描述符集,只需遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合。
具体配置如下:
events {
use epoll; #指定事件处理模型
}
ps:在不指定事件处理模型时,nginx默认会自动的选择最佳的事件处理模型服务。
(四)设置会话保持时间
在Nginx中,keepalive_timeout参数用于配置长连接的超时时间,单位为秒。这个参数的作用是保持客户端与服务器之间的连接在一定时间内保持活动状态,以便客户端可以重用这些连接来发送后续的请求,而无需每次都建立新的连接。这样做可以减少连接建立和关闭的开销,提高服务器的资源利用率和响应速度,尤其是在处理大量并发请求时。
具体配置如下:
keepalive_timeout 60; #设置会话保持时间,单位为秒
(五)开启Gzip压缩
Nginx的Gzip压缩功能主要用于压缩HTTP响应内容,以减小数据传输的大小,从而提高网站的性能和速度。Gzip功能通过在发送给客户端之前对响应内容进行压缩,可以有效减少数据传输的带宽消耗和响应时间。
1.安装Gzip模块
在Linux系统中,编译Nginx时使用以下命令安装Gzip模块。
./configure --prefix=/usr/local/nginx --with-http_gzip_static_module
make install
2.配置Gzip模块
在Nginx配置文件中添加以下内容(PS:以下配置可根据自己网站的实际需求做调整):
gzip on; # 开启Gzip压缩功能
gzip_min_length 1k; # 设置最小压缩文件大小为1KB
gzip_buffers 4 32k; # 设置压缩缓冲区个数和大小
gzip_http_version 1.1; # 设置支持的HTTP协议版本为1.1
gzip_comp_level 6; # 压缩比率, 一般选择4-6
gzip_types text/plain application/x-javascript text/css application/xml; # 设置需要压缩的文件类型
3.判断Gzip压缩是否开启成功
添加以上配置后,重启nginx,打开F12,查看请求,出现如下图所示红框字样则说明开启成功。
(六)开启高效文件传输模式
当在 Nginx 配置中设置 sendfile on,Nginx 将使用零拷贝技术来传输文件,这种技术只需要两次上下文切换和两次数据拷贝,从而减少了系统开销,提高了文件传输的效率。相比之下,当 sendfile 设置为off时,Nginx 会使用传统的文件传输技术,即通过read + write的方式进行文件传输,这需要四次上下文切换和四次数据拷贝,效率较低。此外,与 sendfile 相关的另一个配置选项是tcp_nopush。当 tcp_nopush设置为on时,Nginx 会等待数据包最大时一次性传输出去,这有助于解决网络堵塞问题,减少网络报文段的数量。
具体配置如下:
sendfile on; # 开启高效文件传输模式。
tcp_nopush on; #需要在sendfile开启模式才有效,防止网路阻塞,积极的减少网络报文段的数量。将响应头和正文的开始部分一起发送,而不一个接一个的发送。
(七)使用HTTP/2协议
HTTP/2 协议相较于传统的 HTTP/1.1 协议,具有多路复用、头部压缩等特性,可以显著提高图片加载的效率。启用 HTTP/2 就好比为数据传输开辟了多条高速公路,不再是一条道走到黑,能够同时传输多个请求,大大减少了等待时间。
1.安装HTTP2模块
在Linux系统中,编译Nginx时使用以下命令安装HTTP2模块。
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-http_v2_module
make install
2.配置HTTP2模块
在Nginx配置文件中,只需要在在监听的443端口配置这一栏,添加以下代码即可启用 HTTP/2。
http2 on; #启用HTTPS并启用HTTP/2协议支持功能(需要操作系统和SSL库支持)
3.验证是否开启成功
访问测试网站:https://domsignal.com/test/,输入网站域名,即可知道结果。
(八)缓存策略配置
缓存是提高网站性能的重要手段之一。Nginx提供了多种缓存策略,可以根据实际需求进行配置。以下是一些常见的缓存策略:
1. 浏览器缓存
通过设置正确的 HTTP 头信息,让浏览器缓存图片、css、js资源。当用户再次访问相同的页面时,如果这些资源没有更新,浏览器将直接使用本地缓存,而无需再次从服务器下载。
配置如下:
location ~* \.(jpg|jpeg|png|gif|svg|css|js)$ {
expires 30d; #设置缓存有效期时间为30天,可自行调整时间
add_header Cache-Control "public";
}
2. Nginx 本地缓存
在Nginx中设置本地缓存可以通过配置文件中的proxy_cache_path指令和相关的缓存指令来实现。
配置示例:
http {
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g
inactive=60m use_temp_path=off;
server {
listen 80;
server_name localhost;
location / {
proxy_pass #
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
}
}
}
参数解释:
-
proxy_cache_path 定义了缓存的存储路径、缓存目录的层次结构、缓存键的区域、最大缓存大小以及缓存内容在多长时间没有被访问后应被视为不活跃并可能被删除。
-
levels=1:2 指定了缓存目录的层次结构。
-
keys_zone=my_cache:10m 设置了内存区域以存储缓存键,大小为10MB。
-
max_size=10g 指定了最大缓存大小为10GB。
-
inactive=60m 指定了缓存数据在60分钟内未被访问就会被移除。
-
use_temp_path=off 关闭临时文件的使用,这样Nginx就不会将大文件写入临时目录。
-
proxy_cache my_cache 启用代理缓存。
-
proxy_cache_valid 200 302 10m 设置HTTP状态码为200和302的响应缓存有效期为10分钟。
-
proxy_cache_valid 404 1m 设置HTTP状态码为404的响应缓存有效期为1分钟。
-
proxy_cache_use_stale 指定了在指定的错误情况下使用过期的缓存内容。
-
确保替换 http://my_upstream 为你实际的上游服务器配置。这个配置假设你已经设置了一个名为 my_upstream 的上游服务器块。
(九)日志配置优化
日志是排查问题的重要手段,但是过多的日志会导致磁盘空间不足,影响系统性能。因此,需要对Nginx的日志进行优化。以下是一些优化方法:
1. 调整nginx输出日志的级别
Nginx支持的日志级别有:debug、info、notice、warn、error等。可以通过修改Nginx配置文件中的log_level参数来调整日志级别。具体配置如下:
2. 优化日志写入规则
Nginx支持的日志级别有:debug、info、notice、warn、error等,可以通过修改Nginx配置文件中的log_level参数来调整日志级别。还有如果每次请求成功都会写入一条日志,这显然会增加磁盘的压力,因此需要优化nginx的日志级别、写入规则和压缩等级,配置如下:
access_log /usr/local/nginx/logs/access.log combined buffer=32k gizp flush=1m info; # 配置访问日志写入规则、压缩、日志级别
error_log /usr/local/nginx/logs/error.log info; # 配置错误日志,并设置日志级别为info
参数说明:
/usr/local/nginx/logs/access.log 是访问日志文件的路径。
combined 是日志格式,这是一个常用的日志格式,它记录的信息比较全面,包括时间、客户端IP、请求方法等。
buffer=32k 指明了缓冲区的大小,这里设置为32KB。
gzip 日志写入前先进行压缩。压缩率可以指定,从1到9数值越大压缩比越高,同时压缩的速度也越慢。默认是1。
flush 设置缓存的有效时间。如果超过flush指定的时间,缓存中的内容将被清空,当产生第一条数据后过了一分钟才写入。
info 日志级别,常见的日志级别有 debug、info、notice、warn、error、crit、alert、merg,级别越高,记录的信息越少,默认为 error。
三、搭建免费的CDN加速
CDN加速主要是解决因分布、带宽、服务器性能带来的访问延迟问题,适用于站点加速、点播、直播等场景。它使用户可以就近取得所需内容,解决Internet网络拥挤的状况,提高用户访问网站的响应速度和成功率。CDN的基本技术思路是尽可能避开互联网上可能影响数据传输速度和稳定性的环节,提升内容传输的速度和稳定性。通过将源站资源缓存到全国各地的边缘服务器,供用户就近获取,从而降低源站压力。
(一)免费CDN介绍
收集了网上目前仍在运行的免费cdn,有以下几家:
1.FreeCDN
能够同时提供DDOS防御、CC防御和支持HTTPS/SSL证书并且不限流量,这个是目前发现的唯一 一家可以提供这种免费的服务,其他大多是限制了流量或者不提供DDOS防御/CC防御,能够支持HTTPS/SSL证书的也不多,提供国内和国外的免费cdn。
2.Procdn
是一家新兴的cdn服务提供商,采用了lecdn系统,仅需要1元即可获得cdn服务,如您不会用,还可进群找技术人员免费提供支持,节点30+。
3.cloudflare
这个家喻户晓,可谓最大方的cdn服务提供商了,随便跑,并且有着不错的防御,就是国内速度不太行,但是可以通过优选ip来缓解这个问题,问题不大,对应个人用户来说是个很好的选择。
网址:https://www.cloudflare-cn.com/
(二)搭建过程
这里以cloudflare为例,进行CDN加速搭建。打开cloudflare网站首页后,先进行注册登录。
应用程序服务选择免费->添加一个网站。
接着输入邮箱和密码进行注册。
注册成功后,会进入以下页面,先切换右上角的语言为简体中文,方便后续操作,然后点击添加网站或应用程序按钮。
接着输入网站的域名地址,点击继续。
选择Free套餐并点击继续。
自动加载或导入DNS记录,点击继续。
点击继续。
进入后台后,我们需要把cloudflare分配给我们的DNS服务器,在我们购买域名的注册机构或经销商哪进行更换,由cloudflare负责对我们的域名进行解析。
以阿里云为例,博主的域名是在阿里云进行购买注册的,进入阿里云域名控制台->域名列表->DNS管理->DNS修改。
修改成cloudflare分配给我们的DNS服务器。
修改DNS配置完成后,cloudflare后台显示如下图所示则说明DNS解析成功配置。
(三)完善配置
进入DNS->设置菜单,开启DNSSEC配置,该配置通过提供数字签名和验证机制,增强了DNS数据的可信度和安全性,保护用户免受恶意重定向和其他网络攻击的影响,同时提高了整个互联网的安全性和可靠性。
进入SSL/TLS->概述菜单,将SSL/TLS加密模式设置为完全,该配置用于解决使用 CloudFlare 导致网站「重定向的次数过多」导致的访问失败问题。同时将CDN的回源端口设置为443(HTTPS协议的端口),这样CDN回源时会以HTTPS协议请求源站,避免触发源站的强制跳转逻辑。
进入安全性->自动程序菜单,开启自动程序攻击模式和阻止AI爬虫程序和爬网程序。
进入安全性->设置菜单,可配置网站的安全级别、质询通过期、浏览器完整性检查、替换不安全的 JavaScript 库。
(四)验证是否成功开启
进入站长工具网站 https://ping.chinaz.com/,输入网站域名进行ping测试,如果发现有多个不同的解析响应IP,则说明开启成功。
四、网站优化后的效果
如下图所示,网站的加载时间明显得到显著的提升。
五、其他优化建议
(一)数据库表增加索引
数据库表增加索引对网站的好处主要体现在提高查询速度、减少IO操作、提高数据的唯一性和完整性、以及提高并发性能。
(二)对图片进行压缩上传
主要原因是为了提高网站加载速度并节省存储空间。在数字时代,图片是网页和社交媒体上不可或缺的元素,但大尺寸的图片不仅会拖慢网站的加载速度,影响用户体验,还会占用大量的存储空间,增加网站的运营成本。因此,对图片进行压缩变得尤为重要。压缩图片可以通过减少图片的文件大小,从而加快网页的加载速度,提高用户体验和满意度。此外,压缩图片还能有效节省存储空间,降低网站的存储成本。
(三)提高服务器配置
网站优化需要提升服务器的配置主要包括处理器(CPU)、内存(RAM)、存储空间、带宽(Bandwidth)、操作系统和虚拟化技术。
处理器(CPU):选择多核心的中央处理器,如四核或更高,以及较大的高速缓存可以提供更快的数据读写速度,提升网站性能。
内存(RAM):需要较大的内存容量来支持处理大量的数据和请求。选择具有可扩展性的内存模块,以便在需要时进行升级。
存储空间:选择具有足够存储空间的硬盘或固态硬盘(SSD),以容纳网站的数据和文件。确保服务器配置有数据冗余和备份机制,以防止数据丢失或损坏。
带宽(Bandwidth):选择具有较高带宽的网络连接,满足用户对快速加载网站的需求。使用内容分发网络(CDN)来加速网站的访问速度,减少服务器负载。
操作系统(Operating System):选择稳定性较高的操作系统,如Linux或Windows Server等,确保具有良好的安全性能,以保护网站免受恶意攻击。
虚拟化技术:使用虚拟化技术可以提高服务器的资源利用率,并简化管理和维护工作。
此外,还有一些具体的优化措施可以帮助提高服务器的性能和可靠性,包括合理配置内存和CPU、优化磁盘I/O性能、调整网络配置、加强服务器安全性、使用性能监控工具等。这些措施共同作用,可以显著提升网站的访问速度和用户体验,确保网站的稳定运行。
六、结语
扫下方二维码关注或访问个人网站 https://www.xiaolin-code.com/,第一时间获取最新文章更新。