中小型网站架构分析及优化

news/2024/5/11 23:30:00/文章来源:https://blog.csdn.net/weixin_33998125/article/details/90064525

先看网站架构图:

wKiom1WKdbGgXLOGAAHVOEBTyTg628.jpg

以上网站架构广泛运用中大型网站中,本文从架构每一层分析所用主流技术和解决手段,有助于初入网站运维朋友们,进一步对网站架构认识,从而自己形成一套架构概念。

第一层:CDN

  国内网络分布主要南电信北联通,造成跨地区访问延迟大问题,对于有一定访问量网站来说,增加CDN(内容分发网络)层可有效改善此现象,也是网站加速的最好选择。CDN把网站页面缓存到全国分布的节点上,用户访问时从最近的机房获取数据,这样大大减少网络访问的路径。如果想自己搭建CDN,不建议这么做,因为什么呢?其实说白了,就是什么事别往运维上拦。CDN架构部署不复杂,影响效果的因素却很多,后期管理维护也比较复杂,想达到预期的效果确非易事,这是一个费力不讨好的活,最后老板还是感觉是你能力不足。建议找专做CDN的公司,费用也不贵,有抗流量攻击能力,效果也很好,运维也少很多事,何乐而不为呢!

第二层:反向代理(网页缓存)

  如果CDN没有缓存要请求的数据则向这层发起请求,在代理服务器配置缓存功能(本地),代理服务器就查找本地缓存是否有CDN请求的数据,如果有就直接返回给CDN,如果没有则请求后端负载均衡器然后转发给WEB服务器返回数据给代理服务器,代理服务器再将结果给CDN。代理服务器一般缓存不经常变动的静态页面,如image、js、css、html等,主流的缓存软件有Squid、Varnish、Nginx。

第三层:负载均衡

  访问量较大的网站都会用到负载均衡,因为这是解决单台服务器性能瓶颈的最好办法。反向代理将请求转发给负载均衡器,负载均衡器根据算法(轮训、负载情况选择后端等)交给后端WEB服务处理,WEB服务处理完成后直接返回数据给反向代理服务器。负载均衡合理分配请求给后端多台WEB服务器,减轻单台服务器并发负载,并保证服务可用性。主流的负载均衡软件有LVS、HAProxy、Nginx。

第四层:WEB服务

  WEB服务是处理用户请求的,WEB服务处理效率,直接影响到访问速度,为避免这层因素造成访问慢,应对其进行调优,让WEB服务发挥到最佳状态。常见的WEB服务有Apache和Nginx。

Apache优化:

1).mod_deflate压缩模块

查看是否加载:

1
# apachectl –M |grep deflate

如果没有安装使用apxs编译进去:

1
# /usr/local/apache/bin/apxs –c –I –A apache源码目录/modules/mod_deflate.c

deflate配置参数:

1
2
3
4
5
6
<IfModulemod_deflate.c>
DeflateCompressionLevel6      #压缩等级(1-9),数值越大效率越高,消耗CPU也就越高
SetOutputFilterDEFLATE      #启用压缩
AddOutputFilterByTypeDEFLATE text/html text/plain text/xml #压缩类型
AddOutputFilterByTypeDEFLATE css js html htm xml php  
</IfModule>

2).mod_expires缓存模块

查看是否加载:

1
# apachectl –M |grep expires

如果没有安装使用apxs编译进去:

1
# /usr/local/apache/bin/apxs –c –I –A apache源码目录/modules/mod_expires.c

再在httpd.conf启用模块:LoadModule expires_module modules/mod_expires.so 

缓存机制有三种用法:全局、目录和虚拟主机

全局配置,在配置文件末尾添加:

1
2
3
4
5
6
<IfModulemod_expires.c>
ExpiresActiveon       #启用有效期控制,会自动清除已过期的缓存,然后从服务器获取新的
ExpiresDefault "accessplus 1 days"       #默认任意格式的文档都是1天后过期
ExpiresByTypetext/html "access plus 12 months"  
ExpiresByTypeimage/jpg "access plus 12 months"   #jpg格式图片缓存12月
</IfModule>

3).工作模式选择及优化

 apache有两种常见工作模式,worker和prefork,默认是worker,是混合型的MPM(多路处理模块),支持多进程和多线程,由线程来处理请求,所以可以处理更多请求,提高并发能力,系统资源开销也小于基于进程的MPM,由于线程使用进程内存空间,进程崩溃会导致其下线程崩溃。而prefork是非线程型MPM,进程占用系统资源也比worker多,由于进程处理连接,在工作效率上也比worker更稳定。可通过apache2 –l查看当前工作模式,在编译时使用—with-mpm参数指定工作模式。根据自己业务需求选择不同工作模式,再适当增加工作模式相关参数,可提高处理能力。

配置参数说明:

1
2
3
4
5
6
7
8
<IfModuleprefork.c>
StartServers      8   #默认启动8个httpd进程
MinSpareServers    5    #最小的空闲进程数
MaxSpareServers    20   #最大的空闲进程数,如果大于这个值,apache会自动kill一些进程
ServerLimit      256   #服务器允许进程数的上限
MaxClients       256  #同时最多发起多少个访问,超过则进入队列等待
MaxRequestsPerChild  4000  #每个进程启动的最大线程
</IfModule>

Nginx优化:

1).gzip压缩模块

1
2
3
4
5
6
7
8
9
10
http {
    ……
    gzip on;
    gzip_min_length 1k;   #允许压缩的页面最小字节数,默认是0,多大都压缩,小于1k的可能适得其反
    gzip_buffers 4 16k;   #gzip申请内存的大小,按数据大小的4倍去申请内存
    gzip_http_version 1.0;  #识别http协议版本
    gzip_comp_level 2;    #压缩级别,1压缩比最小,处理速度最快,9压缩比最大,处理速度最慢
    gzip_types text/plainapplication/x-javascripttext/css application/xml image/jpg;  #压缩数据类型
    gzip_vary on;      #根据客户端的http头来判断,是否需要压缩
}

2).expires缓存模块

1
2
3
4
5
6
7
8
9
10
server {
    location ~ .*\.(gif|jpg|png|bmp|swf)$   #缓存数据后缀类型
    {
      expires 30d;   #使用expires缓存模块,缓存到客户端30天
    }
    location ~ .*\.( jsp|js|css)?$
    {
      expires 1d;
    }
}

3).fastcgi优化

nginx不支持直接调用或者解析动态程序(php),必须通过fastcgi(通用网关接口)来启动php-fpm进程来解析php脚本。也就是说用户请求先到nginx,nginx再将动态解析交给fastcgi,fastcgi启动php-fpm解析php脚本。所以我们有必要对fastcgi和php-fpm进行适当的参数优化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
http {
    ……
    fastcgi_cache_path/usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;  
    # FastCGI缓存指定一个文件路径、目录结构等级、关键字区域存储时间和非活动删除时间
    fastcgi_connect_timeout 300;    #指定连接到后端FastCGI的超时时间
    fastcgi_send_timeout 300;     #指定向FastCGI传送请求的超时时间
    fastcgi_read_timeout 300;     #指定接收FastCGI应答的超时时间
    fastcgi_buffer_size 64k;      #指定读取FastCGI应答第一部分需要多大的缓冲区
    fastcgi_buffers 4 64k;      #指定本地需要用多少盒多大的缓冲区来缓冲FastCGI的应答请求
    fastcgi_busy_buffers_size 128k;   
    fastcgi_temp_file_write_size 128k;  #表示在写入缓存文件时使用多大的数据块,默认值是fastcgi_buffers的两倍
    fastcgi_cache TEST;          #开启fastcgi_cache缓存并指定一个TEST名称
    fastcgi_cache_valid 200 302 1h;   #指定200、302应答代码的缓存1小时
    fastcgi_cache_valid 301 1d;     #将301应答代码缓存1天
    fastcgi_cache_valid any 1m;     #将其他应答均缓存1分钟
{

php-fpm.conf配置参数:

1
2
3
4
5
pm =dynamic        #两种控制子进程方式(static和dynamic)
pm.max_children= 5     #同一时间存活的最大子进程数
pm.start_servers= 2    #启动时创建的进程数
pm.min_spare_servers= 1  #最小php-fpm进程数
pm.max_spare_servers= 3  #最大php-fpm进程数

4).proxy_cache本地缓存模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
http {
        ……
   proxy_temp_path  /usr/local/nginx/proxy_cache/temp;    #缓存临时目录
   proxy_cache_path /usr/local/nginx/proxy_cache/cache levels=1:2 keys_zone=one:10m inactive=1d max_size=1g;
   #缓存文件实际目录,levels定义层级目录,1:2说明1是一级目录,2是二级目录,keys_zone存储元数据,并分配10M内存空间。inctive表示1天没有被访问的缓存就删除,默认10分钟。max_size是最大分配磁盘空间
   server {
      listen 80;
      server_name 192.168.1.10;
      location / {
        proxy_cache one;   #调用缓存区
        #proxy_cache_valid 200 304 12h; #可根据HTTP状态码设置不同的缓存时间
        proxy_cache_valid any  10m;    #缓存有效期为10分钟
      }
      #清除URL缓存,允许来自哪个网段的IP可以清除缓存(需要安装第三方模块"ngx_cache_purge"),清除URL缓存方法:访问http://192.168.1.10/purge/文件名
      location ~ /purge(/.*){
        allow 127.0.0.1;
        allow 192.168.1.0/24;
        deny all;
        proxy_cache_purge cache_one$host$1$is_args$args;
      }
 }

小结:

  启用压缩模块可以节省一部分带宽,会增加WEB端CPU处理,但在上图网站架构中,WEB端启用压缩模块并没有起到作用,因为传输到上层走的是局域网。对于直接面向用户的架构还是要启用的。WEB也不用启用expires模块,因为有了反向代理服务器和CDN,所以到不了用户浏览器,开启起不到作用。

  如果反向代理使用nginx做代理,可开启expires模块,将静态文件缓存到用户浏览器,浏览器发起请求时,先判断本地缓存是否有请求的数据,如果有再判断是否过期,如果不过期就直接浏览缓存数据,哪怕服务器资源已经改变,所以要根据业务情况合理设置过期时间。
5. 利用PHP缓存器提高代码执行效率

 php程序在没有使用缓存器情况下,每次请求php页面,php都会对此页面进行代码编译,这就意味着重复的编译工作会增加服务器负载。有了缓存器就会把每次编译后的数据缓存到共享内存中,下次访问直接使用缓冲区已编译好的代码,从而避免重复的编译过程,以加快其执行效率。因此PHP网站使用缓存器是完全有必要的!主流的PHP缓存器有:eAccelerator、XCache

第五层:动静分离

  动静分离,顾名思义,是将动态页面和静态页面分离到不同服务器上处理,比如使用web是nginx,可以让fastcgi部署到单独一台服务器,专门解析php动态页面,静态页面默认由nginx处理,并做好缓存策略。再比如一个商城网站,会有大量的图片,可以考虑增加文件服务器组,将请求图片和上传图片的都交给文件服务器处理。文件服务器主流使用NFS,存在单点故障,可以DRBD+HeartBeat+NFS部署高可用,如果单台压力过大,考虑使用分布式文件系统,如GlusterFS、MooseFS等。

DRBD+HeartBeat+NFS博文:http://lizhenliang.blog.51cto.com/7876557/1362539

第六层:数据库缓存

  利用缓存技术,把热数据缓存到内存中,如果请求的数据在缓存中,就直接返回,否则去数据库中取,并更新把拿的数据更新到缓存系统,提高读性能,降低数据库压力。缓存实现有本地缓存和分布式缓存,本地缓存是将数据缓存到本地服务器内存中或者文件中。分布式缓存是将数据缓存到内存中,是分布式的,可以缓存海量数据,扩展性好。主流的分布式缓存系统有Memcached和Redis,Memcached性能稳定,速度很快,QPS可达8w左右。如果想数据持久化就选择用Redis,性能不低于Memcached。

第七层:数据库

  这层在整个网站架构中起着主导型作用,直接决定用户体验,相对架构优化也比较复杂。



本文转自 李振良OK 51CTO博客,原文链接:http://blog.51cto.com/lizhenliang/1664428,如需转载请自行联系原作者

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

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

相关文章

网站流量日志数据自定义采集

分布式集群爬虫小架构 离线hadoop分析数据整体流转图 网站流量日志数据自定义采集 网站流量日志数据自定义采集 1、系统的意义 网站流量数据统计分析&#xff0c;可以帮助网站管理员、运营人员、推广人员等获取网站流量信息&#xff0c;并从流量来源、网站内容、网站访客特性等…

中断数周之后 微软网站恢复销售华为笔记本电脑

【TechWeb】6月18日消息&#xff0c;据美国财经网站CNBC报道&#xff0c;当地时间周一&#xff0c;微软表示&#xff0c;在中断数周之后&#xff0c;已恢复在其网站上销售华为笔记本电脑。 现在&#xff0c;包括MateBook 13、MateBook和MateBook X Pro在内的华为笔记本电脑都再…

IIs 网站应用程序与虚拟目录的区别及高级应用说明(文件分布式存储方案)

对于IIS网站&#xff0c;大伙用的比较多&#xff0c;就不啰嗦了。今天和说说大伙比较少使用的"IIS应用程序”和虚拟目录的区别及高级应用场景&#xff0c;文件分布式存储方案。 1&#xff1a;IIS网站&#xff1a;一个网站&#xff0c;基本就是一个站点&#xff0c;绑定N个…

Python小白我用了38行代码把一个网站的pdf资料都下了下来

在网上找书&#xff0c;无意间发现了一个网站&#xff0c;上面有很多电子书。试着打开了几本&#xff0c;感觉很不错&#xff0c;就下了下来。可惜我的人性太贪婪了&#xff0c;想把他们都下下来&#xff0c;哪怕放到磁盘上生灰。至少可以满足对知识的焦虑感。 怎么办&#xff…

opensearch_将OpenSearch添加到您的网站并进入浏览器的搜索框

opensearchI was over at http://search.twitter.com earlier today and I noticed the Search Box in Firefox had a blue lit-up dealie: 我今天早些时候在http://search.twitter.com结束了&#xff0c;我注意到Firefox中的搜索框有一个蓝色的亮点。 Hm...OK. Whats that? I…

手把手教你搭建一个属于自己的网站

​ 其实去年就写过一篇&#xff0c;当时写的很简短&#xff0c;算是基础的基础&#xff0c;今天就再来一起分享下网站建设方面的知识。看过之前我写的那篇的可以直接从基础篇备案看起。 ps&#xff1a;以下内容为了便于理解&#xff0c;部分是本人自己理解总结&#xff0c;非官…

日常浏览网站整理

2019独角兽企业重金招聘Python工程师标准>>> 工具网站 imgbase64 bejson 开源网站 spring4All美团技术团队博客阿里云栖社区bittiger聚客网我全科牛人博客地址 你假笨JVM博客地址 徐靖峰博客地址 芋道源码 纯洁的微笑 王亚普 程序员DD 阿里-李鼎 阿里-梁飞 …

写论文的时候会经常使用到的技巧、网站、工具整理【转载】

学习需要&#xff0c;非商业转载&#xff0c;如有侵权请及时联系&#xff0c;立删&#xff0c;十分抱歉 工具汇总一&#xff1a; 知乎地址&#xff1a;https://zhuanlan.zhihu.com/p/25595196 &#xff08;16.02.27 更新&#xff09;以下内容包括&#xff1a;选择正确的英文词语…

大型分布式网站架构技术总结

网址&#xff1a;http://www.cnblogs.com/itfly8/p/4967966.html本文是学习大型分布式网站架构的技术总结。对架构一个高性能&#xff0c;高可用&#xff0c;可伸缩&#xff0c;可扩展的分布式网站进行了概要性描述&#xff0c;并给出一个架构参考。一部分为读书笔记&#xff0…

迁移TFS2008后,项目门户网站及Team Explorer的报表均无法正常显示的原因

一、wss 1.检查wss网站集管理员&#xff0c;并且进入该网站查看网站权限。 二、reporting serivce 现象&#xff1a; 通过TeamSystemWebAccess插件进行web访问查询报表时&#xff0c;提示&#xff1a; 处理报表时出错。 (rsProcessingAborted) 无法模拟数据源“TfsOlapReportDS…

asp.net网站怎么启动_新的ASP.NET网站启动

asp.net网站怎么启动A few weeks ago we introduced a beta of a freshly designed http://asp.net website. Today we launched it. Jon, myself, and the team that manages the site took lots of your feedback (lots from the comments of the Beta Blog Post) and did ou…

服务协议隐私政策_隐私链-随着第三方服务的堆积,您网站的隐私政策

服务协议隐私政策There are so many really innovative products online right now. A good friend was showing me amazing product called Intercom that lets you see who of your users are online, their social profiles, even direct message/chat them live on your si…

前端代码在线调试分享网站

1、RunJs 2、CodePen 3、JsFiddle

带命令行的嵌入式系统_带有嵌入式命令行的网站:您的命令行进入了我的Internet

带命令行的嵌入式系统Eight years ago I wrote a post called Opportunity: Windows is completely missing the TextMode boat. The language is dated... 八年前&#xff0c;我写了一篇名为《机会&#xff1a;Windows完全没有TextMode的小船》的文章。 语言过时了... I assum…

henny penny视频_Penny Pinching视频:在数据中心之间移动Azure网站

henny penny视频I talked about Pinching pennies when scaling in The Cloud last week when I added jQuery lazy loading to my podcasts Website. I wanted to avoid paying any unnecessary bandwidth costs. The result was great and Ill be under my bandwidth this mo…

梁斌penny_Penny Pinching在云中:在Windows Azure网站上启用新的文物性能监控

梁斌pennyIve been looking for ways to save money running my (now 12) websites in the cloud lately. Getting insights from logs has been helpful, but I really want more details as to what my app is doing so that I might do less of it. Remember the secret of …

javascript扩展_丰富的新JavaScript代码编辑器,扩展到多个Microsoft网站

javascript扩展I noticed yesterday that some C#, JavaScript and CSS files I had sitting in SkyDrive were suddenly editable. 昨天我注意到&#xff0c;我坐在SkyDrive中的一些C&#xff03;&#xff0c;JavaScript和CSS文件突然可以编辑。 Not just editable, but ther…

前端资源(框架,库,网站)

前端有很多优美的框架和库&#xff0c;以及一些资源很多的网站和博客&#xff0c;今天我准备和大家分享分享 框架 库 插件 工具 网站 &#xff08;由于Vue和React的UI库比较多&#xff0c;我将在下一篇文章中展示&#xff09; 框架 Vue: Vue (读音 /vjuː/&#xff0c;类似于 v…

mac azure git_从一个Git存储库将两个网站部署到Windows Azure

mac azure gitDeploying to Windows Azure is very easy from Git. I use the Azure Cross-Platform Command Line (open source on github, written in node) that I get from npm via "npm install azure-cli --g" to make the sites. 从Git部署到Windows Azure非常…

Penny Pinching在云中:Azure网站何时有意义?

I had a great conversation on Twitter with Frans Bouma about pricing where he asked a number of questions that werent easily answered in 140 characters. The pricing for these things isnt clear or easy. Its not clear or easy because its complicated. 我在推…