Optimize Website


目录:

打开网站慢

网站打开速度慢是什么原因导致

一个网站无论优化、页面布局、各方面搭建多好,如果网站打开速度慢会导致用户流失。是什么原因导致网站打开慢?网站打开慢的原因是什么?网站打开的速度与页面的响应时间,往往是站长们所忽视的,但这个问题是导致用户流失的一个大根源。当用户访问你的网站时,打开网站速度慢或者不能打开,那在用户心里对你网站的印象会大大降低。用户的直观印象会觉得只有不正规的网站才会有这样的现象。如果用户是通过搜索关键字进入你的网站想要需求合作或者帮助,一旦你网站打开速度慢,用户就会直接认为你是一个不入流的公司或者是小公司,对于公司企业网站来讲,网站打开速度很重要。网站打开速度慢的原因有很多,可能是空间问题网站建设问题域名解析问题等多方面。

1. 网络问题-> ping 域名/ip、查负载、
2. 浏览器缓存太多、或者浏览器问题(换一个浏览器)
3. 大量爬虫、遭遇攻击
4. 域名问题(DNS、域名自身) 
    域名解析不正常,过期,或者终止服务,会导致找不到服务器,这样的情况解决的方法就是检查域名以及联系域名注册商确认原因。

5. 服务器,主机,空间问题
    服务器内存CPU检查
    服务器环境异常、不稳定,或者终止服务,网站自然就会打不开。在建站时,选择服务器或者主机、空间时一定要选择好,按照自身网站的需求来选择,不要为了方便或者便宜而选择一些比较差的服务器。

6.死链问题
    死链是网站改版升级等操作之后,残留下来的不存在页面,也就是说,是网站改动前的页面,经过改动之后删除了这个页面,但是这个页面已经被搜索引擎收录了,这样的页面称为死链,用户通过搜索引擎搜索到死链页面访问之后会出现空白或者打开不开的现象,在这里我们要做好404页面,或者我们可以做一个404文件,将死链写入404文件中然后提交给百度站长平台。404起到的是一个跳转的作用,防止用户在访问死链页面时出现打不开、空白、无响应的现象。

7. 图片与flash的问题
    网站中过多的图片与flash会影响网站的打开速度,在上传图片时要进行压缩,减少图片占用的空间。很多网站为了让自己的网站看起来更加的美观,会在网站中添加flash文件,让网站的核心内容播放出来。但是当用户网速不好,或者你的空间不稳定,就会出现flash加载失败的现象,很影响用户体验。


8. 插件问题
    一般来说,网站安装插件是对网站有一定的用处才会去安装,但如果你网站过多的插件会影响网站的打开时间,例如有一些添加网站美观的插件,安装后虽然可以让你网站看起来更美观了,但是影响到了网站的响应速度。所以无用的插件尽量不要安装。


9. 引入过多站外内容
    网站引用其他站外的内容是正常的事情,但是网站上引用过多其他网站的内容,会导致你网站经常出现卡顿,和网站打开速度慢的现象。你引用的站外内容,如果该网站的速度慢,或者改网站的页面不存在或者删除,那么也会影响你网站的打开时间。


10. 访问量问题
    如果你网站已经是一个高知名度或者是人气很高的网站,网站每天的访问量都很高,在这种情况下,你需要考虑该换置一个更大的服务器了。

结语:做网站优化不单单在于网站内容方面的搭建,要结合多方面进行网站优化,有时候往往是小问题的忽视导致网站得不到提升

为什么站点访问慢?

参考: https://mp.weixin.qq.com/s/OqJkde1cUVKY0XC5vcl0jQ

参考资料

作者:Coagent

链接:http://www.jianshu.com/p/QsGiYD

下面推荐介绍几本有关 Web 性能优化的图书,可以找来阅读,尤其是《构建高性能WEB站点》这本书,非常值得服务器运维工程师阅读,它是国内一本面向服务器工程师的性能优化书籍,比较系统地讲解了优化思路,且有很多实际操作方面的举例说明。

优化思路浅析

要优化 Web 服务器的性能,我们先来看看 Web 服务器在 web 页面处理上的步骤:

  • Web 浏览器向一个特定的服务器发出 Web 页面请求;

  • Web 服务器接收到 web 页面请求后,寻找所请求的 web 页面,并将所请求的 Web 页面传送给 Web 浏览器;

  • Web 浏览器接收到所请求的 web 页面内容,并将它显示出来。

上面三个步骤都关系 Web 服务器,但实际 Web 服务器性能相关最大的是在第 2 步,这里 Web 服务器需要寻找来自浏览器所请求的 Web 页面内容。

我们知道,Web 页面内容有静态的,也有动态的,静态的内容,web 服务器可以直接将结果发回给浏览器,对于动态内容,则通常需要交给应用服务器先处理,由应用服务器返回结果。

当然,也有 Web 服务器本身可以处理动态内容的,例如 IIS 就可以自已解释处理 ASP, ASP.NET 这两种微软的动态网页脚本语言。

从上面简要的分析里,我们大致可以得到这样的结论,影响 Web 页面访问的影响因素会有这几个:

  1. Web 服务器从磁盘中读取静态页面内容的速度,也即时间;

  2. Web 服务器判定请求内容是静态还是动态内容的时间;

  3. Web 服务器转发请求给应用服务器的时间;

  4. 应用服务器处理(解释)动态内容所需的时间;

  5. Web 服务器返回 Web 内容给浏览器的响应时间;

  6. Web 服务器接收来自浏览器请求的处理性能;

  7. Web 访问请求数据在网络上传输的时间:包括从浏览器到服务器,和从服务器到浏览器两部分;

  8. 浏览器本地计算和渲染 Web 内容的时间,即接收内容后展现内容的时间。

上面 8 项很容易理解,也很直接,其实还有以下几项也是关乎 Web 页面访问速度体验的因素,你可以思考下是否如此?或者说是否会影响到页面访问性能。

  • Web 服务器执行安全策略检查的时间,或者说性能;

  • Web 服务器读取日志文件、写日志内容、关闭对日志文件访问的时间,先读后写再关闭,这三步中的读与写又涉及到磁盘访问性能因素;

  • 同时与 Web 服务器连接会话的客户端数量大小,即并发访问量多大。

我们可以将上面一共 11 项影响因素抽像出来,那么就是:

  1. Web 服务器磁盘性能;

  2. Web 服务器与应用服务器交互的性能;

  3. 应用服务器处理动态内容的性能,或者说动态内容应用处理性能;

  4. 客户端与 Web 服务器的连接速度,即网络传输性能;

  5. Web 浏览器解释和渲染 Web 内容的性能;

  6. Web 访问并发性能。

反映到我们进行性能优化,可以入手的角度就有:

A. 增加带宽,包括服务器和客户端两边的 Internet 连接带宽;

B. 加快动态内容的处理性能;

C. 尽可能多地使用静态内容,这样 Web 服务器就可以无需请求应用服务器,直接将 Web 内容发给浏览器端,这里可以入手的方案又有:

a.  动态内容缓存

b.  动态内容静态化

D. 多台服务器负载均衡同时处理大量的并发访问;

E. 提升服务器磁盘访问性能,也即通常所说的 I/O 性能;

F. 减少网页中的 HTTP 请求数;

G. 更换更好性能的 Web 服务器;

H. 合理部署服务器,在离客户端更近的地方部署服务器,已经证明可以明显地提升访问性能。

性能优化实践

经过前面小节的简要分析,我相信你对优化 Web 服务器有一定的思路了,你可以从硬件层面软件层面Web 代码三个层面去优化。

下面我们结合一个具体的实例来实践一回,本文所举例是一个小型的 Web 站点,部分数据系假设,如有类同,纯属巧合,仅起抛砖引玉之用。在实际工作中,如果碰到大站点,你可以参考此处的分析,修改优化方案。

1. 站点简介

一个社区论坛站点,采用 Discuz! 论坛程序构建,该程序采用主流的 PHP + MySQL 组成。

网站目前有近 5 万注册用户,绝大多数是国内的用户,活跃用户数在一半左右,每天平均 PV 在 15~20 万,独立访问 IP 数在 8000 左右。

2. Web 服务器性能优化需求

网站现部署在国外的服务器,租用虚拟主机来运营,因为访问量比较大,所以经常会收到虚拟主机服务商的流量很大的通知,要求控制下访问量。

另外,虚拟主机的服务器在美国,没有在国内租用虚拟主机的原因是国内网站在备案方面非常繁琐,在网站一开始运营时数据量和访问量都比较小,所以对性能要求不高,数据量小,所以服务器在查询处理数据时速度比较快,也让人感觉访问速度不慢,现在随着数据量和访问量的不断上升,访问速度已明显下降,到了需要改善访问性能的时候了。

基于目前该社区网站的情况,提出的优化需求是,国内访问速度需要提升一倍,目前首页加载时间需要 40 秒左右,希望优化后能在 20 秒以内将首页加载完成。

另外提出网站数据能够每天自动备份一次,备份数据保留一个月的,以便随时恢复。

上述两点需求,其中第一条才是性能优化需求,第二条是额外的需求了。

3. 性能优化方案

根据其网站的现状和优化需求,结合自己的经验,加上谷歌的搜索,同时与网站主不断确认沟通,最终得到以下性能优化方案:

由虚拟主机部署改为独立服务器部署

虚拟主机受限比较多,无法自己自定义配置 Web 服务器,无法配置 PHP 动态缓存,而且独立服务器可以独享内存、处理器资源,不再受虚拟主机商对每个虚拟主机用户的内存和处理器资源占用限制。处理器资源和内存资源,对接受更多并发访问有直接性能提升效果。

由 Windows 操作系统改为 Linux 操作系统

网站使用的是 PHP + MySQL 程序,PHP 在 Windows 下的性能,受限于 IIS 需要通过 ISAPI 形式调用 PHP,所以性能不如 Linux 下 Apache 直接通过 PHP 模块解释 PHP,更不如 Nginx 与 PHP-FPM 的性能,既然使用了独立服务器,操作系统也可以自己确定,Linux 系统我们选用了熟悉的 Ubuntu Linux Server 10.04(一年前还没有 12.04)。

Web 服务器采用 Nginx,而不使用 Apache

选用 Nginx 而不用 Apache 的原因非常直接和干脆,因为站点里有很多静态的附件文件,在处理静态内容上,Nginx 性能是 Apache 的差不多 10 倍。

在 PHP 解释和伪静态规则方面,Apache 要比 Nginx 强,但这不影响我们放弃它,为缓解这一点,我们在后面对 PHP 进行了动态缓存。

对 PHP 查询进行动态缓存,使用 eAccelerator 这个加速器

PHP 加速器是一个为了提高 PHP 执行效率,从而缓存起 PHP 的操作码,这样 PHP 后面执行就不用解析转换了,可以直接调用 PHP 操作码,这样速度上就提高了不少。

eAccelerator 是一个开源 PHP 加速器,优化和动态内容缓存,提高了 PHP 脚本的缓存性能,使得 PHP 脚本在编译的状态下,对服务器的开销几乎完全消除。它还有对脚本起优化作用,以加快其执行效率。使得的 PHP 程序代码执效率能提高 1-10 倍,这个加速还是非常明显的。

具体地,我们计划对 eAccelerator 进行以下设置优化:

  1. 缓存使用物理内存来进行,不使用磁盘来缓存。我们知道内存的读写性能是硬盘的 N 倍,所以在内存资源可以安排情况下,强烈建议使用内存来保存 eAccelerator 的缓存内容。

  2. 缓存大小设置为 32MB,这个值是操作系统默认支持最大的缓存容量。虽然可以通过修改配置文件来加大这个值,但我们觉得没有必要,所以就放弃了。

Nginx 性能优化

选用了 Nginx,虽然它的性能很好,但我们仍然需要对它进行性能优化,在这个案例中,我们做了以下优化:

  1. 使用 8 个进程,每个进程大约需要 20M 内存消耗,这里一共使用了 150M 左右的内存。

  2. 充分使用主服务器的 CPU 内核:

四核,使用 CPU 粘性配置选项(worker_cpu_affinity),每核处理器分配两个进程。

  1. 开启 gzip 压缩功能:

gzip 压缩对 JS, CSS, XML 压缩效果非常好,能压缩一半,即减少一倍的传输时间;

对图片文件,JPG 已经压缩过的,它的压缩性能要少一些。

  1. 图片本地缓存 1 天:

网站上的图片很多,通常一张图片上传后,不会频繁的修改,只会频繁的访问,所以将图片放在 Nginx 缓存里,可以减少服务器访问加载次数,提升访问速度。

  1. JS、CSS 文件本地缓存 7 天:

这两种网页文件,平时都不会去修改它,将它缓存起来,可以减少加载次数,提升访问速度。

为什么这两种文件不和图片一起设置缓存有效期,是考虑了不同文件的修改频率不一样。

  1. Nginx 日志每天切割一次:

这个优化项能大大减小 Nginx 日志文件的大小,经过一周的查看,每天的日志文件是 50M 左右,如果不是每天切割,用月切割,那一个月的日志文件就是几个 G,要 Web 服务器在内存里加载这么大的文件,系统本身内存不够用,就自然会用到磁盘来缓存,这就影响性能。

每天 50M 左右,在内存上完全可以顺利加载,这样 Nginx 在处理访问时,可以快速的保存访问日志。

经过上述几个优化项目,Nginx 这边一共需要占用 200M 左右内存资源。

对 PHP CGI 进程性能进行优化

Nginx 没有 PHP 模块,所以它对 PHP 的支持是通过 PHP-FPM 来实现的,PHP-FPM 是跑进程来处理并发请求,在这个案例中,我们配置了 20 个进程,每个进程差不多占用 20M 左右内存资源,一共是 400M 左右。

同时,PHP-FPM 与 Nginx 交互机制,选用 Linux Socket 模式而不是 TCP 协议端口,Socks 是系统级处理模式,socks 也就是一个文件连接,而 TCP 协议端口,需要经过网络协议处理,性能不如前者,所以我们选择了前者。

MySQL 数据库性能优化

因为网站主程序是选用他人开发的开源程序,所以对数据库查询的程序优化我们无法处理,只能从 MySQL 本身寻找突破口。

我们可以想像一下,对于论坛网站,通常看贴、查贴的访问量要远大于创建贴子、回复贴子的访问量,体现在 MySQL 数据库上,就是读表与查询表数据的连接处理更多。

因此我们要选择对读表、查询性能更好的存储引擎,结合以前了解的知识,MySQL 缺省的 MyISAM 引擎就是被设计为适合处理读频率远大于写频率的环境,查询效率相当可观,而且内存占用很少,这也与我们租用低内存配置的 VPS 相符。

具体到 MySQL 配置参数的优化上,受限于服务器上内存资源本身有限,就直接采用缺省的中型环境配置文件。

内容分发网络应用

站点每天十多万的访问,上万独立 IP 访问,查看先前的访问统计,访问来自国内各个地区,使用多种网络连接访问进来,为保证来自各网络的用户访问速度,同时也减少对网站服务器的请求,我们采用了 CDN 来分发静态内容,这样各地的用户可以就近访问到已缓存在 CDN 上的文件,CDN 服务商会在静态内容第一次访问时缓存到他们全国各地的服务器上,当第二次访问时,用户实际是没有连接到网站服务器上获取文件的,而是直接从 CDN 服务器上获取,可以明显的提升网站性能。

网站中的css,jss等文件都是小文件,而且很多

image-20230214161235609

日志统计命令组合

#查看tcp连接状态,指定查看80端口的tcp连接状态,有利于分析连接是否释放,或者攻击时进行状态分析。
netstat -tan |awk '{print $6}'sort|uniq -c|sort -rn

#TCP各种状态列表:
netstat -nt | grep -e 127.0.0.1 -e 0.0.0.0 -e ::: -v | awk '/^tcp/ {++state[$NF]} END {for(i in state) print i,"\t",state[i]}'

netstat -tan | grep TIME_WAIT | wc -l
netstat -tan | grep ESTABLISHED | wc -l

#查看php_fpm进程数,如果接近预设值,说明不够用,需要增加:
netstat -anpo | grep "php-fpm" | wc -l

#查找80端口请求数最高的前20个IP,有时候业务的请求量突然上去了,那么这个时候我们可以查看下请求来源IP情况,如果是集中在少数IP上的,那么可能是存在攻击行为,我们使用防火墙就可以进行封禁。命令如下:

netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20

#IP和TCP分析
#查看连接某服务端口最多的的IP地址:
netstat -ntu | grep :80 | awk '{print $5}' | cut -d: -f1 | awk '{++ip[$1]} END {for(i in ip) print ip[i],"\t",i}' | sort -nr


#找出当前系统内存使用量较高的进程,在很多运维的时候,我们发现内存耗用较为严重,那么怎么样才能找出内存消耗的进程排序呢?
ps -aux | sort -rnk 4 | head -20 #输出的第4列就是内存的耗用百分比。最后一列就是相对应的进程。
vim ./var
##set color##
echoRed() { echo $'\e[0;31m'"$1"$'\e[0m'; }
echoGreen() { echo $'\e[0;32m'"$1"$'\e[0m'; }
echoYellow() { echo $'\e[0;33m'"$1"$'\e[0m'; }

vim System_and_Access_log_analysis_summary.sh
#!/bin/bash
. ./var
System_and_Access_log_analysis_summary(){
    LOG_FILE="/usr/local/nginx/logs/access.log"
    WEB_PORT="80"
    MYSQL_PORT="3306"

    #查看tcp连接状态
    netstat -tan |awk '{print $6}'sort | uniq -c | sort -rn
    echoGreen "以上是tcp连接状态"

    #查找80端口请求数最高的前20个IP
    netstat -anlp|grep ${WEB_PORT} | grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20
    echo "---------------------------------------"
    netstat -ntu | grep :${WEB_PORT} | awk '{print $5}' | cut -d: -f1 | awk '{++ip[$1]} END {for(i in ip) print ip[i],"\t",i}' | sort -nr
    echoYellow "以上是80端口请求数最高的前20个IP"

    #查找3306端口请求数最高的前20个IP
    netstat -anlp|grep ${MYSQL_PORT} | grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20
    echoGreen "以上3306端口请求数最高的前20个IP"

    #找出当前系统内存使用量较高的进程,输出的第4列就是内存的耗用百分比。最后一列就是相对应的进程
    #ps -aux | sort -rnk 4 | head -20
    ps aux | head -1;ps aux |grep -v PID |sort -rn -k +4 | head -20
    echoYellow "以上是当前系统内存使用量较高的20"

    #找出当前系统CPU使用量较高的进程
    ps -aux | sort -rnk 3 | head -20
    echoGreen "以上是当前系统CPU使用量较高的进程"

    #查看php_cgi进程数,如果接近预设值,说明不够用,需要增加:
    netstat -anpo | grep "php-cgi" | wc -l
    echoYellow "以上php_cgi进程数,如果接近预设值,说明不够用,需要增加"



    #列出当天访问次数最多的IP
    # cut -d- -f 1 access.log |uniq -c |sort -rn |head -20
    awk '{print $1}' ${LOG_FILE} | uniq -c | sort -rn | head -20
    echoGreen "以上是截止此时访问次数最多的IP"


    #查看当天有多少个IP访问
    awk '{print $1}' ${LOG_FILE} | sort | uniq | wc -l
    echoYellow "以上是截止此时有多少个IP访问"

    #查看某一个页面总计被访问的次数
    grep "index.html" ${LOG_FILE} | wc -l
    echoGreen "以上index.html页面总计被访问的次数"

    #查看每一个IP访问了多少个页面
    awk '{++s[$1]} END {for (a in s) print a,s[a]}' $LOG_FILE
    echoYellow "以上是每一个IP访问了多少个页面"

    #将每个IP访问的页面数进行从小到大排序
    awk '{++s[$1]} END {for (a in s) print s[a],a}' $LOG_FILE | sort -n
    echoGreen "以上是每个IP访问的页面数进行从小到大排序"


    #查看某一个IP访问了哪些页面
    #grep "^127.0.0.1" $LOG_FILE | awk '{print $1,$7}'
    #echoYellow "以上是192.168.1.2访问了哪些页面"

    #去掉搜索引擎统计当天的页面
    #awk '{print $12,$1}' $LOG_FLIE |grep ^"Mozilla" | awk 'print $2' | sort | uniq | wc -l
    #echoGreen "去掉搜索引擎统计当天的页面"

    #查看10/Apr/2020:11:03:33这一个小时内有多少IP访问
    awk '{print $4,$1}' ${LOG_FILE} | grep "10/Apr/2020:11:03:33"  | awk '{print $2}' | sort | uniq | wc -l
    echoYellow "以上是10/Apr/2020:11:03:33这一个小时内有多少IP访问"

    #列出所有IP访问情况
    awk '{print $1}' $LOG_FILE | sort -n | uniq
    echoGreen "以上是所有IP访问情况"

    #查看访问最频繁的前100个IP
    awk '{print $1}' $LOG_FILE | sort -n | uniq -c | sort -rn | head -n 100
    echoYellow "以上是访问最频繁的前100个IP"


    #查询某个IP的详细访问情况,按访问频率排序
    grep '127.0.0.1' ${LOG_FILE} | awk '{print $7}' | sort | uniq -c | sort | uniq -c | sort -rn | head -n 100
    echoGreen "以上是某个IP的详细访问情况,按访问频率排序"


    #查看访问100次以上的IP
    awk '{print $1}' ${LOG_FILE} | sort -n | uniq -c | awk '{if($1 >100) print $0}' | sort -rn
    echoYellow "查看访问100次以上的IP"


    #页面统计访问:查看访问频率的前100个页面
    awk '{print $7}' ${LOG_FILE} | sort | uniq -c | sort -rn | head -n 100
    echoGreen "以上是页面统计访问:查看访问频率的前100个页面"


    #页面统计访问:查看访问频率的前100个页面(排除php|py)
    grep -E -v ".php|.py" ${LOG_FILE} | awk '{print $7}' | sort | uniq -c | sort -rn | head -n 100
    echoGreen "以上是页面统计访问:查看访问频率的前100个页面(排除php|py)"

    #页面访问统计:查看页面访问次数超过100次的页面
    cut -d ' ' -f 7 ${LOG_FILE} | sort | uniq -c | awk '{if ($1 > 100) print$0}'
    echoYellow "以上是页面访问统计:查看页面访问次数超过100次的页面"


    #页面访问统计:查看最近1000条记录中,访问量最高的页面
    tail -1000 ${LOG_FILE} | awk '{print $7}' | sort | uniq -c | sort -nr
    echoGreen "以上是页面访问统计:查看最近1000条记录中,访问量最高的页面"


    #每秒请求量统计:统计每秒的请求数前100的时间点(精确到秒)
    awk '{print $4}' ${LOG_FILE} | cut -c14-21 | sort | uniq -c | sort -nr | head -n 100
    echoYellow "以上是每秒请求量统计:统计每秒的请求数前100的时间点(精确到秒)"

    #每分钟请求量统计:统计每分钟的请求数,top100的时间点(精确到分钟)
    awk '{print $4}' ${LOG_FILE} | cut -c14-18 | sort | uniq -c | sort -nr | head -n 100
    echoGreen "以上是每秒请求量统计:统计每秒的请求数前100的时间点(精确到秒)"

    #每小时请求量统计:统计每小时的请求数,top100的时间点(精确到小时)
    awk '{print $4}' ${LOG_FILE} | cut -c14-15 | sort | uniq -c | sort -nr | head -n 100
    echoGreen "以上是每小时请求量统计:统计每小时的请求数前100的时间点(精确到秒)"
}
System_and_Access_log_analysis_summary

免责声明: 本文部分内容转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除。