<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>奔向远方 &#187; apache</title>
	<atom:link href="http://www.tisswb.com/archives/tag/apache/feed" rel="self" type="application/rss+xml" />
	<link>http://www.tisswb.com</link>
	<description>结婚开始倒计时了，高兴~</description>
	<lastBuildDate>Tue, 19 Jul 2011 09:30:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>配置LAMP生产环境：安装Apache、PHP、Mysql</title>
		<link>http://www.tisswb.com/archives/526.html</link>
		<comments>http://www.tisswb.com/archives/526.html#comments</comments>
		<pubDate>Sat, 28 Nov 2009 16:59:52 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[Linux/Unix]]></category>
		<category><![CDATA[Web服务器]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[LAMP]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=526</guid>
		<description><![CDATA[上一篇主要说了一下快速最小化安装CentOS5.3的过程，这一篇主要讲一讲APM（Apache、PHP、Mysql的缩写）的安装过程。下一篇将集中讲述一下我是优化LAMP（CentOS5.3+Apache2.2.14+PHP5.2.11+Mysql5.0.36）的具体细节。
在CentOS5.3下面安装APM 主要有两种方法，第一种，yum快速安装；第二种，编译安装。这两种方法可以说各有各的好处，作为生产环境都是可以的，下面我们分别讲讲两种方法。
第一种，yum快速安装APM

安装APM之前，为了保证使用mysql5.1.x和php5.2.x，首先要添加一个源
安装相应的GPG key
# rpm --import http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka
新建一个repo
# /etc/yum.repos.d/utterramblings.repo 
<span class="readmore"><a href="http://www.tisswb.com/archives/526.html" title="配置LAMP生产环境：安装Apache、PHP、Mysql" target="_blank">阅读全文——共1272字</a></span>]]></description>
			<content:encoded><![CDATA[<p>上一篇主要说了一下<a href="http://www.tisswb.cn/archives/519.html" target="_self">快速最小化安装CentOS5.3</a>的过程，这一篇主要讲一讲APM（Apache、PHP、Mysql的缩写）的安装过程。下一篇将集中讲述一下我是优化LAMP（CentOS5.3+Apache2.2.14+PHP5.2.11+Mysql5.0.36）的具体细节。</p>
<p>在CentOS5.3下面安装APM 主要有两种方法，第一种，yum快速安装；第二种，编译安装。这两种方法可以说各有各的好处，作为生产环境都是可以的，下面我们分别讲讲两种方法。</p>
<p>第一种，yum快速安装APM</p>
<ol>
<li>安装APM之前，为了保证使用mysql5.1.x和php5.2.x，首先要添加一个源
<p>安装相应的GPG key</p>
<p><code># rpm --import http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka</code></p>
<p>新建一个repo</p>
<p><code># /etc/yum.repos.d/utterramblings.repo </code></p>
<p>把以下内容添加进去，保存退出就OK了</p>
<p><code>[utterramblings]<br />
name=Jason's Utter Ramblings Repo<br />
baseurl=http://www.jasonlitka.com/media/EL$releasever/$basearch/<br />
enabled=1<br />
gpgcheck=1<br />
gpgkey=http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka </code></p>
</li>
<li>安装APM
<p>安装命令如下：</p>
<p><code>yum install httpd httpd-devel mysql mysql-devel mysql-server php php-devel php-mysql php-common php-gd php-mbstring php-mcrypt php-xml</code></p>
<p>使用/etc/init.d/httpd start 就可以开启web服务器。</p>
<p>使用/etc/init.d/mysqld start 就可以开启Mysql数据库服务器。</li>
<li>初始化Mysql
<p>第一次启动mysql以后执行如下命令：</p>
<p><code>/usr/bin/mysqladmin -u root password 'asdasd'</code></p>
<p>其中&#8221;中的asdasd是密码，你可以设置成想要的密码。</p>
<p>给root用户授权局域网访问</p>
<p><code>GRANT ALL ON *.* TO root@'192.168.%.%' IDENTIFIED BY '密码';<br />
flush privileges;</code></p>
<p>这样的话就可以使用如下命令登陆mysql了：</p>
<p><code>mysql -uroot -p</code></li>
<li>设置httpd和mysqld开机启动
<p>命令如下：</p>
<p><code>chkconfig httpd on</p>
<p>chkconfig mysqld on</p>
<p></code></li>
<li>在/var/www/html下面新建网页phpinfo.php，内容如下：
<p>这样就可以访问基本的web了：http://192.168.0.6/phpinfo.php （其中192.168.0.6是服务器的ip地址）</li>
</ol>
<p>第二种，编译安装APM</p>
<p>具体编译过程正在整理，敬请期待</p>
<p>20100525 今天更新了一下yum的安装方法，添加了几个devel的安装，因为有些时候安装其他的软件的时候需要用到。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.com/archives/526.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>linux服务器优化的一点点心得</title>
		<link>http://www.tisswb.com/archives/223.html</link>
		<comments>http://www.tisswb.com/archives/223.html#comments</comments>
		<pubDate>Sun, 21 Dec 2008 14:54:43 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[Linux/Unix]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=223</guid>
		<description><![CDATA[最近终于给自己弄了一台服务器，操作系统是linux的，把自己的博客，还有一个linux论坛赶紧迁移了上去，一开始感觉相当爽，毕竟一个服务器就自己一个人用，那感觉相当的爽哈。可是没几天，麻烦事情就来了：服务器越来越慢，打开我的博客和论坛，速度都是出奇的慢，一开始我以为是机器的问题，毕竟是个奔三的服务器，有6年的历史了。
今天问了一个服务器方面的专家朋友，他看了看我的设置，给了我一个建议，打开像Gzip一类的服务器压缩模块和增加服务器缓存试一试。
于是我就到网上查找相关资料，我的服务器操作系统是ubuntu8.04。
然后我打开了apapche的mem_cache和deflate模块，命令分别是：
sudo a2enmod mem_cache
sudo a2enmod deflate
然后重启apache
这两个模块的设置我没有修改，先测试再说。
然后我又到网上找到了开启wordpress2.7和discuz7的Gzip的方法，照着做了一遍。
<span class="readmore"><a href="http://www.tisswb.com/archives/223.html" title="linux服务器优化的一点点心得" target="_blank">阅读全文——共441字</a></span>]]></description>
			<content:encoded><![CDATA[<p>最近终于给自己弄了一台服务器，操作系统是linux的，把自己的<a href="http://www.tisswb.cn">博客</a>，还有一个<a href="http://www.nowlinux.cn" target="_blank">linux论坛</a>赶紧迁移了上去，一开始感觉相当爽，毕竟一个服务器就自己一个人用，那感觉相当的爽哈。可是没几天，麻烦事情就来了：服务器越来越慢，打开我的<a href="http://www.tisswb.cn" target="_self">博客</a>和<a href="http://www.nowlinux.cn">论坛</a>，速度都是出奇的慢，一开始我以为是机器的问题，毕竟是个奔三的服务器，有6年的历史了。</p>
<p>今天问了一个服务器方面的专家朋友，他看了看我的设置，给了我一个建议，打开像Gzip一类的服务器压缩模块和增加服务器缓存试一试。</p>
<p>于是我就到网上查找相关资料，我的服务器操作系统是ubuntu8.04。</p>
<p>然后我打开了apapche的mem_cache和deflate模块，命令分别是：</p>
<p>sudo a2enmod mem_cache<br />
sudo a2enmod deflate</p>
<p>然后重启apache</p>
<p>这两个模块的设置我没有修改，先测试再说。</p>
<p>然后我又到网上找到了开启wordpress2.7和discuz7的Gzip的方法，照着做了一遍。</p>
<p>在来访问我的网站，hoho速度果然快了，快了好多～～～～</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.com/archives/223.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ubuntu下Apache 虚拟主机的配置</title>
		<link>http://www.tisswb.com/archives/33.html</link>
		<comments>http://www.tisswb.com/archives/33.html#comments</comments>
		<pubDate>Thu, 24 Apr 2008 04:34:52 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[Linux/Unix]]></category>
		<category><![CDATA[Web服务器]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[虚拟主机]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=33</guid>
		<description><![CDATA[== 基本配置 ==
我们都知道，如果我们想在单台机器上设置多个域名或主机名时，我们就要用到基于名称的虚拟主机了。那么要如何进行设置呢？这就是本 HowTo 想解决的问题了。在 Ubuntu 的 /etc/apache2/ 目录下有个 Apache2 的主配置文件 apache2.conf。在该文件中我们可以看到有这么一行内容：
Include /etc/apache2/sites-enabled/[^.#]*
这行的意思表明该文件包含了 /etc/apache2/sites-enabled/ 目录中文件名不含 &#8220;.&#8221; 或 &#8220;#&#8221; 这两个字符的所有文件。而当我们列出该目录的文件时，发现只有一个 000-default 的软链接文件，实际连接的是 /etc/apache2/sites-available 目录中的 default 文件，不难看出该文件的文件名中并不包含 &#8220;.&#8221; 或 &#8220;#&#8221;。所以这个文件当然是要被配置文件 apache2.conf 所包含的了。打开该文件，发现它其实是一个虚拟主机的配置文件，不过由于该文件中的虚拟主机为 *，所以它实际上是一个通用配置文件。如果我们要建立虚拟主机的话，那么就要把该文件改成如下所示：
<span class="readmore"><a href="http://www.tisswb.com/archives/33.html" title="ubuntu下Apache 虚拟主机的配置" target="_blank">阅读全文——共4107字</a></span>]]></description>
			<content:encoded><![CDATA[<p>== 基本配置 ==<br />
我们都知道，如果我们想在单台机器上设置多个域名或主机名时，我们就要用到基于名称的虚拟主机了。那么要如何进行设置呢？这就是本 HowTo 想解决的问题了。在 Ubuntu 的 /etc/apache2/ 目录下有个 Apache2 的主配置文件 apache2.conf。在该文件中我们可以看到有这么一行内容：</p>
<p>Include /etc/apache2/sites-enabled/[^.#]*</p>
<p>这行的意思表明该文件包含了 /etc/apache2/sites-enabled/ 目录中文件名不含 &#8220;.&#8221; 或 &#8220;#&#8221; 这两个字符的所有文件。而当我们列出该目录的文件时，发现只有一个 000-default 的软链接文件，实际连接的是 /etc/apache2/sites-available 目录中的 default 文件，不难看出该文件的文件名中并不包含 &#8220;.&#8221; 或 &#8220;#&#8221;。所以这个文件当然是要被配置文件 apache2.conf 所包含的了。打开该文件，发现它其实是一个虚拟主机的配置文件，不过由于该文件中的虚拟主机为 *，所以它实际上是一个通用配置文件。如果我们要建立虚拟主机的话，那么就要把该文件改成如下所示：</p>
<p>NameVirtualHost 10.39.6.59<br />
&lt;VirtualHost 10.39.6.59&gt;<br />
    ServerName www.firehare.com<br />
    ServerAdmin ubuntu.firehare@gmail.com</p>
<p>    DocumentRoot /var/www/<br />
    &lt;Directory /&gt;<br />
        Options FollowSymLinks<br />
        AllowOverride None<br />
    &lt;/Directory&gt;<br />
    &lt;Directory /var/www/&gt;<br />
        Options Indexes FollowSymLinks MultiViews<br />
        AllowOverride None<br />
        Order allow,deny<br />
        allow from all<br />
        # This directive allows us to have apache2&#8242;s default start page<br />
        # in /apache2-default/, but still have / go to the right place<br />
        # Commented out for Ubuntu<br />
        #RedirectMatch ^/$ /apache2-default/<br />
    &lt;/Directory&gt;</p>
<p>    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/<br />
    &lt;Directory &#8220;/usr/lib/cgi-bin&#8221;&gt;<br />
        AllowOverride None<br />
        Options ExecCGI -MultiViews +SymLinksIfOwnerMatch<br />
        Order allow,deny<br />
        Allow from all<br />
    &lt;/Directory&gt;</p>
<p>    ErrorLog /var/log/apache2/error.log</p>
<p>    # Possible values include: debug, info, notice, warn, error, crit,<br />
    # alert, emerg.<br />
    LogLevel warn</p>
<p>    CustomLog /var/log/apache2/access.log combined<br />
    ServerSignature On</p>
<p>    Alias /doc/ &#8220;/usr/share/doc/&#8221;<br />
    &lt;Directory &#8220;/usr/share/doc/&#8221;&gt;<br />
        Options Indexes MultiViews FollowSymLinks<br />
        AllowOverride None<br />
        Order deny,allow<br />
        Deny from all<br />
        Allow from 127.0.0.0/255.0.0.0 ::1/128<br />
    &lt;/Directory&gt;</p>
<p>&lt;/VirtualHost&gt;<br />
下面我们来分析一下上面这段设置中与虚拟主机有关的设置语句：<br />
* NameVirtualHost 10.39.6.59：表示我们要做的是一个基于名称的虚拟主机，且其 IP 地址为 10.39.6.59<br />
* &lt;VirtualHost 10.39.6.59&gt; 和 &lt;/VirtualHost&gt;：表示在其中的是一个虚拟主机的配置<br />
* ServerName www.firehare.com：设置虚拟主机的域名<br />
* ServerAdmin ubuntu.firehare@gmail.com：设置该虚拟主机网管员的邮件<br />
* DocumentRoot /var/www/：设置该虚拟主机的主目录路径<br />
* ErrorLog /var/log/apache2/error.log：设置该虚拟主机的出错信息<br />
* CustomLog /var/log/apache2/access.log combined：设置该虚拟主机的访问信息</p>
<p>这样我们就配置了一个虚拟主机 www.firehare.com。但由于这是缺省配置，所以在 Apache2 重启之后，无论你输入 DNS 服务器中指向这个主机的任何域名，都会被导向 www.firehare.com 这个缺省配置所指向的 /var/www 这个目录的。除非该域名被其他虚拟主机配置所用，比如我们还配置了 edunuke.firehare.com 指向本机，且配置了相应的虚拟主机，这样的话，输入域名 edunuke.firehare.com 就会被对应该域名的目录中。</p>
<p>== 进一步说明 ==<br />
为了说明清楚 我们再添加一个虚拟主机站点 edunuke.firehare.com，首先到 /etc/apache2/sites-available/ 目录中建立一个文件 edunuke。当然这个文件名中是没有 &#8220;.&#8221; 或 &#8220;#&#8221; 这两个字符的了。然后编辑该文件：</p>
<p>&lt;VirtualHost 10.39.6.59&gt;<br />
    ServerName edunuke.firehare.com<br />
    ServerAdmin ubuntu.firehare@firehare.com<br />
    DocumentRoot &#8220;/var/www/edunuke/&#8221;<br />
    ErrorLog &#8220;/var/log/apache2/edunuke_errors.log&#8221;<br />
    CustomLog &#8220;/var/log/apache2/edunuke_accesses.log&#8221; common   <br />
&lt;/VirtualHost&gt;</p>
<p>设置的具体含义同上面的相似，这是我就不再多说了。然后再运行命令：</p>
<p>sudo a2ensite edunuke</p>
<p>这样的话，虚拟主机站点 edunuke.firehare.com 就已经安装好了。这时你也可以在 /etc/apache2/sites-enabled/ 目录中发现多了一个到 /etc/apache2/sites-available/edunuke 的软链接。接下来就是将 Apache2 重启来使虚拟主机站点运行起来：</p>
<p>sudo /etc/init.d/apache2 restart</p>
<p>这样你在浏览器上输入 edunuke.firehare.com 的话，就会被指向 /var/www/edunuke 目录了，而输入其他指向本机的域名则都会指到缺省配置中的 /var/www 目录中。熟悉 Apache2 的朋友会问为什么这样麻烦，放在一个文件中不也是可以吗？为什么要用两个文件呢？其实很简单，因为如果我要对 edunuke 站点进行维护时，我只要运行命令：</p>
<p>sudo a2dissite edunuke<br />
sudo /etc/init.d/apache2 restart</p>
<p>即可，这样既可以维护 edunuke 这个站点，同时还不影响其他站点的正常运行。</p>
<p>== 高级配置 ==<br />
上面谈了一下简单的虚拟主机配置方法。这个基本上能满足我们大部分的需要。但如果要是安装 Zope+Plone 的话，上面的这点设置是远远不够的，由于 Zope+Plone 结构所采用的端口并非是80端口，所以我们还得做端口重定向。为了能够做这个，我们得激活 Rewrite 和 Proxy 两个模块。激活模块很简单，同站点配置目录一样，在 Apache2 中也有两个模块配置目录：mods-available 和 mods-enabled。在 mods-available 目录中的是所有可用的模块，而在 mods-enabled 目录中的则是已被安装到 Apache2 中的模块。由于在 mods-available 目录中已经有了 Rewrite 和 Proxy 模块的配置引导文件，所以只需要简单地将其安装到 Apache2 中即可。使用命令：</p>
<p>sudo a2enmod rewrite<br />
sudo a2enmod proxy</p>
<p>然后，添加虚拟主机站点 plone.firehare.com，同 edunuke 站点创建相似在/etc/apache2/sites-available/ 目录中建立一个文件 plone。显然这个文件名中是没有 &#8220;.&#8221; 或 &#8220;#&#8221; 这两个字符的了。然后编辑该文件：</p>
<p>&lt;VirtualHost 10.39.6.59&gt;<br />
    ServerName plone.firehare.com<br />
    ServerAdmin ubuntu.firehare@firehare.com<br />
    ErrorLog &#8220;/var/log/apache2/plone_errors.log&#8221;<br />
    CustomLog &#8220;/var/log/apache2/plone_accesses.log&#8221; common</p>
<p>    RewriteEngine on<br />
    RewriteRule ^/(.*) http://127.0.0.1:8081/VirtualHostBase/http/plone.firehare.com:80/plone/VirtualHostRoot/$1 [L,P]</p>
<p>    &lt;Proxy *&gt;<br />
        Order Deny,Allow<br />
        Deny from all<br />
        Allow from all<br />
    &lt;/Proxy&gt;</p>
<p>&lt;/VirtualHost&gt;</p>
<p>这样就安装好了 plone.firehare.com 虚拟主机站点，可以在浏览器中地址栏中输入 http://plone.firehare.com 就可以重定向到 Zope+Plone 站点去了。<span class="postbody"><br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.com/archives/33.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LAMP系统性能调优(2): 优化 Apache 和 PHP</title>
		<link>http://www.tisswb.com/archives/24.html</link>
		<comments>http://www.tisswb.com/archives/24.html#comments</comments>
		<pubDate>Tue, 01 Apr 2008 16:01:13 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[Linux/Unix]]></category>
		<category><![CDATA[Web服务器]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[LAMP]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=24</guid>
		<description><![CDATA[      如今，使用 LAMP（Linux®、Apache、MySQL 和 PHP/Perl）架构的应用程序不断被开发和部署。但是，服务器管理员常常对应用程序本身几乎没有控制能力，因为应用程序是别人编写的。这份 共三部分的系列文章 将讨论许多服务器配置问题，这些配置会影响应用程序的性能。第二篇文章重点讨论可为优化 Apache 和 PHP 而采取的措施。
        Linux、Apache、MySQL 和 PHP（或 Perl）是许多 Web 应用程序的 LAMP 架构的基础。有很多基于 LAMP 组件的开源软件包可用于解决各种各样的问题。随着应用程序负载的增加，底层基础设施的瓶颈也会越来越明显，其表现形式就是响应用户请求的速度变慢。 上一篇文章 展示了调优 Linux 系统的方法，还介绍了 LAMP 和性能度量的基础知识。本文重点关注 Web 服务器组件：Apache 和 PHP。
<span class="readmore"><a href="http://www.tisswb.com/archives/24.html" title="LAMP系统性能调优(2): 优化 Apache 和 PHP" target="_blank">阅读全文——共7276字</a></span>]]></description>
			<content:encoded><![CDATA[<p>      如今，使用 LAMP（Linux®、Apache、MySQL 和 PHP/Perl）架构的应用程序不断被开发和部署。但是，服务器管理员常常对应用程序本身几乎没有控制能力，因为应用程序是别人编写的。这份 <a href="http://www.ibm.com/developerworks/cn/views/linux/articles.jsp?view_by=search&amp;search_by=LAMP+%E7%B3%BB%E7%BB%9F%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98">共三部分的系列文章</a> 将讨论许多服务器配置问题，这些配置会影响应用程序的性能。第二篇文章重点讨论可为优化 Apache 和 PHP 而采取的措施。</p>
<p>        Linux、Apache、MySQL 和 PHP（或 Perl）是许多 Web 应用程序的 LAMP 架构的基础。有很多基于 LAMP 组件的开源软件包可用于解决各种各样的问题。随着应用程序负载的增加，底层基础设施的瓶颈也会越来越明显，其表现形式就是响应用户请求的速度变慢。 <a href="http://www.ibm.com/developerworks/cn/linux/l-tune-lamp-1/">上一篇文章</a> 展示了调优 Linux 系统的方法，还介绍了 LAMP 和性能度量的基础知识。本文重点关注 Web 服务器组件：Apache 和 PHP。</p>
<p><span style="font-size: small;"><a name="N10073"><span class="atitle">调优 Apache </span></a></span></p>
<p><span style="font-size: small;">Apache 是一种高度可配置的软件。它具有大量特性，但每一种都代价高昂。从某种程度上来说，调优 Apache 来说就是以恰当的方式分配资源，还涉及到将配置简化为仅包含必要内容。</span></p>
<p><span style="font-size: small;"><a name="N1007D"><span class="smalltitle">配置 MPM</span></a></span></p>
<p><span style="font-size: small;">Apache 是模块化的，因为可以轻松添加和移除特性。在 Apache 的核心，多处理模块（Multi-Processing Module，MPM）提供了这种模块化功能性 —— 管理网络连接、调度请求。MPM 使您能够使用线程，甚至能够将 Apache 迁移到另外一个操作系统。 </span></p>
<p><span style="font-size: small;">每次只能有一个 MPM 是活动的，必须使用 <code>--with-mpm=<em>(worker|prefork|event)</em> </code>静态编译。</span></p>
<p><span style="font-size: small;">每个请求使用一个进程的传统模型称为 <em>prefork</em>。较新的线程化模型称为 <em>worker</em>，它使用多个进程，每个进程又有多个线程，这样就能以较低的开销获得更好的性能。最新的 <em>event</em> MPM 是一种实验性的模型，为不同的任务使用单独的线程池。要确定当前使用的是哪种 MPM，可执行 <code>httpd -l</code>。</span></p>
<p><span style="font-size: small;">选 择使用何种 MPM 取决于许多因素。在 event MPM 脱离实验状态之前，不应考虑这种模型，而是在使用线程和不使用线程之间作出选择。表面上看来，如果所有底层模块（包括 PHP 使用的所有库）都是线程安全的，线程要优于分叉（forking）。而 Prefork 是较为安全的选择；如果选择了 worker，则应该谨慎测试。性能收益还取决于您的发布版所附带的库及硬件。</span></p>
<p><span style="font-size: small;">无论选择了哪种 MPM，都必须恰当地配置它。一般而言，配置 MPM 包括告知 Apache 怎样去控制有多少 worker 正在运行，它们是线程还是进程。prefork MPM 的重要配置选项如清单 1 所示。</span></p>
<p><span style="font-size: small;"><br />
<a name="listing1"><strong>清单 1. prefork MPM 的配置</strong></a><br />
</span></p>
<table border="0" cellspacing="0" cellpadding="0" width="65%">
<tbody>
<tr>
<td class="code-outline">
<pre class="displaycode"><span style="font-size: small;">
StartServers       50
MinSpareServers   15
MaxSpareServers   30
MaxClients       225
MaxRequestsPerChild  4000
</span></pre>
</td>
</tr>
</tbody>
</table>
<p><span style="font-size: small;"><br />
</span></p>
<table border="0" cellspacing="0" cellpadding="0" width="40%" align="right">
<tbody>
<tr>
<td width="10"><span style="font-size: small;"><img src="http://www.ibm.com/i/c.gif" alt="" width="10" height="1" /></span></td>
<td>
<table border="1" cellspacing="0" cellpadding="5" width="100%">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="font-size: small;"><a name="N100B6"><strong>编译您自己的软件</strong></a><br />
</span><span style="font-size: small;">最 初使用 UNIX® 时，我坚持为加入系统的一切编译软件。最终，维护更新给我带来了麻烦，所以我学会了如何构建包来简化这一任务。后来我意识到，大多数时候我都在重复做发布 版做过的事情。现在，在很大程度上来说，我会尽可能坚持使用我所选择的发布版提供的一切，仅在必要的时候使用自己的包。</span></p>
<p><span style="font-size: small;">类似地，您可能会发现，就可维护性而言，使用厂商提供的软件包要优于使用最新、最棒的代码。有些时候，性能调优和系统管理的目标会有所冲突。如果使用商业版的 Linux 或依赖于第三方支持，那么可能不得不考虑厂商的支持。</span></p>
<p><span style="font-size: small;">如果您一意孤行，那么请学会如何构建能与您的发布版协同工作的包，请学会如何将其集成到补丁系统之中。这将确保软件，以及您作出的任何更改得到一致的构建，且能跨多个系统使用。还应订阅恰当的邮件列表和 RSS 提要来及时获得软件更新。</span></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<p><span style="font-size: small;">prefork 模型会为每个请求创建一个新进程。多余的进程保持空闲，以处理传入的请求，这缩短了启动延迟。只要 Web 服务器出现，预先完成的配置就会立即启动 50 个进程，并尽力保持 10 到 20 个空闲服务器运行。进程数的硬性限制由 <code>MaxClients</code> 指定。尽管一个进程能够处理许多相继的请求，Apache 还是会取消连接数超过 4,000 以后的进程，这降低了内存泄漏的风险。</span></p>
<p><span style="font-size: small;">配置线程化 MPM 与之类似，不同之处只是必须确定使用多少线程和进程。Apache 文档解释了所有必要的参数和计算。</span></p>
<p><span style="font-size: small;">要经过几次尝试和出错之后才能选好要使用的值。最重要的值是 <code>MaxClients</code>。目标在于允许足够多的 workder 进程或线程运行，同时又不会导致服务器进行过度的交换。如果传入的请求超出处理能力，那么至少满足此值的那些请求会得到服务，其他请求被阻塞。</span></p>
<p><span style="font-size: small;">如果 <code>MaxClients</code> 过高，那么所有客户机都将体验到糟糕的服务，因为 Web 服务器会试图换出一个进程，以使另一个进程能够运行。而设得过低意味着可能会不必要地拒绝服务。查看高负载下运行的进程数量和所有 Apache 进程所导致的内存占用情况对设置这个值很有帮助。如果 <code>MaxClients</code> 的值超过 256，必须将 <code>ServerLimit</code> 也设为同样的数值，请仔细阅读 MPM 的文档，了解相关信息。</span></p>
<p><span style="font-size: small;">根据服务器的角色调优要启动和保持空闲的服务器数量。如果服务器仅运行 Apache，那么可以使用适中的值，如 <a href="http://www.ibm.com/developerworks/cn/linux/l-tune-lamp-2.html#listing1">清单 1</a> 所示，因为这样就能充分利用机器。如果系统中还有其他数据库或服务器，那么就应该限制运行中的空闲服务器的数量。</span></p>
<p><span style="font-size: small;"><a name="N100EE"><span class="smalltitle">有效地使用选项和重写</span></a></span></p>
<p><span style="font-size: small;">Apache 处理的每个请求都要履行一套复杂的规则，这些规则指明了 Web 服务器必须遵循的约束或特殊指令。对文件夹的访问可能按 IP 地址约束为某个特定文件夹，也可配置用户名和密码。这些选项还包含处理特定文件，例如，如果提供了一个目录列表，该如何处理的文件，或输出结果是否应压 缩。</span></p>
<p><span style="font-size: small;">这些配置以 httpd.conf 中容器的形式出现，例如 &lt;Directory&gt;，以便指定所用配置引用的是磁盘上的一个位置；再如 &lt;Location&gt;，表示引用是 URL 中的路径。清单 2 展示了一个实际的 Directory 容器。</span></p>
<p><span style="font-size: small;"><br />
<a name="listing2"><strong>清单 2. 为根目录应用的一个 Directory 容器</strong></a><br />
</span></p>
<table border="0" cellspacing="0" cellpadding="0" width="65%">
<tbody>
<tr>
<td class="code-outline">
<pre class="displaycode"><span style="font-size: small;">
&lt;Directory /&gt;
AllowOverride None
Options FollowSymLinks
&lt;/Directory&gt;
</span></pre>
</td>
</tr>
</tbody>
</table>
<p><span style="font-size: small;"><br />
</span></p>
<p><span style="font-size: small;">在清单 2 中，位于一对 <code>Directory</code> 和 <code>/Directory</code> 标记之间的配置应用于给定目录和该目录下的一切内容 —— 在本例中，这个给定目录是根目录。此处，<code>AllowOverride</code> 标记指出，用户不允许重写任何选项（稍后将进一步介绍）。<code>FollowSymLinks</code> 选项被启用，它允许 Apache 查看之前的符号连接来为请求提供服务，即便文件位于包含 Web 文件的目录之外。这就意味着，如果 Web 目录中的一个文件是 /etc/passwd 的符号连接，Web 服务器将在请求时顺利为该文件提供服务。如果使用了 <code>-FollowSymLinks</code>，该特性就会被禁用，同样的请求将致使为客户机返回错误。</span></p>
<p><span style="font-size: small;">最后这个场景正是导致两方面关注的原因所在。第一个方面与性能有关。如果禁用了 <code>FollowSymLinks</code>，Apache 就必须检查使用该文件名的所有组件（目录和文件本身），以确保它们不是符号连接。这会带来额外的开销（磁盘操作）。另外一个称为 <code>FollowSymLinksIfOwnerMatch</code> 的选项会在文件所有者与连接所有者相同时使用符号连接。为获得最佳性能，请使用 <a href="http://www.ibm.com/developerworks/cn/linux/l-tune-lamp-2.html#listing2">清单 2</a> 中的选项。</span></p>
<p><span style="font-size: small;">至 此，有安全意识的读者应该有了警惕的感觉。安全性永远是功能性与风险之间的权衡。在我们的例子中，功能性是速度，而风险是允许对系统上的文件进行未经授权 的访问。缓解风险的措施之一是 LAMP 应用服务器通常专注于一种具体功能，用户无法创建危险的符号连接。如果有必要启用符号连接，那么可以将其约束在文件系统的特定区域，如清单 3 所示。</span></p>
<p><span style="font-size: small;"><br />
<a name="listing3"><strong>清单 3. 将 FollowSymLinks 约束为一个用户的目录</strong></a><br />
</span></p>
<table border="0" cellspacing="0" cellpadding="0" width="65%">
<tbody>
<tr>
<td class="code-outline">
<pre class="displaycode"><span style="font-size: small;">
&lt;Directory /&gt;
Options FollowSymLinks
&lt;/Directory&gt;

&lt;Directory /home/*/public_html&gt;
Options -FollowSymLinks
&lt;/Directory&gt;
</span></pre>
</td>
</tr>
</tbody>
</table>
<p><span style="font-size: small;"><br />
</span></p>
<p><span style="font-size: small;">在清单 3 中，一个用户的主目录中的任何 public_html 目录及其所有子目录都移除了 <code>FollowSymLinks</code> 选项。</span></p>
<p><span style="font-size: small;">如您所见，通过主服务器配置，可为每个目录单独配置选项。用户可以自行重写这种服务器配置（如果管理员通过 <code>AllowOverrides</code> 语句允许了这种操作），只需将一个 .htaccess 文件放入目录即可。该文件包含额外的服务器指令，每次请求包含 .htaccess 文件的目录时将加载并应用这些指令。尽管之前探讨过系统没有用户的问题，但许多 LAMP 应用程序都利用这种功能性来控制访问、实现 URL 重写，因此有必要理解其工作原理。</span></p>
<p><span style="font-size: small;">即便 <code>AllowOverrides</code> 语句能阻止用户去做您不希望他们做的事，Apache 也必须检查 .htaccess 文件，看看是否有要完成的工作。父目录可以指定由来自子目录的请求处理的指令，这也就表示，Apache 必须搜索所请求文件的目录树的所有组件。可想而知，这会使每次请求都导致大量磁盘操作。</span></p>
<p><span style="font-size: small;">最简单的解决方案 是不允许重写，这能消除 Apache 检查 .htaccess 的需求。之后的任何特殊配置都将直接放在 httpd.conf 中。清单 4 显示为对一个用户的项目目录进行密码检查向 httpd.conf 增加的代码，而不是将其放入一个 .htaccess 文件并依赖于 <code>AllowOverrides</code>。</span></p>
<p><span style="font-size: small;"><br />
<a name="listing4"><strong>清单 4. 将 .htaccess 配置移入 httpd.conf</strong></a><br />
</span></p>
<table border="0" cellspacing="0" cellpadding="0" width="65%">
<tbody>
<tr>
<td class="code-outline">
<pre class="displaycode"><span style="font-size: small;">
&lt;Directory /home/user/public_html/project/&gt;
AuthUserFile /home/user/.htpasswd
AuthName "uber secret project"
AuthType basic
Require valid-user
&lt;/Directory&gt;
</span></pre>
</td>
</tr>
</tbody>
</table>
<p><span style="font-size: small;"><br />
</span></p>
<p><span style="font-size: small;">如果配置转移到 httpd.conf 中，且 <code>AllowOverrides</code> 被禁用，磁盘的使用就能减少。一个用户的项目可能不会吸引许多人来点击，但设想一下，将这项技术应用于一个忙碌的站点时会有多么强大。</span></p>
<p><span style="font-size: small;">有时不可能彻底消除 .htaccess 文件的使用。例如，在清单 5 中，一个选项被约束到文件系统的特定部分，重写也可以是有作用域的。</span></p>
<p><span style="font-size: small;"><br />
<a name="listing5"><strong>清单 5. 限定 .htaccess 检查的作用域</strong></a><br />
</span></p>
<table border="0" cellspacing="0" cellpadding="0" width="65%">
<tbody>
<tr>
<td class="code-outline">
<pre class="displaycode"><span style="font-size: small;">
&lt;Directory /&gt;
AllowOverrides None
&lt;/Directory&gt;

&lt;Directory /home/*/public_html&gt;
AllowOverrides AuthConfig
&lt;/Directory&gt;
</span></pre>
</td>
</tr>
</tbody>
</table>
<p><span style="font-size: small;"><br />
</span></p>
<p><span style="font-size: small;">实现清单 5 之后，Apache 会在父目录中查找 .htaccess 文件，但会在 public_html 目录处停止，因为文件系统的其余部分禁用了此功能。例如，如果请求的是一个映射到 /home/user/public_html/project/notes.html 的文件，那么仅有 public_html 和 project 目录被搜索。</span></p>
<p><span style="font-size: small;">关于每目录单独配置的最后一个提示就是：要按顺序依次进行。任何介绍 Apache 调优的的文章都会告诉您，应通过 <code>HostnameLookups off</code> 指令禁用 DNS 查找，因为试图反向解析连接到您的服务器的所有 IP 地址无疑是浪费资源。然而，基于主机名的任何约束都会迫使 Web 服务器对客户机的 IP 地址执行反向查找，对其结果进行正向查找，以验证该名称的真实性。因此，避免使用基于客户主机名的访问控制，在必须使用时限定其作用域，这些都是明智的做 法。</span></p>
<p><span style="font-size: small;"><a name="N1017F"><span class="smalltitle">持久连接</span></a></span></p>
<p><span style="font-size: small;">一 个客户机连接到 Web 服务器时，允许客户机通过同一个 TCP 连接发出多个请求，这减少了与多个连接相关的延迟。在一个 Web 页面引用了多幅图片时，这就很有用：客户机可以通过一个连接先请求页面，再请求所有图片。其缺点在于服务器上的 worker 进程必须等待客户机要关闭的会话，之后才能转到下一个请求。</span></p>
<p><span style="font-size: small;">Apache 使您能够配置如何处理持久连接（称为 <em>keepalives</em>）。httpd.conf 全局级的 <code>KeepAlive 5</code> 允许服务器在连接强制关闭之前处理一个连接上的 5 个请求。将此值设置为 0 将禁用持久连接。同样位于全局级上的 <code>KeepAliveTimeout</code> 确定在会话关闭之前，Apache 将等待另外一个连接多久。</span></p>
<p><span style="font-size: small;">持久连接的处理并非 “一刀切” 式的配置。对于某些 Web 站点，禁用 keepalives 更合适（<code>KeepAlive 0</code>）；而对于其他一些站点，启用它会带来巨大的收益。惟一的解决之道就是尝试使用这两种配置，自己观察哪种更合适。但若启用了 keepalives，使用较小的超时时间较为明智，例如 2，即 <code>KeepAliveTimeout 2</code>。这能确保希望发出另外一个请求的客户机有充足的时间，还能确保 worker 进程不会一直空闲，等待可能永远不会出现的下一个请求。</span></p>
<p><span style="font-size: small;"><a name="N101A1"><span class="smalltitle">压缩</span></a></span></p>
<p><span style="font-size: small;">Web 服务器能够在将输出发回给客户机之前压缩它。这将使通过 Internet 发送的页面更小，代价是 Web 服务器上的 CPU 周期。对于那些负担得起 CPU 开销的服务器来说，这是提高页面下载速度的好办法 —— 页面压缩后大小变为原来的三分之一这种事情并不罕见。</span></p>
<p><span style="font-size: small;">图片通常已经是压缩过的，因此压缩应仅限于文本输出。Apache 通过 <code>mod_deflate</code> 提供压缩。尽管 <code>mod_deflate</code> 可轻松启用，但它涉及到太多的复杂性，很多手册都解释了这些复杂的内容。本文不会介绍压缩的配置，但提供了相应文档的链接（参见 <a href="http://www.ibm.com/developerworks/cn/linux/l-tune-lamp-2.html#resources">参考资料</a> 部分）。</span></p>
<p><span style="font-size: small;"><a name="N101B9"><span class="atitle">调优 PHP</span></a></span></p>
<p><span style="font-size: small;">PHP 是运行应用程序代码的引擎。应该仅安装计划使用的那些模块，并配置您的 Web 服务器，使之仅为脚本文件（通常是以 .php 结尾的那些文件）使用 PHP，而非所有静态文件。</span></p>
<p><span style="font-size: small;"><a name="N101C2"><span class="smalltitle">操作码缓存</span></a></span></p>
<p><span style="font-size: small;">请求一个 PHP 脚本时，PHP 会读取该脚本，并将其编译为 <em>Zend 操作码</em>，这是要执行的代码的一种二进制表示形式。随后，此操作码由 PHP 执行并丢弃。操作码缓存将保存这个编译后的操作码，并在下一次调用该页面时重用它。这会节省很多时间。有多种缓存可用，我比较常用的是 eAccelerator。</span></p>
<p><span style="font-size: small;">要安装 eAccelerator，您的计算机上需要有 PHP 开发库。由于不同的 Linux 发布版存放文件的位置不同，所以最好直接从 eAccelerator 的 Web 站点获得安装说明（参见 <a href="http://www.ibm.com/developerworks/cn/linux/l-tune-lamp-2.html#resources">参考资料</a> 部分获得链接）。您的发布版也有可能已经包含了一个操作码缓存，只需安装即可。</span></p>
<p><span style="font-size: small;">无论如何在系统上安装 eAccelerator，都有一些配置选项需要注意。配置文件通常是 /etc/php.d/eaccelerator.ini。<code>eaccelerator.shm_size</code> 定义共享高速缓存的大小，编译后的脚本就存储在这里。该值的单位是兆字节（MB）。根据您的应用程序确定恰当的大小。eAccelerator 提供了一个脚本来显示缓存的状态，其中包含内存占用，64MB 是个不错的选择（<code>eaccelerator.shm_size="64"</code>）。如果您选择的值未被接受，那么必须修改内核的最大共享内存的大小。向 /etc/sysctl.conf 添加 <code>kernel.shmmax=67108864</code>，运行 <code>sysctl -p</code> 来使设置生效。<code>kernel.shmmax</code> 值的单位是字节。</span></p>
<p><span style="font-size: small;">如果共享内存的分配超出极限，eAccelerator 必须将旧脚本从内存中清除。默认情况下，这是被禁用的；<code>eaccelerator.shm_ttl = "60"</code> 指定：当 eAccelerator 用完共享内存时，60 秒内未被访问的所有脚本都将被清除。</span></p>
<p><span style="font-size: small;">另一种流行的 eAccelerator 替代工具是 Alternative PHP Cache（APC）。Zend 的厂商也提供了一种商业操作码缓存，包括一个进一步提高效率的优化器。</span></p>
<p><span style="font-size: small;"><a name="N101F6"><span class="smalltitle">php.ini</span></a></span></p>
<p><span style="font-size: small;">PHP 的配置是在 php.ini 中完成的。四个重要的设置控制 PHP 可使用多少系统资源，如表 1 所列。</span></p>
<p><span style="font-size: small;"><br />
<a name="table1"><strong>表 1. php.ini 中与资源相关的设置</strong></a><br />
</span></p>
<table class="data-table-1" border="0" cellspacing="0" cellpadding="0" width="100%" summary="php.ini resource settings">
<tbody>
<tr>
<th><span style="font-size: small;">设置</span></th>
<th><span style="font-size: small;">描述</span></th>
<th><span style="font-size: small;">建议值</span></th>
</tr>
<tr>
<td><span style="font-size: small;">max_execution_time</span></td>
<td><span style="font-size: small;">一个脚本可使用多少 CPU 秒 </span></td>
<td><span style="font-size: small;">30</span></td>
</tr>
<tr>
<td><span style="font-size: small;">max_input_time</span></td>
<td><span style="font-size: small;">一个脚本等待输入数据的时间有多长（秒）</span></td>
<td><span style="font-size: small;">60</span></td>
</tr>
<tr>
<td><span style="font-size: small;">memory_limit</span></td>
<td><span style="font-size: small;">在被取消之前，一个脚本可使用多少内存（字节）</span></td>
<td><span style="font-size: small;">32M</span></td>
</tr>
<tr>
<td><span style="font-size: small;">output_buffering</span></td>
<td><span style="font-size: small;">数据发送给客户机之前，有多少数据（字节）需要缓存</span></td>
<td><span style="font-size: small;">4096</span></td>
</tr>
</tbody>
</table>
<p><span style="font-size: small;">具体数字主要取决于您的应用程序。如果要从用户处接收大文件，那么 <code>max_input_time</code> 可能必须增加，可以在 php.ini 中修改，也可以通过代码重写它。与之类似，CPU 或内存占用较多的程序也可能需要更大的设置值。目标就是缓解超标程序的影响，因此不建议全局禁用这些设置。关于 <code>max_execution_time</code>，还有一点需要注意：它表示进程的 CPU 时间，而不是绝对时间。因此一个进行大量 I/O 和少量计算的程序的运行时间可能远远超过 <code>max_execution_time</code>。这也是 <code>max_input_time</code> 可以大于 <code>max_execution_time</code> 的原因所在。 </span></p>
<p><span style="font-size: small;">PHP 可执行的日志记录数是可配置的。在生产环境中，禁用除最重要的日志以外的一切日志记录能够减少磁盘写操作。如果需要使用日志来排除问题，那么可以按需启用日志记录。<code>error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR</code> 将启用足够的日志记录，使您发现问题，同时从脚本中消除大量无用的内容。</span></p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td></td>
</tr>
</tbody>
</table>
<p><span style="font-size: small;"><a name="N10267"><span class="atitle">结束语</span></a></span></p>
<p><span style="font-size: small;">本 文重点探讨 Web 服务器的调优，包括 Apache 和 PHP。对于 Apache，总体的想法是消除 Web 服务器必须执行的多余检查，例如处理 .htaccess 文件。还必须调优所用的多处理模块，以便在使用的系统资源和可供传入请求使用的空闲 worker 之间找到平衡。对于 PHP，最好的事情就是安装一个操作码缓存。密切注意几个资源设置也能确保脚本不会浪费系统资源，不会减慢系统处理其他任务的速度。</span></p>
<p><span style="font-size: small;">本系列的下一篇也是最后一篇文章将介绍 MySQL 数据库的调优。请继续关注！</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.com/archives/24.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

