• 单机web与架构设计


    转自http://blogs.studylinux.net/?p=3248

    一:在很久很久很久。。。以前,那时候有一台电脑是件很奢侈的事情,尽管现在开起来配置很低,内存128M,打开一个纯文本文档要几分钟,下载一个图片可能要俩小时,网络还是拨号的56k,但这已经是很遥远的事情了,现在的PC在家庭、公司及个人非常普及,还有移动端(手机、ipad等)可以随时随地访问互联网(有上网设备、已经连接网络的前提下),现在的中国网民接近十亿,如此大的访问量给服务提供商带来了很大很大很大。。。的压力,无论是从内容、性能、安全或稳定等任意方面考虑,都是比较复杂的事情,下面就看一下服务端的架构设计演变过程:

    1.1:单机模式下遇到的问题: 

    apache和php 通信:模块

    nginx和php 通信:fast-cgi或者socket,socket的速度比fast-cgi快,但是没有前者稳定,127.0.0.1是回环端口,nginx在本地要使用127.0.0.1,如果其本机的其他地址需要建立tcp连接,127.0.0.1是本机直接转发。

    1.2:cgi和fast-cgi的区别:

    CGI:
    cgi在2000年或更早的时候用得比较多, 以前web服务器一般只处理静态的请求,如果碰到一个动态请求怎么办呢?web服务器会根据这次请求的内容,然后会fork一个新进程来运行外部c程序(或perl脚本…), 这个进程会把处理完的数据返回给web服务器,最后web服务器把内容发送给用户,刚才fork的进程也随之退出。 如果下次用户还请求改动态脚本,那么web服务器又再次fork一个新进程,周而复始的进行。

    Fast-CGI:
    web服务器可以内置perl解释器或php解释器。 也就是说这些解释器做成模块的方式,web服务器会在启动的时候就启动这些解释器。 当有新的动态请求进来时,web服务器就是自己解析这些perl或php脚本,省得重新fork一个进程,效率提高了,fastcgi的方式是,web服务器收到一个请求时,他不会重新fork一个进程(因为这个进程在web服务器启动时就开启了,而且不会退出),web服务器直接把内容传递给这个进程(进程间通信,但fastcgi使用了别的方式,tcp方式通信),这个进程收到请求后进行处理,把结果返回给web服务器,最后自己接着等待下一个请求的到来,而不是退出,因此CGI就是所谓的短生存期应用程序,FastCGI就是所谓的长生存期应用程序,由于FastCGI程序并不需要不断的产生新进程,可以大大降低服务器的压力。并且产生较高的应用效率,自今,较为流行的Java语言Servlet技术在设计上是以参考FastCGI的技术运行所设计。

    mysql和php默认是短连接,开启长连接使用,在php页面需要连接数据库的地方添加如下内容:

    #默认为短连接连接数据库
    new PDO(“mysql:host=localhost;dbname=db_demo”,”root”,””);   
    #若要使用数据库长连接,需要在最后加如下参数: 
    new PDO(“mysql:host=localhost;dbname=db_demo”,”root”,””,”array(PDO::ATTR_PERSISTENT => true) “); 

    1.3:单机服务使用apache+php的网站部署模式,下图中的数据库每日备份到本地保存

    1.4:单机模式Nginx+Php的网站部署模式:

    #实现动静分离,对静态文件进行压缩,可以将IE 1-6 不开启压缩,因为其对压缩的支持不是很好,另外需要按需求将图片、jss、json等数据分别开启压缩,另外可以在每个tomcat 上装一个nginx 对tomcat实现动静分离,这样就减轻了负载层实现动静分离的压力,另外可以只在nginx开启日志而tomcat 不再记录日志,因为nginx的日志记录性能比tomcat性能要好一些,而且负载也可以不记录日志。

    php-fpm:是一个PHP FastCGI的管理器,在php 5.3.3版本之前的php 需要单独安装一个补丁包才能实现,PHP-FPM提供了更好的PHP 进程管理方式,可以有效控制内存和进程、并且可以平滑重载PHP配置,编译安装PHP的时候需要使用–enable-fpm参数开启。

    CGI:CGI工作原理:每当客户请求CGI的时候,WEB服务器就请求操作系统生成一个新的CGI解释器进程来处理用户的请求,新的CGI解释器要重新读取并加载php.ini配置文件并进行环境初始化,当CGI满足要求后,WEB服务器就杀死这个进程,然后在等新的请求进来重复上一个步骤的操作,所以,CGI解释器的反复加载是CGI性能低下的主要原因。

    Fast-CGI:CGI的全称是公共网关接口,是多进程的工作方式,是HTTP服务器与机器上的其他进程交谈的一种口,CGI可以使用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量,fastcgi是一个常住型的CGI,对php.ini文件的读取加载只需要在启动进程的时候加载一次即可,FastCGI技术目前支持语言有 PHP、C/C++、Java、Perl、Tcl、Python、SmallTalk、Ruby、Aardio等。相关模块在Apache,IIS, Lighttpd,Nginx等流行的服务器上也是可用的,Nginx 0.8.46+PHP 5.2.14(FastCGI)服务器在3万并发连接下,开启的10个Nginx进程消耗150M内存(15M*10=150M),开启的64个php-cgi进程消耗1280M内存(20M*64=1280M),加上系统自身消耗的内存,总共消耗不到2GB内存。如果服务器内存较小,完全可以只开启25个php-cgi进程,这样php-cgi消耗的总内存数才500M。

    1.5:实现MySQL读写分离:

    在从MySQL服务器一定要设置set global read_only=on/off,避免从库可以写数据而导致引起的主从不同步,mysql主从同步本身无法直接限速,但是可以通过防火墙对IP进行限速,MySQL binlog保留三到五天,每天对数据库进行全库的备份,因此MySQL binlog日志就不需要备份了。

    1.6:实现组件分离:

    1.6.1:将图片、视频等业务进行分离,从顶级域名进行分离,是为了防止cookie的提交,因为图片和视频是不需要cookie的,而cookie是针对顶级域名的作用域生效的,即使是访问图片浏览器也会提交cookie从而增加带宽占用,因此要根据域名做顶级资源的分离,另外浏览器多进程并发访问服务器资源,多进程访问可以大幅提升服务器资源响应速度从而提升用户体验,浏览器访问效果如下:

    1.6.2:浏览器访问web流程:

    1.先进行DNS 域名解析,2.下载web页面的html页面,3:逐行读取html文件并下载资源文件,浏览器访问web页面是流式的,即边下载边渲染显示,4:遇到有下载的请求会单独开一个进程下载,之前的进程仍然读取原html文件,5:遇到下载js文件浏览器会阻塞,等待js文件下载完成解析成功之后再向后读取html文件,6:css文件要访问html的头部,因为css是进行页面布局的

    1.6.3:优化方式:

    1.静态资源和动态资源分离,并使用各自独立的顶级域名,这样可以防止不必要的cookie提交  2.使用多个不同的静态资源域名,加快浏览器的并发下载 3.把css写在html文件的前面并把js文件写在js文件的后端 4.开启gzip压缩

    1.6.4:DNS预获取:

    是html 5支持的新功能,前端优化的一部分,一般来说,在前端优化中与 DNS 有关的有两点: 一个是减少DNS的请求次数,另一个就是进行DNS预获取,DNS 作为互联网的基础协议,其解析的速度似乎很容易被网站优化人员忽视。现在大多数新浏览器已经针对DNS解析进行了优化,典型的一次DNS解析需要耗费 20-120 毫秒,减少DNS解析时间和次数是个很好的优化方式。DNS Prefetching 是让具有此属性的域名不需要用户点击链接就在后台解析,而域名解析和内容载入是串行的网络操作,所以这个方式能 减少用户的等待时间,提升用户体验 。

    1.6.5:组件分离的架构:

    1.6.6:通过HTTP重定向解决搭建简单集群:

    1.6.7:通过DNS 轮训实现域名负载:

    1.6.8:Nginx 反向代理:

    1.6.9:Nginx 反向代理+keepalived:

    1.6.10:实现session共享:

    1.6.11:使用haproxy做负载均衡:

    1.6.12:使用LVS 做负载:

    1.6.13:实现CDN加速,CDN每个月几百兆的带宽每兆在二十几左右,几个G的带宽每个月在每月每兆二十左右:

    某公司文档:http://www.tuicool.com/articles/Vvq6naF

    1.6.14:实现分布式缓存:

    1.6.15:四层负载+七层代理:

    1.6.16:实现SOA:

    相关文档:http://dubbo.io/Training-zh.htm,http://dubbo.io/

  • 相关阅读:
    能力修炼:底层、体系化与开放性闭环能力
    实现可扩展代码的四步曲
    碎碎念五六
    代码可扩展示例:元素构建
    碎碎念五七
    如何做编程知识投资及减少知识失效的影响
    如何写一份好的吸引人的简历
    构造与使用分离:命中内容高亮及合并的展示问题解决实现
    自助对公回单机的部分问题解决方法
    lodop一种导致自定义纸张无效现象的错误写法
  • 原文地址:https://www.cnblogs.com/zcyy/p/15598256.html
Copyright © 2020-2023  润新知