用gzip压缩Web文件,为网页提速

通过gzip压缩文件,用以提高web站点的性能,提高网页访问速度。如何开始对网站内容进行gzip,如果根据不同的主机环境来对这个做相应设置准备,环境假设为LAMP
选择1: 对Apache 1.x进行mod_gzip操作
如果你使用Apache 1.2 和1.3,那么mod_gzip 模块是可用的。为了检查Apache的版本,你可以检查Firebug’中Net面板,查找对于任何请求,服务器响应的头部。如果你不能看到它,那么检查提供商的文档或者创建一个简单的PHP脚本来回显这些信息到浏览器中去,如:
<?php echo apache_get_version(); ?>
在服务器头部信息中,你或许能看到mod_gzip版本,如果它被安装了的话。它或许是这个样子的:
Server: Apache/1.3.37 (Unix) mod_gzip/1.3.26.1a…..
好了,在我们将信息发送给浏览器之前,我们已经建立了我想要压缩的所有内容,PHP脚本输出,静态HTML页面,JavaScripts和样式表。那么现在就可以通过mod_gzip来实现,在你站点的根目录下创建一个.htaccess文件,包括:
mod_gzip_on Yes
mod_gzip_item_include mime ^application/x-javascript$
mod_gzip_item_include mime ^application/json$
mod_gzip_item_include mime ^text/.*$
mod_gzip_item_include file \.html$
mod_gzip_item_include file \.php$
mod_gzip_item_include file \.js$
mod_gzip_item_include file \.css$
mod_gzip_item_include file \.txt$
mod_gzip_item_include file \.xml$
mod_gzip_item_include file \.json$
Header append Vary Accept-Encoding
第一行是的mod_gzip命令可用。下面的三行设置压缩是基于MIME类型上的。下面的部分是一样,只是以文件扩展为基础。最后的一行是设置Vary头部的,包括Accept-Encoding值。
如果你想发送Vary: *头部,使用:
Header set Vary *
需要注意的是,一些主机提供商不允许你使用Header 定向。如果存在这种情况,希望你可以用下面这句话来代替最后一行“
mod_gzip_send_vary On
这也将要设置Vary头部为Accept-Encoding.
需要注意的是,这里或许有很小的文件存在,如果你的文件太小(举个例子,小于1KB),那么它们就需要gzip,即时你已经将所有的东西都设置正确了。如果你gzip的话,你的主机不得不为每个小的文件进行不必要的gzip开销。
选择2:Apache 2.0版本使用mod_deflate
如果你的主机运行的是Apache 2版本,那么你可以使用mod_deflate。尽管的它的名字没有带有gzip的信息,但是它也是使用gzip进行压缩。为了设置mod_deflate,需要在.htaccess文件中添加下面的信息:
AddOutputFilterByType DEFLATE text/html text/css text/plain text/xml application/x-javascript application/json
Header append Vary Accept-Encoding
选择3:使用php.ini文件
理想情况下,我们希望Apache能gzip内容,但是不幸的是,一些主机提供商或许不允许你这么做。如果你的主机提供商这这样的话,你就可以使用php.ini文件。若干你将一个php.ini文件放到一个目录下,那么它就会重写这个目录和它子目录下的PHP设置。
如果你不能使用Apache的mod_gzip 或mod_deflate模块,你仍旧能够使用PHP来压缩你的内容,达到预期的解决方案,你需要设置你的web服务器,因此所有的静态HTML、JavaScript [...]


典型web服务器Header设置内容过期方法

一、Internet信息服务 (IIS)的内容过期设置
如果IIS 网站中有时间敏感信息,可以配置设置来保证过期信息不被代理服务器或 Web 浏览器缓存。可以配置网站内容,使之在任何的时间自动过期。当启用内容过期时,Web 浏览器将比较当前日期和截止日期,以便决定是显示缓存页还是从服务器请求更新的页。Microsoft ASP.NET 这样的服务器端技术可用于动态更改提供的内容。通常,时间敏感信息只限于单个文件、目录或网站;不过,您也可以为某台计算机上的所有网站设置内容过期。
必须是本地计算机上 Administrators 组的成员或者必须被委派了相应的权限,才能执行下列步骤。作为安全性的最佳操作,请使用不属于 Administrators 组的帐户登录计算机,然后使用运行方式命令以管理员身份运行 IIS管理器
在命令提示符下,键入 runas /user:administrative_accountname “mmc %systemroot%\system32\inetsrv\iis.msc”。
设置网站内容的过期时间
1. 在 IIS 管理器中,展开本地计算机;右键单击要设置内容过期的网站、虚拟目录或文件,然后单击“属性”。
2. 单击“HTTP 头”选项卡。
3. 选中“启用内容过期”复选框。
4. 单击“立即过期”、“此时间段后过期”或“过期时间”,然后在对应的框中输入所需的过期信息。
5. 单击“确定”。
二、APACHE服务的内容过期设置
Apache配置摘录及解释
i. 过期相关设置
LoadModule headers_module modules/mod_headers.so
#Load 修改header的模块。
LoadModule expires_module modules/mod_expires.so
#Load 设定过期header的模块。
Header append Via: CCN-BJ-4-502
#增加一个Via header,值配置成设备的hostname。
KeepAliveTimeout 60
#设置连接的保持时间为60秒。
ExpiresActive On
#启用过期header功能。
ExpiresDefault A604800
#缺省过期时间为“访问后的604800秒”
<Directory /data/download>
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
ExpiresByType text/html A300
#text/html类型文件的过期设置为“访问后的300秒”
ExpiresByType text/css A259200
#text/css类型文件的过期设置为“访问后的259200秒”
ExpiresByType application/x-javascript A300
# application/x-javascript类型文件的过期设置为“访问后的300秒”
ExpiresByType image/gif A2592000
#image/gif类型文件的过期设置为“访问后的2592000秒”
ExpiresByType application/x-shockwave-flash [...]


CDN服务器网页缓存分析之Last-Modified和ETag

Last-Modified和ETag是条件请求(Conditional Request)相关的两个字段。如果一个缓存收到了针对一个页面的请求,它发送一个验证请求询问服务器页面是否已经更改,在HTTP头里面带上” ETag”和”If Modify Since”头。服务器根据这些信息判断是否有更新信息,如果没有,就返回HTTP 304(NotModify);如果有更新,返回HTTP 200和更新的页面内容,并且携带新的”ETag”和”LastModified”。
使用这个机制,能够避免重复发送文件给浏览器,不过仍然会产生一个HTTP请求。
一般纯静态页面本身都会有Last-Modified信息,Apache服务器会读取页面文件中的Last-Modified信息,并添加到http响应头部。
对于动态页面,如果在页面内部没有通过函数强制加上Last-Modified,例如header(”Last-Modified: ” . gmdate(”D, d M Y H:i:s”) . ” GMT”),Apache服务器会把当前时间作为Last-Modified,返回给浏览器。
无论是纯静态页面还是动态页面,Firefox浏览器巧妙地按照接受到服务器响应的时间设置缓存页面的Last-Modified,而不是按照http响应头部中的Last-Modified字段。
ETag
既然有了Last-Modified,为什么还要用ETag字段呢?因为如果在一秒钟之内对一个文件进行两次更改,Last-Modified就会不正确。因此,HTTP/1.1利用Entity Tag头提供了更加严格的验证。
Apache服务器默认情况下,会对所有的静态、动态文件的响应头添加ETag字段。在Apache的httpd.conf文件中可以通过FileETag指令配置该选项。
FileETag指令配置了当文档是基于一个文件时用以创建 Etag(entity tag)响应头的文件的属性。在Apache 1.3.22及以前,ETag的值是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的。如果一个目录的 配置包含了‘FileETag INode MTime Size’而其一个子目录包含了‘FileETag -INode’那么这个子目录的设置(并会被其下任何没有进行覆盖的子目录继承)将等价于‘FileETag MTime Size’。
在多台负载平衡的服务器环境下,同一个文件会有不同的etag或者文件修改日期,浏览器每次都会重新下载。设置‘FileETag None’可以使响应头不再包含ETag字段。


CDN服务器网页缓存分析之Cache-Control

Cache-Control字段中可以声明多些元素,例如no-cache, must-revalidate, max-age=0等。这些元素用来指明页面被缓存最大时限,如何被缓存的,如何被转换到另一个不同的媒介,以及如何被存放在持久媒介中的。但是任何一个 Cache-Control指令都不能保证隐私性或者数据的安全性。“private”和“no-store”指令可以为隐私性和安全性方面提供一些帮 助,但是他们并不能用于替代身份验证和加密。
Apache的mod_cern_meta模块允许文件级Http响应头部的控制,同时它也可以配置Cache-Control头(或任何其他头)。响应 头文件是放在原始目录的子目录中,根据原始文件名所命名的一个文件。具体用法请参阅Apache的官方网站。其中Cache-Control : max-age表示失效日期。如果没有启动mod_cern_meta模块,Apache服务器会把Expires字段中的日期换算成以秒为单位的一个 delta值,赋值给max-age。如果启动mod_cern_meta模块,并且配置了max-age值,Apache会将这个覆盖Expires字 段。同时,max-age隐含了Canche-Control: public。这样浏览器接受到的Cache-Control : max-age和Expires值就是一致的。
如果失效日期Cache-Control : max-ag=0或者是负值,浏览器会在对应的缓存中把Expires设置为1970-01-01 08:00:00。


CDN服务器网页缓存分析之Expires

Expires字段声明了一个网页或URL地址不再被浏览器缓存的时间,一旦超过了这个时间,浏览器都应该联系原始服务器。RFC告诉我们:“由于推断的失效时间也许会降低语义透明度,应该被谨慎使用,同时我们鼓励原始服务器尽可能提供确切的失效时间。”

对于一般的纯静态页面,如html、gif、jpg、css、js,默认安装的Apache服务器,不会在响应头添加这个字段。Firefox浏览器接受 到相应后,如果发现没有Expires字段,浏览器根据文件的类型和“Last-Modified”字段来推断出一个合适的失效时间,并存储在客户端。推 测出的时间一般是接受到响应时间后的三天左右。
Apache的expires_module模块可以在Http响应头部自动加上Expires字段。在Apache的httpd.conf文件中进行如下配置:
#启用expires_module模块

LoadModule expires_module modules/mod_expires.so

# 启用有效期控制

ExpiresActive On

# GIF有效期为1个月

ExpiresByType image/gif A2592000

# HTML文档的有效期是最后修改时刻后的一星期

ExpiresByType text/html M604800

#以下的含义类似

ExpiresByType text/css “now plus 2 month”
ExpiresByType text/js “now plus 2 day”
ExpiresByType image/jpeg “access plus 2 month”
ExpiresByType image/bmp “access plus 2 month”
ExpiresByType image/x-icon “access plus 2 month”
ExpiresByType image/png “access plus 2 month”

对于动态页面,如果在页面内部没有通过函数强制加上Expires,例如header(”Expires: ” . gmdate(”D, d M Y H:i:s”) . ” GMT”),Apache服务器会把Wed, 11 Jan [...]


linux关闭防火墙

新LINUX安装完,发现配置完apache后没法访问,估计是防火墙问题。
/etc/init.d/iptables status
会得到一系列信息,说明防火墙开着。
/etc/init.d/iptables stop
永久关闭:
chkconfig –level 35 iptables off


搭建高效率Web服务器

Apache通常是开源界的首选Web服务器,因为它的强大和可靠,已经具有了品牌效应,可以适用于绝大部分的应用场合。但是它的强大有时候却显得笨重, 配置文件得让人望而生畏,高并发情况下效率不太高。而轻量级的Web服务器Lighttpd却是后起之秀,其静态文件的响应能力远高于Apache,据说 是Apache的2-3倍。Lighttpd的高性能和易用性,足以打动我们,在它能够胜任的领域,尽量用它。Lighttpd对PHP的支持也很好,还 可以通过Fastcgi方式支持其他的语言,比如Python。
毕竟Lighttpd是轻量级的服务器,功能上不能跟Apache比,某些应用无法胜任。比如Lighttpd还不支持缓存,而现在的绝大部分站点都是用 程序生成动态内容,没有缓存的话即使程序的效率再高也很难满足大访问量的需求,而且让程序不停的去做同一件事情也实在没有意义。首先,Web程序是需要做 缓存处理的,即把反复使用的数据做缓存。即使这样也还不够,单单是启动Web处理程序的代价就不少,缓存最后生成的静态页面是必不可少的。而做这个是 Squid的强项,它本是做代理的,支持高效的缓存,可以用来给站点做反向代理加速。把Squid放在Apache或者Lighttpd的前端来缓存 Web服务器生成的动态内容,而Web应用程序只需要适当地设置页面实效时间即可。
即使是大部分内容动态生成的网站,仍免不了会有一些静态元素,比如图片、JS脚本、CSS等等,将Squid放在Apache或者Lighttp前端后, 反而会使性能下降,毕竟处理HTTP请求是Web服务器的强项。而且已经存在于文件系统中的静态内容再在Squid中缓存一下,浪费内存和硬盘空间。因此 可以考虑将Lighttpd再放在Squid的前面,构成 Lighttpd+Squid+Apache的一条处理链,Lighttpd在最前面,专门用来处理静态内容的请求,把动态内容请求通过proxy模块转 发给Squid,如果Squid中有该请求的内容且没有过期,则直接返回给Lighttpd。新请求或者过期的页面请求交由Apache中Web程序来处 理。经过Lighttpd和Squid的两级过滤,Apache需要处理的请求将大大减少,减少了Web应用程序的压力。同时这样的构架,便于把不同的处 理分散到多台计算机上进行,由Lighttpd在前面统一把关。
在这种架构下,每一级都是可以进行单独优化的,比如Lighttpd可以采用异步IO方式,Squid可以启用内存来缓存,Apache可以启用MPM 等,并且每一级都可以使用多台机器来均衡负载,伸缩性很好。


php如何基于squid面向apache反向代理

squid 已经不再仅仅是一个 proxy server了,越来越多的站点采用 squid 作
前端服务,后方运行着若干台真正的 web server(apache)在服务… (注: 就算只
有一台服务器, 也可以同时安装squid +apache一起服务),squid 本身强劲的缓存
设计大大提升 web 效率。
squid, apache 的配置安装均不是本文的重点,在此也不详述。一般情况下这
些缓存设计都擅长于静态网页或小图片或小文件等,而对于较为复杂的动态页面,
作这样的缓存均可能带来用户浏览效果的不实时,往往导致后端页面更新了前端却
还没有及时刷新,非常不爽。
其实在 php 脚本中, 结合 HTTP 标准头中有2个重要的标签可以很好的解决
这个困扰。即服务端发送的 Last-Modifed 和 客户端发送的 If-Modified-From 。
假设 webServer 采用 php 脚本服务,每次的的请求产生的负载比较高(+db…)
当 php 能够在 squid 提交请求时通过 If-Modified-From 得知在 squid 缓存池中
的数据 Last-Modified 时间的话,通过比较时间戳记就可以知道缓存是否有效,若
有效那么 php 脚本就不需要从头执行完成,只要简单的输入 Last-Modified 的时间
即可退出程序 exit(0),节省不必要的程序开销。实现步骤如下:
1.
# squid.conf (squid 的配置文件中确保相关的 URL 刷新写法如下)
# 重点在于0, 0% 和 reload-into-ims
# [...]


高性能网站架构-LLMP

在网站架构设计中,大家一定对 LAMP (LinuxApacheMysqlPhp) 不陌生。
LAMP确实是一个非常优秀的架构,秉承着自由,开放,高效,易用的设计理念。
但是,本文不打算探讨LAMP,网上有很多介绍LAMP的资料。
这里,想给大家介绍另一个在LAMP上衍生出来的,以提升性能为主要目的的开源网站架构。
1, 选择高性能 OS
首先,不难理解,任何一个server最底层的支撑还是OS,而OS的选择,主要包括 Unix, Windows server, Linux, BSD等等。
其中,开源的OS,有Linux, BSD及部分unix。从目前使用情况来看,linux还是网站首选OS之一。
但是,Linux由于其自由的特点,也给选择产生了一些不便 - 发行版太多。
现有的主流版本包括 red hat(RHEL), ubuntu, 红旗, opensuse, debian等。
其中,每一个发行版都有自己的特色,比如RHEL的稳定,ubuntu的易用,红旗的中文支持很棒等。
但要以性能为主,又兼顾稳定,易用性,以上都不是最佳选择。
这里推荐一个发行版,它是一个极限性能,加高度可定制,优化的 Linux - gentoo。
gentoo的性能优化是从kernel源码编译就开始入手了,通过选择不同的源码包,可以适应于不同的应用场景。
(不同内核介绍:?http://imkenwu.javaeye.com/blog/168906?)
举个经典的例子:国内,douban.com 在定制优化过的 gentoo 上跑的web服务器最高一天支撑了 2500 万pv。
http://www.dbanotes.net/arch/douban_web_server.html
这种流量,哪怕是提供纯静态的内容,也是很恐怖的。
而支持这种大流量的,除了server本身,最关键的就是高度精简的OS了。
所以,综上所述,高性能网站推荐使用可优化,定制的?gentoo?作为载体。
2, 选择高性能 web server
Apache是 LAMP 架构最核心的 web server, 开源,模块丰富,功能强大,稳定是它的绝对优势。
在美国前100个网站中,有49%的使用apache。可见其影响力。
但是,有利有弊,apache的致命缺陷,就是多于臃肿,强大的功能,一定会带来性能上的损耗。
面对这种情形,在市场上,有一支异军突起,那就是更轻量级的 web server - lighty(lighttpd)。
官方为它定义的口号是 fly light。
它具有非常低的内存开销,cpu占用率低,效能好,以及丰富的模块支持等特点。
这让他在短时间内占据了14%以上的市场份额。并且有越来越多的人开始选择使用lighty作为前端 web server。
到这里为之,其实高性能 web server 非?lighty?莫属。但更棒的是,依靠 gentoo 的高度定制化,我们还可以
进一步提升 lighty 的性能潜力-那就是定制 lighty。
3,选择高性能 database
数据库是任何网站走动态化内容展现及业务数据存储的保障。
市面上的开源数据库主要有 mysql , [...]


Apache目录配置利器.htaccess文件

1.工作原理和使用方法
.htaccess文件(或者”分布式配置文件”)提供了针对每个目录改变配置的方法,即在一个特定的目录中放置一个包含指令的文件,其中的指令作用于此目录及其所有子目录。
通常,.htaccess文件使用的配置语法和主配置文件一样。AllowOverride指令按类别决定了.htaccess文件中哪些指令才是有效的。
如果需要使用.htaccess以外的其他文件名,可以用AccessFileName指令来改变。例如,需要使用.config ,则可以在服务器配置文件中按以下方法配置:
AccessFileName .config
2.不使用.htaccess文件的场合
一般情况下,不应该使用.htaccess文件,除非你对主配置文件没有访问权限。有一种很常见的误解,认为用户认证只能通过.htaccess文件实现,其实并不是这样,把用户认证写在主配置文件中是完全可行的,而且是一种很好的方法。
.htaccess文件应该被用在内容提供者需要针对特定目录改变服务器的配置而又没有root权限的情况下。如果服务器管理员不愿意频繁修改配置,则可以允许用户通过.htaccess文件自己修改配置,尤其是ISP在同一个机器上运行了多个用户站点,而又希望用户可以自己改变配置的情况下。
虽然如此,一般都应该尽可能地避免使用.htaccess文件。任何希望放在.htaccess文件中的配置,都可以放在主配置文件的<Directory>段中,而且更高效。
避免使用.htaccess文件有两个主要原因。
首先是性能。如果AllowOverride启用了.htaccess文件,则Apache需要在每个目录中查找.htaccess文件,因此,无论是否真正用到,启用.htaccess都会导致性能的下降。另外,对每一个请求,都需要读取一次.htaccess文件。
还有,Apache必须在所有上级的目录中查找.htaccess文件,以使所有有效的指令都起作用(参见指令的生效),所以,如果请求/www/htdocs/example中的页面,Apache必须查找以下文件:
/.htaccess
/www/.htaccess
/www/htdocs/.htaccess
/www/htdocs/example/.htaccess
总共要访问4个额外的文件,即使这些文件都不存在。(注意,这可能仅仅由于允许根目录”/”使用.htaccess ,虽然这种情况并不多。)
其次是安全。这样会允许用户自己修改服务器的配置,这可能会导致某些意想不到的修改,所以请认真考虑是否应当给予用户这样的特权。但是,如果给予用户较少的特权而不能满足其需要,则会带来额外的技术支持请求,所以,必须明确地告诉用户已经给予他们的权限,说明AllowOverride设置的值,并引导他们参阅相应的说明,以免日后生出许多麻烦。
注意,在/www/htdocs/example目录下的.htaccess文件中放置指令,与在主配置文件中<Directory /www/htdocs/example>段中放置相同指令,是完全等效的。
/www/htdocs/example目录下的.htaccess文件:
/www/htdocs/example目录下的.htaccess文件的内容:
AddType text/example .exm
httpd.conf文件中摘录的内容:
<Directory /www/htdocs/example>
AddType text/example .exm
</Directory>
但是,把配置放在主配置文件中更加高效,因为只需要在Apache启动时读取一次,而不是在每次文件被请求时都读取。将AllowOverride设置为none可以完全禁止使用.htaccess文件:
AllowOverride None

3.指令的生效
.htaccess文件中的配置指令作用于.htaccess文件所在的目录及其所有子目录,但是很重要的、需要注意的是,其上级目录也可能会有.htaccess文件,而指令是按查找顺序依次生效的,所以一个特定目录下的.htaccess文件中的指令可能会覆盖其上级目录中的.htaccess文件中的指令,即子目录中的指令会覆盖父目录或者主配置文件中的指令。
例子:
/www/htdocs/example1目录中的.htaccess文件有如下内容:
Options +ExecCGI
(注意:必须设置”AllowOverride Options”以允许在.htaccess中使用”Options”指令)
/www/htdocs/example1/example2目录中的.htaccess文件有如下内容:
Options Includes
由于第二个.htaccess文件的存在,/www/htdocs/example1/example2中的CGI执行是不允许的,而只允许 Options Includes ,它完全覆盖了之前的设置。
4.服务器端包含(SSI)举例
.htaccess文件的另一个常见用途是允许一个特定的目录使用服务器端包含(SSI),可以在需要的目录中放置.htaccess文件,并作如下配置:
Options +Includes
AddType text/html shtml
AddHandler server-parsed shtml
注意,必须同时设置 AllowOverride Options 和 AllowOverride FileInfo 以使这些指令生效。

注:相关模块
core
mod_authn_file
mod_authz_groupfile
mod_cgi
mod_include
mod_mime
相关指令
AccessFileName
AllowOverride
Options
AddHandler
SetHandler
AuthType
AuthName
AuthUserFile
AuthGroupFile
Require
?