<?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; LAMP</title>
	<atom:link href="http://www.tisswb.cn/archives/tag/lamp/feed" rel="self" type="application/rss+xml" />
	<link>http://www.tisswb.cn</link>
	<description>结婚开始倒计时了，高兴~</description>
	<lastBuildDate>Sat, 31 Jul 2010 16:42:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>php编译参数的含义</title>
		<link>http://www.tisswb.cn/archives/576.html</link>
		<comments>http://www.tisswb.cn/archives/576.html#comments</comments>
		<pubDate>Sat, 31 Jul 2010 16:42:44 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web技术]]></category>
		<category><![CDATA[Web服务器]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[LAMP]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=576</guid>
		<description><![CDATA[今天整理编译php的时候的参数，在网上搜集了一些关于configure参数的资料：
./configure
&#8211;prefix=/usr/local/php                                   php 安装目录
&#8211;with-apxs2=/usr/local/apache/bin/apxs
&#8211;with-config-file-path=/usr/local/php/etc               指定php.ini位置
&#8211;with-mysql=/usr/local/mysql                        mysql安装目录，对mysql的支持
&#8211;with-mysqli=/usr/local/mysql/bin/mysql_config            mysqli文件目录,优化支持
<span class="readmore"><a href="http://www.tisswb.cn/archives/576.html" title="php编译参数的含义" target="_blank">阅读全文——共2772字</a></span>]]></description>
			<content:encoded><![CDATA[<p>今天整理编译php的时候的参数，在网上搜集了一些关于configure参数的资料：</p>
<p>./configure</p>
<p>&#8211;prefix=/usr/local/php                                   <a target="_self"><strong>php</strong> </a>安装目录<br />
&#8211;with-apxs2=/usr/local/apache/bin/apxs<br />
&#8211;with-config-file-path=/usr/local/php/etc               指定php.ini位置<br />
&#8211;with-mysql=/usr/local/mysql                        mysql安装目录，对mysql的支持<br />
&#8211;with-mysqli=/usr/local/mysql/bin/mysql_config            mysqli文件目录,优化支持<br />
&#8211;enable-safe-mode                              打开安全模式<br />
&#8211;enable-ftp                                 打开ftp的支持<br />
&#8211;enable-zip                                 打开对zip的支持<br />
&#8211;with-bz2                                    打开对bz2文件的支持                        <br />
&#8211;with-jpeg-dir                                 打开对jpeg图片的支持<br />
&#8211;with-png-dir                                 打开对png图片的支持<br />
&#8211;with-freetype-dir                              打开对freetype字体库的支持<br />
&#8211;without-iconv                                 关闭iconv函数，种字符集间的转换<br />
&#8211;with-libxml-dir                                 打开libxml2库的支持<br />
&#8211;with-xmlrpc                                 打开xml-rpc的c语言<br />
&#8211;with-zlib-dir                                 打开zlib库的支持<br />
&#8211;with-gd                                    打开gd库的支持<br />
&#8211;enable-gd-native-ttf                           支持TrueType字符串函数库<br />
&#8211;with-curl                                    打开curl浏览工具的支持<br />
&#8211;with-curlwrappers                              运用curl工具打开url流<br />
&#8211;with-ttf                                    打开freetype1.*的支持，可以不加了<br />
&#8211;with-xsl                                     打开XSLT 文件支持，扩展了libxml2库 ，需要libxslt软件<br />
&#8211;with-gettext                                 打开gnu 的gettext 支持，编码库用到<br />
&#8211;with-pear                      打开pear命令的支持，php扩展用的<br />
&#8211;enable-calendar                  打开日历扩展功能<br />
&#8211;enable-mbstring                  多字节，字符串的支持<br />
&#8211;enable-bcmath                  打开图片大小调整,用到zabbix监控的时候用到了这个模块<br />
&#8211;enable-sockets                  打开 sockets 支持<br />
&#8211;enable-exif                      图片的元数据支持<br />
&#8211;enable-magic-quotes               魔术引用的支持<br />
&#8211;disable-rpath                     关闭额外的运行库文件<br />
&#8211;disable-debug                  关闭调试模式<br />
&#8211;with-mime-magic=/usr/share/file/magic.mime      魔术头文件位置</p>
<p>cgi方式安装才用的<a target="_self"><strong>参数</strong> </a><br />
&#8211;enable-fpm                     打上php-fpm 补丁后才有这个参数，cgi方式安装的启动程序<br />
&#8211;enable-fastcgi                  支持fastcgi方式启动php<br />
&#8211;enable-force-cgi-redirect             同上 ,帮助里没有解释<br />
&#8211;with-ncurses                     支持ncurses 屏幕绘制以及基于文本终端的图形互动功能的动态库<br />
&#8211;enable-pcntl                     freeTDS需要用到的，可能是链接mssql 才用到</p>
<p>mhash和mcrypt算法的扩展<br />
&#8211;with-mcrypt                     算法<br />
&#8211;with-mhash                     算法</p>
<p>&#8211;with-gmp<br />
&#8211;enable-inline-optimization<br />
&#8211;with-openssl                     openssl的支持，加密传输时用到的<br />
&#8211;enable-dbase<br />
&#8211;with-pcre-dir=/usr/local/bin/pcre-config      perl的正则库案安装位置<br />
&#8211;disable-dmalloc<br />
&#8211;with-gdbm                     dba的gdbm支持<br />
&#8211;enable-sigchild<br />
&#8211;enable-sysvsem<br />
&#8211;enable-sysvshm<br />
&#8211;enable-zend-multibyte               支持zend的多字节<br />
&#8211;enable-mbregex<br />
&#8211;enable-wddx<br />
&#8211;enable-shmop<br />
&#8211;enable-soap</p>
<p>来源：<a href="http://nedvedheqing.javaeye.com/blog/545632">http://nedvedheqing.javaeye.com/blog/545632</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.cn/archives/576.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>配置LAMP生产环境：安装Apache、PHP、Mysql</title>
		<link>http://www.tisswb.cn/archives/526.html</link>
		<comments>http://www.tisswb.cn/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[未分类]]></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
安装命令如下：
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
使用/etc/init.d/httpd start 就可以开启web服务器。
<span class="readmore"><a href="http://www.tisswb.cn/archives/526.html" title="配置LAMP生产环境：安装Apache、PHP、Mysql" target="_blank">阅读全文——共828字</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<br />
安装命令如下：<br />
<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><br />
使用/etc/init.d/httpd start 就可以开启web服务器。<br />
使用/etc/init.d/mysqld start 就可以开启Mysql数据库服务器。</li>
<li>初始化Mysql<br />
第一次启动mysql以后执行如下命令：<br />
<code>/usr/bin/mysqladmin -u root password 'asdasd'</code><br />
其中&#8221;中的asdasd是密码，你可以设置成想要的密码。<br />
这样的话就可以使用如下命令登陆mysql了：<br />
<code>mysql -uroot -p</code></li>
<li>设置httpd和mysqld开机启动<br />
命令如下：<br />
<code>chkconfig httpd on<br />
chkconfig mysqld on<br />
</code></li>
<li>在/var/www/html下面新建网页phpinfo.php，内容如下：<br />
这样就可以访问基本的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.cn/archives/526.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>配置LAMP生产环境：安装CentOS5.3</title>
		<link>http://www.tisswb.cn/archives/519.html</link>
		<comments>http://www.tisswb.cn/archives/519.html#comments</comments>
		<pubDate>Thu, 26 Nov 2009 14:20:13 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[Linux/Unix]]></category>
		<category><![CDATA[Web服务器]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[LAMP]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=519</guid>
		<description><![CDATA[有几个月没有任何文章，今天回来了。几个月前换了新的工作，主要是将一个大数据量和大访问量的论坛的从dvbbs迁移到discuz，并且为新的程序配置LAMP安装生产环境并逐步优化，中间还负责对discuz进行了二次开发。从这篇文章开始，我开始总结一下这几个月的工作吧，首先安装操作系统，我的生产环境选择的是CentOS5.3，下面主要介绍一下CentOS的最小化安装过程。

系统启动到选择安装方式的时候，选择linux text，文本方式安装。
安装过程中，因为是最小化安装，所以语言选择en即可，分区我采用的是默认的没有进行修改，ip是自定义设置的，时间选项选择在上海，去掉了使用UTC的选项，最后选择程序的时候全部不选择。
最小化安装速度很快，也就是10分钟左右，基本的系统就能安装好，然后重启。
重启后，执行以下操作：
yum install setuptool ntsysv ntp vixie-cron crontabs microcode_ctl wget irqbalance
<span class="readmore"><a href="http://www.tisswb.cn/archives/519.html" title="配置LAMP生产环境：安装CentOS5.3" target="_blank">阅读全文——共3227字</a></span>]]></description>
			<content:encoded><![CDATA[<p>有几个月没有任何文章，今天回来了。几个月前换了新的工作，主要是将一个大数据量和大访问量的论坛的从dvbbs迁移到discuz，并且为新的程序配置LAMP安装生产环境并逐步优化，中间还负责对discuz进行了二次开发。从这篇文章开始，我开始总结一下这几个月的工作吧，首先安装操作系统，我的生产环境选择的是CentOS5.3，下面主要介绍一下CentOS的最小化安装过程。</p>
<ol>
<li>系统启动到选择安装方式的时候，选择linux text，文本方式安装。</li>
<li>安装过程中，因为是最小化安装，所以语言选择en即可，分区我采用的是默认的没有进行修改，ip是自定义设置的，时间选项选择在上海，去掉了使用UTC的选项，最后选择程序的时候全部不选择。</li>
<li>最小化安装速度很快，也就是10分钟左右，基本的系统就能安装好，然后重启。</li>
<li>重启后，执行以下操作：<br />
<code><span style="color: #ff0000;">yum install setuptool ntsysv ntp vixie-cron crontabs microcode_ctl wget irqbalance</span></code><br />
setuptool：可以让文本方式下的setup管用<br />
ntsysv：在setup下有system service管理<br />
ntp：时间更新服务<br />
vixie-cron，crontabs：cron服务<br />
microcode_ctl：inter CPU的微代码之类的东西<br />
wget：从网上下东西<br />
irqbalance：当服务器CPU为S.M.P架构或支持双核心、HT技术时安装，否则不用。</li>
<li>安装完成后，执行如下命令：<br />
<code><span style="color: #ff0000;">setup</span></code><br />
其中关闭Firewall，禁用SELinux。<br />
服务只留下：<br />
<code><strong>crond</strong><br />
<strong>irqbalance</strong> 没装，需要时用yum安装，仅当服务器CPU为S.M.P架构或支持双核心、HT技术时，才需开启，否则关闭。<br />
<strong>microcode_ctl<br />
network<br />
sshd<br />
syslog</strong></code></li>
</ol>
<p>这样，一个基本的CentOS系统就安装完了，下一篇我们就来说一说<a href="http://www.tisswb.cn/archives/526.html" target="_blank">安装Apache、PHP、MySql</a>。</p>
<p><strong>附录：</strong></p>
<p>1.使用163的更新源，163的更新源速度很快，虽然内容不是最新的，但是基本的东西都还是有的。</p>
<p>将/etc/yum.repos.d/CentOS-Base.repo 的内容替换成如下内容<br />
<code><br />
# CentOS-Base.repo<br />
#<br />
# This file uses a new mirrorlist system developed by Lance Davis for CentOS.<br />
# The mirror system uses the connecting IP address of the client and the<br />
# update status of each mirror to pick mirrors that are updated to and<br />
# geographically close to the client.  You should use this for CentOS updates<br />
# unless you are manually picking other mirrors.<br />
#<br />
# If the mirrorlist= does not work for you, as a fall back you can try the<br />
# remarked out baseurl= line instead.<br />
#<br />
#</code></p>
<p><code>[base]<br />
name=CentOS-$releasever - Base<br />
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&amp;arch=$basearch&amp;repo=os<br />
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/<br />
baseurl=http://mirrors.163.com/centos/$releasever/os/$basearch/<br />
gpgcheck=1<br />
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5</code></p>
<p><code>#released updates<br />
[updates]<br />
name=CentOS-$releasever - Updates<br />
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&amp;arch=$basearch&amp;repo=updates<br />
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/<br />
baseurl=http://mirrors.163.com/centos/$releasever/updates/$basearch/<br />
gpgcheck=1<br />
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5</code></p>
<p><code>#packages used/produced in the build but not released<br />
[addons]<br />
name=CentOS-$releasever - Addons<br />
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&amp;arch=$basearch&amp;repo=addons<br />
#baseurl=http://mirror.centos.org/centos/$releasever/addons/$basearch/<br />
baseurl=http://mirrors.163.com/centos/$releasever/addons/$basearch/<br />
gpgcheck=1<br />
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5</code></p>
<p><code>#additional packages that may be useful<br />
[extras]<br />
name=CentOS-$releasever - Extras<br />
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&amp;arch=$basearch&amp;repo=extras<br />
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/<br />
baseurl=http://mirrors.163.com/centos/$releasever/extras/$basearch/<br />
gpgcheck=1<br />
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5</code></p>
<p><code> </code></p>
<p><code>#additional packages that extend functionality of existing packages<br />
[centosplus]<br />
name=CentOS-$releasever - Plus<br />
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&amp;arch=$basearch&amp;repo=centosplus<br />
#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/<br />
baseurl=http://mirrors.163.com/centos/$releasever/centosplus/$basearch/<br />
gpgcheck=1<br />
enabled=1<br />
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5</code></p>
<p>2.安装vim，并设置高亮。<br />
个人比较喜欢使用vim，可是CentOS默认只安装了vi的基本部分，需要执行下面的命令<br />
<code>yum -y install vim-enhanced</code><br />
然后在vim中:syntax on就可以设置高亮了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.cn/archives/519.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>在ubuntu6.06上安装apache2.2X + mysql + PHP + Ruby on Rails + Mongrel Cluster</title>
		<link>http://www.tisswb.cn/archives/47.html</link>
		<comments>http://www.tisswb.cn/archives/47.html#comments</comments>
		<pubDate>Fri, 09 May 2008 04:05:22 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[Linux/Unix]]></category>
		<category><![CDATA[Web服务器]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[LAMP]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=47</guid>
		<description><![CDATA[到现在已经安装了好几次服务器了。总结出了一些经验，在这里和大家分享一下。
说明
我使用的linux是ubuntu 6.06 server cd版本。选第一项安装最基本的系统文件，不自动安装LAMP服务，因为ubuntu 6.06自带的apache2是2.0X的，不适合做mongrel cluster的前台，安装自带的apache2.0X之后卸载它比较麻烦，所以干脆不要自动安装LAMP服务，而手动安装apache2.2。
ubuntu 6.06 server cd的基本安装只安装系统必要文件，不安装其它服务，甚至连ssh都要手动：
sudo apt-get install ssh
安装，请大家注意要安装上ssh才能远程访问。
安装准备
加本地ubuntu源，加快下载速度。
sudo nano /etc/apt/sources.list
加入速度比较快的源，如cn99的：
<span class="readmore"><a href="http://www.tisswb.cn/archives/47.html" title="在ubuntu6.06上安装apache2.2X + mysql + PHP + Ruby on Rails + Mongrel Cluster" target="_blank">阅读全文——共6346字</a></span>]]></description>
			<content:encoded><![CDATA[<p>到现在已经安装了好几次服务器了。总结出了一些经验，在这里和大家分享一下。</p>
<p><strong><span style="color: #ffffff; background-color: #ff6600;">说明</span></strong><br />
我使用的linux是ubuntu 6.06 server cd版本。选第一项安装最基本的系统文件，不自动安装LAMP服务，因为ubuntu 6.06自带的apache2是2.0X的，不适合做mongrel cluster的前台，安装自带的apache2.0X之后卸载它比较麻烦，所以干脆不要自动安装LAMP服务，而手动安装apache2.2。</p>
<p>ubuntu 6.06 server cd的基本安装只安装系统必要文件，不安装其它服务，甚至连ssh都要手动：<br />
sudo apt-get install ssh<br />
安装，请大家注意要安装上ssh才能远程访问。</p>
<p><strong style="background-color: #ff6600;"><span style="color: #ffffff;">安装准备</span></strong></p>
<p><strong><span style="color: #ff6600;">加本地ubuntu源，加快下载速度</span></strong>。<br />
sudo nano /etc/apt/sources.list<br />
加入速度比较快的源，如cn99的：<br />
deb http://ubuntu.cn99.com/ubuntu/ dapper main restricted universe multiverse<br />
deb http://ubuntu.cn99.com/ubuntu/ dapper-updates main restricted universe multiverse<br />
deb http://ubuntu.cn99.com/ubuntu/ dapper-security main restricted universe multiverse<br />
deb http://ubuntu.cn99.com/ubuntu/ dapper-backports main restricted universe multiverse<br />
deb http://ubuntu.cn99.com/ubuntu-cn/ dapper main restricted universe multiverse</p>
<p><strong><span style="color: #ff6600;">更新系统</span></strong><br />
sudo apt-get update<br />
sudo apt-get dist-upgrade</p>
<p><strong><span style="color: #ff6600;">准备必要文件</span></strong><br />
sudo apt-get install build-essential<br />
<span style="color: #ff6600;"><strong><br />
创建下载源码文件夹</strong></span><br />
cd ~<br />
mkdir src<br />
cd src</p>
<p><strong><span style="color: #ff6600;">安装zlib</span></strong><br />
wget http://www.zlib.net/zlib-1.2.3.tar.gz<br />
tar xvfz zlib-1.2.3.tar.gz<br />
cd zlib-1.2.3/<br />
./configure &#8211;prefix=/usr/local<br />
make<br />
sudo make install<br />
cd ..</p>
<p><strong><span style="color: #ffffff;"><span style="background-color: #ff6600;">安装Apache2.2</span></span></strong><br />
<span style="color: #ff6600;"><strong style="background-color: #ffffff;">下载安装apche2.2</strong></span><br />
sudo dpkg &#8211;purge apache apache2<br />
wget http://apache.rmplc.co.uk/httpd/httpd-2.2.4.tar.gz<br />
tar xvfz httpd-2.2.4.tar.gz<br />
cd httpd-2.2.4/<br />
./configure &#8211;prefix=/usr/local/apache2 &#8211;enable-mods-shared=all &#8211;enable-deflate &#8211;enable-proxy &#8211;enable-proxy-balancer &#8211;enable-proxy-http<br />
make<br />
sudo make install<br />
cd ..</p>
<p><strong><span style="color: #ff6600;">测试apache2.2</span></strong><br />
启动apache2.2<br />
sudo /usr/local/apache2/bin/apachectl start<br />
访问测试</p>
<p>http://xxx.xxx.xxx.xxx（服务器IP）</p>
<p>停止apache2.2<br />
sudo /usr/local/apache2/bin/apachectl stop</p>
<p><strong><span style="color: #ff6600;"><span style="background-color: #ffffff;">让apache2.2在系统启动时自动运行</span></span></strong><br />
sudo cp /usr/local/apache2/bin/apachectl /etc/init.d/apachectl<br />
sudo chmod +x /etc/init.d/apachectl<br />
sudo nano /etc/init.d/apachectl<br />
修改文件，增加：<br />
#!/bin/sh<br />
#<br />
<span style="color: #0000ff;"># chkconfig: &#8211; 85 15<br />
# description: Apache is a web server.<br />
</span>sudo /usr/sbin/update-rc.d apachectl defaults</p>
<p><strong><span style="color: #ff6600;">增加apache用户，增强系统安全性</span></strong><br />
sudo adduser &#8211;system apache<br />
sudo nano /usr/local/apache2/conf/httpd.conf<br />
修改文件，将<br />
User daemon<br />
Group daemon<br />
改成：<br />
<span style="color: #0000ff;">User apache<br />
Group nogroup</span></p>
<p><strong><span style="color: #ffffff;"><span style="background-color: #ff6600;">PHP模块安装</span></span></strong><br />
如果你不想在服务器中使用php网站，直接跳过本节<br />
<span style="color: #ff6600;"><strong>下载安装php4</strong></span>(因为我的服务器只是用来运行早点的php程序，php4够用了）<br />
sudo apt-get install flex<br />
wget http://au2.php.net/get/php-4.4.7.tar.gz/from/cn.php.net/mirror<br />
tar xvfz php-4.4.7.tar.gz<br />
cd php-4.4.7<br />
./configure &#8211;with-apxs2=/usr/local/apache2/bin/apxs &#8211;with-mysql &#8211;disable-cgi &#8211;with-zlib &#8211;with-gettext<br />
make<br />
sudo make install<br />
sudo cp php.ini-dist /usr/local/lib/php.ini<br />
cd ..</p>
<p><strong><span style="color: #ff6600;">设置php</span></strong><br />
sudo nano /usr/local/apache2/conf/httpd.conf<br />
修改文件，<br />
增加（如果已经加上就不用了）<br />
<span style="color: #0000ff;">LoadModule php4_module        modules/libphp4.so</span><br />
在<br />
AddType application/x-gzip .gz .tgz<br />
之后增加：<br />
<span style="color: #0000ff;">AddType application/x-httpd-php .php</span><br />
修改<br />
DirectoryIndex index.html<br />
为<br />
DirectoryIndex index.html <span style="color: #0000ff;">index.php default.php </span></p>
<p><strong><span style="color: #ff6600;">测试php</span></strong><br />
在网站目录（默认/usr/local/apache2/hdocs/)创建<span style="color: #0000ff;">test.php</span>文件，内容<br />
&lt;?php<br />
phpinfo();<br />
?&gt;<br />
然后访问：</p>
<p>http://xxx.xxx.xxx.xxx/test.php</p>
<p>应显示系统php模块信息。</p>
<p><strong><span style="color: #ffffff; background-color: #ff6600;">安装MySQL</span></strong><br />
sudo apt-get install mysql-server mysql-client</p>
<p><strong><span style="color: #ff6600;">修改root用户密码</span></strong>：<br />
sudo mysqladmin -u root password 新密码<br />
sudo mysqladmin -u root -h localhost password 新密码</p>
<p>如果要进行其它基本设置，修改/etc/mysql/my.cnf文件。</p>
<p><strong><span style="color: #ff6600;">mysql数据备份与恢复</span></strong><br />
备份<br />
mysqldump -u 用户名 -p 数据库名 &gt; 备份文件名<br />
恢复<br />
mysql -u 用户名 -p 数据库名 &lt; 备份文件名</p>
<p><span style="color: #ffffff; background-color: #ff6600;"><strong>安装ruby1.8.6</strong></span><br />
ubuntu 6.06自带的ruby是1.8.4, 因为在使用1.8.4版的ruby时我遇到mongrel提示ruby版本过旧的问题，所以自行编译安装1.8.6版的ruby.</p>
<p><strong><span style="color: #ff6600;">安装ruby1.8.6</span></strong><br />
wget http://rubyforge.org/frs/download.php/18421/ruby-1.8.6.tar.gz<br />
sudo tar -xvf ruby-1.8.6.tar.gz<br />
cd ruby-1.8.6<br />
./configure<br />
make test<br />
make<br />
sudo make install</p>
<p>安装ruby1.8.6后在运行script/console时遇到了<br />
      /usr/local/lib/ruby/1.8/irb/completion.rb:10:in `require&#8217;:<br />
      no such file to load &#8212; readline (LoadError)<br />
错误，解决办法是<strong><span style="color: #ff6600;"><br />
安装readline</span></strong><br />
sudo apt-get install libncurses5-dev libreadline5-dev<br />
cd ext/readline<br />
ruby extconf.rb<br />
make<br />
sudo make install<br />
cd ../../..</p>
<p><strong><span style="color: #ff6600;">ruby gems安装</span></strong><br />
sudo wget http://rubyforge.org/frs/download.php/11289/rubygems-0.9.0.tgz<br />
tar -xvzf rubygems-0.9.0.tgz<br />
cd rubygems-0.9.0<br />
sudo ruby setup.rb<br />
sudo gem update &#8211;system<br />
cd ..</p>
<p><strong><span style="color: #ff6600;">安装libmysql</span></strong><br />
sudo apt-get install libmysql-ruby libmysql-ruby1.8 libruby1.8<br />
安装好这个后<br />
irb<br />
irb(main):001:0&gt; require &#8216;mysql&#8217;<br />
还是提示出错，于是我安装mysql gem<br />
sudo gem install mysql<br />
但安装出错。。。。<br />
奇怪的是后来发现RoR网站可以正常运行，没有问题。网友如果解决了这个问题，请留言一下。</p>
<p><strong><span style="color: #ffffff; background-color: #ff6600;">安装Rails</span></strong><br />
sudo gem install rails &#8211;include-dependencies<br />
注意linux平台安装过程要选带ruby的rails。</p>
<p><strong><span style="color: #ffffff; background-color: #ff6600;">安装Mongrel Cluster</span></strong><br />
sudo gem install daemons gem_plugin mongrel mongrel_cluster &#8211;include-dependencies<br />
同上，linux平台安装过程要选带ruby的程序。</p>
<p>新<strong><span style="color: #ff6600;">增加一个mongrel用户</span></strong>，增强系统安全性<br />
sudo adduser mongrel<br />
将网站文件归到这个用户<br />
sudo chown -R mongrel:mongrel /www/app<br />
上面/www/app为RoR程序目录<br />
<strong><span style="color: #ff6600;"><br />
创建mongrel群</span></strong><br />
sudo mongrel_rails cluster::configure -e production -p 8000 -N 3 -c /www/app -a 127.0.0.1 &#8211;user mongrel &#8211;group mongrel<br />
其中/www/app为RoR程序目录<br />
8000为mongrel群开始端口<br />
-N 3中的3为mongrel群中的mongrel服务器数量，3表示3个mongrel组成这个群，群使用的端口从8000开始，8000，8001，8002三个。<br />
上面的命令将会在RoR程序/www/app/config目录下生成mongrel_cluster.yml文件。<br />
将新文件归到mongrel用户<br />
sudo chown -R mongrel:mongrel /www/app/config/mongrel_cluster.yml</p>
<p><strong><span style="color: #ff6600;">启动mongrel群测试<br />
</span></strong>在当前RoR程序根目录（如上面的/www/app）下运行<br />
sudo mongrel_rails cluster::start</p>
<p><strong><span style="color: #ff6600;">让mongrel cluster在系统启动时自动运行<br />
</span></strong>sudo mkdir /etc/mongrel_cluster<br />
sudo ln -s /www/app/config/mongrel_cluster.yml /etc/mongrel_cluster/app.yml<br />
sudo cp /usr/local/lib/ruby/gems/1.8/gems/mongrel_cluster-1.0.2/resources/mongrel_cluster /etc/init.d/<br />
上面的/usr/local/lib/ruby/gems/1.8/gems/mongrel_cluster-1.0.2/是mongrel gem所在的目录。<br />
修改mongrel_cluster文件<br />
sudo nano /etc/init.d/mongrel_cluster<br />
在CONF_DIR之上加入一行：<br />
<span style="color: #0000ff;">PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local:/usr/local/sbin:/usr/local/bin<br />
</span>解决一些情况下因为mongrel找不到程序而不能在系统启动时自动运行的问题。<br />
sudo chmod +x /etc/init.d/mongrel_cluster<br />
sudo /usr/sbin/update-rc.d -f mongrel_cluster defaults<br />
手动修改mongrel cluster的启动顺序，让它在最后运行，解决有可能发生的另一些启动问题。<br />
sudo mv /etc/rc2.d/S20mongrel_cluster /etc/rc2.d/S99mongrel_cluster</p>
<p><strong><span style="color: #ff6600;">让Apache成为mongrel的前台</span></strong><br />
修改httpd.conf文件（默认在/usr/local/apache2/conf/目录下）<br />
最后加入：<br />
NameVirtualHost 192.168.1.1<br />
&lt;Proxy balancer://<span style="color: #0000ff;">cslog_cluster</span>&gt;<br />
  BalancerMember http://127.0.0.1:<span style="color: #0000ff;">8000</span><br />
  BalancerMember http://127.0.0.1:<span style="color: #0000ff;">8001</span><br />
  BalancerMember http://127.0.0.1:<span style="color: #0000ff;">8002</span><br />
&lt;/Proxy&gt;</p>
<p>&lt;VirtualHost 192.168.1.1&gt;<br />
    ServerName www.cslog.cn<br />
    DocumentRoot /www/cslog/public<br />
  RewriteEngine On<br />
  RewriteCond %{DOCUMENT_ROOT}/maintenance.html -f<br />
  RewriteCond %{SCRIPT_FILENAME} !maintenance.html<br />
  RewriteRule ^.*$ /maintenance.html [L]<br />
  # Rewrite index to check for static index.html<br />
  RewriteRule ^/$ /index.html [QSA]<br />
  # Rewrite to check for Rails cached pages with .html extentions<br />
  RewriteRule ^([^.]+)$ $1.html [QSA]<br />
  # All dynamic requests get sent to the cluster<br />
  RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f<br />
  RewriteRule ^/(.*)$ balancer://<span style="color: #0000ff;">cslog_cluster</span>%{REQUEST_URI} [P,QSA,L]<br />
  # Deflate for clients that support it.<br />
  AddOutputFilterByType DEFLATE text/html text/plain text/xml<br />
  BrowserMatch ^Mozilla/4 gzip-only-text/html<br />
  BrowserMatch ^Mozilla/4.0[678] no-gzip<br />
  BrowserMatch bMSIE !no-gzip !gzip-only-text/html<br />
# Error and access logs.<br />
  ErrorLog logs/cslog_error_log<br />
  CustomLog logs/cslog_access_log combined<br />
&lt;/VirtualHost&gt;<br />
文件中的cslog_cluster可以自己命名，但要对应。<br />
8000，8001，8002为mongrel群对应的端口。</p>
<p><strong><span style="color: #ffffff;"><span style="background-color: #ff6600;">总结</span></span></strong><br />
到这里，ubuntu6.06上的apache2.2， mysql， PHP， Ruby on Rails ， Mongrel Cluster安装设置已经完成。下午一次全过程大概用了两个小时，如果写成脚本，应该可以系统自动安装，可以更快完成全过程。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.cn/archives/47.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ubuntu 6.06+LAMP+discuz6.0 启用URL静态化配置</title>
		<link>http://www.tisswb.cn/archives/32.html</link>
		<comments>http://www.tisswb.cn/archives/32.html#comments</comments>
		<pubDate>Thu, 24 Apr 2008 04:29:53 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[Linux/Unix]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[LAMP]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[URL静态化]]></category>
		<category><![CDATA[虚拟主机]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=32</guid>
		<description><![CDATA[安装discuz6.0后，启用URL静态化的步骤（本人使用的是apache的虚拟主机）：
1。由于ubuntu6.06中使用apt安装的apache默认不启用mod_rewrite 模块，需要启用：
命令：sudo a2enmod rewrite
之后在/etc/apache2/mods-enabled下面已有rewrite.load文件就可以看到
LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so
2。在/etc/apache2/sites-enabled中编辑需要打开的虚拟主机文件，
示例如下：
&#60;VirtualHost *:80&#62;
    ServerAdmin noname@gmail.com
    DocumentRoot /www/html/scripts
<span class="readmore"><a href="http://www.tisswb.cn/archives/32.html" title="ubuntu 6.06+LAMP+discuz6.0 启用URL静态化配置" target="_blank">阅读全文——共983字</a></span>]]></description>
			<content:encoded><![CDATA[<p>安装discuz6.0后，启用URL静态化的步骤（本人使用的是apache的虚拟主机）：</p>
<p>1。由于ubuntu6.06中使用apt安装的apache默认不启用mod_rewrite 模块，需要启用：</p>
<p>命令：sudo a2enmod rewrite</p>
<p>之后在/etc/apache2/mods-enabled下面已有rewrite.load文件就可以看到</p>
<p>LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so</p>
<p>2。在/etc/apache2/sites-enabled中编辑需要打开的虚拟主机文件，</p>
<p><span style="font-family: Courier New;">示例如下：</span></p>
<p><span style="font-family: Courier New;">&lt;VirtualHost *:80&gt;<br />
    ServerAdmin </span><a href="mailto:noname@gmail.com" target="_blank"><span style="font-family: Courier New;">noname@gmail.com</span></a><br />
<span style="font-family: Courier New;">    DocumentRoot /www/html/scripts<br />
    ServerName scripts.zeali.net<br />
    ErrorLog /logs/scripts.zeali.net-error_log<br />
    CustomLog /logs/scripts.zeali.net-access_log common<br />
&lt;IfModule mod_rewrite.c&gt;<br />
RewriteEngine On<br />
RewriteRule ^(.*)/archiver/((fid|tid)-[w-]+.html)$ $1/archiver/index.php?$2<br />
RewriteRule ^(.*)/forum-([0-9]+)-([0-9]+).html$ $1/forumdisplay.php?fid=$2&amp;page=$3<br />
RewriteRule ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+).html$ $1/viewthread.php?tid=$2&amp;extra=page%3D$4&amp;page=$3<br />
RewriteRule ^(.*)/space-(username|uid)-(.+).html$ $1/space.php?$2=$3<br />
RewriteRule ^(.*)/tag-(.+).html$ $1/tag.php?name=$2<br />
&lt;/IfModule&gt;<br />
&lt;/VirtualHost&gt;</span></p>
<p><span style="font-family: Courier New;">3。激活这个虚拟主机设置</span></p>
<p><span style="font-family: Courier New;">命令：sudo a2ensite xxx</span></p>
<p><span style="font-family: Courier New;">4。重启apache</span></p>
<p><span style="font-family: Courier New;">这时候，discuz的静态化已经可以使用了~</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.cn/archives/32.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LAMP系统性能调优(3): MySQL 服务器调优</title>
		<link>http://www.tisswb.cn/archives/26.html</link>
		<comments>http://www.tisswb.cn/archives/26.html#comments</comments>
		<pubDate>Tue, 01 Apr 2008 16:04:20 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[Linux/Unix]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Web技术]]></category>
		<category><![CDATA[Web服务器]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[LAMP]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=26</guid>
		<description><![CDATA[有 3 种方法可以加快 MySQL 服务器的运行速度，效率从低到高依次为：

替换有问题的硬件。
对 MySQL 进程的设置进行调优。
对查询进行优化。

替换有问题的硬件通常是我们的第一考虑，主要原因是数据库会占用大量资源。不过这种解决方案也就仅限于此了。实际上，您通常可以让中央处理器（CPU）或磁盘速度加倍，也可以让内存增大 4 到 8 倍。
第二种方法是对 MySQL 服务器（也称为 mysqld）进行调优。对这个进程进行调优意味着适当地分配内存，并让 mysqld 了解将会承受何种类型的负载。加快磁盘运行速度不如减少所需的磁盘访问次数。类似地，确保 MySQL 进程正确操作就意味着它花费在服务查询上的时间要多于花费在处理后台任务（如处理临时磁盘表或打开和关闭文件）上的时间。对 mysqld 进行调优是本文的重点。
最好的方法是确保查询已经进行了优化。这意味着对表应用了适当的索引，查询是按照可以充分利用 MySQL 功能的方式来编写的。尽管本文并没有包含查询调优方面的内容（很多著作中已经针对这个主题进行了探讨），不过它会配置 mysqld 来报告可能需要进行调优的查询。
<span class="readmore"><a href="http://www.tisswb.cn/archives/26.html" title="LAMP系统性能调优(3): MySQL 服务器调优" target="_blank">阅读全文——共7891字</a></span>]]></description>
			<content:encoded><![CDATA[<p>有 3 种方法可以加快 MySQL 服务器的运行速度，效率从低到高依次为：</p>
<ol>
<li>替换有问题的硬件。</li>
<li>对 MySQL 进程的设置进行调优。</li>
<li>对查询进行优化。</li>
</ol>
<p>替换有问题的硬件通常是我们的第一考虑，主要原因是数据库会占用大量资源。不过这种解决方案也就仅限于此了。实际上，您通常可以让中央处理器（CPU）或磁盘速度加倍，也可以让内存增大 4 到 8 倍。</p>
<p>第二种方法是对 MySQL 服务器（也称为 <code>mysqld</code>）进行调优。对这个进程进行调优意味着适当地分配内存，并让 <code>mysqld</code> 了解将会承受何种类型的负载。加快磁盘运行速度不如减少所需的磁盘访问次数。类似地，确保 MySQL 进程正确操作就意味着它花费在服务查询上的时间要多于花费在处理后台任务（如处理临时磁盘表或打开和关闭文件）上的时间。对 <code>mysqld</code> 进行调优是本文的重点。</p>
<p>最好的方法是确保查询已经进行了优化。这意味着对表应用了适当的索引，查询是按照可以充分利用 MySQL 功能的方式来编写的。尽管本文并没有包含查询调优方面的内容（很多著作中已经针对这个主题进行了探讨），不过它会配置 <code>mysqld</code> 来报告可能需要进行调优的查询。</p>
<p>虽然已经为这些任务指派了次序，但是仍然要注意硬件和 <code>mysqld</code> 的设置以利于适当地调优查询。机器速度慢也就罢了，我曾经见过速度很快的机器在运行设计良好的查询时由于负载过重而失败，因为 <code>mysqld</code> 被大量繁忙的工作所占用而不能服务查询。<a name="N100C3"><span class="atitle">记录慢速查询</span></a></p>
<p>在一个 SQL 服务器中，数据表都是保存在磁盘上的。索引为服务器提供了一种在表中查找特定数据行的方法，而不用搜索整个表。当必须要搜索整个表时，就称为<em>表扫描</em>。通常来说，您可能只希望获得表中数据的一个子集，因此全表扫描会浪费大量的磁盘 I/O，因此也就会浪费大量时间。当必须对数据进行连接时，这个问题就更加复杂了，因为必须要对连接两端的多行数据进行比较。</p>
<p>当然，表扫描并不总是会带来问题；有时读取整个表反而会比从中挑选出一部分数据更加有效（服务器进程中查询规划器用来作出这些决定）。如果索引的使用效率很低，或者根本就不能使用索引，则会减慢查询速度，而且随着服务器上的负载和表大小的增加，这个问题会变得更加显著。执行时间超过给定时间范围的查询就称为<em>慢速查询</em>。</p>
<p>您可以配置 <code>mysqld</code> 将这些慢速查询记录到适当命名的慢速查询日志中。管理员然后会查看这个日志来帮助他们确定应用程序中有哪些部分需要进一步调查。清单 1 给出了要启用慢速查询日志需要在 my.cnf 中所做的配置。<br />
<a name="listing1"><strong>清单 1. 启用 MySQL 慢速查询日志</strong></a></p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td class="code-outline">[mysqld] ; enable the slow query log, default 10 seconds log-slow-queries ; log queries taking longer than 5 seconds long_query_time = 5 ; log queries that don&#8217;t use indexes even if they take less than long_query_time ; MySQL 4.1 and newer only log-queries-not-using-indexes</td>
</tr>
</tbody>
</table>
<p> </p>
<p>这三个设置一起使用，可以记录执行时间超过 5 秒和没有使用索引的查询。请注意有关 <code>log-queries-not-using-indexes</code> 的警告：您必须使用 MySQL 4.1 或更高版本。慢速查询日志都保存在 MySQL 数据目录中，名为 <em>hostname</em>-slow.log。如果希望使用一个不同的名字或路径，可以在 my.cnf 中使用 <code>log-slow-queries = /new/path/to/file</code> 实现此目的。</p>
<p>阅读慢速查询日志最好是通过 <code>mysqldumpslow</code> 命令进行。指定日志文件的路径，就可以看到一个慢速查询的排序后的列表，并且还显示了它们在日志文件中出现的次数。一个非常有用的特性是 <code>mysqldumpslow</code> 在比较结果之前，会删除任何用户指定的数据，因此对同一个查询的不同调用被计为一次；这可以帮助找出需要工作量最多的查询。<a name="N100FF"><span class="atitle">对查询进行缓存</span></a></p>
<p>很多 LAMP 应用程序都严重依赖于数据库，但却会反复执行相同的查询。每次执行查询时，数据库都必须要执行相同的工作 —— 对查询进行分析，确定如何执行查询，从磁盘中加载信息，然后将结果返回给客户机。MySQL 有一个特性称为<em>查询缓存</em>，它将（后面会用到的）查询结果保存在内存中。在很多情况下，这会极大地提高性能。不过，问题是查询缓存在默认情况下是禁用的。</p>
<p>将 <code>query_cache_size = 32M</code> 添加到 /etc/my.conf 中可以启用 32MB 的查询缓存。</p>
<p><a name="N10112"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">监视查询缓存</span></strong></span></a></p>
<p>在启用查询缓存之后，重要的是要理解它是否得到了有效的使用。MySQL 有几个可以查看的变量，可以用来了解缓存中的情况。清单 2 给出了缓存的状态。</p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td class="code-outline">mysql&gt; SHOW STATUS LIKE &#8216;qcache%&#8217;; +&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;+ | Variable_name | Value | +&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;+ | Qcache_free_blocks | 5216 | | Qcache_free_memory | 14640664 | | Qcache_hits | 2581646882 | | Qcache_inserts | 360210964 | | Qcache_lowmem_prunes | 281680433 | | Qcache_not_cached | 79740667 | | Qcache_queries_in_cache | 16927 | | Qcache_total_blocks | 47042 | +&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;+ 8 rows in set (0.00 sec)</td>
</tr>
</tbody>
</table>
<p> </p>
<p>这些项的解释如表 1 所示。<br />
<a name="table1"><strong>表 1. MySQL 查询缓存变量</strong></a></p>
<table class="data-table-1" border="0" cellspacing="0" cellpadding="0" width="80%" summary="Timers">
<tbody>
<tr>
<th>变量名</th>
<th>说明</th>
</tr>
<tr>
<td><code>Qcache_free_blocks</code></td>
<td>缓存中相邻内存块的个数。数目大说明可能有碎片。<code>FLUSH QUERY CACHE</code> 会对缓存中的碎片进行整理，从而得到一个空闲块。</td>
</tr>
<tr>
<td><code>Qcache_free_memory</code></td>
<td>缓存中的空闲内存。</td>
</tr>
<tr>
<td><code>Qcache_hits</code></td>
<td>每次查询在缓存中命中时就增大。</td>
</tr>
<tr>
<td><code>Qcache_inserts</code></td>
<td>每次插入一个查询时就增大。命中次数除以插入次数就是不中比率；用 1 减去这个值就是命中率。在上面这个例子中，大约有 87% 的查询都在缓存中命中。</td>
</tr>
<tr>
<td><code>Qcache_lowmem_prunes</code></td>
<td>缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数。这个数字最好长时间来看；如果这个数字在不断增长，就表示可能碎片非常严重，或者内存很少。（上面的 <code>free_blocks</code> 和 <code>free_memory</code> 可以告诉您属于哪种情况）。</td>
</tr>
<tr>
<td><code>Qcache_not_cached</code></td>
<td>不适合进行缓存的查询的数量，通常是由于这些查询不是 <code>SELECT</code> 语句。</td>
</tr>
<tr>
<td><code>Qcache_queries_in_cache</code></td>
<td>当前缓存的查询（和响应）的数量。</td>
</tr>
<tr>
<td><code>Qcache_total_blocks</code></td>
<td>缓存中块的数量。</td>
</tr>
</tbody>
</table>
<p>通常，间隔几秒显示这些变量就可以看出区别，这可以帮助确定缓存是否正在有效地使用。运行 <code>FLUSH STATUS</code> 可以重置一些计数器，如果服务器已经运行了一段时间，这会非常有帮助。</p>
<p>使用非常大的查询缓存，期望可以缓存所有东西，这种想法非常诱人。由于 <code>mysqld</code> 必须要对缓存进行维护，例如当内存变得很低时执行剪除，因此服务器可能会在试图管理缓存时而陷入困境。作为一条规则，如果 <code>FLUSH QUERY CACHE</code> 占用了很长时间，那就说明缓存太大了。</p>
<p><a name="N101CB"><span class="atitle">强制限制</span></a></p>
<p>您可以在 <code>mysqld</code> 中强制一些限制来确保系统负载不会导致资源耗尽的情况出现。清单 3 给出了 my.cnf 中与资源有关的一些重要设置。<br />
<a name="listing3"><strong>清单 3. MySQL 资源设置</strong></a></p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td class="code-outline">set-variable=max_connections=500 set-variable=wait_timeout=10 max_connect_errors = 100</td>
</tr>
</tbody>
</table>
<p> </p>
<p>连接最大个数是在第一行中进行管理的。与 Apache 中的 <code>MaxClients</code> 类似，其想法是确保只建立服务允许数目的连接。要确定服务器上目前建立过的最大连接数，请执行 <code>SHOW STATUS LIKE 'max_used_connections'</code>。</p>
<p>第 2 行告诉 <code>mysqld</code> 终止所有空闲时间超过 10 秒的连接。在 LAMP 应用程序中，连接数据库的时间通常就是 Web 服务器处理请求所花费的时间。有时候，如果负载过重，连接会挂起，并且会占用连接表空间。如果有多个交互用户或使用了到数据库的持久连接，那么将这个值设低一点并不可取！</p>
<p>最后一行是一个安全的方法。如果一个主机在连接到服务器时有问题，并重试很多次后放弃，那么这个主机就会被锁定，直到 <code>FLUSH HOSTS</code> 之后才能运行。默认情况下，10 次失败就足以导致锁定了。将这个值修改为 100 会给服务器足够的时间来从问题中恢复。如果重试 100 次都无法建立连接，那么使用再高的值也不会有太多帮助，可能它根本就无法连接。<a name="N101FB"><span class="atitle">缓冲区和缓存</span></a></p>
<p>MySQL 支持超过 100 个的可调节设置；但是幸运的是，掌握少数几个就可以满足大部分需要。查找这些设置的正确值可以通过 <code>SHOW STATUS</code> 命令查看状态变量，从中可以确定 <code>mysqld</code> 的运作情况是否符合我们的预期。给缓冲区和缓存分配的内存不能超过系统中的现有内存，因此调优通常都需要进行一些妥协。</p>
<p>MySQL 可调节设置可以应用于整个 <code>mysqld</code> 进程，也可以应用于单个客户机会话。</p>
<p><a name="N10213"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">服务器端的设置</span></strong></span></a></p>
<p>每个表都可以表示为磁盘上的一个文件，必须先打开，后读取。为了加快从文件中读取数据的过程，<code>mysqld</code> 对这些打开文件进行了缓存，其最大数目由 /etc/mysqld.conf 中的 <code>table_cache</code> 指定。清单 4 给出了显示与打开表有关的活动的方式。<br />
<a name="listing4"><strong>清单 4. 显示打开表的活动</strong></a></p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td class="code-outline">mysql&gt; SHOW STATUS LIKE &#8216;open%tables&#8217;;</p>
<p>+&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;-+<br />
|Variable_name | Value |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;-+ |<br />
Open_tables | 5000 |<br />
| Opened_tables | 195 |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;-+<br />
2 rows in set (0.00 sec)</td>
</tr>
</tbody>
</table>
<p> </p>
<p>清单 4 说明目前有 5,000 个表是打开的，有 195 个表需要打开，因为现在缓存中已经没有可用文件描述符了（由于统计信息在前面已经清除了，因此可能会存在 5,000 个打开表中只有 195 个打开记录的情况）。如果 <code>Opened_tables</code> 随着重新运行 <code>SHOW STATUS</code> 命令快速增加，就说明缓存命中率不够。如果 <code>Open_tables</code> 比 <code>table_cache</code> 设置小很多，就说明该值太大了（不过有空间可以增长总不是什么坏事）。例如，使用 <code>table_cache = 5000</code> 可以调整表的缓存。</p>
<p>与表的缓存类似，对于线程来说也有一个缓存。 <code>mysqld</code> 在接收连接时会根据需要生成线程。在一个连接变化很快的繁忙服务器上，对线程进行缓存便于以后使用可以加快最初的连接。</p>
<p>清单 5 显示如何确定是否缓存了足够的线程。<br />
<a name="listing5"><strong>清单 5. 显示线程使用统计信息</strong></a></p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td class="code-outline">mysql&gt; SHOW STATUS LIKE &#8216;threads%&#8217;; +&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8211;+ | Variable_name | Value | +&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8211;+ | Threads_cached | 27 | | Threads_connected | 15 | | Threads_created | 838610 | | Threads_running | 3 | +&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8211;+ 4 rows in set (0.00 sec)</td>
</tr>
</tbody>
</table>
<p> </p>
<p>此处重要的值是 <code>Threads_created</code>，每次 <code>mysqld</code> 需要创建一个新线程时，这个值都会增加。如果这个数字在连续执行 <code>SHOW STATUS</code> 命令时快速增加，就应该尝试增大线程缓存。例如，可以在 my.cnf 中使用 <code>thread_cache = 40</code> 来实现此目的。</p>
<p>关键字缓冲区保存了 MyISAM 表的索引块。理想情况下，对于这些块的请求应该来自于内存，而不是来自于磁盘。清单 6 显示了如何确定有多少块是从磁盘中读取的，以及有多少块是从内存中读取的。<br />
<a name="listing6"><strong>清单 6. 确定关键字效率</strong></a></p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td class="code-outline">mysql&gt; show status like &#8216;%key_read%&#8217;; +&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8211;+ | Variable_name | Value | +&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8211;+ | Key_read_requests | 163554268 | | Key_reads | 98247 | +&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8211;+ 2 rows in set (0.00 sec)</td>
</tr>
</tbody>
</table>
<p> </p>
<p><code>Key_reads</code> 代表命中磁盘的请求个数， <code>Key_read_requests</code> 是总数。命中磁盘的读请求数除以读请求总数就是不中比率 —— 在本例中每 1,000 个请求，大约有 0.6 个没有命中内存。如果每 1,000 个请求中命中磁盘的数目超过 1 个，就应该考虑增大关键字缓冲区了。例如，<code>key_buffer = 384M</code> 会将缓冲区设置为 384MB。</p>
<p>临时表可以在更高级的查询中使用，其中数据在进一步进行处理（例如 <code>GROUP BY</code> 字句）之前，都必须先保存到临时表中；理想情况下，在内存中创建临时表。但是如果临时表变得太大，就需要写入磁盘中。清单 7 给出了与临时表创建有关的统计信息。<br />
<a name="listing7"><strong>清单 7. 确定临时表的使用</strong></a></p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td class="code-outline">mysql&gt; SHOW STATUS LIKE &#8216;created_tmp%&#8217;; +&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;-+ | Variable_name | Value | +&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;-+ | Created_tmp_disk_tables | 30660 | | Created_tmp_files | 2 | | Created_tmp_tables | 32912 | +&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;-+ 3 rows in set (0.00 sec)</td>
</tr>
</tbody>
</table>
<p> </p>
<p>每次使用临时表都会增大 <code>Created_tmp_tables</code>；基于磁盘的表也会增大 <code>Created_tmp_disk_tables</code>。对于这个比率，并没有什么严格的规则，因为这依赖于所涉及的查询。长时间观察 <code>Created_tmp_disk_tables</code> 会显示所创建的磁盘表的比率，您可以确定设置的效率。 <code>tmp_table_size</code> 和 <code>max_heap_table_size</code> 都可以控制临时表的最大大小，因此请确保在 my.cnf 中对这两个值都进行了设置。</p>
<p><a name="N102B0"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">每个会话的设置</span></strong></span></a></p>
<p>下面这些设置针对于每个会话。在设置这些数字时要十分谨慎，因为它们在乘以可能存在的连接数时候，这些选项表示大量的内存！您可以通过代码修改会话中的这些数字，或者在 my.cnf 中为所有会话修改这些设置。</p>
<p>当 MySQL 必须要进行排序时，就会在从磁盘上读取数据时分配一个排序缓冲区来存放这些数据行。如果要排序的数据太大，那么数据就必须保存到磁盘上的临时文件中，并再次进行排序。如果 <code>sort_merge_passes</code> 状态变量很大，这就指示了磁盘的活动情况。清单 8 给出了一些与排序相关的状态计数器信息。<br />
<a name="listing8"><strong>清单 8. 显示排序统计信息</strong></a></p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td class="code-outline">mysql&gt; SHOW STATUS LIKE &#8220;sort%&#8221;; +&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;+ | Variable_name | Value | +&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;+ | Sort_merge_passes | 1 | | Sort_range | 79192 | | Sort_rows | 2066532 | | Sort_scan | 44006 | +&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;+ 4 rows in set (0.00 sec)</td>
</tr>
</tbody>
</table>
<p> </p>
<p>如果 <code>sort_merge_passes</code> 很大，就表示需要注意 <code>sort_buffer_size</code>。例如， <code>sort_buffer_size = 4M</code> 将排序缓冲区设置为 4MB。</p>
<p>MySQL 也会分配一些内存来读取表。理想情况下，索引提供了足够多的信息，可以只读入所需要的行，但是有时候查询（设计不佳或数据本性使然）需要读取表中大量数据。要理解这种行为，需要知道运行了多少个 <code>SELECT</code> 语句，以及需要读取表中的下一行数据的次数（而不是通过索引直接访问）。实现这种功能的命令如清单 9 所示。<br />
<a name="listing9"><strong>清单 9. 确定表扫描比率</strong></a></p>
<table border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td class="code-outline">mysql&gt; SHOW STATUS LIKE &#8220;com_select&#8221;; +&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8211;+ | Variable_name | Value | +&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8211;+ | Com_select | 318243 | +&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8211;+ 1 row in set (0.00 sec) mysql&gt; SHOW STATUS LIKE &#8220;handler_read_rnd_next&#8221;; +&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8211;+ | Variable_name | Value | +&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8211;+ | Handler_read_rnd_next | 165959471 | +&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8211;+ 1 row in set (0.00 sec)</td>
</tr>
</tbody>
</table>
<p> </p>
<p><code>Handler_read_rnd_next</code> / <code>Com_select</code> 得出了表扫描比率 —— 在本例中是 521:1。如果该值超过 4000，就应该查看 <code>read_buffer_size</code>，例如 <code>read_buffer_size = 4M</code>。如果这个数字超过了 8M，就应该与开发人员讨论一下对这些查询进行调优了！</p>
<p> </p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td><img src="http://www.ibm.com/i/c.gif" border="0" alt="" width="8" height="6" /></td>
</tr>
</tbody>
</table>
<table class="no-print" border="0" cellspacing="0" cellpadding="0" align="right">
<tbody>
<tr align="right">
<td><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4" /></p>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="middle"> </td>
<td align="right" valign="top"><strong></strong></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<p><a name="N102FD"><span class="atitle">3 个必不可少的工具</span></a></p>
<p>尽管在了解具体设置时，<code>SHOW STATUS</code> 命令会非常有用，但是您还需要一些工具来解释 <code>mysqld</code> 所提供的大量数据。我发现有 3 个工具是必不可少的；在 <a href="http://www.tisswb.cn/wp-admin/#resources"><span style="color: #5c81a7;">参考资料</span></a> 一节中您可以找到相应的链接。</p>
<p>大部分系统管理员都非常熟悉 <code>top</code> 命令，它为任务所消耗的 CPU 和内存提供了一个不断更新的视图。 <code>mytop</code> 对 <code>top</code> 进行了仿真；它为所有连接上的客户机以及它们正在运行的查询提供了一个视图。<code>mytop</code> 还提供了一个有关关键字缓冲区和查询缓存效率的实时数据和历史数据，以及有关正在运行的查询的统计信息。这是一个很有用的工具，可以查看系统中（比如 10 秒钟之内）的状况，您可以获得有关服务器健康信息的视图，并显示导致问题的任何连接。</p>
<p><code>mysqlard</code> 是一个连接到 MySQL 服务器上的守护程序，负责每 5 分钟搜集一次数据，并将它们存储到后台的一个 Round Robin Database 中。有一个 Web 页面会显示这些数据，例如表缓存的使用情况、关键字效率、连接上的客户机以及临时表的使用情况。尽管 <code>mytop</code> 提供了服务器健康信息的快照，但是 <code>mysqlard</code> 则提供了长期的健康信息。作为奖励，<code>mysqlard</code> 使用自己搜集到的一些信息针对如何对服务器进行调优给出一些建议。</p>
<p>搜集 <code>SHOW STATUS</code> 信息的另外一个工具是 <code>mysqlreport</code>。其报告要远比 <code>mysqlard</code> 更加复杂，因为需要对服务器的每个方面都进行分析。这是对服务器进行调优的一个非常好的工具，因为它对状态变量进行适当计算来帮助确定需要修正哪些问题。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.cn/archives/26.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LAMP系统性能调优(2): 优化 Apache 和 PHP</title>
		<link>http://www.tisswb.cn/archives/24.html</link>
		<comments>http://www.tisswb.cn/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.cn/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.cn/archives/24.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LAMP系统性能调优(1): 理解 LAMP 架构</title>
		<link>http://www.tisswb.cn/archives/23.html</link>
		<comments>http://www.tisswb.cn/archives/23.html#comments</comments>
		<pubDate>Tue, 01 Apr 2008 15:56:01 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[Linux/Unix]]></category>
		<category><![CDATA[Web服务器]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[LAMP]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=23</guid>
		<description><![CDATA[Linux、Apache、MySQL 和 PHP（或 Perl）是许多 Web 应用程序的基础 —— 从 to-do 列表到 blog，再到电子商务站点。WordPress 和 Pligg 是两个支持大容量 Web 站点的常用软件包。这种架构简称为 LAMP。几乎每个 Linux 发布版都包含 Apache、MySQL、PHP 和 Perl，所以安装 LAMP 软件是非常容易的。
安装的简便性使人误以为这些软件会自行顺利地运行，但是实际情况并非如此。最终，应用程序的负载会超出后端服务器自带设置的处理能力，应用程序的性能会降低。LAMP 安装需要不断监控、调优和评估。
系统调优对于不同的人有不同的含义。本系列主要关注 LAMP 组件（Linux、Apache、MySQL 和 PHP）的调优。对应用程序本身进行调优是另一个复杂的问题。应用程序和后端服务器之间存在一种共生关系：未能适当调优的服务器甚至会使最好的应用程序在负载之下崩溃，而借助充分的调优，完全可以避免编写得很糟糕的应用程序使服务器缓慢如牛。幸运的是，正确的系统调优和监视可以指出应用程序中的问题。
<span class="readmore"><a href="http://www.tisswb.cn/archives/23.html" title="LAMP系统性能调优(1): 理解 LAMP 架构" target="_blank">阅读全文——共6380字</a></span>]]></description>
			<content:encoded><![CDATA[<p>Linux、Apache、MySQL 和 PHP（或 Perl）是许多 Web 应用程序的基础 —— 从 to-do 列表到 blog，再到电子商务站点。WordPress 和 Pligg 是两个支持大容量 Web 站点的常用软件包。这种架构简称为 LAMP。几乎每个 Linux 发布版都包含 Apache、MySQL、PHP 和 Perl，所以安装 LAMP 软件是非常容易的。</p>
<p>安装的简便性使人误以为这些软件会自行顺利地运行，但是实际情况并非如此。最终，应用程序的负载会超出后端服务器自带设置的处理能力，应用程序的性能会降低。LAMP 安装需要不断监控、调优和评估。</p>
<p>系统调优对于不同的人有不同的含义。本系列主要关注 LAMP 组件（Linux、Apache、MySQL 和 PHP）的调优。对应用程序本身进行调优是另一个复杂的问题。应用程序和后端服务器之间存在一种共生关系：未能适当调优的服务器甚至会使最好的应用程序在负载之下崩溃，而借助充分的调优，完全可以避免编写得很糟糕的应用程序使服务器缓慢如牛。幸运的是，正确的系统调优和监视可以指出应用程序中的问题。</p>
<p><a name="N10065"><span class="atitle">LAMP 架构</span></a></p>
<p>对任何系统进行调优的第一步都是了解它的工作原理。按照最简单的形式，基于 LAMP 的应用程序是用 PHP 这样的脚本语言编写的，它们作为 Linux 主机上运行的 Apache Web 服务器的一部分运行。</p>
<p>PHP 应用程序通过请求的 URL、所有表单数据和已捕获的任意会话信息从客户机获得信息，从而确定应该执行什么操作。如有必要，服务器会从 MySQL 数据库（也在 Linux 上运行）获得信息，将这些信息与一些 Hypertext Markup Language（HTML）模板组合在一起，并将结果返回给客户机。当用户在应用程序中导航时，这个过程重复进行；当多个用户访问系统时，这个过程会并发进行。但是，数据流不是单向的，因为可以用来自用户的信息更新数据库，包括会话数据、统计数据（包括投票）和用户提交的内容（比如评论或站点更新）。除了动态元素之外，还有静态元素，比如图像、JavaScript 代码和层叠样式表（CSS）。</p>
<p>在研究 LAMP 系统中的请求流之后，就来看看可能出现性能瓶颈的地方。数据库提供许多动态信息，所以数据库对查询的响应延迟都会反映在客户机中。Web 服务器必须能够快速地执行脚本，还要能够处理多个并发请求。最后，底层操作系统必须处于良好的状态才能支持应用程序。通过网络在不同服务器之间共享文件的其他设置也可能成为瓶颈。</p>
<p><a name="N1008C"><span class="atitle">度量性能</span></a></p>
<p>持续地对性能进行度量在两个方面有帮助。首先，度量可以帮助了解性能趋势，包括好坏两方面的趋势。作为一个简单的方法，查看一下 Web 服务器上的中央处理单元（CPU）使用率，就可以了解 CPU 是否负载过重。同样，查看过去使用的总带宽并推断未来的变化，可以帮助判断什么时候需要进行网络升级。这些度量最好与其他度量和观测结合考虑。例如，当用户抱怨应用程序太慢时，可以检查磁盘操作是否达到了最大容量。</p>
<p>性能度量的第二个用途是，判断调优是对系统性能有帮助，还是使它更糟糕了。方法是比较修改之前和之后的度量结果。但是，为了进行有效的比较，每次应该只修改一个设置，然后对适当的指标进行比较以判断修改的效果。每次只修改一个设置的原因应该是很明显的：同时做出的两个修改很可能会相互影响。选择用来进行比较的指标比较微妙。</p>
<p>选择的指标必须能够反映应用程序用户感觉到的响应。如果一项修改的目标是减少数据库的内存占用量，那么取消各种缓冲区肯定会有帮助，但是这会牺牲查询速度和应用程序性能。所以，应该选择应用程序响应时间这样的指标，这会使调优向着正确的方向发展，而不仅仅是针对数据库内存使用量。</p>
<p>可以以许多方式度量应用程序响应时间。最简单的方法可能是使用 <code>curl</code> 命令，见清单 1。<br />
<a name="list1"><strong>清单 1. 使用 cURL 度量 Web 站点的响应时间</strong></a></p>
<table border="0" cellspacing="0" cellpadding="0" width="85%">
<tbody>
<tr>
<td class="code-outline">$ curl -o /dev/null -s -w %{time_connect}:%{time_starttransfer}:%{time_total} http://www.canada.com 0.081:0.272:0.779</td>
</tr>
</tbody>
</table>
<p> </p>
<p>清单 1 给出对一个流行的新闻站点执行 <code>curl</code> 命令的情况。输出通常是 HTML 代码，通过 <code>-o</code> 参数发送到 <code>/dev/null</code>。<code>-s</code> 参数去掉所有状态信息。<code>-w</code> 参数让 <code>curl</code> 写出表 1 列出的计时器的状态信息：<br />
<a name="table1"><strong>表 1. curl 使用的计时器</strong></a></p>
<table class="data-table-1" border="0" cellspacing="0" cellpadding="0" width="85%" summary="Timers">
<tbody>
<tr>
<th scope="col">计时器</th>
<th scope="col">描述</th>
</tr>
<tr>
<th class="tb-row" scope="row">time_connect</th>
<td>建立到服务器的 TCP 连接所用的时间</td>
</tr>
<tr>
<th class="tb-row" scope="row">time_starttransfer</th>
<td>在发出请求之后，Web 服务器返回数据的第一个字节所用的时间</td>
</tr>
<tr>
<th class="tb-row" scope="row">time_total</th>
<td>完成请求所用的时间</td>
</tr>
</tbody>
</table>
<p> </p>
<p>这些计时器都相对于事务的起始时间，甚至要先于 Domain Name Service（DNS）查询。因此，在发出请求之后，Web 服务器处理请求并开始发回数据所用的时间是 0.272 &#8211; 0.081 = 0.191 秒。客户机从服务器下载数据所用的时间是 0.779 &#8211; 0.272 = 0.507 秒。</p>
<p>通过观察 <code>curl</code> 数据及其随时间变化的趋势，可以很好地了解站点对用户的响应性。</p>
<p>当然，Web 站点不仅仅由页面组成。它还有图像、JavaScript 代码、CSS 和 cookie 要处理。<code>curl</code> 很适合了解单一元素的响应时间，但是有时候需要了解整个页面的装载速度。</p>
<p>用于 Firefox 浏览器的 Tamper Data 扩展（参见 <a href="http://www.tisswb.cn/wp-admin/#resources"><span style="color: #5c81a7;">参考资料</span></a> 一节中的链接）可以在日志中记录 Web 浏览器发出的每个请求，并显示每个请求所用的下载时间。使用这个扩展的方法是，选择 <strong>Tools &gt; Tamper Data</strong> 来打开 Ongoing requests 窗口。装载要考察的页面，然后就会看到浏览器发出的每个请求的状态和装载每个元素所用的时间。图 1 给出装载 developerWorks 主页的结果。<br />
<a name="fig1"><strong>图 1. 用于装载 developerWorks 主页的请求细目</strong></a><br />
 <img class="alignnone" src="http://www.ibm.com/developerworks/cn/linux/l-tune-lamp-1/tamper1.jpg" alt="" /></p>
<p>每一行描述一个元素的装载情况。显示的数据包括发出请求的时间、装载所用的时间、大小和结果。Duration 栏列出装载元素本身所用的时间，Total Duration 栏列出所有子元素所用的时间。在图 1 中，装载主要页面所用的时间是 516 毫秒（ms），但是装载所有东西并显示整个页面所用的时间是 5101 ms。</p>
<p>Tamper Data 扩展有一种有用的模式，将页面装载数据的输出绘制成图形。右击 Ongoing requests 窗口上半部分的任何地方，并选择 <strong>Graph all</strong>。图 2 显示图 1 中数据的图形化视图。<br />
<a name="fig2"><strong>图 2. 用于装载 developerWorks 主页的请求的图形化视图</strong></a><br />
 <img src="http://www.ibm.com/developerworks/cn/linux/l-tune-lamp-1/tamper2.jpg" alt="" width="569" height="389" /></p>
<p>在图 2 中，每个请求的持续时间显示为深蓝色，并相对于页面装载的启始时间显示。所以，可以看出哪些请求使整个页面的装载变慢了。</p>
<p>尽管关注的重点是页面装载时间和用户体验，但是也不要忽视核心系统指标，比如磁盘、内存和网络。有许多实用程序可以捕获这些信息；其中最有帮助的可能是 <code>sar</code>、<code>vmstat</code> 和 <code>iostat</code>。关于这些工具的更多信息，请参见 <a href="http://www.tisswb.cn/wp-admin/#resources"><span style="color: #5c81a7;">参考资料</span></a> 一节.</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td> </td>
</tr>
</tbody>
</table>
<p><a name="N1015F"><span class="atitle">基本系统调节</span></a></p>
<p>在对系统的 Apache、PHP 和 MySQL 组件进行调优之前，应该花一些时间确保底层 Linux 组件的运行正常。还应该对正在运行的服务进行缩减，只运行需要的那些服务。这不但是一种良好的安全实践，而且可以节省内存和 CPU 时间。</p>
<p><a name="N10169"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">一些快速的内核调优措施</span></strong></span></a></p>
<p>大多数 Linux 发布版都定义了适当的缓冲区和其他 Transmission Control Protocol（TCP）参数。可以修改这些参数来分配更多的内存，从而改进网络性能。设置内核参数的方法是通过 <code>proc</code> 接口，也就是通过读写 <code>/proc</code> 中的值。幸运的是，<code>sysctl</code> 可以读取 <code>/etc/sysctl.conf</code> 中的值并根据需要填充 <code>/proc</code>，这样就能够更轻松地管理这些参数。清单 2 展示在互联网服务器上应用于 Internet 服务器的一些比较激进的网络设置。<br />
<a name="list2"><strong>清单 2. 包含较为激进的网络设置的 /etc/sysctl.conf</strong></a></p>
<table border="0" cellspacing="0" cellpadding="0" width="85%">
<tbody>
<tr>
<td class="code-outline"># Use TCP syncookies when needed net.ipv4.tcp_syncookies = 1 # Enable TCP window scaling net.ipv4.tcp_window_scaling: = 1 # Increase TCP max buffer size net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 # Increase Linux autotuning TCP buffer limits net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216 # Increase number of ports available net.ipv4.ip_local_port_range = 1024 65000</td>
</tr>
</tbody>
</table>
<p> </p>
<p>将这些设置添加到 <code>/etc/sysctl.conf</code> 的现有内容中。第一个设置启用 TCP SYN cookie。当从客户机发来新的 TCP 连接时，数据包设置了 SYN 位，服务器就为这个半开的连接创建一个条目，并用一个 SYN-ACK 数据包进行响应。在正常操作中，远程客户机用一个 ACK 数据包进行响应，这会使半开的连接转换为全开的。有一种称为 <em>SYN 泛滥（SYN flood）</em> 的网络攻击，它使 ACK 数据包无法返回，导致服务器用光内存空间，无法处理到来的连接。SYN cookie 特性可以识别出这种情况，并使用一种优雅的方法保留队列中的空间（细节参见 <a href="http://www.tisswb.cn/wp-admin/#resources"><span style="color: #5c81a7;">参考资料</span></a> 一节）。大多数系统都默认启用这个特性，但是确保配置这个特性更可靠。</p>
<p>启用 TCP 窗口伸缩使客户机能够以更高的速度下载数据。TCP 允许在未从远程端收到确认的情况下发送多个数据包，默认设置是最多 64 KB，在与延迟比较大的远程客户机进行通信时这个设置可能不够。窗口伸缩会在头中启用更多的位，从而增加窗口大小。</p>
<p>后面四个配置项增加 TCP 发送和接收缓冲区。这使应用程序可以更快地丢掉它的数据，从而为另一个请求服务。还可以强化远程客户机在服务器繁忙时发送数据的能力。</p>
<p>最后一个配置项增加可用的本地端口数量，这样就增加了可以同时服务的最大连接数量。</p>
<p>在下一次引导系统时，或者下一次运行 <code>sysctl -p /etc/sysctl.conf</code> 时，这些设置就会生效。</p>
<p><a name="N101AF"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">配置磁盘来提高性能</span></strong></span></a></p>
<p>磁盘在 LAMP 架构中扮演着重要的角色。静态文件、模板和代码都来自磁盘，组成数据库的数据表和索引也来自磁盘。对磁盘的许多调优（尤其是对于数据库）集中于避免磁盘访问，因为磁盘访问的延迟相当高。因此，花一些时间对磁盘硬件进行优化是有意义的。</p>
<p>首先要做的是，确保在文件系统上禁用 <code>atime</code> 日志记录特性。<code>atime</code> 是最近访问文件的时间，每当访问文件时，底层文件系统必须记录这个时间戳。因为系统管理员很少使用 <code>atime</code>，禁用它可以减少磁盘访问时间。禁用这个特性的方法是，在 <code>/etc/fstab</code> 的第四列中添加 <code>noatime</code> 选项。清单 3 给出了一个配置示例。<br />
<a name="list3"><strong>清单 3. 演示如何启用 noatime 的 fstab 示例</strong></a></p>
<table border="0" cellspacing="0" cellpadding="0" width="85%">
<tbody>
<tr>
<td class="code-outline">/dev/VolGroup00/LogVol00 / ext3 defaults,noatime 1 1 LABEL=/boot /boot ext3 defaults,noatime 1 2 devpts /dev/pts devpts gid=5,mode=620 0 0 tmpfs /dev/shm tmpfs defaults 0 0 proc /proc proc defaults 0 0 sysfs /sys sysfs defaults 0 0 LABEL=SWAP-hdb2 swap swap defaults 0 0 LABEL=SWAP-hda3 swap swap defaults 0 0</td>
</tr>
</tbody>
</table>
<p> </p>
<p>在清单 3 中只修改了 ext3 文件系统，因为 <code>noatime</code> 只对驻留在磁盘上的文件系统有帮助。为让这一修改生效，不需要重新引导；只需重新挂装每个文件系统。例如，为了重新挂装根文件系统，运行 <code>mount / -o remount</code>。</p>
<p>有多种磁盘硬件组合，而且 Linux 不一定能够探测出访问磁盘的最佳方式。可以使用 <code>hdparm</code> 命令查明和设置用来访问 IDE 磁盘的方法。<code>hdparm -t /path/to/device</code> 执行速度测试，可以将这个测试结果作为性能基准。为了使结果尽可能准确，在运行这个命令时系统应该是空闲的。清单 4 给出在 <code>hda</code> 上执行速度测试的结果。<br />
<a name="list4"><strong>清单 4. 在 /dev/hd 上执行的速度测试</strong></a></p>
<table border="0" cellspacing="0" cellpadding="0" width="85%">
<tbody>
<tr>
<td class="code-outline"># hdparm -t /dev/hda /dev/hda: Timing buffered disk reads: 182 MB in 3.02 seconds = 60.31 MB/sec</td>
</tr>
</tbody>
</table>
<p> </p>
<p>这一测试说明，在这个磁盘上读取数据的速度是大约每秒 60 MB。</p>
<p>在尝试一些磁盘调优选项之前，必须注意一个问题。错误的设置可能损害文件系统。有时候会出现一个警告，指出这个选项与硬件不兼容；但是，有时候没有警告消息。因此，在将系统投入生产之前，必须对设置进行彻底的测试。在所有服务器上都采用标准的硬件也会有所帮助。</p>
<p>表 2 列出比较常用的一些选项。<br />
<a name="table2"><strong>表 2. hdparm 的常用选项</strong></a></p>
<table class="data-table-1" border="0" cellspacing="0" cellpadding="0" width="85%">
<tbody>
<tr>
<th scope="col">选项</th>
<th scope="col">描述</th>
</tr>
<tr>
<th class="tb-row" scope="row">-vi</th>
<td>向磁盘查询它支持的设置以及它正在使用的设置。</td>
</tr>
<tr>
<th class="tb-row" scope="row">-c</th>
<td>查询/启用 (E)IDE 32 位 I/O 支持。<code>hdparm -c 1 /dev/hda</code> 启用这个设置。</td>
</tr>
<tr>
<th class="tb-row" scope="row">-m</th>
<td>查询/设置每中断多扇区模式。如果设置大于零，设置值就是每个中断可以传输的最大扇区数量。</td>
</tr>
<tr>
<th class="tb-row" scope="row">-d 1 -X</th>
<td>启用直接内存访问（DMA）传输并设置 IDE 传输模式。<code>hdparm</code> 手册页详细说明了在 <code>-X</code> 后面可以设置的数字。只有在 <code>-vi</code> 说明目前并未使用最快速的模式的情况下，才需要进行这个设置。</td>
</tr>
</tbody>
</table>
<p> </p>
<p>不幸的是，对于 Fiber Channel and Small Computer Systems Interface（SCSI）系统，调优依赖于具体的驱动器。</p>
<p>必须将有帮助的设置添加到启动脚本中，比如 <code>rc.local</code>。</p>
<p><a name="N10274"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">网络文件系统调优</span></strong></span></a></p>
<p>网络文件系统（NFS）是一种通过网络共享磁盘的方法。NFS 可以帮助确保每个主机具有相同数据的拷贝，并确保修改反映在所有节点上。但是，在默认情况下，NFS 的配置不适合大容量磁盘。</p>
<p>每个客户机应该用 <code>rsize=32768,wsize=32768,intr,noatime</code> 挂装远程文件系统，从而确保：</p>
<ul>
<li>使用大的读/写块（数字指定最大块大小，在这个示例中是 32KB）。</li>
<li>在挂起时 NFS 操作可以被中断。</li>
<li>不持续更新 <code>atime</code>。</li>
</ul>
<p> </p>
<p>可以将这些设置放在 <code>/etc/fstab</code> 中，见 <a href="http://www.tisswb.cn/wp-admin/#list3"><span style="color: #5c81a7;">清单 3</span></a>。如果使用自动挂装器，那么应该将这些设置放在适当的 <code>/etc/auto.*</code> 文件中。</p>
<p>在服务器端，一定要确保有足够的 NFS 内核线程来处理所有客户机。在默认情况下，只启动一个线程，但是 Red Hat 和 Fedora 系统会启动 8 个线程。对于繁忙的 NFS 服务器，应该提高这个数字，比如 32 或 64。可以用 <code>nfsstat -rc</code> 命令评估客户机，了解是否有阻塞的现象，这个命令显示客户机远程过程调用（RPC）统计数据。清单 5 显示一个 Web 服务器的客户机统计数据。<br />
<a name="list5"><strong>清单 5. 显示 NFS 客户机的 RPC 统计数据</strong></a></p>
<table border="0" cellspacing="0" cellpadding="0" width="85%">
<tbody>
<tr>
<td class="code-outline"># nfsstat -rc Client rpc stats: calls retrans authrefrsh 1465903813 0 0</td>
</tr>
</tbody>
</table>
<p> </p>
<p>第二列 <code>retrans</code> 是零，这表示从上一次重新引导以来没有出现需要重新传输的情况。如果这个数字比较大，就应该考虑增加 NFS 内核线程。设置方法是将所需的线程数量传递给 <code>rpc.nfsd</code>，比如 <code>rpc.nfsd 128</code> 会启动 128 个线程。任何时候都可以进行这种设置。线程会根据需要启动或销毁。同样，这个设置应该放在启动脚本中，尤其是在系统上启用 NFS 的脚本。</p>
<p>关于 NFS，最后要注意一点：如果可能的话，应该避免使用 NFSv2，因为 NFSv2 的性能比 v3 和 v4 差得多。在现代的 Linux 发行版中这应该不是问题，但是可以在服务器上检查 <code>nfsstat</code> 的输出，了解是否有任何 NFSv2 调用。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.cn/archives/23.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ubuntu用APT的方式安装LAMP</title>
		<link>http://www.tisswb.cn/archives/9.html</link>
		<comments>http://www.tisswb.cn/archives/9.html#comments</comments>
		<pubDate>Fri, 28 Mar 2008 05:05:32 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[Linux/Unix]]></category>
		<category><![CDATA[Web服务器]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[apt]]></category>
		<category><![CDATA[LAMP]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=9</guid>
		<description><![CDATA[1 .要用apt-get的方式安装，最好，也可能是必须先运行下面在命令升级自己的系统，我的就只能先升级后才能安装mysql5 + Apache2 + PHP5的。
我在没升级前运行sudo apt-get install apache2 php5 mysql-server 是没有用的。而如果你找的源不好或是你的网络不稳定的话，你也有可能升级不成。这样的话，你想用apt-get的方式来安装一些软件时可能是不能安装的。
#sudo apt-get update
#sudo apt-get dist-upgrade
2.安装：
#sudo apt-get install mysql-server
安装上mysql5
#sudo apt-get install apache2
安装apache2
#sudo apt-get install php5
<span class="readmore"><a href="http://www.tisswb.cn/archives/9.html" title="ubuntu用APT的方式安装LAMP" target="_blank">阅读全文——共1672字</a></span>]]></description>
			<content:encoded><![CDATA[<p>1 .要用apt-get的方式安装，最好，也可能是必须先运行下面在命令升级自己的系统，我的就只能先升级后才能安装mysql5 + Apache2 + PHP5的。<br />
我在没升级前运行sudo apt-get install apache2 php5 mysql-server 是没有用的。而如果你找的源不好或是你的网络不稳定的话，你也有可能升级不成。这样的话，你想用apt-get的方式来安装一些软件时可能是不能安装的。<br />
#sudo apt-get update<br />
#sudo apt-get dist-upgrade</p>
<p>2.安装：<br />
#sudo apt-get install mysql-server<br />
安装上mysql5<br />
#sudo apt-get install apache2<br />
安装apache2<br />
#sudo apt-get install php5<br />
安装php5<br />
#sudo apt-get install php5-mysql<br />
安装php的mysql模块<br />
#sudo apt-get install php5-gd<br />
安装GD库<br />
在运行上面的命令的时候，可以留心看下libapache2-mod-auth-mysql（安装apache2时可能会安上）和libapache2-mod-php5,如果看到安上了就不用再单独安装了。</p>
<p>3 . 配置：</p>
<p>我们刚安装上的MYSQL，只有一个系统默认的root用户，而且是没有密码的，此时我们一定要给MYSQL设置一个密码，个人认为一定要的。因为我第一 次安装时就是没有搞这一步，认为和win下的一样，可先不用设置。可是当我在http://127.0.0.1/phpmyadmin下用root不带密 码登陆时怎样也不会成功！<br />
终端下输入：<br />
#mysql -u root<br />
#mysql&gt; GRANT ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY “123456″;<br />
’123456‘是root的密码，可以自由设置，但最好是设个安全点的。<br />
#mysql&gt;q 退出mysql</p>
<p>mysql的配置文件-my.cnf:(路径：/etc/mysql/my.cnf)<br />
#sudo gedit /etc/mysql/my.conf #编辑my.conf</p>
<p>apache2的配置文件-apache2.conf(路径：/etc/apache2/apache2.conf)<br />
#sudo gedit /etc/apache2.conf #编辑apache22.conf</p>
<p>PHP的配置文件-php.ini:（路径：/etc/php5/apache2/php.ini）<br />
#sudo gedit /etc/php5/apache2/php.ini #编辑php.ini</p>
<p>此时这三个文件暂时不用编辑，如为了安全起见和优化，是一定要编辑的。具体的大家可参观其它资料，此篇暂不多说！！</p>
<p>4 . 安装phpmyadmin<br />
#sudo apt-get install phpmyadmin<br />
安装完毕可测试：http://127.0.0.1/phpmyadmin 当出来界面就行了，暂时先别登录，等改下你的PHPMYADMIN的配置文件（config.inc.php）再登陆。<br />
终端输入：sudo gedit /etc/phpmyadmin/config.inc.php<br />
找到$cfg[’Servers’][$i][’password’]= ”;<br />
改成：$cfg[’Servers’][$i][’password’]= ‘123456′;<br />
‘123456‘是刚才设置的mysql的密码。</p>
<p>5 . 此时最好重新启动计算机,（在网看到有人这样说，因是第二次安装也就照做了）打开浏览器http://localhost/phpmyadmin/<br />
用户名输入root,再输入刚改的密码，然后执行<br />
可以看到在win下那可亲的phpmyadmin面貌了。</p>
<p>小结：<br />
apache2的操作命令：<br />
启动：sudo /etc/init.d/apache2 start<br />
重启：sudo /etc/init.d/apache2 restart<br />
关闭：sudo /etc/init.d/apache2 stop<br />
apache2的默认主目录：/var/www/</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.cn/archives/9.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>打造Ubuntu下的LAMP</title>
		<link>http://www.tisswb.cn/archives/7.html</link>
		<comments>http://www.tisswb.cn/archives/7.html#comments</comments>
		<pubDate>Wed, 26 Mar 2008 16:31:29 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[Linux/Unix]]></category>
		<category><![CDATA[Web服务器]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[LAMP]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=7</guid>
		<description><![CDATA[现在LAMP（Linux+Apache+Mysql+PHP）架站模式是越来越流行了，几乎都可以说是成为了架站的时尚了。但常言道树大招风，相应的安全问题也就随之而来了，象层出不穷的SQL脚本注入(SQL Injection)及CSS跨站脚本攻击(Cross Site Script)等让人不厌其烦。那么有没有什么好的方法来尽量减少这方面的危险呢？甚至在事发之后可以有效的进行日志反查以明白其攻击手法为日后响应做准备呢？答案是肯定的！其实这已经不再属于局限于架站而更多属于安全的范畴了，也就是如标题所言要如何建立一个SLAMP（Security）服务器了。
本来是想利用makejail包做一个chroot环境的。但由于makejail包只在基于Debian woody的Apache 1.3.22 上做过测试，而由于没有时间，本人暂时也还没做过基于Ubuntu 5.04上的Apache2的测试，所以不敢妄语，有哪位朋友做过或有类似方式的话，还请不吝赐教！好了废话少说，下面就开始我们的安全架站之旅了。本文的所有操作在Ubuntu 5.04发行版上测试通过。具体步骤如下：
<span class="readmore"><a href="http://www.tisswb.cn/archives/7.html" title="打造Ubuntu下的LAMP" target="_blank">阅读全文——共4256字</a></span>]]></description>
			<content:encoded><![CDATA[<p><span class="postbody">现在LAMP（Linux+Apache+Mysql+PHP）架站模式是越来越流行了，几乎都可以说是成为了架站的时尚了。但常言道树大招风，相应的安全问题也就随之而来了，象层出不穷的SQL脚本注入(SQL Injection)及CSS跨站脚本攻击(Cross Site Script)等让人不厌其烦。那么有没有什么好的方法来尽量减少这方面的危险呢？甚至在事发之后可以有效的进行日志反查以明白其攻击手法为日后响应做准备呢？答案是肯定的！其实这已经不再属于局限于架站而更多属于安全的范畴了，也就是如标题所言要如何建立一个SLAMP（Security）服务器了。<br />
本来是想利用makejail包做一个chroot环境的。但由于makejail包只在基于Debian woody的Apache 1.3.22 上做过测试，而由于没有时间，本人暂时也还没做过基于Ubuntu 5.04上的Apache2的测试，所以不敢妄语，有哪位朋友做过或有类似方式的话，还请不吝赐教！好了废话少说，下面就开始我们的安全架站之旅了。本文的所有操作在Ubuntu 5.04发行版上测试通过。具体步骤如下：<br />
1.将系统更新到最新状态，在做任何操作之前都要做这一步，以确保系统的稳定，同时也不会有一些莫名其妙的现象出现。<br />
$sudo apt-get update<br />
$sudo apt-get upgrade-dist<br />
2.架设LAMP服务器<br />
$sudo apt-get apache2 mysql-server php4 php4-gd php4-mysql<br />
3.配置LAMP服务<br />
a) 我们编辑/etc/php4/apache2/php.ini文件，先做一般配置，在改动之前，请先将该配置文件做个备份。以便在出错的时候可以恢复。<br />
&gt;memory_limit = 8M =&gt;修改成你所需的内存大小<br />
&gt;upload_max_filesize = 2M =&gt;修改文件最大上传尺寸<br />
&gt;extension=mysql.so<br />
&gt;extension=gd.so =&gt;将你要用到模块前面的注释给去掉<br />
b) 这样LAMP服务就算是架设完成了，下面就要对该架构进行安全加固了。<br />
4.编辑/etc/apache2/apache2.conf文件，在改动之前，请先将该配置文件做个备份。以便在出错的时候可以恢复。<br />
&gt;AddDefaultCharset ISO-8859-1 =&gt;AddDefaultCharset GB2312<br />
6.然后开始加固php,我们再次编辑/etc/php4/apache2/php.ini文件，之所以没有一次改完，主要是为了给大家一个清晰的思路。<br />
&gt;#打开安全模式，打开他的好处就是PHP文件只能访问所有者和PHP文件所有着一样的文件，即使在chroot环境下也无法访问jail 中属主不一样的 文件，类似于php shell这样的后门就没用武之地了哦，phpshell是很流行的php后门，他可以执行系统命令，就象他的名字一样，和shell很接近。<br />
&gt;safe_mode = On</span><span class="postbody">&gt;#上面的设置就限制了fopen(), file()等函数可以操作的目录范围,避免了入侵者非法读取文件,一定要在/var/www后面加&#8221;/&#8221;,否则/var/wwww下的文件也能被访问 。<br />
&gt;open_basedir = /var/www/</span></p>
<div><span class="postbody">&gt;#禁止使用phpinfo和get_cfg_var函数，这样可以避免泄露服务信息，一般在在确认PHP能正常工作之后再使之关闭<br />
&gt;disable_functions = phpinfo,get_cfg_var</span></div>
<p><span class="postbody">&gt;#设置php程序错误日志<br />
&gt;error_reporting = E_ALL<br />
&gt;log_errors = On<br />
&gt;error_log = /var/log/php_err.log</p>
<p>&gt;#如果php程序没有指明需要register_globals的话，最好把register_globals设置为Off,这样可以避免很多安全问题的。注意，如果你的程序是需要register_globals的话，可千万别关。Ubuntu默认是关闭的。<br />
&gt;register_globals = Off</p>
<p>&gt;#禁止打开远程地址,记得最近出的php include的那个漏洞吗？就是在一个php程序中include了变量，那么入侵者就可以利用这个控制服务器在本地执行远程的一个php程序，例如phpshell,所以我们关闭这个。<br />
&gt;allow_url_fopen = Off</p>
<p>7.这样PHP的安全优化就做好了，下面做MySQL的安全优化。<br />
a)在Ubuntu下用apt装的mysql默认是禁止从网络连接MySQL的，我们可以从/etc/mysql/my.cnf文件中看到有 skip-networking语句的，如果你做的是MySQL服务器的话，那么是要将其注释掉的，这样其他机器才能访问你这台机器，如果该服务仅供本机使用的话，那么就保持原状，这样别的机器不能访问你这台机器的MySQL。由于这里是做在一起的，所以保持不变好了。</p>
<p>b)然后我们给mysql设置一个密码并修改管理员用户名(默认是root),但一定得记得，无论怎么样修改密码,都会有记录的,如果通过 mysqladmin修改，shell的历史记录会有的，如果登陆了mysql之后再修改，在 ~/.mysql_history会记录的，所以我们一定得处理这两个历史记录文件，我们把他们删了，再从/dev/null做个软连接过来就可以解决问题了。注意由于我们会在SHELL下用的是sudo，所以该历史是保存在本用户目录下的，而不是在根用户目录下的。而mysql也是在本用户目录下使用的，所以也是保存在本用户目录下的。如果你觉得不能记忆历史记录麻烦的话，也可以在用到了MySQL的Root用户之后，进入这两个文件中，将相关语句删除。<br />
$rm .bash_history<br />
$rm .mysql_history<br />
$ln -s /dev/null .bash_history<br />
$ln -s /dev/null .mysql_history</p>
<p>c)然后我们删除多余的数据库并去掉匿名帐号<br />
[root@debian ~]mysql -u root -p<br />
Enter password:XXXXXX<br />
mysql&gt; drop database test;<br />
mysql&gt; use mysql;<br />
mysql&gt; delete from db;<br />
mysql&gt; delete from user where user = &#8221;;<br />
mysql&gt; delete from user where not(host=&#8221;localhost&#8221;) and user=&#8221;root&#8221;;<br />
mysql&gt; flush privileges;</p>
<p>d)然后修改默认的管理员帐号root为你喜欢的,我这里改成myadmin<br />
mysql&gt; update user set user=&#8221;myadmin&#8221; where user=&#8221;root&#8221;;<br />
mysql&gt; flush privileges;<br />
这样就可以通过myadmin而不是root用户名来访问MySQL数据库了！</p>
<p>8.现在我们安装mod-security。<br />
a)首先安装libapache2-mod-security包<br />
$sudo apt-get install libapache2-mod-security</p>
<p>b)该模块默认是没激活的，我们可以在/etc/apache2/mods-available目录下看到有mod-security.load文件，但在/etc/apache2/mods-enabled目录却没有它的软链接。我们现在激活它：<br />
$sudo ln -s /etc/apache2/mods-available/mod-security.load /etc/apache2/mods-enabled/mod-security.load<br />
$sudo cp /usr/share/doc/libapache2-mod-security/examples/httpd2.conf.example-full /etc/apache2/mods-available/mod-security.conf<br />
$sudo vi /etc/apache2/mods-available/mod-security.conf，老规则改动之前先做好备份。<br />
&gt;# 检测内容长度以避免堆溢出攻击<br />
&gt;SecFilterForceByteRange 32 254 =&gt;SecFilterForceByteRange 32 126</p>
<p>&gt;# debug设置<br />
&gt;SecFilterDebugLevel 9 =&gt;SecFilterDebugLevel 0</p>
<p>&gt;# 设置缺省的动作<br />
&gt;SecFilterDefaultAction &#8220;deny,log,status:499&#8243; =&gt;SecFilterDefaultAction &#8220;deny,log,status:404&#8243;</p>
<p>&gt;# 把设置传递给子目录<br />
&gt;SecFilterInheritance Off</p>
<p>&gt;# Redirect user on filter match<br />
&gt;# 当匹配sh的时候,重新定向到一个特殊的警告页面,该页面是自行编写的，写些警告的话让攻击者知难而退，该段先不要生效，等到相关配置配好之后再失效不迟。记住在配好之后要使之生效。<br />
&gt;#SecFilter sh redirect:http://localhost/hack/warning.htm</p>
<p>&gt;# Prevent OS specific keywords<br />
&gt;#过滤一些敏感的东西，我们使用*是为了攻击者使用/etc/./passwd来绕开检测<br />
&gt;SecFilter /etc/passwd =&gt;SecFilter /etc/*passwd<br />
&gt;SecFilter /bin/*sh</p>
<p>&gt;# Very crude filters to prevent SQL injection attacks<br />
&gt;# 防止SQL插入(SQL Injection)攻击<br />
&gt;SecFilter &#8220;delete[[:space:]]+from&#8221;<br />
&gt;SecFilter &#8220;insert[[:space:]]+into&#8221;<br />
&gt;SecFilter &#8220;select.+from&#8221;<br />
&gt;SecFilter &#8220;select[[:space:]]+from&#8221;<br />
&gt;SecFilter &#8220;union[[:space:]]+from&#8221;</p>
<p>$sudo ln -s /etc/apache2/mods-available/mod-security.conf /etc/apache2/mods-enabled/mod-security.conf</p>
<p>c)重启Apache2服务即可。<br />
$sudo /etc/init.d/apache2 restart</p>
<p>希望对大家有所帮助！</p>
<p> </p>
<p></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.cn/archives/7.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
