本文已有最新版本:

  请点击Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建胜过Apache十倍的Web服务器(第6版)




  [文章作者:张宴 本文版本:v1.3 最后修改:2007.11.06 转载请注明出处:http://blog.zyan.cc]

  Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,它已经在该站点运行超过两年半了。Igor 将源代码以类BSD许可证的形式发布。

  Nginx 的中文维基:http://wiki.codemongers.com/NginxChs

  在高并发连接的情况下,Nginx是Apache服务器不错的替代品。Nginx同时也可以作为7层负载均衡服务器来使用。根据我的测试结果,Nginx 0.5.31 + PHP 5.2.4 (FastCGI) 可以承受3万以上的并发连接数,相当于同等环境下Apache的10倍

  以下是 Nginx 0.5.31 + PHP 5.2.4 (FastCGI) 服务器在3万并发连接下的TCP状况:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

  各种状态TCP连接数如下(各项值所代表的含义见我的另一篇文章《查看Apache并发请求数及其TCP连接状态》):
引用
LAST_ACK 1
SYN_RECV 991
CLOSE_WAIT 1
ESTABLISHED 18789
FIN_WAIT1 1478
FIN_WAIT2 181
TIME_WAIT 506

  根据我的经验,4GB内存的服务器+Apache(prefork模式)一般只能处理3000个并发连接,因为它们将占用3GB以上的内存,还得为系统预留1GB的内存。我曾经就有两台Apache服务器,因为在配置文件中设置的MaxClients为4000,当Apache并发连接数达到3800时,导致服务器内存和Swap空间用满而崩溃。

  而这台 Nginx 0.5.31 + PHP 5.2.4 (FastCGI) 服务器在3万并发连接下,开启的10个Nginx进程消耗100M内存(20MB*10=100M),开启的250个php-cgi进程消耗1G内存(4MB*250≈1GB),加上系统自身消耗的内存,总共才消耗2GB内存。如果服务器内存较小,完全可以只开启25个php-cgi进程,这样php-cgi消耗的总内存数才100M。在开启25个php-cgi进程的情况下,每分钟的处理能力只比开启250个php-cgi进程时低了不到一半。

  以下为 Nginx 0.5.31 + PHP 5.2.4 (FastCGI) 服务器在3万并发连接下,开启的10个Nginx进程和250个php-cgi进程时的系统负载情况:
  点击在新窗口中浏览此图片


  安装步骤:
  (系统要求:Linux 2.6+ 内核,本文中的Linux操作系统为CentOS 4.4)

  一、获取相关开源程序:
  1、下载程序源码包到当前目录:
  本文中提到的所有开源软件为截止到2007年9月21日的最新稳定版。我将它们打了两个压缩包。

  第一个压缩包:nginx_php_mysql_1.0_1of2.zip:
  下载地址:http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=2289607

  第二个压缩包:nginx_php_mysql_1.0_2of2.zip:
  下载地址:http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=2289595

  2、解压缩:
unzip nginx_php_mysql_1.0_1of2.zip
unzip nginx_php_mysql_1.0_2of2.zip



  二、安装PHP 5.2.4(FastCGI模式)
  1、编译安装PHP 5.2.4所需的支持库:
tar zxvf libiconv-1.11.tar.gz
cd libiconv-1.11/
./configure --prefix=/usr/local/webserver/lib/libiconv
make && make install
cd ../

tar zxvf freetype-2.3.5.tar.gz
cd freetype-2.3.5/
./configure --prefix=/usr/local/webserver/lib/freetype
make && make install
cd ../

tar zxvf libpng-1.2.20.tar.gz
cd libpng-1.2.20/
./configure
make && make install
cd ../

tar zxvf jpegsrc.v6b.tar.gz
cd jpeg-6b/
./configure --enable-static --enable-shared
make && make install
cd ../

tar zxvf gd-2.0.35.tar.gz
cd gd-2.0.35/
./configure --prefix=/usr/local/webserver/lib/gd --with-freetype=/usr/local/webserver/lib/freetype --with-jpeg --with-png
make
make install
cd ../

tar zxvf libxml2-sources-2.6.30.tar.gz
cd libxml2-2.6.30/
./configure --prefix=/usr/local/webserver/lib/libxml
make && make install
cd ../



  2、编译安装MySQL 5.0.45
/usr/sbin/groupadd mysql
/usr/sbin/useradd -g mysql mysql
tar zxvf mysql-5.0.45.tar.gz
cd mysql-5.0.45
./configure --prefix=/usr/local/webserver/mysql/ --without-debug --with-unix-socket-path=/tmp/mysql.sock --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static --enable-assembler --with-extra-charsets=gbk,gb2312,utf8 --with-pthread --enable-thread-safe-client
make && make install
chmod +w /usr/local/webserver/mysql
chown -R mysql:mysql /usr/local/webserver/mysql
cp support-files/my-medium.cnf /usr/local/webserver/mysql/my.cnf



  附:以下为附加步骤,如果你想在这台服务器上运行MySQL数据库,则执行以下两步。如果你只是希望让PHP支持MySQL扩展库,能够连接其他服务器上的MySQL数据库,那么,以下两步无需执行。
  ①、以mysql用户帐号的身份建立数据表:
/usr/local/webserver/mysql/bin/mysql_install_db --defaults-file=/usr/local/webserver/mysql/my.cnf --basedir=/usr/local/webserver/mysql --datadir=/usr/local/webserver/mysql/data --user=mysql --pid-file=/usr/local/webserver/mysql/mysql.pid --skip-locking --port=3306 --socket=/tmp/mysql.sock


  ②、启动MySQL(最后的&表示在后台运行)
/bin/sh /usr/local/webserver/mysql/bin/mysqld_safe --defaults-file=/usr/local/webserver/mysql/my.cnf &



  3、编译安装PHP(FastCGI模式)
cd ..
tar zxvf php-5.2.4.tar.gz
cd php-5.2.4/
./configure --prefix=/usr/local/webserver/php --with-mysql=/usr/local/webserver/mysql --with-config-file-path=/usr/local/webserver/php/etc --with-gd=/usr/local/webserver/lib/gd --enable-gd-native-ttf --enable-gd-jis-conv --with-iconv-dir=/usr/local/webserver/lib/libiconv --with-freetype-dir=/usr/local/webserver/lib/freetype --with-jpeg-dir=/usr/local --with-png-dir=/usr/local --with-zlib --with-libxml-dir=/usr/local/webserver/lib/libxml --enable-xml  --disable-debug --disable-rpath --enable-discard-path --enable-safe-mode --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --with-curlwrappers --enable-mbregex --enable-fastcgi --enable-force-cgi-redirect
make && make install
cp php.ini-dist /usr/local/webserver/php/etc/php.ini
cd ../



  附:编译PHP之后,为PHP添加扩展的方法。(本步骤可选)
cd php-5.2.4/pcntl
/usr/local/webserver/php/bin/phpize
./configure --with-php-config=/usr/local/webserver/php/bin/php-config
make && make install
cd ../../../


vi /usr/local/webserver/php/etc/php.ini

修改extension_dir = "/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/"


  4、创建www用户和组,以及其使用的目录:
/usr/sbin/groupadd www -g 48
/usr/sbin/useradd -u 48 -g www www
mkdir -p /data0/vshare/htdocs
chmod +w /data0/vshare/htdocs
chown -R www:www /data0/vshare/htdocs


  5、安装lighttpd中附带的spawn-fcgi,用来启动php-cgi
  注:压缩包中的spawn-fcgi程序为已经编译成二进制的版本。
cp spawn-fcgi /usr/local/webserver/php/bin
chmod +x /usr/local/webserver/php/bin/spawn-fcgi


  6、启动php-cgi进程,监听127.0.0.1的10080端口,进程数为250(如果服务器内存小于3GB,可以只开启25个进程),用户为www:
/usr/local/webserver/php/bin/spawn-fcgi -a 127.0.0.1 -p 10080 -C 250 -u www -f /usr/local/webserver/php/bin/php-cgi



  三、安装Nginx 0.5.31
  1、安装Nginx所需的pcre库:
tar zxvf pcre-7.2.tar.gz
cd pcre-7.2/
./configure
make && make install
cd ../


  2、安装Nginx
tar zxvf nginx-0.5.31.tar.gz
cd nginx-0.5.31/
./configure --user=www --group=www --prefix=/usr/local/webserver/nginx
make && make install
cd ../


  3、创建Nginx日志目录
mkdir -p /data1/logs
chmod +w /data1/logs
chown -R www:www /data1/logs


  4、创建Nginx配置文件
  ①、在/usr/local/webserver/nginx/conf/目录中创建nginx.conf文件:
rm -f /usr/local/webserver/nginx/conf/nginx.conf
vi /usr/local/webserver/nginx/conf/nginx.conf

  输入以下内容:
引用
user  www www;

worker_processes 10;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 51200;

events
{
        use epoll;

        #maxclient = worker_processes * worker_connections / cpu_number
        worker_connections 51200;
}

http
{
        include       conf/mime.types;
        default_type  application/octet-stream;

        log_format  main  '$remote_addr - $remote_user [$time_local] $request '
                          '"$status" $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';

        access_log  /data1/logs/access.log  main;

        #sendfile on;
        #tcp_nopush     on;

        keepalive_timeout 60;

        #gzip  on;

        server
        {
                listen       80;
                server_name  localhost;
                index index.html index.htm index.php;
                root  /data0/vshare/htdocs;

                if (-f $request_filename/index.html)
                {
                        rewrite (.*) $1/index.html break;
                }
                if (-f $request_filename/index.htm)
                {
                        rewrite (.*) $1/index.htm break;
                }
                if (-f $request_filename/index.php)
                {
                        rewrite (.*) $1/index.php break;
                }

                location ~ .*\.php?$
                {
                        include conf/fcgi.conf;      
                        fastcgi_pass  127.0.0.1:10080;
                        fastcgi_index index.php;
                }
        }
}


  ②、在/usr/local/webserver/nginx/conf/目录中创建fcgi.conf文件:
vi /usr/local/webserver/nginx/conf/fcgi.conf

  输入以下内容:
引用
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx;

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
#fastcgi_param  REDIRECT_STATUS    200;


  5、启动Nginx
ulimit -SHn 51200
/usr/local/webserver/nginx/sbin/nginx -c /usr/local/webserver/nginx/conf/nginx.conf



  四、配置开机自动启动Nginx + PHP
vi /etc/rc.local

  在末尾增加以下内容:
引用
/usr/local/webserver/php/bin/spawn-fcgi -a 127.0.0.1 -p 10080 -C 250 -u www -f /usr/local/webserver/php/bin/php-cgi
ulimit -SHn 51200
/usr/local/webserver/nginx/sbin/nginx -c /usr/local/webserver/nginx/conf/nginx.conf



  五、优化Linux内核参数
vi /etc/sysctl.conf

  在末尾增加以下内容:
引用
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 5000    65000


  使配置立即生效:
/sbin/sysctl -p


  (全文完)

Tags: , , ,



技术大类 » Web服务器 | 评论(133) | 引用(1) | 阅读(200444)
sdf
2009-9-17 14:27
The nike shoes will be shipped within 24 hours after jordan shoes we received your payment. And we deliver them right to your ugg boots in 5-7 working days. You would get high quality shoes from original box. We will ship the new one free in case of being lost during shipping.
Aion Power Leveling Email Homepage
2009-10-30 15:30
slash Email Homepage
2009-11-1 19:15
张老师,我这样绑定的域名,为何alias无法生效呢?
server
{
  listen       80;
  server_name vps.bsdunion.com;
  index index.html index.htm index.php;
  root  /web/www/vps.bsdunion.com;

  location ~ .*\.(php|php5)?$
   {
    fastcgi_pass  unix:/tmp/php-cgi.sock;
    #fastcgi_pass  127.0.0.1:9000;
    fastcgi_index index.php;
    include fcgi.conf;
   }

  location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
   {
    expires      30d;
   }

  location ~ .*\.(js|css)?$
   {
    expires      12h;
   }

  access_log   off;
}
tt
2009-12-10 22:14
colen Email
2010-3-2 16:49
老大,我看了半天也没看清楚


usr/local/webserver/php/lib/php

这个目录是哪里来的啊。只叫一下。每次装到php的地方提示我一个jepg的error
我用的是centos 4.8 的系统。请指教
hwerew
2010-3-3 16:12
支持一下!THK直线导轨轴承
hwerw
2010-3-8 15:18
漂亮!顶贴!FYH轴承
hwerrtw
2010-3-12 09:36
哈哈!顶贴!ZARF组合轴承
ghwer
2010-3-18 14:52
写的太好啦!ZARN组合轴承
gwer
2010-3-25 13:33
哈哈!来这里转转吧!SL满装圆柱滚子系列轴承
646872196 Email Homepage
2010-5-29 19:02
这个怎么看的啊老师   教下我啊  我不知道怎么冲fear
KIVEN
2010-8-18 13:25
很牛啊...
这是我在编译GD时出的错误...已经解决
有个问题想请教一下张老师:
开启的250个PHP-CGI  是线程还是进程 ?
开启了10个NGINX进程,处理客户请求的是NGINX下面的线程,是这样的吗?

编译GD提示错误
cd . && /bin/sh /myfile/gd-2.0.35/config/missing --run aclocal-1.9 -I config
aclocal:configure.ac:64: warning: macro `AM_ICONV' not found in library
cd . && /bin/sh /myfile/gd-2.0.35/config/missing --run automake-1.9 --foreign
cd . && /bin/sh /myfile/gd-2.0.35/config/missing --run autoconf
configure.ac:64: error: possibly undefined macro: AM_ICONV
      If this token and others are legitimate, please use m4_pattern_allow.
      See the Autoconf documentation.
make: *** [configure] 错误 1


yum install gettext-devel-0.14.6-4.el5.i386.rpm
需要这个开发库来支持
为他而哭
2011-2-4 17:37
smile
ja
2011-5-13 10:24
编译jpeg-6b有问题,求教?[root@localhost jpeg-6b]# [root@localhost jpeg-6b]# make && make install./libtool --mode=compile gcc -O2  -I. -c ./jcapimin.cmake: ./libtool: Command not foundmake: *** [jcapimin.lo] Error 127
cheap coach handbags
2011-7-14 11:35
cheap coach handbags is the market popular time the longest and most successful brand of one of the leather. On behalf of the American Coach fashion during the innovation style and traditional skills. Durable quality and exquisite craft to Coach in the female consumers have a good reputation. I like it very much.
nginx问题
2011-9-28 10:28
张老师您好!
我是新手,初学nginx,帮我看下这个nginx问题吧,谢谢了!
upstream sp_pool {
   server 192.168.0.2:8001
   server 192.168.0.3:8001 }
upstream po_pool {
   server 192.168.0.2:8002
   server 192.168.0.3:8002 }
server_name  www.test.com;    
   location /sp/ {
   proxy_pass http://sp_pool; }    
   location /po/ {    
   proxy_pass http://po_pool; }
这样做的结果是www.test.com/spwww.test.com/po两个页面
但是我现在要的效果是sp.test.com访问www.test.com/sp访问的页面应该怎么写?
server_name改成sp.test.com后访问的结果是sp.test.com/sp 我希望nginx去掉后面那个/sp的url应该怎么办?
fffc2090dy Email Homepage
2011-9-28 11:09
楼主支持你了! 我希望文章更加完善一些,更加的精华,东莞桑拿网,那就最好了,可能是上网上多了。现在出现眼睛累了。先休息一下,
fds112bvcd Email Homepage
2011-9-28 17:05
数字军团和字母军团打了起来,Gianmarco Lorenzi Pumps,数字头领0说:“1、3,Christian Louboutin Ankle Boots,你们组成B,潜入字母军团,Christian Louboutin Boots!”过了会,只见1、3头破血流地回来了,说:“头领,louis vuitton purses,我们装B被发现了!”
nginx问题
2011-9-28 18:18
张老师您好!
我是新手,初学nginx,帮我看下这个nginx问题吧,谢谢了!
upstream sp_pool {
   server 192.168.0.2:8001
   server 192.168.0.3:8001 }
upstream po_pool {
   server 192.168.0.2:8002
   server 192.168.0.3:8002 }
server_name  www.test.com;    
   location /sp/ {
   proxy_pass http://sp_pool; }    
   location /po/ {    
   proxy_pass http://po_pool; }
这样做的结果是www.test.com/spwww.test.com/po两个页面
但是我现在要的效果是sp.test.com访问www.test.com/sp访问的页面应该怎么写?
server_name改成sp.test.com后访问的结果是sp.test.com/sp 我希望nginx去掉后面那个/sp的url应该怎么办?
c7edf6882 Email Homepage
2011-9-29 04:13
眼看从沙发降到了板凳,又从板凳降到了地板,再不顶,估计首页都不能保住了。。。 www.wlyxwb.com
分页: 3/7 第一页 上页 1 2 3 4 5 6 7 下页 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]