在 CentOS 5.1 下安装 Nginx 替换 apache
== 为什么选择 Nginx ==
Nginx 是一个很牛的高性能 Web 和反向代理服务器, 它具有有很多非常优越的特性:
在高连接并发的情况下,Nginx 是 Apache 服务器不错的替代品:Nginx 在美国是做虚拟主机生意的老板们经常选择的软件平台之一。能够支持高达 50,000 个并发连接数的响应。
Nginx 作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务, 也可以支持作为 HTTP 代理服务器对外进行服务。Nginx 采用 C 进行编写,不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好很多。
作为邮件代理服务器:Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。
Nginx 是一个 安装非常的简单,配置文件 非常简洁(还能够支持 perl 语法),Bugs 非常少的服务器:Nginx 启动特别容易,并且几乎可以做到 7*24 不间断运行,即使运行数个月也不需要重新启动。还能够不间断服务的情况下进行软件版本的升级。
(一)CentOS 5.1 系统安装
系统的安装这部分,请参看我之前写的:
CentOS 5.1 下用源码编译安装 ExtMail (第一部分)
(二)安装 PHP 和 MySQL
(注明:因为我的实际使用环境还需要用到 bz2,GD,gettext,memcache,mhash,pcre,xml,zlib,FreeType 等,因此该步骤的安装除了把 PHP 和 MySQL 装好外,这些额外的软件包也一起安装上,省的麻烦。)
rpm -ivh perl-DBI-1.56-1.noarch.rpm
rpm -ivh mysql-5.0.22-2.2.el5_1.1.i386.rpm
rpm -ivh perl-DBD-MySQL-3.0007-1.fc6.i386.rpm
rpm -ivh mysql-server-5.0.22-2.2.el5_1.1.i386.rpm
rpm -ivh unixODBC-2.2.11-7.1.i386.rpm
rpm -ivh libtool-ltdl-1.5.22-6.1.i386.rpm
rpm -ivh mysql-connector-odbc-3.51.12-2.2.i386.rpm
rpm -ivh mysql-devel-5.0.22-2.2.el5_1.1.i386.rpm
rpm -ivh mysql-test-5.0.22-2.2.el5_1.1.i386.rpm
rpm -ivh mysql-bench-5.0.22-2.2.el5_1.1.i386.rpm
rpm -ivh apr-devel-1.2.7-11.i386.rpm
rpm -ivh apr-util-devel-1.2.7-6.i386.rpm
rpm -Uvh libxml2-2.6.26-2.1.2.1.i386.rpm
rpm -Uvh libxml2-python-2.6.26-2.1.2.1.i386.rpm
rpm -ivh libxslt-python-1.1.17-2.i386.rpm
rpm -Uvh libxml2-devel-2.6.26-2.1.2.1.i386.rpm
rpm -ivh libjpeg-devel-6b-37.i386.rpm
rpm -Uvh libpng-1.2.10-7.1.el5_0.1.i386.rpm
rpm -ivh freetype-demos-2.2.1-19.el5.i386.rpm
rpm -ivh libpng-devel-1.2.10-7.1.el5_0.1.i386.rpm
rpm -ivh freetype-devel-2.2.1-19.el5.i386.rpm
rpm -ivh aspell-ca-0.50-4.2.2.i386.rpm
rpm -ivh aspell-sv-0.51-1.2.1.i386.rpm
rpm -ivh aspell-fr-0.50-9.2.2.i386.rpm
rpm -ivh aspell-ga-0.50-4.2.2.i386.rpm
rpm -ivh aspell-sr-0.02-1.2.1.i386.rpm
rpm -ivh aspell-devel-0.60.3-7.1.i386.rpm
rpm -ivh aspell-id-0.50.1-4.2.2.i386.rpm
rpm -ivh aspell-ru-0.99f7-2.2.2.i386.rpm
rpm -ivh aspell-pt-0.50-10.2.2.i386.rpm
rpm -ivh aspell-es-0.50-13.2.2.i386.rpm
rpm -ivh aspell-br-0.50-4.2.2.i386.rpm
rpm -ivh aspell-el-0.50-4.2.2.i386.rpm
rpm -ivh aspell-gd-0.50-4.2.2.i386.rpm
rpm -ivh aspell-nl-0.1e-1.fc6.i386.rpm
rpm -ivh aspell-is-0.51.1-2.2.2.i386.rpm
rpm -ivh aspell-af-0.50-4.2.2.i386.rpm
rpm -ivh aspell-de-0.50-11.2.2.i386.rpm
rpm -ivh aspell-sl-0.50-1.2.1.i386.rpm
rpm -ivh aspell-cy-0.50-4.2.2.i386.rpm
rpm -ivh aspell-da-0.50-12.2.2.i386.rpm
rpm -ivh aspell-pl-0.51-5.2.2.i386.rpm
rpm -ivh aspell-bg-0.50-11.2.2.i386.rpm
rpm -ivh aspell-hr-0.51-4.2.2.i386.rpm
rpm -ivh aspell-no-0.50.1-9.2.2.i386.rpm
rpm -ivh aspell-gl-0.50-4.2.2.i386.rpm
rpm -ivh aspell-cs-0.51-3.2.2.i386.rpm
rpm -ivh aspell-it-0.53-4.2.1.i386.rpm
rpm -ivh aspell-fo-0.51-4.2.2.i386.rpm
rpm -ivh libc-client-2004g-2.2.1.i386.rpm
rpm -ivh libc-client-devel-2004g-2.2.1.i386.rpm
rpm -Uvh net-snmp-libs-5.3.1-19.el5_1.4.i386.rpm
rpm -ivh beecrypt-devel-4.1.2-10.1.1.i386.rpm
rpm -ivh lm_sensors-2.10.0-3.1.i386.rpm
rpm -ivh net-snmp-5.3.1-19.el5_1.4.i386.rpm
rpm -ivh net-snmp-utils-5.3.1-19.el5_1.4.i386.rpm
rpm -ivh net-snmp-perl-5.3.1-19.el5_1.4.i386.rpm
rpm -ivh –nodeps elfutils-devel-0.125-3.el5.i386.rpm
rpm -ivh net-snmp-devel-5.3.1-19.el5_1.4.i386.rpm
rpm -ivh elfutils-devel-static-0.125-3.el5.i386.rpm
rpm -Uvh pcre-6.6-2.el5_1.7.i386.rpm
rpm -ivh pcre-devel-6.6-2.el5_1.7.i386.rpm
rpm -ivh tcl-devel-8.4.13-3.fc6.i386.rpm
rpm -ivh tcl-html-8.4.13-3.fc6.i386.rpm
rpm -ivh tk-8.4.13-5.el5_1.1.i386.rpm
rpm -ivh tclx-8.4.0-5.fc6.i386.rpm
rpm -ivh tclx-doc-8.4.0-5.fc6.i386.rpm
rpm -ivh tclx-devel-8.4.0-5.fc6.i386.rpm
rpm -ivh gamin-devel-0.1.7-8.el5.i386.rpm
rpm -ivh libart_lgpl-devel-2.3.17-4.i386.rpm
rpm -ivh php-common-5.1.6-15.el5.i386.rpm
rpm -ivh php-pdo-5.1.6-15.el5.i386.rpm
rpm -ivh php-cli-5.1.6-15.el5.i386.rpm
rpm -ivh php-5.1.6-15.el5.i386.rpm
rpm -ivh php-pear-1.4.9-4.noarch.rpm
rpm -ivh php-pear-Net-Socket-1.0.8-1.el5.centos.noarch.rpm
rpm -ivh php-pear-MDB2-2.4.1-2.el5.centos.noarch.rpm
rpm -ivh php-pear-Net-URL-1.0.15-1.el5.centos.noarch.rpm
rpm -ivh php-pear-Auth-SASL-1.0.2-4.el5.centos.noarch.rpm
rpm -ivh php-pear-Net-SMTP-1.2.10-1.el5.centos.noarch.rpm
rpm -ivh php-pear-DB-1.7.13-1.el5.centos.noarch.rpm
rpm -ivh libtidy-0.99.0-12.20070228.el5.centos.i386.rpm
rpm -ivh libmcrypt-2.5.8-4.el5.centos.i386.rpm
rpm -ivh mhash-0.9.9-1.el5.centos.i386.rpm
rpm -ivh php-odbc-5.1.6-15.el5.i386.rpm
rpm -ivh php-dbase-5.1.6-12.el5.centos.i386.rpm
rpm -ivh php-pear-Net-Sieve-1.1.5-2.el5.centos.noarch.rpm
rpm -ivh php-ldap-5.1.6-15.el5.i386.rpm
rpm -ivh php-imap-5.1.6-15.el5.i386.rpm
rpm -ivh php-mhash-5.1.6-12.el5.centos.i386.rpm
rpm -ivh php-pear-HTTP-Request-1.4.2-1.el5.centos.noarch.rpm
rpm -ivh php-pear-Mail-1.1.14-1.el5.centos.noarch.rpm
rpm -ivh php-pear-Date-1.4.7-2.el5.centos.noarch.rpm
rpm -ivh php-snmp-5.1.6-15.el5.i386.rpm
rpm -ivh php-pecl-Fileinfo-1.0.4-3.el5.centos.i386.rpm
rpm -ivh php-bcmath-5.1.6-15.el5.i386.rpm
rpm -ivh php-mcrypt-5.1.6-12.el5.centos.i386.rpm
rpm -ivh php-ncurses-5.1.6-15.el5.i386.rpm
rpm -ivh php-devel-5.1.6-15.el5.i386.rpm
rpm -ivh php-pear-MDB2-Driver-mysql-1.4.1-3.el5.centos.noarch.rpm
rpm -ivh php-soap-5.1.6-15.el5.i386.rpm
rpm -ivh php-mbstring-5.1.6-15.el5.i386.rpm
rpm -ivh php-xml-5.1.6-15.el5.i386.rpm
rpm -ivh php-tidy-5.1.6-12.el5.centos.i386.rpm
rpm -ivh php-pear-Mail-Mime-1.4.0-1.el5.centos.noarch.rpm
rpm -ivh php-dba-5.1.6-15.el5.i386.rpm
rpm -ivh php-pear-File-1.2.2-1.el5.centos.noarch.rpm
rpm -ivh php-pgsql-5.1.6-15.el5.i386.rpm
rpm -ivh php-readline-5.1.6-12.el5.centos.i386.rpm
rpm -ivh php-mysql-5.1.6-15.el5.i386.rpm
rpm -ivh php-pear-Log-1.9.13-1.el5.centos.noarch.rpm
rpm -ivh php-gd-5.1.6-15.el5.i386.rpm
rpm -ivh php-xmlrpc-5.1.6-15.el5.i386.rpm
rpm -ivh php-pecl-memcache-2.2.1-1.el5.centos.i386.rpm
rpm -ivh compat-libstdc++-33-3.2.3-61.i386.rpm
rpm -ivh cabextract-1.2-1.el5.rf.i386.rpm
rpm -ivh nomarch-1.4-2.el5.i386.rpm
rpm -ivh unarj-2.63-0.a.2.el5.rf.i386.rpm
rpm -ivh unrar-3.7.4-1.el5.rf.i386.rpm
# cd nginx-0.6.31
# ./configure –prefix=/usr/local/nginx –conf-path=/usr/local/nginx/conf/nginx.conf –pid-path=/var/run/nginx.pid –error-log-path=/var/log/nginx –http-log-path=var/log/nginx –user=apache –group=apache –with-pcre=/usr/include/pcre –with-http_stub_status_module –with-http_ssl_module
(注意:在这里,需要说明一下,由于 Nginx 的配置文件中我需要用到正则,所以需要 pcre 模块的支持。而我们在第一部分的安装中已经安装了 pcre 及 pcre-devel 的 相应 rpm 包,但是 Ngxin 并不能正确找到 .h/.so/.a/.la 文件,因此需要变通一下)
# mkdir /usr/include/pcre
# mkdir /usr/include/pcre/.libs
# cp /usr/lib/libpcre.a /usr/include/pcre/libpcre.a
# cp /usr/lib/libpcre.a /usr/include/pcre/libpcre.la
# cp /usr/lib/libpcre.a /usr/include/pcre/.libs/libpcre.a
# cp /usr/lib/libpcre.a /usr/include/pcre/.libs/libpcre.la
然后,修改 objs/Makefile 文件,注释掉以下内容:
./configure –disable-shared
接下来,就可以正常执行 make 及 make install 了。
# make
# make install
# mkdir /var/log/nginx
接下来,修改 Nginx 的配置文件
# cd /usr/local/nginx/conf
# vi nginx.conf (如下图所示)

运行以下命令检测配置文件是否无误:
# /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
如出现下面的字符则为配置文件正确:
the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
the configuration file /usr/local/nginx/conf/nginx.conf was tested successfully
启动 nginx:
# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
检查 nginx 进程是否启动:
# ps aux|grep nginx|grep -v grep (若看到如下几个进程,就已经启动 OK,若无则要检查配置)
root 2173 0.0 0.1 5308 596 ? Ss 10:41 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
apache 2174 0.0 0.1 5504 932 ? S 10:41 0:00 nginx: worker process
apache 2175 0.0 0.1 5504 960 ? S 10:41 0:00 nginx: worker process
apache 2177 0.0 0.1 5504 956 ? S 10:41 0:00 nginx: worker process
打开浏览器输入地址,如出现下面的图示则为 nginx 已正常:

(二)配置 Nginx 的 PHP FastCGI
安装 lighthttp 以得到 spawn-fcgi ,并以此来控制 php-cgi 进程运行
# rpm -ivh lua-5.1.2-1.el5.i386.rpm
# rpm -ivh lighttpd-1.4.18-1.el5.i386.rpm
# rpm -ivh lighttpd-fastcgi-1.4.18-1.el5.i386.rpm
编辑 /usr/local/nginx/conf/fastcgi.conf 配置文件:(如下图所示)

修改 /usr/local/nginx/conf/nginx.conf 配置文件:(如下图所示)

启动 php-cgi 进程,监听 127.0.0.1 的 9000 端口,进程数为 5(如果服务器内存小于3GB,可以只开启25个进程),用户为 apache,用户组为 apache:
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u apache -g apache -P /var/run/php-cgi.pid -f /usr/bin/php-cgi
-a <addr> 绑定到地址 addr
-p <port> 绑定到端口 port
-s <path> 绑定到 unix socket 的路径path
-C <childs> 指定产生的 FastCGI 的进程数,默认为 5(仅用于PHP)
-P <path> 指定产生的进程的PID文件路径
-u 和-g FastCGI 使用什么身份(-u 用户 -g 用户组)运行,Ubuntu 下可以使用www-data,其他的根据情况配置,如nobody、apache 等 检查 9000 端口是否正常开启:
# netstat -tlunp

(三)测试 Nginx 的 PHP FastCGI
# vi /usr/local/nginx/html/phpinfo.php (内容如下所示:)
<?php
phpinfo();
?>
在浏览器打开 phpinfo.php 页面,如出现下面的图示则为 nginx 的 PHP 已正常:

(四)安装 PHP 扩展模块:xcache
# php -m (使用该命令列出当前系统安装的 PHP Modules)
使用下面命令查看是否在上面第一个步骤中安装了 memcache,如果没有,就手动安装。
# rpm -qa |grep memcache
php-pecl-memcache-2.2.1-1.el5.centos
# tar zxvf xcache-1.2.2.tar.gz
# cd xcache-1.2.2
# /usr/bin/phpize
# ./configure –with-php-config=/usr/bin/php-config –enable-xcache
# make
# make install
(五)配置 XCache 加速 PHP
# vi /etc/php.ini (在文件最下面加入以下内容:)
[xcache-common]
zend_extension = /usr/lib/php/modules/xcache.so
[xcache.admin]
xcache.admin.user = “xcache”
; xcache.admin.pass = md5($yourpasswd)
xcache.admin.pass = “8e6867a5d05144cf4761d6481fc674a8″
[xcache]
xcache.cacher = On
xcache.shm_scheme = “mmap”
xcache.size = 32M
; cpu number (cat /proc/cpuinfo |grep -c processor)
xcache.count = 2
xcache.slots = 8k
xcache.ttl = 0
xcache.gc_interval = 0
xcache.var_size = 2M
; cpu number (cat /proc/cpuinfo |grep -c processor)
xcache.var_count = 2
xcache.var_slots = 8K
xcache.var_ttl = 0
xcache.var_maxttl = 0
xcache.var_gc_interval = 300
xcache.readonly_protection = Off
xcache.mmap_path = “/dev/zero”
再查找 display_errors = On 并将其修改为 display_errors = Off
重新启动 nginx ,然后在浏览器中刷新 phpinfo.php 页面,出现如下:

当前官方网站发布的最新稳定版本是 0.6.31 :
http://wiki.codemongers.com/NginxNews#latest_stable
