<?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; nginx</title>
	<atom:link href="http://www.zfkun.com/index.php/tag/nginx/feed" rel="self" type="application/rss+xml" />
	<link>http://www.zfkun.com</link>
	<description>关注web前端,追逐html5脚步,体会code人生</description>
	<lastBuildDate>Mon, 23 Apr 2012 15:09:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Windows 下 Nginx + PHP5 的安装与配置</title>
		<link>http://www.zfkun.com/102.html</link>
		<comments>http://www.zfkun.com/102.html#comments</comments>
		<pubDate>Thu, 28 Jan 2010 15:26:33 +0000</pubDate>
		<dc:creator>影之迷惑</dc:creator>
				<category><![CDATA[开发编程]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.zfkun.com/blog/?p=102</guid>
		<description><![CDATA[Nginx 是一个轻量级的高性能 Http WebServer，以事件驱动方式编写，因此相比 Apache 而言，Nginx 更加稳定、性能更好，而且配置简单，资源占用较低。以下是在 Windows 7 安装中 Nginx 和 PHP5.3 的步骤。 <a href="http://www.zfkun.com/102.html">阅读全文 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Nginx 是一个轻量级的高性能 Http WebServer，以事件驱动方式编写，因此相比 Apache 而言，Nginx 更加稳定、性能更好，而且配置简单，资源占用较低。以下是在 Windows 7 安装中 Nginx 和 PHP5.3 的步骤。</p>
<p><strong>安装 PHP5<br />
</strong>首先，从 http://www.php.net/downloads.php 下载最新的 PHP 5.3 Windows 版本，解压至 C:\php5，把压缩包中的 php.ini-recommended，更名为 php.ini，然后打开修改几个选项：</p>
<p name="code" class="c">
error_reporting = E_ALL<br />
display_errors = On<br />
extension_dir = “C:\php5\ext”</p>
<p>; 动态扩展，可以根据需要去掉 extension 前面的注释 ;<br />
; 如加载 PDO, MySQL<br />
extension=php_pdo.dll<br />
extension=php_pdo_mysql.dll</p>
<p>; CGI 设置<br />
cgi.fix_pathinfo = 1
</p>
<p>PHP 加载扩展需要注意依赖性，比如 php_exif.dll 需要 php_mbstring.dll，你必须要把 php_mbstring.dll 放在 php_exif.dll 前面才能加载成功。有些扩展依赖额外的 dll 文件，如 PHP 5.0+ ，php_mysqli.dll 依赖 libmysql.dll，而 php_oci8.dll，你则需要安装 Oracle 8 的客户端。如果你对这些依赖性不是太了解，可以参考一下安装包中的 install.txt 文件。</p>
<p>依赖文件的搜索顺序：首先是 php.exe 所在的目录，如果是 ISAPI 模式，那么会搜索 Web Server 的启动位置，比如 Apache 的 bin 目录；其次是 Windows PATH 环境变量中的目录。这里不要复制任何文件到 Windows 目录中，有必要的话，可以把 C:\php5 加到 PATH 中，便于以后 PHP 的升级。</p>
<p><strong>安装 Nginx</strong><br />
从 v0.7.52 开始，Nginx 开始发布 Windows 版本的 Nginx，你可以在其官方网站上面下载：</p>
<p>http://nginx.net</p>
<p>如果需要老版本的 Nginx for Windows，可以在 Kevin Worthington 的网站上面找找。</p>
<p>我使用的是 0.8.29，下载好以后，解压释放文件到 C:\nginx。</p>
<p>那么如何配置 Nginx，使其可以和 PHP 协同工作？</p>
<p><strong>配置 PHP FastCGI<br />
</strong>Nginx 需要和 FastCGI Server 配合才能处理请求，有两种方式运行 PHP FastCGI Server，一种就是使用 PHP 内置的 FastCGI 管理器：</p>
<p name="code" class="c">
C:/php5/php-cgi.exe -b 127.0.0.1:9000 -c C:/php5/php.ini
</p>
<p>另外一种方式是使用第三方工具，比如 PHP-FPM 、cgi-fcgi 等。显然！要在 Windows 中使用这些工具是件极其痛苦的事情，你可能需要 Cygwin 之类的东西才行，的确有人这么做了，虽然我觉得那是自寻烦恼。</p>
<p>下一步，修改 Nginx ，将 php 请求转发至 PHP FastCGI Server：</p>
<p name="code" class="c">
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000<br />
location ~ ^(.+\.php)(.*)$ {<br />
root D:/public_html;<br />
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;<br />
include php.conf;<br />
}
</p>
<p>root 也就是 $document_root 指的是你的 php scripts 根目录，设置为你的网站根目录。在 Windows 下，需要注意的是 root 的路径，最好使用 “/” 作为路径分隔符，而不是 Windows 默认的 “\”，否则容易出问题，比如，这个路径：D:\public_html\test，就不会起作用，Nginx 会抛出 500 错误，原因是 \test 中 \t 被解析为制表符。当然再加上一个反斜杠转义也是可以的，如：D:\\public_html\\test。</p>
<p>php.conf 配置文件：</p>
<p name="code" class="c">
# 连接到本机 9000 端口，这里的端口是指 PHP FastCGI Server 开启的端口，<br />
# 请与 php-cgi.exe 开启的端口保持一致<br />
# 当 Nginx 收到 php 文件的请求时，会自动转发到 PHP FastCGI Server<br />
fastcgi_pass 127.0.0.1:9000;<br />
fastcgi_index index.php;</p>
<p># Nginx 默认是不支持 CGI PATH_INFO，SCRIPT_NAME 的值也不标准（糅合了 PATH_INFO）<br />
# 下面的两行指令，可以从 SCRIPT_NAME 中剥离出 PATH_INFO<br />
fastcgi_split_path_info ^(.+\.php)(.*)$;<br />
fastcgi_param PATH_INFO $fastcgi_path_info;</p>
<p>include fastcgi_params;
</p>
<p>创建一个独立的 php.conf 保存配置，纯粹是为了精简 nginx.conf，个人习惯而已，也可以全部写在主配置文件中。</p>
<p>修改 php.ini，设置 cgi.fix_pathinfo = 1，这非常重要，PHP 会修正 SCRIPT_FILENAME 为真实的文件地址，否则 PHP 将无法找到需要处理的 php 文件。</p>
<p>一些其他的设置，主服务器：</p>
<p name="code" class="c">
# 默认开启的进程数<br />
worker_processes 1;</p>
<p>error_log logs/error.log;<br />
#error_log logs/error.log notice;<br />
#error_log logs/error.log info;</p>
<p>#pid logs/nginx.pid;</p>
<p>events {<br />
# 一个进程所处理的最大连接数上限，<br />
# 本地开发，不需要默认的 1024，这里改为 64<br />
worker_connections 64;<br />
}
</p>
<p>当某个目录下面不存在默认 index.php index.html 等首页文件时，Nginx 会抛出 403 ERROR，如果你需要罗列此目录，则可以在 http {… } 中加入如下命令：</p>
<p name="code" class="c">
autoindex on;<br />
autoindex_exact_size on;<br />
autoindex_localtime on;
</p>
<p><strong>OK，整合到一起</strong><br />
创建 start_nginx.bat，用于同时启动 PHP FastCGI 和 Nginx：</p>
<p name="code" class="c">
@echo off<br />
REM Windows 下无效<br />
REM set PHP_FCGI_CHILDREN=5</p>
<p>REM 每个进程处理的最大请求数，或设置为 Windows 环境变量<br />
set PHP_FCGI_MAX_REQUESTS=1000</p>
<p>echo Starting PHP FastCGI&#8230;<br />
RunHiddenConsole C:/php5/php-cgi.exe -b 127.0.0.1:9000 -c C:/php5/php.ini</p>
<p>echo Starting nginx&#8230;<br />
C:/nginx/nginx.exe
</p>
<p>RunHiddenConsole.exe 是一个用来隐藏 DOS 窗口的小程序，可以在这里下载。<br />
start_nginx.bat 开启后，也会有 DOS 窗口，但是可以安全的关掉，并不会关闭 Nginx 和 php-cgi.exe。</p>
<p>同样 stop_nginx.bat，用来关闭：</p>
<p name="code" class="c">
@echo off<br />
echo Stopping nginx&#8230;<br />
taskkill /F /IM nginx.exe &gt; nul<br />
echo Stopping PHP FastCGI&#8230;<br />
taskkill /F /IM php-cgi.exe &gt; nul<br />
exit
</p>
<p>到这里基本配置完毕了。</p>

	标签：<a href="http://www.zfkun.com/tag/nginx" title="nginx" rel="tag">nginx</a>, <a href="http://www.zfkun.com/tag/php" title="PHP" rel="tag">PHP</a>, <a href="http://www.zfkun.com/tag/windows" title="windows" rel="tag">windows</a><br />

	<h4>相关推荐</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.zfkun.com/95.html" title="Nginx 0.8.x + PHP 5.2.10（FastCGI）搭建胜过Apache十倍的Web服务器（第5版） (2010 年 01 月 28 日)" data-comment="0">Nginx 0.8.x + PHP 5.2.10（FastCGI）搭建胜过Apache十倍的Web服务器（第5版）</a></li>
	<li><a href="http://www.zfkun.com/135.html" title="挑战 hax.tor.hu 申请带ssh的免费php+mysql空间 (2010 年 03 月 19 日)" data-comment="0">挑战 hax.tor.hu 申请带ssh的免费php+mysql空间</a></li>
	<li><a href="http://www.zfkun.com/277.html" title="微软MSDN windows 7 with sp1 中英文各版本x86x64下载地址 (2011 年 06 月 25 日)" data-comment="1">微软MSDN windows 7 with sp1 中英文各版本x86x64下载地址</a></li>
	<li><a href="http://www.zfkun.com/39.html" title="基于OpenCV的PHP图像人脸识别技术 (2010 年 01 月 16 日)" data-comment="0">基于OpenCV的PHP图像人脸识别技术</a></li>
	<li><a href="http://www.zfkun.com/223.html" title="动态生成windows快捷方式文件 (2011 年 04 月 02 日)" data-comment="0">动态生成windows快捷方式文件</a></li>
	<li><a href="http://www.zfkun.com/417.html" title="WordPress Rewrite SEO 之404方式折腾笔记 (2011 年 07 月 17 日)" data-comment="1">WordPress Rewrite SEO 之404方式折腾笔记</a></li>
	<li><a href="http://www.zfkun.com/226.html" title="Windows7下搭建Node.js环境 (2011 年 04 月 06 日)" data-comment="1">Windows7下搭建Node.js环境</a></li>
	<li><a href="http://www.zfkun.com/51.html" title="windows7 7068 X86三版本及下载 (2010 年 01 月 16 日)" data-comment="0">windows7 7068 X86三版本及下载</a></li>
	<li><a href="http://www.zfkun.com/449.html" title="Thinkpad 全系列驱动程序官方安装光盘下载 (2011 年 11 月 17 日)" data-comment="0">Thinkpad 全系列驱动程序官方安装光盘下载</a></li>
	<li><a href="http://www.zfkun.com/35.html" title="PHP CURL函数库 (2010 年 01 月 16 日)" data-comment="0">PHP CURL函数库</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zfkun.com/102.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nginx 0.8.x + PHP 5.2.10（FastCGI）搭建胜过Apache十倍的Web服务器（第5版）</title>
		<link>http://www.zfkun.com/95.html</link>
		<comments>http://www.zfkun.com/95.html#comments</comments>
		<pubDate>Wed, 27 Jan 2010 16:40:35 +0000</pubDate>
		<dc:creator>影之迷惑</dc:creator>
				<category><![CDATA[开发编程]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[apc]]></category>
		<category><![CDATA[centos]]></category>
		<category><![CDATA[epoll]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[httpd]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[memcache]]></category>
		<category><![CDATA[memcached]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[xcache]]></category>

		<guid isPermaLink="false">http://www.zfkun.com/blog/?p=95</guid>
		<description><![CDATA[本文是张宴撰写的关于搭建“Nginx + PHP（FastCGI）”Web服务器的第5篇文章。本系列文章作为国内最早详细介绍 Nginx + PHP 安装、配置、使用的资料之一，为推动 Nginx 在国内的发展产生了积极的作用。这是一篇关于Nginx 0.7.x系列版本的文章，安装、配置方式与第4篇文章相差不大，但增加了MySQL安装配置的信息、PHP 5.2.10 的 php-fpm 补丁。Nginx 0.7.x系列版本虽然为开发版，但在很多大型网站的生产环境中已经使用。 <a href="http://www.zfkun.com/95.html">阅读全文 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>[文章作者：张宴 本文版本：v5.5 最后修改：2009.09.18 原文链接：<a href="http://blog.s135.com/nginx_php_v5/" target="_blank">http://blog.s135.com/nginx_php_v5/</a>]</p>
<p>前言：本文是我撰写的关于搭建“Nginx + PHP（FastCGI）”Web服务器的第5篇文章。本系列文章作为国内最早详细介绍 Nginx + PHP 安装、配置、使用的资料之一，为推动 Nginx 在国内的发展产生了积极的作用。这是一篇关于Nginx 0.7.x系列版本的文章，安装、配置方式与第4篇文章相差不大，但增加了MySQL安装配置的信息、<strong>PHP 5.2.10 的 php-fpm 补丁</strong>。Nginx 0.7.x系列版本虽然为开发版，但在很多大型网站的生产环境中已经使用。</p>
<p>链接：《<a href="http://blog.s135.com/post/297/" target="_blank">2007年9月的第1版</a>》、《<a href="http://blog.s135.com/post/314/" target="_blank">2007年12月的第2版</a>》、《<a href="http://blog.s135.com/post/351/" target="_blank">2008年6月的第3版</a>》、《<a href="http://blog.s135.com/nginx_php_v4/" target="_blank">2008年8月的第4版</a>》</p>
<p><a href="http://blog.s135.com/attachment/200806/nginx.png" target="_blank"><img title="点击在新窗口中浏览此图片" src="http://blog.s135.com/attachment/200806/nginx.png" alt="点击在新窗口中浏览此图片" border="0" /></a></p>
<p><a href="http://www.nginx.net/" target="_blank">Nginx</a> (“engine x”) 是一个高性能的 HTTP 和反向代理服务器，也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的，它已经在该站点运行超过两年半了。Igor 将源代码以类BSD许可证的形式发布。</p>
<p>Nginx 超越 Apache 的高性能和稳定性，使得国内使用 Nginx 作为 Web 服务器的网站也越来越多，其中包括<a href="http://blog.sina.com.cn/" target="_blank">新浪博客</a>、<a href="http://v.sina.com.cn/" target="_blank">新浪播客</a>、<a href="http://news.163.com/" target="_blank">网易新闻</a>等门户网站频道，<a href="http://www.6.cn/" target="_blank">六间房</a>、<a href="http://www.56.com/" target="_blank">56.com</a>等视频分享网站，<a href="http://www.discuz.net/" target="_blank">Discuz!官方论坛</a>、<a href="http://www.newsmth.net/" target="_blank">水木社区</a>等知名论坛，<a href="http://www.douban.com/" target="_blank">豆瓣</a>、<a href="http://www.yupoo.com/" target="_blank">YUPOO相册</a>、<a href="http://www.hainei.com/" target="_blank">海内SNS</a>、<a href="http://www.xunlei.com/" target="_blank">迅雷在线</a>等新兴Web 2.0网站。</p>
<p>Nginx 的官方中文维基：<a href="http://wiki.nginx.org/NginxChs" target="_blank">http://wiki.nginx.org/NginxChs</a></p>
<p>在高并发连接的情况下，Nginx是Apache服务器不错的替代品。Nginx同时也可以作为7层负载均衡服务器来使用。根据我的测试结果，<strong>Nginx 0.8.15 + PHP 5.2.10 (FastCGI) 可以承受3万以上的并发连接数，相当于同等环境下Apache的10倍</strong>。</p>
<p>根据我的经验，4GB内存的服务器+Apache（prefork模式）一般只能处理3000个并发连接，因为它们将占用3GB以上的内存，还得为系统预留1GB的内存。我曾经就有两台Apache服务器，因为在配置文件中设置的MaxClients为4000，当Apache并发连接数达到3800时，导致服务器内存和Swap空间用满而崩溃。</p>
<p>而这台 Nginx 0.8.15 + PHP 5.2.10 (FastCGI) 服务器在3万并发连接下，开启的10个Nginx进程消耗150M内存（15M*10=150M），开启的64个php-cgi进程消耗1280M内存（20M*64=1280M），加上系统自身消耗的内存，总共消耗不到2GB内存。如果服务器内存较小，完全可以只开启25个php-cgi进程，这样php-cgi消耗的总内存数才500M。</p>
<p>在3万并发连接下，访问Nginx 0.8.15 + PHP 5.2.10 (FastCGI) 服务器的PHP程序，仍然速度飞快。下图为Nginx的状态监控页面，显示的活动连接数为28457（关于Nginx的监控页配置，会在本文接下来所给出的Nginx配置文件中写明）：</p>
<p><a href="http://blog.s135.com/attachment/200712/nginx_status.png" target="_blank"><img title="点击在新窗口中浏览此图片" src="http://blog.s135.com/attachment/200712/nginx_status.png" alt="点击在新窗口中浏览此图片" border="0" /></a></p>
<p>我生产环境下的两台Nginx + PHP5（FastCGI）服务器，跑多个一般复杂的纯PHP动态程序，单台Nginx + PHP5（FastCGI）服务器跑PHP动态程序的处理能力已经超过“700次请求/秒”，相当于每天可以承受6000万（700*60*60*24=60480000）的访问量（<a href="http://blog.s135.com/read.php/334.htm" target="_blank">更多信息见此</a>），而服务器的系统负载也不高：</p>
<p><a href="http://blog.s135.com/attachment/200803/nginx_php_la.gif" target="_blank"><img title="点击在新窗口中浏览此图片" src="http://blog.s135.com/attachment/200803/nginx_php_la.gif" alt="点击在新窗口中浏览此图片" border="0" /></a></p>
<p>2009年9月3日下午2：30，金山游戏《剑侠情缘网络版叁》临时维护1小时（<a href="http://kefu.xoyo.com/gonggao/jx3/2009-09-03/750438.shtml" target="_blank">http://kefu.xoyo.com/gonggao/jx3/2009-09-03/750438.shtml</a>），大量玩家上官网，论坛、评论、客服等动态应用Nginx服务器集群，每台服务器的Nginx活动连接数达到2.8万，这是笔者遇到的Nginx生产环境最高并发值。</p>
<p><a href="http://blog.s135.com/attachment/200909/nginx_c30k.png" target="_blank"><img title="点击在新窗口中浏览此图片" src="http://blog.s135.com/attachment/200909/nginx_c30k.png" alt="点击在新窗口中浏览此图片" border="0" /></a></p>
<hr />
<p>下面是用100个并发连接分别去压生产环境中同一负载均衡器VIP下、提供相同服务的两台服务器，一台为Nginx，另一台为Apache，Nginx每秒处理的请求数是Apache的两倍多，Nginx服务器的系统负载、CPU使用率远低于Apache：</p>
<p>你可以将连接数开到10000～30000，去压Nginx和Apache上的phpinfo.php，这是用浏览器访问Nginx上的phpinfo.php一切正常，而访问Apache服务器的phpinfo.php，则是该页无法显示。4G内存的服务器，即使再优化，Apache也很难在“webbench -c 30000 -t 60 http://xxx.xxx.xxx.xxx/phpinfo.php”的压力情况下正常访问，而调整参数优化后的Nginx可以。</p>
<p>webbench 下载地址：<a href="http://blog.s135.com/post/288/" target="_blank">http://blog.s135.com/post/288/</a></p>
<p>注意：webbench 做压力测试时，该软件自身也会消耗CPU和内存资源，为了测试准确，请将 webbench 安装在别的服务器上。</p>
<p>测试结果：##### Nginx + PHP #####</p>
<p class="c">[root@localhost webbench-1.5]# webbench -c 100 -t 30 http://192.168.1.21/phpinfo.php<br />
Webbench &#8211; Simple Web Benchmark 1.5<br />
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.</p>
<p>Benchmarking: GET http://192.168.1.21/phpinfo.php<br />
100 clients, running 30 sec.</p>
<p>Speed=102450 pages/min, 16490596 bytes/sec.<br />
Requests: 51225 susceed, 0 failed.</p>
<p>top &#8211; 14:06:13 up 27 days,  2:25,  2 users,  load average: 14.57, 9.89, 6.51<br />
Tasks: 287 total,   4 running, 283 sleeping,   0 stopped,   0 zombie<br />
Cpu(s): 49.9% us,  6.7% sy,  0.0% ni, 41.4% id,  1.1% wa,  0.1% hi,  0.8% si<br />
Mem:   6230016k total,  2959468k used,  3270548k free,   635992k buffers<br />
Swap:  2031608k total,     3696k used,  2027912k free,  1231444k cached</p>
<p>测试结果：#####  Apache + PHP #####</p>
<p class="c">[root@localhost webbench-1.5]# webbench -c 100 -t 30 http://192.168.1.27/phpinfo.php<br />
Webbench &#8211; Simple Web Benchmark 1.5<br />
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.</p>
<p>Benchmarking: GET http://192.168.1.27/phpinfo.php<br />
100 clients, running 30 sec.</p>
<p>Speed=42184 pages/min, 31512914 bytes/sec.<br />
Requests: 21092 susceed, 0 failed.</p>
<p>top &#8211; 14:06:20 up 27 days,  2:13,  2 users,  load average: 62.15, 26.36, 13.42<br />
Tasks: 318 total,   7 running, 310 sleeping,   0 stopped,   1 zombie<br />
Cpu(s): 80.4% us, 10.6% sy,  0.0% ni,  7.9% id,  0.1% wa,  0.1% hi,  0.9% si<br />
Mem:   6230016k total,  3075948k used,  3154068k free,   379896k buffers<br />
Swap:  2031608k total,    12592k used,  2019016k free,  1117868k cached</p>
<p>为什么Nginx的性能要比Apache高得多？这得益于Nginx使用了最新的epoll（Linux 2.6内核）和kqueue（freebsd）网络I/O模型，而Apache则使用的是传统的select模型。目前Linux下能够承受高并发访问的Squid、Memcached都采用的是epoll网络I/O模型。</p>
<p>处理大量的连接的读写，Apache所采用的select网络I/O模型非常低效。下面用一个比喻来解析Apache采用的select模型和Nginx采用的epoll模型进行之间的区别：</p>
<p>假设你在大学读书，住的宿舍楼有很多间房间，你的朋友要来找你。select版宿管大妈就会带着你的朋友挨个房间去找，直到找到你为止。而epoll版宿管大妈会先记下每位同学的房间号，你的朋友来时，只需告诉你的朋友你住在哪个房间即可，不用亲自带着你的朋友满大楼找人。如果来了10000个人，都要找自己住这栋楼的同学时，select版和epoll版宿管大妈，谁的效率更高，不言自明。同理，在高并发服务器中，轮询I/O是最耗时间的操作之一，select和epoll的性能谁的性能更高，同样十分明了。</p>
<p>安装步骤：<br />
（系统要求：Linux 2.6+ 内核，本文中的Linux操作系统为CentOS 5.3，另在RedHat AS4上也安装成功）<br />
<strong>一、获取相关开源程序：</strong><br />
1、【适用CentOS操作系统】利用CentOS Linux系统自带的yum命令安装、升级所需的程序库（RedHat等其他Linux发行版可从安装光盘中找到这些程序库的RPM包，进行安装）：</p>
<p class="c">sudo -s<br />
LANG=C<br />
yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers</p>
<p>2、【适用RedHat操作系统】RedHat等其他Linux发行版可从安装光盘中找到这些程序库的RPM包（事先可通过类似“rpm -qa | grep libjpeg”的命令查看所需的RPM包是否存在，通常是“xxx-devel”不存在，需要安装）。RedHat可以直接利用CentOS的RPM包安装，以下是RPM包下载网址：<br />
①、RedHat AS4 &amp; CentOS 4<br />
<a href="http://mirrors.163.com/centos/4/os/i386/CentOS/RPMS/" target="_blank">http://mirrors.163.com/centos/4/os/i386/CentOS/RPMS/</a><br />
<a href="http://mirrors.163.com/centos/4/os/x86_64/CentOS/RPMS/" target="_blank">http://mirrors.163.com/centos/4/os/x86_64/CentOS/RPMS/</a></p>
<p>②、RedHat AS5 &amp; CentOS 5<br />
<a href="http://mirrors.163.com/centos/5/os/i386/CentOS/" target="_blank">http://mirrors.163.com/centos/5/os/i386/CentOS/</a><br />
<a href="http://mirrors.163.com/centos/5/os/x86_64/CentOS/" target="_blank">http://mirrors.163.com/centos/5/os/x86_64/CentOS/</a></p>
<p>③、RPM包搜索网站<br />
<a href="http://rpm.pbone.net/" target="_blank">http://rpm.pbone.net/</a><br />
<a href="http://www.rpmfind.net/" target="_blank">http://www.rpmfind.net/</a></p>
<p>④、RedHat AS4 系统环境，通常情况下缺少的支持包安装：<br />
Ⅰ、i386 系统</p>
<p class="c">wget http://blog.s135.com/soft/linux/nginx_php/rpm/i386/libjpeg-devel-6b-33.i386.rpm<br />
rpm -ivh libjpeg-devel-6b-33.i386.rpm<br />
wget http://blog.s135.com/soft/linux/nginx_php/rpm/i386/freetype-devel-2.1.9-1.i386.rpm<br />
rpm -ivh freetype-devel-2.1.9-1.i386.rpm<br />
wget http://blog.s135.com/soft/linux/nginx_php/rpm/i386/libpng-devel-1.2.7-1.i386.rpm<br />
rpm -ivh libpng-devel-1.2.7-1.i386.rpm</p>
<p>Ⅱ、x86_64 系统</p>
<p class="c">wget http://blog.s135.com/soft/linux/nginx_php/rpm/x86_64/libjpeg-devel-6b-33.x86_64.rpm<br />
rpm -ivh libjpeg-devel-6b-33.x86_64.rpm<br />
wget http://blog.s135.com/soft/linux/nginx_php/rpm/x86_64/freetype-devel-2.1.9-1.x86_64.rpm<br />
rpm -ivh freetype-devel-2.1.9-1.x86_64.rpm<br />
wget http://blog.s135.com/soft/linux/nginx_php/rpm/x86_64/libpng-devel-1.2.7-1.x86_64.rpm<br />
rpm -ivh libpng-devel-1.2.7-1.x86_64.rpm</p>
<p>3、【适用CentOS、RedHat及其它Linux操作系统】下载程序源码包：<br />
本文中提到的所有开源软件为截止到2009年09月18日的最新稳定版。<br />
①、从软件的官方网站下载：</p>
<p class="c">mkdir -p /data0/software<br />
cd /data0/software<br />
wget http://sysoev.ru/nginx/nginx-0.8.15.tar.gz<br />
wget http://www.php.net/get/php-5.2.10.tar.gz/from/this/mirror<br />
wget http://blog.s135.com/soft/linux/nginx_php/phpfpm/php-5.2.10-fpm-0.5.11.diff.gz<br />
wget http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.38.tar.gz/from/http://mysql.he.net/<br />
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.tar.gz<br />
wget http://downloads.sourceforge.net/mcrypt/libmcrypt-2.5.8.tar.gz?modtime=1171868460&amp;big_mirror=0<br />
wget http://downloads.sourceforge.net/mcrypt/mcrypt-2.6.8.tar.gz?modtime=1194463373&amp;big_mirror=0<br />
wget http://pecl.php.net/get/memcache-2.2.5.tgz<br />
wget http://downloads.sourceforge.net/mhash/mhash-0.9.9.9.tar.gz?modtime=1175740843&amp;big_mirror=0<br />
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.9.tar.gz<br />
wget http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.tar.bz2<br />
wget http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz<br />
wget http://blog.s135.com/soft/linux/nginx_php/imagick/ImageMagick.tar.gz<br />
wget http://pecl.php.net/get/imagick-2.2.2.tgz</p>
<p>②、从blog.s135.com下载（比较稳定，只允许在本站，或者在Linux/Unix下通过Wget、Curl等命令下载以下软件）：</p>
<p class="c">mkdir -p /data0/software<br />
cd /data0/software<br />
wget http://blog.s135.com/soft/linux/nginx_php/nginx/nginx-0.8.15.tar.gz<br />
wget http://blog.s135.com/soft/linux/nginx_php/php/php-5.2.10.tar.gz<br />
wget http://blog.s135.com/soft/linux/nginx_php/phpfpm/php-5.2.10-fpm-0.5.11.diff.gz<br />
wget http://blog.s135.com/soft/linux/nginx_php/mysql/mysql-5.1.38.tar.gz<br />
wget http://blog.s135.com/soft/linux/nginx_php/libiconv/libiconv-1.13.tar.gz<br />
wget http://blog.s135.com/soft/linux/nginx_php/mcrypt/libmcrypt-2.5.8.tar.gz<br />
wget http://blog.s135.com/soft/linux/nginx_php/mcrypt/mcrypt-2.6.8.tar.gz<br />
wget http://blog.s135.com/soft/linux/nginx_php/memcache/memcache-2.2.5.tgz<br />
wget http://blog.s135.com/soft/linux/nginx_php/mhash/mhash-0.9.9.9.tar.gz<br />
wget http://blog.s135.com/soft/linux/nginx_php/pcre/pcre-7.9.tar.gz<br />
wget http://blog.s135.com/soft/linux/nginx_php/eaccelerator/eaccelerator-0.9.5.3.tar.bz2<br />
wget http://blog.s135.com/soft/linux/nginx_php/pdo/PDO_MYSQL-1.0.2.tgz<br />
wget http://blog.s135.com/soft/linux/nginx_php/imagick/ImageMagick.tar.gz<br />
wget http://blog.s135.com/soft/linux/nginx_php/imagick/imagick-2.2.2.tgz</p>
<p><strong>二、安装PHP 5.2.10（FastCGI模式）</strong><br />
1、编译安装PHP 5.2.10所需的支持库：</p>
<p class="c">tar zxvf libiconv-1.13.tar.gz<br />
cd libiconv-1.13/<br />
./configure &#8211;prefix=/usr/local<br />
make<br />
make install<br />
cd ../</p>
<p>tar zxvf libmcrypt-2.5.8.tar.gz<br />
cd libmcrypt-2.5.8/<br />
./configure<br />
make<br />
make install<br />
/sbin/ldconfig<br />
cd libltdl/<br />
./configure &#8211;enable-ltdl-install<br />
make<br />
make install<br />
cd ../../</p>
<p>tar zxvf mhash-0.9.9.9.tar.gz<br />
cd mhash-0.9.9.9/<br />
./configure<br />
make<br />
make install<br />
cd ../</p>
<p>ln -s /usr/local/lib/libmcrypt.la /usr/lib/libmcrypt.la<br />
ln -s /usr/local/lib/libmcrypt.so /usr/lib/libmcrypt.so<br />
ln -s /usr/local/lib/libmcrypt.so.4 /usr/lib/libmcrypt.so.4<br />
ln -s /usr/local/lib/libmcrypt.so.4.4.8 /usr/lib/libmcrypt.so.4.4.8<br />
ln -s /usr/local/lib/libmhash.a /usr/lib/libmhash.a<br />
ln -s /usr/local/lib/libmhash.la /usr/lib/libmhash.la<br />
ln -s /usr/local/lib/libmhash.so /usr/lib/libmhash.so<br />
ln -s /usr/local/lib/libmhash.so.2 /usr/lib/libmhash.so.2<br />
ln -s /usr/local/lib/libmhash.so.2.0.1 /usr/lib/libmhash.so.2.0.1</p>
<p>tar zxvf mcrypt-2.6.8.tar.gz<br />
cd mcrypt-2.6.8/<br />
/sbin/ldconfig<br />
./configure<br />
make<br />
make install<br />
cd ../</p>
<p>2、编译安装MySQL 5.1.38</p>
<p class="c">/usr/sbin/groupadd mysql<br />
/usr/sbin/useradd -g mysql mysql<br />
tar zxvf mysql-5.1.38.tar.gz<br />
cd mysql-5.1.38/<br />
./configure &#8211;prefix=/usr/local/webserver/mysql/ &#8211;enable-assembler &#8211;with-extra-charsets=complex &#8211;enable-thread-safe-client &#8211;with-big-tables &#8211;with-readline &#8211;with-ssl &#8211;with-embedded-server &#8211;enable-local-infile &#8211;with-plugins=innobase<br />
make &amp;&amp; make install<br />
chmod +w /usr/local/webserver/mysql<br />
chown -R mysql:mysql /usr/local/webserver/mysql<br />
cd ../</p>
<p>附：以下为附加步骤，如果你想在这台服务器上运行MySQL数据库，则执行以下两步。如果你只是希望让PHP支持MySQL扩展库，能够连接其他服务器上的MySQL数据库，那么，以下两步无需执行。</p>
<p>①、创建MySQL数据库存放目录</p>
<p class="c">mkdir -p /data0/mysql/3306/data/<br />
chown -R mysql:mysql /data0/mysql/</p>
<p>②、以mysql用户帐号的身份建立数据表：</p>
<p class="c">/usr/local/webserver/mysql/bin/mysql_install_db &#8211;basedir=/usr/local/webserver/mysql &#8211;datadir=/data0/mysql/3306/data &#8211;user=mysql</p>
<p>③、创建my.cnf配置文件：</p>
<p class="c">vi /data0/mysql/3306/my.cnf</p>
<p>输入以下内容：</p>
<p class="c">[client]<br />
default-character-set = utf8<br />
port    = 3306<br />
socket  = /tmp/mysql.sock</p>
<p>[mysql]<br />
prompt=”(\u:blog.s135.com:)[\d]&gt; ”<br />
no-auto-rehash</p>
<p>[mysqld]<br />
#default-character-set = utf8<br />
user    = mysql<br />
port    = 3306<br />
socket  = /tmp/mysql.sock<br />
basedir = /usr/local/webserver/mysql<br />
datadir = /data0/mysql/3306/data<br />
open_files_limit    = 10240<br />
back_log = 600<br />
max_connections = 3000<br />
max_connect_errors = 6000<br />
table_cache = 614<br />
external-locking = FALSE<br />
max_allowed_packet = 32M<br />
sort_buffer_size = 2M<br />
join_buffer_size = 2M<br />
thread_cache_size = 300<br />
thread_concurrency = 8<br />
query_cache_size = 32M<br />
query_cache_limit = 2M<br />
query_cache_min_res_unit = 2k<br />
default-storage-engine = MyISAM<br />
default_table_type = MyISAM<br />
thread_stack = 192K<br />
transaction_isolation = READ-COMMITTED<br />
tmp_table_size = 246M<br />
max_heap_table_size = 246M<br />
long_query_time = 1<br />
log_long_format<br />
log-bin = /data0/mysql/3306/binlog<br />
binlog_cache_size = 4M<br />
binlog_format = MIXED<br />
max_binlog_cache_size = 8M<br />
max_binlog_size = 512M<br />
expire_logs_days = 7<br />
key_buffer_size = 256M<br />
read_buffer_size = 1M<br />
read_rnd_buffer_size = 16M<br />
bulk_insert_buffer_size = 64M<br />
myisam_sort_buffer_size = 128M<br />
myisam_max_sort_file_size = 10G<br />
myisam_max_extra_sort_file_size = 10G<br />
myisam_repair_threads = 1<br />
myisam_recover</p>
<p>skip-name-resolve<br />
master-connect-retry = 10<br />
slave-skip-errors = 1032,1062,126,1114,1146,1048,1396</p>
<p>server-id = 1</p>
<p>innodb_additional_mem_pool_size = 16M<br />
innodb_buffer_pool_size = 2048M<br />
innodb_data_file_path = ibdata1:1024M:autoextend<br />
innodb_file_io_threads = 4<br />
innodb_thread_concurrency = 8<br />
innodb_flush_log_at_trx_commit = 2<br />
innodb_log_buffer_size = 16M<br />
innodb_log_file_size = 128M<br />
innodb_log_files_in_group = 3<br />
innodb_max_dirty_pages_pct = 90<br />
innodb_lock_wait_timeout = 120<br />
innodb_file_per_table = 0<br />
[mysqldump]<br />
quick<br />
max_allowed_packet = 32M</p>
<p>④、创建管理MySQL数据库的shell脚本：</p>
<p class="c">vi /data0/mysql/3306/mysql</p>
<p>输入以下内容（这里的用户名admin和密码12345678接下来的步骤会创建）：</p>
<p class="c">#!/bin/sh</p>
<p>mysql_port=3306<br />
mysql_username=”admin”<br />
mysql_password=”12345678&#8243;</p>
<p>function_start_mysql()<br />
{<br />
printf “Starting MySQL&#8230;\n”<br />
/bin/sh /usr/local/webserver/mysql/bin/mysqld_safe &#8211;defaults-file=/data0/mysql/${mysql_port}/my.cnf 2&gt;&amp;1 &gt; /dev/null &amp;<br />
}</p>
<p>function_stop_mysql()<br />
{<br />
printf “Stoping MySQL&#8230;\n”<br />
/usr/local/webserver/mysql/bin/mysqladmin -u ${mysql_username} -p${mysql_password} -S /tmp/mysql.sock shutdown<br />
}</p>
<p>function_restart_mysql()<br />
{<br />
printf “Restarting MySQL&#8230;\n”<br />
function_stop_mysql<br />
sleep 5<br />
function_start_mysql<br />
}</p>
<p>function_kill_mysql()<br />
{<br />
kill -9 $(ps -ef | grep &#8216;bin/mysqld_safe&#8217; | grep ${mysql_port} | awk &#8216;{printf $2}&#8217;)<br />
kill -9 $(ps -ef | grep &#8216;libexec/mysqld&#8217; | grep ${mysql_port} | awk &#8216;{printf $2}&#8217;)<br />
}</p>
<p>if [ "$1" = "start" ]; then<br />
function_start_mysql<br />
elif [ "$1" = "stop" ]; then<br />
function_stop_mysql<br />
elif [ "$1" = "restart" ]; then<br />
function_restart_mysql<br />
elif [ "$1" = "kill" ]; then<br />
function_kill_mysql<br />
else<br />
printf “Usage: /data0/mysql/${mysql_port}/mysql {start|stop|restart|kill}\n”<br />
fi</p>
<p>⑤、赋予shell脚本可执行权限：</p>
<p class="c">chmod +x /data0/mysql/3306/mysql</p>
<p>⑥、启动MySQL：</p>
<p class="c">/data0/mysql/3306/mysql start</p>
<p>⑦、通过命令行登录管理MySQL服务器（提示输入密码时直接回车）：</p>
<p class="c">/usr/local/webserver/mysql/bin/mysql -u root -p -S /tmp/mysql.sock</p>
<p>⑧、输入以下SQL语句，创建一个具有root权限的用户（admin）和密码（12345678）：</p>
<p class="c">GRANT ALL PRIVILEGES ON *.* TO &#8216;admin&#8217;@'localhost&#8217; IDENTIFIED BY &#8217;12345678&#8242;;<br />
GRANT ALL PRIVILEGES ON *.* TO &#8216;admin&#8217;@&#8217;127.0.0.1&#8242; IDENTIFIED BY &#8217;12345678&#8242;;</p>
<p>⑨、（可选）停止MySQL：</p>
<p class="c">/data0/mysql/3306/mysql stop</p>
<p>3、编译安装PHP（FastCGI模式）</p>
<p class="c">tar zxvf php-5.2.10.tar.gz<br />
gzip -cd php-5.2.10-fpm-0.5.11.diff.gz | patch -d php-5.2.10 -p1<br />
cd php-5.2.10/<br />
./configure &#8211;prefix=/usr/local/webserver/php &#8211;with-config-file-path=/usr/local/webserver/php/etc &#8211;with-mysql=/usr/local/webserver/mysql &#8211;with-mysqli=/usr/local/webserver/mysql/bin/mysql_config &#8211;with-iconv-dir=/usr/local &#8211;with-freetype-dir &#8211;with-jpeg-dir &#8211;with-png-dir &#8211;with-zlib &#8211;with-libxml-dir=/usr &#8211;enable-xml &#8211;disable-rpath &#8211;enable-discard-path &#8211;enable-safe-mode &#8211;enable-bcmath &#8211;enable-shmop &#8211;enable-sysvsem &#8211;enable-inline-optimization &#8211;with-curl &#8211;with-curlwrappers &#8211;enable-mbregex &#8211;enable-fastcgi &#8211;enable-fpm &#8211;enable-force-cgi-redirect &#8211;enable-mbstring &#8211;with-mcrypt &#8211;with-gd &#8211;enable-gd-native-ttf &#8211;with-openssl &#8211;with-mhash &#8211;enable-pcntl &#8211;enable-sockets &#8211;with-ldap &#8211;with-ldap-sasl &#8211;with-xmlrpc &#8211;enable-zip &#8211;enable-soap &#8211;without-pear<br />
make ZEND_EXTRA_LIBS=&#8217;-liconv&#8217;<br />
make install<br />
cp php.ini-dist /usr/local/webserver/php/etc/php.ini<br />
cd ../<br />
curl http://pear.php.net/go-pear | /usr/local/webserver/php/bin/php</p>
<p>4、编译安装PHP5扩展模块</p>
<p class="c">tar zxvf memcache-2.2.5.tgz<br />
cd memcache-2.2.5/<br />
/usr/local/webserver/php/bin/phpize<br />
./configure &#8211;with-php-config=/usr/local/webserver/php/bin/php-config<br />
make<br />
make install<br />
cd ../</p>
<p>tar jxvf eaccelerator-0.9.5.3.tar.bz2<br />
cd eaccelerator-0.9.5.3/<br />
/usr/local/webserver/php/bin/phpize<br />
./configure &#8211;enable-eaccelerator=shared &#8211;with-php-config=/usr/local/webserver/php/bin/php-config<br />
make<br />
make install<br />
cd ../</p>
<p>tar zxvf PDO_MYSQL-1.0.2.tgz<br />
cd PDO_MYSQL-1.0.2/<br />
/usr/local/webserver/php/bin/phpize<br />
./configure &#8211;with-php-config=/usr/local/webserver/php/bin/php-config &#8211;with-pdo-mysql=/usr/local/webserver/mysql<br />
make<br />
make install<br />
cd ../</p>
<p>tar zxvf ImageMagick.tar.gz<br />
cd ImageMagick-6.5.1-2/<br />
./configure<br />
make<br />
make install<br />
cd ../</p>
<p>tar zxvf imagick-2.2.2.tgz<br />
cd imagick-2.2.2/<br />
/usr/local/webserver/php/bin/phpize<br />
./configure &#8211;with-php-config=/usr/local/webserver/php/bin/php-config<br />
make<br />
make install<br />
cd ../</p>
<p>5、修改php.ini文件<br />
<strong>手工修改：</strong>查找/usr/local/webserver/php/etc/php.ini中的extension_dir = “./”<br />
修改为extension_dir = “/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/”<br />
并在此行后增加以下几行，然后保存：<br />
extension = “memcache.so”<br />
extension = “pdo_mysql.so”<br />
extension = “imagick.so”</p>
<p>再查找output_buffering = Off<br />
修改为output_buffering = On</p>
<p><strong>自动修改：</strong>若嫌手工修改麻烦，可执行以下shell命令，自动完成对php.ini文件的修改：</p>
<p class="c">sed -i &#8216;s#extension_dir = “./”#extension_dir = “/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/”\nextension = “memcache.so”\nextension = “pdo_mysql.so”\nextension = “imagick.so”\n#&#8217; /usr/local/webserver/php/etc/php.ini<br />
sed -i &#8216;s#output_buffering = Off#output_buffering = On#&#8217; /usr/local/webserver/php/etc/php.ini<br />
sed -i “s#; always_populate_raw_post_data = On#always_populate_raw_post_data = On#g” /usr/local/webserver/php/etc/php.ini</p>
<p>6、配置eAccelerator加速PHP：</p>
<p class="c">mkdir -p /usr/local/webserver/eaccelerator_cache<br />
vi /usr/local/webserver/php/etc/php.ini</p>
<p>按shift+g键跳到配置文件的最末尾，加上以下配置信息：</p>
<p class="c">[eaccelerator]<br />
zend_extension=”/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so”<br />
eaccelerator.shm_size=”64&#8243;<br />
eaccelerator.cache_dir=”/usr/local/webserver/eaccelerator_cache”<br />
eaccelerator.enable=”1&#8243;<br />
eaccelerator.optimizer=”1&#8243;<br />
eaccelerator.check_mtime=”1&#8243;<br />
eaccelerator.debug=”0&#8243;<br />
eaccelerator.filter=”"<br />
eaccelerator.shm_max=”0&#8243;<br />
eaccelerator.shm_ttl=”3600&#8243;<br />
eaccelerator.shm_prune_period=”3600&#8243;<br />
eaccelerator.shm_only=”0&#8243;<br />
eaccelerator.compress=”1&#8243;<br />
eaccelerator.compress_level=”9&#8243;</p>
<p>7、创建www用户和组，以及供blog.s135.com和www.s135.com两个虚拟主机使用的目录：</p>
<p class="c">/usr/sbin/groupadd www<br />
/usr/sbin/useradd -g www www<br />
mkdir -p /data0/htdocs/blog<br />
chmod +w /data0/htdocs/blog<br />
chown -R www:www /data0/htdocs/blog<br />
mkdir -p /data0/htdocs/www<br />
chmod +w /data0/htdocs/www<br />
chown -R www:www /data0/htdocs/www</p>
<p>8、创建php-fpm配置文件（php-fpm是为PHP打的一个FastCGI管理补丁，可以平滑变更php.ini配置而无需重启php-cgi）：<br />
在/usr/local/webserver/php/etc/目录中创建php-fpm.conf文件：</p>
<p class="c">rm -f /usr/local/webserver/php/etc/php-fpm.conf<br />
vi /usr/local/webserver/php/etc/php-fpm.conf</p>
<p>输入以下内容（如果您安装 Nginx + PHP 用于程序调试，请将以下的&lt;value name=”display_errors”&gt;0&lt;/value&gt;改为&lt;value name=”display_errors”&gt;1&lt;/value&gt;，以便显示PHP错误信息，否则，Nginx 会报状态为500的空白错误页）：</p>
<div class="xml">&lt;?xml version=”1.0&#8243; ?&gt;<br />
&lt;configuration&gt;All relative paths in this config are relative to php&#8217;s install prefix&lt;section name=”global_options”&gt;</p>
<p>Pid file<br />
&lt;value name=”pid_file”&gt;/usr/local/webserver/php/logs/php-fpm.pid&lt;/value&gt;</p>
<p>Error log file<br />
&lt;value name=”error_log”&gt;/usr/local/webserver/php/logs/php-fpm.log&lt;/value&gt;</p>
<p>Log level<br />
&lt;value name=”log_level”&gt;notice&lt;/value&gt;</p>
<p>When this amount of php processes exited with SIGSEGV or SIGBUS &#8230;<br />
&lt;value name=”emergency_restart_threshold”&gt;10&lt;/value&gt;</p>
<p>&#8230; in a less than this interval of time, a graceful restart will be initiated.<br />
Useful to work around accidental curruptions in accelerator&#8217;s shared memory.<br />
&lt;value name=”emergency_restart_interval”&gt;1m&lt;/value&gt;</p>
<p>Time limit on waiting child&#8217;s reaction on signals from master<br />
&lt;value name=”process_control_timeout”&gt;5s&lt;/value&gt;</p>
<p>Set to &#8216;no&#8217; to debug fpm<br />
&lt;value name=”daemonize”&gt;yes&lt;/value&gt;</p>
<p>&lt;/section&gt;</p>
<p>&lt;workers&gt;</p>
<p>&lt;section name=”pool”&gt;</p>
<p>Name of pool. Used in logs and stats.<br />
&lt;value name=”name”&gt;default&lt;/value&gt;</p>
<p>Address to accept fastcgi requests on.<br />
Valid syntax is &#8216;ip.ad.re.ss:port&#8217; or just &#8216;port&#8217; or &#8216;/path/to/unix/socket&#8217;<br />
&lt;value name=”listen_address”&gt;127.0.0.1:9000&lt;/value&gt;</p>
<p>&lt;value name=”listen_options”&gt;</p>
<p>Set listen(2) backlog<br />
&lt;value name=”backlog”&gt;-1&lt;/value&gt;</p>
<p>Set permissions for unix socket, if one used.<br />
In Linux read/write permissions must be set in order to allow connections from web server.<br />
Many BSD-derrived systems allow connections regardless of permissions.<br />
&lt;value name=”owner”&gt;&lt;/value&gt;<br />
&lt;value name=”group”&gt;&lt;/value&gt;<br />
&lt;value name=”mode”&gt;0666&lt;/value&gt;<br />
&lt;/value&gt;</p>
<p>Additional php.ini defines, specific to this pool of workers.<br />
&lt;value name=”php_defines”&gt;<br />
&lt;value name=”sendmail_path”&gt;/usr/sbin/sendmail -t -i&lt;/value&gt;<br />
&lt;value name=”display_errors”&gt;1&lt;/value&gt;<br />
&lt;/value&gt;</p>
<p>Unix user of processes<br />
&lt;value name=”user”&gt;www&lt;/value&gt;</p>
<p>Unix group of processes<br />
&lt;value name=”group”&gt;www&lt;/value&gt;</p>
<p>Process manager settings<br />
&lt;value name=”pm”&gt;</p>
<p>Sets style of controling worker process count.<br />
Valid values are &#8216;static&#8217; and &#8216;apache-like&#8217;<br />
&lt;value name=”style”&gt;static&lt;/value&gt;</p>
<p>Sets the limit on the number of simultaneous requests that will be served.<br />
Equivalent to Apache MaxClients directive.<br />
Equivalent to PHP_FCGI_CHILDREN environment in original php.fcgi<br />
Used with any pm_style.<br />
&lt;value name=”max_children”&gt;128&lt;/value&gt;</p>
<p>Settings group for &#8216;apache-like&#8217; pm style<br />
&lt;value name=”apache_like”&gt;</p>
<p>Sets the number of server processes created on startup.<br />
Used only when &#8216;apache-like&#8217; pm_style is selected<br />
&lt;value name=”StartServers”&gt;20&lt;/value&gt;</p>
<p>Sets the desired minimum number of idle server processes.<br />
Used only when &#8216;apache-like&#8217; pm_style is selected<br />
&lt;value name=”MinSpareServers”&gt;5&lt;/value&gt;</p>
<p>Sets the desired maximum number of idle server processes.<br />
Used only when &#8216;apache-like&#8217; pm_style is selected<br />
&lt;value name=”MaxSpareServers”&gt;35&lt;/value&gt;</p>
<p>&lt;/value&gt;</p>
<p>&lt;/value&gt;</p>
<p>The timeout (in seconds) for serving a single request after which the worker process will be terminated<br />
Should be used when &#8216;max_execution_time&#8217; ini option does not stop script execution for some reason<br />
&#8217;0s&#8217; means &#8216;off&#8217;<br />
&lt;value name=”request_terminate_timeout”&gt;0s&lt;/value&gt;</p>
<p>The timeout (in seconds) for serving of single request after which a php backtrace will be dumped to slow.log file<br />
&#8217;0s&#8217; means &#8216;off&#8217;<br />
&lt;value name=”request_slowlog_timeout”&gt;0s&lt;/value&gt;</p>
<p>The log file for slow requests<br />
&lt;value name=”slowlog”&gt;logs/slow.log&lt;/value&gt;</p>
<p>Set open file desc rlimit<br />
&lt;value name=”rlimit_files”&gt;65535&lt;/value&gt;</p>
<p>Set max core size rlimit<br />
&lt;value name=”rlimit_core”&gt;0&lt;/value&gt;</p>
<p>Chroot to this directory at the start, absolute path<br />
&lt;value name=”chroot”&gt;&lt;/value&gt;</p>
<p>Chdir to this directory at the start, absolute path<br />
&lt;value name=”chdir”&gt;&lt;/value&gt;</p>
<p>Redirect workers&#8217; stdout and stderr into main error log.<br />
If not set, they will be redirected to /dev/null, according to FastCGI specs<br />
&lt;value name=”catch_workers_output”&gt;yes&lt;/value&gt;</p>
<p>How much requests each process should execute before respawn.<br />
Useful to work around memory leaks in 3rd party libraries.<br />
For endless request processing please specify 0<br />
Equivalent to PHP_FCGI_MAX_REQUESTS<br />
&lt;value name=”max_requests”&gt;102400&lt;/value&gt;</p>
<p>Comma separated list of ipv4 addresses of FastCGI clients that allowed to connect.<br />
Equivalent to FCGI_WEB_SERVER_ADDRS environment in original php.fcgi (5.2.2+)<br />
Makes sense only with AF_INET listening socket.<br />
&lt;value name=”allowed_clients”&gt;127.0.0.1&lt;/value&gt;</p>
<p>Pass environment variables like LD_LIBRARY_PATH<br />
All $VARIABLEs are taken from current environment<br />
&lt;value name=”environment”&gt;<br />
&lt;value name=”HOSTNAME”&gt;$HOSTNAME&lt;/value&gt;<br />
&lt;value name=”PATH”&gt;/usr/local/bin:/usr/bin:/bin&lt;/value&gt;<br />
&lt;value name=”TMP”&gt;/tmp&lt;/value&gt;<br />
&lt;value name=”TMPDIR”&gt;/tmp&lt;/value&gt;<br />
&lt;value name=”TEMP”&gt;/tmp&lt;/value&gt;<br />
&lt;value name=”OSTYPE”&gt;$OSTYPE&lt;/value&gt;<br />
&lt;value name=”MACHTYPE”&gt;$MACHTYPE&lt;/value&gt;<br />
&lt;value name=”MALLOC_CHECK_”&gt;2&lt;/value&gt;<br />
&lt;/value&gt;</p>
<p>&lt;/section&gt;</p>
<p>&lt;/workers&gt;</p>
<p>&lt;/configuration&gt;</p>
</div>
<p>9、启动php-cgi进程，监听127.0.0.1的9000端口，进程数为200（如果服务器内存小于3GB，可以只开启64个进程），用户为www：</p>
<p class="c">ulimit -SHn 65535<br />
/usr/local/webserver/php/sbin/php-fpm start</p>
<p>注：/usr/local/webserver/php/sbin/php-fpm还有其他参数，包括：start|stop|quit|restart|reload|logrotate，修改php.ini后不重启php-cgi，重新加载配置文件使用reload。</p>
<p><strong>三、安装Nginx 0.8.15</strong><br />
1、安装Nginx所需的pcre库：</p>
<p class="c">tar zxvf pcre-7.9.tar.gz<br />
cd pcre-7.9/<br />
./configure<br />
make &amp;&amp; make install<br />
cd ../</p>
<p>2、安装Nginx</p>
<p class="c">tar zxvf nginx-0.8.15.tar.gz<br />
cd nginx-0.8.15/<br />
./configure &#8211;user=www &#8211;group=www &#8211;prefix=/usr/local/webserver/nginx &#8211;with-http_stub_status_module &#8211;with-http_ssl_module<br />
make &amp;&amp; make install<br />
cd ../</p>
<p>3、创建Nginx日志目录</p>
<p class="c">mkdir -p /data1/logs<br />
chmod +w /data1/logs<br />
chown -R www:www /data1/logs</p>
<p>4、创建Nginx配置文件<br />
①、在/usr/local/webserver/nginx/conf/目录中创建nginx.conf文件：</p>
<p class="c">rm -f /usr/local/webserver/nginx/conf/nginx.conf<br />
vi /usr/local/webserver/nginx/conf/nginx.conf</p>
<p>输入以下内容：</p>
<p class="c">user  www www;<br />
worker_processes 8;<br />
error_log  /data1/logs/nginx_error.log  crit;<br />
pid        /usr/local/webserver/nginx/nginx.pid;</p>
<p>#Specifies the value for maximum file descriptors that can be opened by this process.<br />
worker_rlimit_nofile 65535;</p>
<p>events<br />
{<br />
use epoll;<br />
worker_connections 65535;<br />
}</p>
<p>http<br />
{<br />
include       mime.types;<br />
default_type  application/octet-stream;</p>
<p>#charset  gb2312;</p>
<p>server_names_hash_bucket_size 128;<br />
client_header_buffer_size 32k;<br />
large_client_header_buffers 4 32k;<br />
client_max_body_size 8m;</p>
<p>sendfile on;<br />
tcp_nopush     on;</p>
<p>keepalive_timeout 60;</p>
<p>tcp_nodelay on;</p>
<p>fastcgi_connect_timeout 300;<br />
fastcgi_send_timeout 300;<br />
fastcgi_read_timeout 300;<br />
fastcgi_buffer_size 64k;<br />
fastcgi_buffers 4 64k;<br />
fastcgi_busy_buffers_size 128k;<br />
fastcgi_temp_file_write_size 128k;</p>
<p>gzip on;<br />
gzip_min_length  1k;<br />
gzip_buffers     4 16k;<br />
gzip_http_version 1.0;<br />
gzip_comp_level 2;<br />
gzip_types       text/plain application/x-javascript text/css application/xml;<br />
gzip_vary on;</p>
<p>#limit_zone  crawler  $binary_remote_addr  10m;</p>
<p>server<br />
{<br />
listen       80;<br />
server_name  blog.s135.com;<br />
index index.html index.htm index.php;<br />
root  /data0/htdocs/blog;</p>
<p>#limit_conn   crawler  20;</p>
<p>location ~ .*\.(php|php5)?$<br />
{<br />
#fastcgi_pass  unix:/tmp/php-cgi.sock;<br />
fastcgi_pass  127.0.0.1:9000;<br />
fastcgi_index index.php;<br />
include fcgi.conf;<br />
}</p>
<p>location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$<br />
{<br />
expires      30d;<br />
}</p>
<p>location ~ .*\.(js|css)?$<br />
{<br />
expires      1h;<br />
}</p>
<p>log_format  access  &#8217;$remote_addr &#8211; $remote_user [$time_local] “$request” &#8216;<br />
&#8216;$status $body_bytes_sent “$http_referer” &#8216;<br />
&#8216;”$http_user_agent” $http_x_forwarded_for&#8217;;<br />
access_log  /data1/logs/access.log  access;<br />
}</p>
<p>server<br />
{<br />
listen       80;<br />
server_name  www.s135.com;<br />
index index.html index.htm index.php;<br />
root  /data0/htdocs/www;</p>
<p>location ~ .*\.(php|php5)?$<br />
{<br />
#fastcgi_pass  unix:/tmp/php-cgi.sock;<br />
fastcgi_pass  127.0.0.1:9000;<br />
fastcgi_index index.php;<br />
include fcgi.conf;<br />
}</p>
<p>log_format  wwwlogs  &#8217;$remote_addr &#8211; $remote_user [$time_local] “$request” &#8216;<br />
&#8216;$status $body_bytes_sent “$http_referer” &#8216;<br />
&#8216;”$http_user_agent” $http_x_forwarded_for&#8217;;<br />
access_log  /data1/logs/wwwlogs.log  wwwlogs;<br />
}</p>
<p>server<br />
{<br />
listen  80;<br />
server_name  status.blog.s135.com;</p>
<p>location / {<br />
stub_status on;<br />
access_log   off;<br />
}<br />
}<br />
}</p>
<p>②、在/usr/local/webserver/nginx/conf/目录中创建fcgi.conf文件：</p>
<p class="c">vi /usr/local/webserver/nginx/conf/fcgi.conf</p>
<p>输入以下内容：</p>
<p class="c">fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;<br />
fastcgi_param  SERVER_SOFTWARE    nginx;</p>
<p>fastcgi_param  QUERY_STRING       $query_string;<br />
fastcgi_param  REQUEST_METHOD     $request_method;<br />
fastcgi_param  CONTENT_TYPE       $content_type;<br />
fastcgi_param  CONTENT_LENGTH     $content_length;</p>
<p>fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;<br />
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;<br />
fastcgi_param  REQUEST_URI        $request_uri;<br />
fastcgi_param  DOCUMENT_URI       $document_uri;<br />
fastcgi_param  DOCUMENT_ROOT      $document_root;<br />
fastcgi_param  SERVER_PROTOCOL    $server_protocol;</p>
<p>fastcgi_param  REMOTE_ADDR        $remote_addr;<br />
fastcgi_param  REMOTE_PORT        $remote_port;<br />
fastcgi_param  SERVER_ADDR        $server_addr;<br />
fastcgi_param  SERVER_PORT        $server_port;<br />
fastcgi_param  SERVER_NAME        $server_name;</p>
<p># PHP only, required if PHP was built with &#8211;enable-force-cgi-redirect<br />
fastcgi_param  REDIRECT_STATUS    200;</p>
<p>5、启动Nginx</p>
<p class="c">ulimit -SHn 65535<br />
/usr/local/webserver/nginx/sbin/nginx</p>
<p><strong>四、配置开机自动启动Nginx + PHP</strong></p>
<p class="c">vi /etc/rc.local</p>
<p>在末尾增加以下内容：</p>
<p class="c">ulimit -SHn 65535<br />
/usr/local/webserver/php/sbin/php-fpm start<br />
/usr/local/webserver/nginx/sbin/nginx</p>
<p><strong>五、优化Linux内核参数</strong></p>
<p class="c">vi /etc/sysctl.conf</p>
<p>在末尾增加以下内容：</p>
<p class="c"># Add<br />
net.ipv4.tcp_max_syn_backlog = 65536<br />
net.core.netdev_max_backlog =  32768<br />
net.core.somaxconn = 32768</p>
<p>net.core.wmem_default = 8388608<br />
net.core.rmem_default = 8388608<br />
net.core.rmem_max = 16777216<br />
net.core.wmem_max = 16777216</p>
<p>net.ipv4.tcp_timestamps = 0<br />
net.ipv4.tcp_synack_retries = 2<br />
net.ipv4.tcp_syn_retries = 2</p>
<p>net.ipv4.tcp_tw_recycle = 1<br />
#net.ipv4.tcp_tw_len = 1<br />
net.ipv4.tcp_tw_reuse = 1</p>
<p>net.ipv4.tcp_mem = 94500000 915000000 927000000<br />
net.ipv4.tcp_max_orphans = 3276800</p>
<p>#net.ipv4.tcp_fin_timeout = 30<br />
#net.ipv4.tcp_keepalive_time = 120<br />
net.ipv4.ip_local_port_range = 1024  65535</p>
<p>使配置立即生效：</p>
<p class="c">/sbin/sysctl -p</p>
<p><strong>六、在不停止Nginx服务的情况下平滑变更Nginx配置</strong><br />
1、修改/usr/local/webserver/nginx/conf/nginx.conf配置文件后，请执行以下命令检查配置文件是否正确：</p>
<p class="c">/usr/local/webserver/nginx/sbin/nginx -t</p>
<p>如果屏幕显示以下两行信息，说明配置文件正确：<br />
the configuration file /usr/local/webserver/nginx/conf/nginx.conf syntax is ok<br />
the configuration file /usr/local/webserver/nginx/conf/nginx.conf was tested successfully</p>
<p>2、这时，输入以下命令查看Nginx主进程号：</p>
<p class="c">ps -ef | grep “nginx: master process” | grep -v “grep” | awk -F &#8216; &#8216; &#8216;{print $2}&#8217;</p>
<p>屏幕显示的即为Nginx主进程号，例如：<br />
6302<br />
这时，执行以下命令即可使修改过的Nginx配置文件生效：</p>
<p class="c">kill -HUP 6302</p>
<p>或者无需这么麻烦，找到Nginx的Pid文件：</p>
<p class="c">kill -HUP `cat /usr/local/webserver/nginx/nginx.pid`</p>
<p><strong>七、编写每天定时切割Nginx日志的脚本</strong><br />
1、创建脚本/usr/local/webserver/nginx/sbin/cut_nginx_log.sh</p>
<p class="c">vi /usr/local/webserver/nginx/sbin/cut_nginx_log.sh</p>
<p>输入以下内容：</p>
<p class="c">#!/bin/bash<br />
# This script run at 00:00</p>
<p># The Nginx logs path<br />
logs_path=”/usr/local/webserver/nginx/logs/”</p>
<p>mkdir -p ${logs_path}$(date -d “yesterday” +”%Y”)/$(date -d “yesterday” +”%m”)/<br />
mv ${logs_path}access.log ${logs_path}$(date -d “yesterday” +”%Y”)/$(date -d “yesterday” +”%m”)/access_$(date -d “yesterday” +”%Y%m%d”).log<br />
kill -USR1 `cat /usr/local/webserver/nginx/nginx.pid`</p>
<p>2、设置crontab，每天凌晨00:00切割nginx访问日志</p>
<p class="c">crontab -e</p>
<p>输入以下内容：</p>
<p class="c">00 00 * * * /bin/bash  /usr/local/webserver/nginx/sbin/cut_nginx_log.sh</p>
<p><strong>附：文章修改历史</strong></p>
<p>● [2009年05月06日] [Version 5.0] 在4.14版本的基础上重新撰写本文，支持PHP 5.2.9，增加MySQL配置过程</p>
<p>● [2009年05月10日] [Version 5.1] 增加压力测试方法。</p>
<p>● [2009年05月20日] [Version 5.2] Nginx升级到0.7.58版本；PHP编译选项增加：&#8211;with-xmlrpc &#8211;enable-zip。</p>
<p>● [2009年06月10日] [Version 5.3] Nginx升级到0.7.59版本；MySQL升级到5.1.35版本。</p>
<p>● [2009年06月26日] [Version 5.4] Nginx升级到0.7.61版本；PHP升级到5.2.10版本；PCRE升级到7.9版本；PHP增加soap扩展；关闭了PHP的PEAR；优化sysctl配置。</p>
<p>● [2009年09月18日] [Version 5.5] Nginx升级到0.8.15版本；PCRE升级到7.9版本；解决PHP 5.2.10 的PEAR问题。</p>

	标签：<a href="http://www.zfkun.com/tag/apache" title="apache" rel="tag">apache</a>, <a href="http://www.zfkun.com/tag/apc" title="apc" rel="tag">apc</a>, <a href="http://www.zfkun.com/tag/centos" title="centos" rel="tag">centos</a>, <a href="http://www.zfkun.com/tag/epoll" title="epoll" rel="tag">epoll</a>, <a href="http://www.zfkun.com/tag/html" title="html" rel="tag">html</a>, <a href="http://www.zfkun.com/tag/http" title="http" rel="tag">http</a>, <a href="http://www.zfkun.com/tag/httpd" title="httpd" rel="tag">httpd</a>, <a href="http://www.zfkun.com/tag/linux" title="linux" rel="tag">linux</a>, <a href="http://www.zfkun.com/tag/memcache" title="memcache" rel="tag">memcache</a>, <a href="http://www.zfkun.com/tag/memcached" title="memcached" rel="tag">memcached</a>, <a href="http://www.zfkun.com/tag/mysql" title="mysql" rel="tag">mysql</a>, <a href="http://www.zfkun.com/tag/nginx" title="nginx" rel="tag">nginx</a>, <a href="http://www.zfkun.com/tag/php" title="PHP" rel="tag">PHP</a>, <a href="http://www.zfkun.com/tag/xcache" title="xcache" rel="tag">xcache</a><br />

	<h4>相关推荐</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.zfkun.com/135.html" title="挑战 hax.tor.hu 申请带ssh的免费php+mysql空间 (2010 年 03 月 19 日)" data-comment="0">挑战 hax.tor.hu 申请带ssh的免费php+mysql空间</a></li>
	<li><a href="http://www.zfkun.com/102.html" title="Windows 下 Nginx + PHP5 的安装与配置 (2010 年 01 月 28 日)" data-comment="0">Windows 下 Nginx + PHP5 的安装与配置</a></li>
	<li><a href="http://www.zfkun.com/39.html" title="基于OpenCV的PHP图像人脸识别技术 (2010 年 01 月 16 日)" data-comment="0">基于OpenCV的PHP图像人脸识别技术</a></li>
	<li><a href="http://www.zfkun.com/223.html" title="动态生成windows快捷方式文件 (2011 年 04 月 02 日)" data-comment="0">动态生成windows快捷方式文件</a></li>
	<li><a href="http://www.zfkun.com/147.html" title="前端资源文件缓存清除一法 (2010 年 11 月 25 日)" data-comment="0">前端资源文件缓存清除一法</a></li>
	<li><a href="http://www.zfkun.com/417.html" title="WordPress Rewrite SEO 之404方式折腾笔记 (2011 年 07 月 17 日)" data-comment="1">WordPress Rewrite SEO 之404方式折腾笔记</a></li>
	<li><a href="http://www.zfkun.com/35.html" title="PHP CURL函数库 (2010 年 01 月 16 日)" data-comment="0">PHP CURL函数库</a></li>
	<li><a href="http://www.zfkun.com/21.html" title="iconv 方法使用 (2010 年 01 月 16 日)" data-comment="0">iconv 方法使用</a></li>
	<li><a href="http://www.zfkun.com/220.html" title="HTML5 canvas 初级入门教程 (2011 年 03 月 20 日)" data-comment="0">HTML5 canvas 初级入门教程</a></li>
	<li><a href="http://www.zfkun.com/html5" title="HTML5 (2011 年 06 月 03 日)" data-comment="0">HTML5</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zfkun.com/95.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

