转自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: