1 Memcached

Memcached 是一个分布式的内存缓存系统,能在内存中缓存从数据库(或其他数据源)中取出的数据,用重复读取内存中的的数据取代一次次查询数据的方法,极大的提高了 Web 应用程序的速度。 安装 Memcached 和相应的类库:

apt-get update
apt-get install memcached php5-memcache

查看 Memcached 是否运行,输入以下命令:

ps -ef | grep memcached

确认 localhost 已经加到配置文件中,用 grep 命令查看:

grep 127.0.0.1 /etc/memcached.conf

如果 localhost 已经包含在配置文件里上一条命令的输出中将会显示有 -l 127.0.0.1 。没有的话,将这一行加进配置文件并重启 Memcached:

echo '-l 127.0.0.1' >> /etc/memcached.conf
/etc/init.d/memcached restart
/etc/init.d/apache2 restart

还需要创建一个 PHP 配置文件以便装载模块,基于 Debian 的系统文件位置在 /etc/php5/conf.d/memcache.ini

extension=memcache.so

Magento 可以用内置的方法配置使用 Memcached 。在 app/etc/local.xml 已经生成后将以下 XML 代码加进去:

<config>
    <global>
        ...
        <cache>
            <backend><![CDATA[memcached]]></backend><!-- apc / memcached / xcache / empty=file -->
            <slow_backend><![CDATA[database]]></slow_backend>
            <memcached><!-- memcached cache backend related config -->
                <servers><!-- any number of server nodes can be included -->
                    <server>
                        <host><![CDATA[127.0.0.1]]></host>
                        <port><![CDATA[11211]]></port>
                        <persistent><![CDATA[1]]></persistent>
                        <weight><![CDATA[1]]></weight>
                        <timeout><![CDATA[10]]></timeout>
                        <retry_interval><![CDATA[10]]></retry_interval>
                        <status><![CDATA[1]]></status>
                    </server>
                </servers>
                <compression><![CDATA[0]]></compression>
                <cache_dir><![CDATA[]]></cache_dir>
                <hashed_directory_level><![CDATA[]]></hashed_directory_level>
                <hashed_directory_umask><![CDATA[]]></hashed_directory_umask>
                <file_name_prefix><![CDATA[]]></file_name_prefix>
            </memcached>
        </cache>
    </global>
    ...
</config>


2 Apache mod_cache

Apache 的 mod_cache 模块能让 Apache 将内容缓存到磁盘或内存中,减少页面的载入时间。缓存动态站点例如电子商务网站需要谨慎处理,缓存有时不可用,将导致客户看到过时的内容。启用 mod_cache :

a2enmod cache
a2enmod disk_cache
a2enmod mem_cache

取消文件 /etc/apache2/mods-available/disk_cache.conf 中 CacheEnable 行的注释启用磁盘缓存,并重启 Apache。 安装一个工具来清理磁盘缓存,以下示例代码展示了如何安装并运行它:

apt-get install apache2-utils
htcacheclean -d30 -n -t -p /var/cache/apache2/mod_disk_cache -l 100M -i

示例代码设置成缓存文件夹每 30 分钟清空一次,缓存容量不超过 100 M,可以根据需要自行设定。


3 Apache mod_expires

好用的浏览器会缓存用户访问过的页面。每个页面都应该有一个内容有效期的信头指令告诉浏览器缓存何时过期,如果信头没有正确设置浏览器访问内容时每一次都重新请求。要使 Magento 的页面有正确的内容有效期信头,在 Magento 根目录的 .htaccess 文件中加入以下代码:

<ifmodule mod_expires.c>
    ExpiresActive On
    ExpiresDefault "access plus 1 month"
</ifmodule>


4 Apache KeepAlive

Apache 的 KeepAlive 功能让客户端和服务端的的 TCP 连接保持打开状态,允许多个请求在在同一个连接中完成。这能很大节省页面特别是加载许多图片的页面载入时间,它去除了打开多个连接的开销。要使用此功能,打开 /etc/apache2/apache2.conf ,找到 KeepAlive 项,确认如下:

KeepAlive On
KeepAliveTimeout 2

以上就启用 KeepAlive 特性,timeout 的单位为秒。


5 PHP APC

PHP APC 是另一种缓存经编译的 PHP 代码缓存系统,这意味着对同一个 PHP 脚本请求不需要对该脚本重复编译,增强了性能。这是一个 PEAR 模块,但也有一些系统依赖,运行一下命令安装它们:

apt-get install apache2-threaded-dev php5-dev php-pear make gpp
pecl install apc

APC 的配置文件需要创建,基于 Debian 的系统中文件在 /etc/php5/conf.d/apc.ini ,在文件中写入以下代码:

extension=apc.so 
apc.shm_size=256
apc.num_files_hint=10000
apc.user_entries_hint=10000
apc.max_file_size=5M

编辑 Magento 的 app/etc/local.xml 文件让 Magento 使用 APC 来缓存,在 <global> 和 </global> 之间加入以下代码:

<cache>
    <backend>apc</backend>
    <prefix>alphanumeric</prefix>
</cache>

验证 APC 是否已经启用,查看 phpinfo 的输出中是否有 APC 的引用,运行以下命令:

php -r 'phpinfo();' | grep 'apc'


6 数据库存储 session

通常,数据库服务器要比 web 服务器利用率小。提高性能可以将 session 处理从 web 服务器的文件系统移到数据库服务器。Magento 安装时会询问将 session 存储在文件或是数据库中,但这很容易修改,打开 Magento 的 app/etc/local.xml 文件,定位到 <session_save> 标签,修改其中的值(默认为<![CDATA[files]]>):

<session_save><![CDATA[db]]></session_save>

也可以用 memcache 存储 session,这不像数据库存储那么长久,但可能更快:

<session_save><![CDATA[memcache]]></session_save>

加入更多选项:

<session_save_path><![CDATA[tcp://127.0.0.1:11211?persistent=1&weight;=2&timeout;=10&retry;_interval=10]]></session_save_path>


7 GZip 压缩

页面在客户端和服务端传输时可以用 GZip 压缩,减少传输的数据量。虽然压缩和解压增加了性能开销,但这也是减小了传输页面特别是大页面要使用的流量。要使用 GZip 压缩,启用 Apache 的 mod_deflate 模块,并将以下代码加入站点的配置文件中:

<ifmodule mod_deflate.c>
        SetOutputFilter DEFLATE
        # Netscape 4.x has some problems...
        BrowserMatch ^Mozilla/4 gzip-only-text/html
        # Netscape 4.06-4.08 have some more problems
        BrowserMatch ^Mozilla/4\.0[678] no-gzip
        # MSIE masquerades as Netscape, but it is fine
        BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
        # Don't compress images
        SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
        # Make sure proxies don't deliver the wrong content
        Header append Vary User-Agent env=!dont-vary
</ifmodule>


8 MySQLTuner

MySQLTuner 是一个检查性能短板的好工具。这个 Perl 脚本能分析你的数据库并给出建议如何修改你的 my.cnf 来提高性能。这能帮助提高通常作为这类应用性能瓶颈的数据库性能,而无需昂贵的硬件升级。安装并运行它:

wget http://mysqltuner.com/mysqltuner.pl
perl mysqltuner.pl

你将会看到一些建议修改某些值来提高性能。按照建议逐步修改就能看到每一项多大程度提高了性能。

本文节选并翻译自 Optimising Magento for Performance