>  기사  >  웹 프론트엔드  >  중소규모 웹사이트 구조 분석 및 최적화

중소규모 웹사이트 구조 분석 및 최적화

伊谢尔伦
伊谢尔伦원래의
2016-12-03 11:57:121495검색

웹사이트 아키텍처 다이어그램 먼저 살펴보기:

중소규모 웹사이트 구조 분석 및 최적화

위 웹사이트 아키텍처는 중대형 웹사이트에서 널리 사용됩니다. 이 기사에서는 각 웹사이트에서 사용되는 주류 기술과 솔루션을 분석합니다. 웹 사이트 운영 및 유지 관리를 처음 접하는 사람들을 위해 웹 사이트 아키텍처를 더 깊이 이해하고 일련의 아키텍처 개념을 스스로 형성할 수 있습니다.

첫 번째 레이어: CDN

국내 네트워크 분포는 주로 남쪽의 차이나 텔레콤, 북쪽의 차이나 유니콤으로 특정 지역 간 접속 지연이 큰 문제를 일으키고 있습니다. 방문수에 따라 CDN(콘텐츠 배포 네트워크) 레이어를 추가하면 이러한 현상을 효과적으로 개선할 수 있으며 웹 사이트 가속화를 위한 최선의 선택이기도 합니다. CDN은 웹사이트 페이지를 전국에 분산된 노드에 캐시하고, 사용자가 접속하면 가장 가까운 전산실에서 데이터를 얻어 네트워크 접속 경로를 대폭 줄여준다. CDN을 직접 구축하고 싶다면 권장하지 않습니다. 이유는 무엇입니까? 사실, 직설적으로 말하면, 운영 및 유지 관리에 어떤 것도 방해하지 마십시오. CDN 아키텍처 구축은 복잡하지 않지만 효과에 영향을 미치는 요소가 많습니다. 사후 관리 및 유지 관리도 복잡합니다. 결국에는 원하는 결과를 얻기가 쉽지 않습니다. 당신은 능력이 없다는 것입니다. CDN 전문업체를 찾는 것이 좋습니다. 비용도 비싸지 않고, 트래픽 공격에 대한 저항력도 있고, 효과도 매우 좋으며, 운영 및 유지관리가 훨씬 덜 번거롭습니다.

두 번째 레이어: 역방향 프록시(웹페이지 캐시)

CDN이 요청할 데이터를 캐시하지 않는 경우 이 레이어에 요청하고 캐시 기능(로컬) )가 프록시 서버에 구성되어 있습니다. 프록시 서버는 로컬 캐시를 검색하여 CDN에서 요청한 데이터가 있는지 확인하고, 없으면 CDN으로 직접 반환합니다. 이를 웹 서버로 보내 데이터를 프록시 서버로 반환한 다음 프록시 서버는 결과를 CDN으로 보냅니다. 프록시 서버는 일반적으로 이미지, js, CSS, html 등과 같이 자주 변경되지 않는 정적 페이지를 캐시합니다. 주류 캐싱 소프트웨어에는 Squid, Varnish 및 Nginx가 포함됩니다.

세 번째 레이어: 로드 밸런싱

방문 횟수가 많은 웹사이트에서는 로드 밸런싱을 사용하게 됩니다. 단일 서버의 성능 병목 현상을 해결하는 가장 좋은 방법이기 때문입니다. 역방향 프록시는 요청을 로드 밸런서에 전달하고, 로드 밸런서는 알고리즘 기반 처리(회전 훈련, 로드 선택 등)를 위해 이를 백엔드 웹 서비스에 전달합니다. 웹 서비스 처리가 완료된 후. 데이터는 역방향 프록시 서버로 직접 반환됩니다. 로드 밸런싱은 요청을 여러 백엔드 웹 서버에 합리적으로 분산시켜 단일 서버의 동시 로드를 줄이고 서비스 가용성을 보장합니다. 주류 로드 밸런싱 소프트웨어에는 LVS, HAProxy 및 Nginx가 포함됩니다.

네 번째 계층: WEB 서비스

WEB 서비스는 사용자 요청을 처리합니다. WEB 서비스 처리 효율성은 액세스 속도를 저하시키는 요인에 직접적인 영향을 미칩니다. 훌륭하게 조정되었습니다. 웹 서비스를 최대한 활용해 보세요. 일반적인 웹 서비스에는 Apache와 Nginx가 포함됩니다.

Apache 최적화:

1).mod_deflate 압축 모듈

로드 여부 확인:

# apachectl –M |grep deflate

설치되어 있지 않은 경우 apxs를 사용하여 컴파일합니다. 그것:

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

deflate 구성 매개변수:

<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 캐시 모듈

여부를 확인하세요. 로드되었습니다:

# apachectl –M |grep expires

설치되지 않은 경우 apxs를 사용하여 컴파일합니다.

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

httpd.conf에서 모듈을 활성화합니다. : LoadModuleexpires_modulemodules/mod_expires.so

캐시 메커니즘에는 세 가지 용도가 있습니다: 전역, 디렉터리 및 가상 호스트

전역 구성, 구성 파일 끝에 추가:

<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参数指定工作模式。根据自己业务需求选择不同工作模式,再适当增加工作模式相关参数,可提高处理能力。

  配置参数说明:

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

       Nginx优化:

  1).gzip压缩模块

 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缓存模块

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进行适当的参数优化。

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配置参数:

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本地缓存模块

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等。

 第六层:数据库缓存

캐싱 기술을 활용하여 핫 데이터를 메모리에 캐시합니다. 요청한 데이터가 캐시에 있으면 직접 반환됩니다. 그렇지 않으면 읽기 성능을 향상하고 캐시 시스템으로 업데이트합니다. 데이터베이스 비용. 캐싱 구현에는 로컬 캐싱과 분산 캐싱이 포함됩니다. 로컬 캐싱은 데이터를 로컬 서버 메모리 또는 파일에 캐시합니다. 분산 캐시는 데이터를 메모리에 캐시하고, 분산하여 대용량 데이터를 캐시할 수 있으며, 확장성이 좋습니다. 주류 분산 캐시 시스템에는 Memcached와 Redis가 포함됩니다. Memcached는 약 8w의 QPS로 안정적인 성능과 빠른 속도를 제공합니다. 데이터 지속성을 원한다면 Memcached보다 성능이 낮지 않은 Redis를 선택하세요.

일곱 번째 계층: 데이터베이스

이 계층은 전체 웹사이트 아키텍처에서 주도적인 역할을 하며 사용자 경험을 직접 결정합니다. 상대적인 아키텍처 최적화도 더욱 복잡합니다.


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.