如何保证服务高可用、高性能 是今天PHP全球开发者大全的主题,目前在业界已经有成熟的解决方案。在服务日常稳定,无太大波动时,很难考验服务的高可用,只有经历过爆发式的流量,暴露出问题才发现自己的“高可用”其实并不是那么回事。用户才是检验服务高可用的唯一依据。
在这里我将会从以下几个方面分析:
Nginx 与 Apache
Apache
Apache 处理请求的模式有三种:prefork 模式(线程创建进程)、worker模式(进程创建线程)、事件驱动模式(与worker模式相似,但会为连接创建专用线程,活动请求使用另外创建的线程)。Apache 在处理每一个请求都会由一个线程或者一个进程处理,,所以 Apache 在处理请求时,开销很大。当它在高并发场景下时,其性能底下的问题便会突显出来。
Nginx
Nginx 提供异步、事件驱动、非阻塞请求处理,由于请求异步处理,Nginx 不必等待每个请求完成,避免锁住资源。Nginx 没有内置任何解释型语言,这也许是好事,因为如此一来Nginx便可以专注处理请求的接受与相应,而具体解析脚本语言的进程则在 Nginx 之外,通常我们认为 Nginx 要快于 Apache ,但是在一些场景下,例如静态资源下,Apache 也有自己的优势。
因此,在构建高性能服务器时,APache 并不是问题所在,PHP 才是真正的瓶颈。
PHP-FPM 配置
|
|
配置:官方解释
如何最优化呢?
就需要和自己的服务状况、机器配置性能等紧密结合
HTTP 服务器性能优化
HTTP Server 优化
缓存静态文件
通常将静态资源(img、css、js、font)变更不频繁 添加特殊的响应头
Apahce 在 .htaccess 文件中添加
123 <FilesMatch "\.(ico|jpg|jpeg|png|gif|css|js|woff)$">Header set Cache-Control "max-age=604800"</FilesMatch>Nginx 在主机的host配置 conf
1234 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css|js|woff)${expires 7d;}
这里 大家可能会有疑问?要是我这7天内修改了静态文件怎么办呢?
好了,这个问题就需要引入版本号,在静态文件之后 也增加一个参数 作为区分
HTTP 持久链接
HTTP keep-alive 模式的优点
CPU 和内存的负载会减轻,因为同一时刻打开的 TCP 链接数变少了,后续请求和响应无需打开新链接,可以继续基于这个 TCP 链接发送上下行数据。
当 TCP 链接建立后,请求的等待时间将会减少,TCP 建立链接时的三次握手发生在用户与Server之间,当🤝成功,一条TCP链接就被建立起来了,同一个域的请求可以并行下载资源(chrome 最大为6)、
网络阻塞情况减轻,因为同一时刻是会有少数的链接保持着。
Apache 开启 Keep-alive 方式有两种,分别是通过修改 .htaccess 文件或 Apache 配置文件
Nginx 的 Keep-alive 是由 http_core 模块支持的,默认情况下是开启的。
除了,缓存静态资源、开启长链接。我们还可以开启 GZIP 压缩功能
PHP独立部署服务
Apache 是以 mod_php 模块的方式加载 PHP 的。这样,PHP 与 Apache 耦合很紧,所有的请求都会由 Apache 模块处理,非常消耗机器的硬件资源,我们可以让 PHP-FPM 与 Apache 结合,独立部署,通过 FastCGI 协议及相互传递数据。这样子 Apache 只需要关注 HTTP 请求链接即可,PHP 进程则有 PHP-FPM创建和维护。
Nginx 则有些不同,Nginx 不提供内建 PHP 模块的方法,所以 Nginx 与 PHP 本身就是相互独立的。
最后就是关闭没有服务、没用的模块。
内容分发网络 (CDN)
CDN网络特征如下
内容是静态的,不频繁更爱,因为 CDN 会将它们缓存在内存中。
CDN 服务器位于不同的位置。当浏览器请求到达 CDN 时,CDN从请求位置可用的最近位置发送请求内容。
每个浏览器都具有向域发送同时请求的限制
自己在项目中使用 CDN,是这样子的 “卧槽,快了好多”;使用完后 “5555,还能不能更快点啊”
免费的CDN资源库
JavaScript/CSS/Img 优化
静态资源围绕 合并 压缩
合并 可以减少资源请求数量
压缩 可以减少资源下载的时间
常用的资源压缩在线资源
当然,最优的方案就是使用前端构建工具(grunt、webpack) 打包
全页缓存技术
使用这个条件是 网页不经常做变更,一般可以用在企业产品官方等。
大多数的平台通过内置支持货通过插件和幂快实现全页缓存。在这种情况下,插件或模块为每个请求处理页面的动态区域。
Varnish
Varnish-Web应用程序加速器
负载均衡
HAProxy