A NEW DAY HAS COME

Archives for 电脑软件 category

Anehta — 新一代的web攻击平台

2008-10-30 09:06

来源:http://hi.baidu.com/aullik5/blog/item/203809540b611ac2b745aeee.html

两个礼拜了,从一开始的激动不已,到现在更加激动不已。

有很多想说,又不知从何说起。那么,还是采取FAQ的形式来向大家介绍吧!

Q: 为什么叫:Anehta ?
A: 因为“雅典娜”的名字是 :athena ,但是这个名字已经被sourceforge上的某人抢了,所以按照“刺氏命名法”,把“athena”反过来,本项目正式命名为: Anehta,中文发音:“阿内塔”

Q: Anehta 项目是做什么的?
A: 简单来说,你可以理解为
AttackAPI + BeEF。 但是Anehta 绝对没有这么简单,因为我实现了很多特有的机制,使得Anehta更加强大以及更加容易扩展。

Q: 没听过什么AttackAPI,还是不知道Anehta是做什么。
A: 更通俗来说,Anehta 就是一个跨站脚本攻击(XSS)的利用平台。

Q:Anehta是用什么语言开发的,对系统有什么要求?
A:由于在一开始就考虑到了通用性、跨平台性、跨浏览器、稳定性、易扩展性,所以Anehta在这方面做的是非常好的。anehta是基于javascript 和 PHP开发的。其中部分用到了 jQuery 框架,虽然anehta 可以独立于jQuery存在,但是考虑到引入jQuery 后,可以大大降低开发模块的成本,所以还是保留了。使用jQuery的另外一个好处就是跨浏览器,因为jQuery 本身是跨浏览器的,所以anehta也很容易做到这点.

使用PHP是因为PHP是当今使用最为广泛的脚本语言之一。(其实有个很不可告人的原因是因为大部分肉鸡都是PHP的吧,嘿嘿,anehta不需要任何perl、python、ruby等脚本支持)

Q:Anehta的架构是什么样的?
A:首先,我使用javascript 实现了一套JS框架,这套框架封装了很多函数和类,是专门用于攻击的一套JS框架。使用这套框架可以非常轻松的开发出威力强大的脚本。这套框架网站开发者也可以使用,可以获得很多强大的功能。

其次,基于这套框架,我开发了许多模块,比如本项目特有的“回旋镖模块”,可以跨域偷取cookie;再比如一个完美的JS键盘记录器等,还有很多功能,我会陆续补充好文档。

再次,anehta拥有非常清晰的结构,XSS后只需要加载一个feed.js,就会自动完成所有工作了。

最后,anehta不是纯客户端的,除了核心的JS攻击框架外,在服务端还利用PHP做了许多处理。

Q:Anehta具有什么特色和优点
A:Anehta 结构清晰,功能是模块化,开发者可以单独为anehta开发各种各样的模块,以满足独特的需求。
模块之间具有低耦合性,互不影响。同时anehta的模块互相之间可以通信。

此外anetha还实现了很多独特、方便的技术。比如hook模块中,实现了可以hook任意js函数的方法。此外利用flash shared objects实现的水印技术也非常独特,即便用户删除了cookie,从IE切换到了Firefox或是Opera,也照样能够识别出是本人. 而回旋镖模块更是能够将反射型的XSS变成持久型的XSS,实时命令模块等都属于基本功能了。不久后我会补全anehta的文档,包括所有API的使用说明。

Anehta 的另一个特色就是会集成flash、java、css等多种hacking技术于一体,虽然目前还只实现了一小部分,但是我会慢慢把他们都做完。

此外,由于服务端的存在,所以Anehta 是一个平台(Platform),而并非一个框架(framework)。服务端设计还存在很大的开发潜力。

Q:为什么要做这样一个项目?
A:可以说是心血来潮,也可以说是游戏之作,但是Anehta确实倾注了我的大量心血。从一开始我就总结了很多需求,思考了很多设计上的东西,所以anehta拥有非常好的架构和可扩展性。我的目的是将anehta做成一个集web攻击大成者的平台,所以anehta会涉及到那么多乱七八糟的技术。

出于精简的目的,我舍弃了很多用处不大的功能,但是anehta还将扩展更多强大和实用的功能。在我看来,anehta的js框架部分已经比attackAPI要好了,功能部分更是远远超过了BeEF和XSS Shell!

Q:Anehta针对哪些用户?
A:本项目是为安全工程师进行渗透测试以及演示脚本漏洞的危害而设计,请勿用作非法用途!本项目遵循GPLv3条款,属于开源项目,任何人可以自由复制、使用或修改本代码,本人概不承担法律责任!

Q:Anehta实现了哪些功能?
A:以下是已经实现的功能列表
* 获取客户端基本信息(浏览器版本/OS version/客户端IP/代理IP/Referer/Request URI);
* Ajax库支持
* 窃取客户端Cookie
* 跨域窃取Cookie(比如我在淘宝上窃取百度的cookie)
* 灵活的XSRF模块
* 客户端DDOS攻击(发起大量请求,CC)
* hook表单提交(Form Sniffer 功能)
* hook 任意javascript 函数;注入任意javascript函数
* 一个优秀的Javascript Keylogger;
* 支持数据加密传输(出于性能考虑,目前暂时使用base64)
* 注入iframe模块(可以实施挂马)
* 模块之间互相通信
* 独特的客户端水印,使得删除cookie、切换浏览器也能识别到用户
* logger虚拟守护进程(定时检查所有模块的输出,并记录到服务器)
    窃取剪贴板的内容(仅仅支持IE)
* 客户端地理位置查询
* 在线的web代理,支持自定义cookie访问站点(第三方实现)
* 实时命令模块
* 扫描浏览器的历史记录
    一个基于JS的端口扫描器
* 获取客户端软件信息(比如是否安装了QQ、迅雷等)
* 邮件通知模块

Q:Anehta未来会怎么发展?
A:我会持续开发和扩展Anehta,在不久的未来会完善英文文档并对外正式发布。目前计划里的蓝图如下:
Client-Side
* GIFAR支持
    ClickJacking/XSIO支持
    XSS Worm Module
    获取显示器分辨率
    钓鱼模块(可以欺骗用户从而获取密码等)
    获取客户端真实IP
* 更加强大的扫描模块
    JS压缩、变形(让anehta更小巧)
    Cross Site Sql Injection 模块(对注射的支持)
* 客户端代理模块(直接利用客户端访问网站,这在攻击内部系统时很有用)
* 检查IM或者网站的登录状态
* 更多的子窗口控制功能
* 调用activex的一些方法
* pipeline(管道功能,具体作用暂且保密)
* 验证码的支持
    将大量功能集成到flash和java中
    Heap Spray 、 Heap Fengshui 模块,帮助更方便写客户端exploit
    升级和传播模块
    支持加载第三方攻击库,比如attackAPI
    新技术的支持(HTML5,AS3,CSS3等)
    ……

Server-Side:
* 通过IM自动通知Master
* 通过手机短信自动通知Master
    客户端session保持以及session fixation支持
* 良好的多主机管理以及更加友好的界面
    feed.js 生成器
* 数据库支持(Mysql 或 sqlite);
    更加友好的log输出

Both Client and Server:
* 窃取客户端文件(Ajax Upload)

Anehta还有一些bug和不足,先不列到这里了,我会持续改进,此外由于我对UI和美化一窍不通,所以目前界面还很丑,将就着用吧!

哪位朋友有心也可以帮我写写UI

最后,啰嗦了这么多,是不是等不及了呢?
那么,要看演示的,可以到这里下载录像:
http://www.secwiki.com/anehta/demo/anehtaDEMO.zip

也可以在线观看,不过文件比较大,有20多M
http://www.secwiki.com/anehta/demo/anehta.html

想体验一下? 到这里访问demo页面:
http://www.secwiki.com/anehta/demo.html DEMO页面是一个被XSS的页面

粗陋的后台是在:
http://www.secwiki.com/anehta/admin.php 在这里可以看到被XSS后的结果。

请参考我制作的录像

FF的用户请关闭noscript扩展,拦截了就没得玩了撒

项目首页:
http://anehta.googlecode.com

源代码获取:
http://code.google.com/p/anehta/source/checkout

打包下载:(下次地址变更了,有个文件忘记打包了)
http://anehta.googlecode.com/files/anehta-v0.5.5fixed.zip

镜像:http://www.nukeblog.cn/anehta/anehta-v0.5.5fixed.zip

不包含QQWry.dat 的版本:(314k,需要有QQWray.dat才能正常运行)
http://anehta.googlecode.com/files/anehta-v0.5.5_fixed_withoutQQWry.zip

QQWry单独下载:(4M, 下载后放到anehta根目录)
http://anehta.googlecode.com/files/QQWry.zip

-EOF-

[文章作者:张宴 本文版本:v4.10 最后修改:2008.12.23 转载请注明原文链接:http://blog.s135.com/post/366.htm]

  前言:本文是我撰写的关于搭建“Nginx + PHP(FastCGI)”Web服务器的第4篇文章。本系列文章作为国内最早详细介绍 Nginx + PHP 安装、配置、使用的资料之一,为推动 Nginx 在国内的发展产生了积极的作用。这是一篇关于Nginx 0.7.x系列版本的文章,安装、配置方式与第3篇文章相差不大,但配置参数有不同。Nginx 0.7.x系列版本虽然为开发版,但在很多大型网站的生产环境中已经使用。

  链接:《2007年9月的第1版》、《2007年12月的第2版》、《2008年6月的第3版

  点击在新窗口中浏览此图片

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

  Nginx 超越 Apache 的高性能和稳定性,使得国内使用 Nginx 作为 Web 服务器的网站也越来越多,其中包括新浪博客新浪播客网易新闻等门户网站频道,六间房56.com等视频分享网站,Discuz!官方论坛水木社区等知名论坛,豆瓣YUPOO相册海内SNS迅雷在线等新兴Web 2.0网站。


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



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

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

  而这台 Nginx 0.7.27 + PHP 5.2.8 (FastCGI) 服务器在3万并发连接下,开启的10个Nginx进程消耗150M内存(15M*10=150M),开启的64个php-cgi进程消耗1280M内存(20M*64=1280M),加上系统自身消耗的内存,总共消耗不到2GB内存。如果服务器内存较小,完全可以只开启25个php-cgi进程,这样php-cgi消耗的总内存数才500M。

  在3万并发连接下,访问Nginx 0.7.27 + PHP 5.2.8 (FastCGI) 服务器的PHP程序,仍然速度飞快。下图为Nginx的状态监控页面,显示的活动连接数为28457(关于Nginx的监控页配置,会在本文接下来所给出的Nginx配置文件中写明):

  点击在新窗口中浏览此图片

  我生产环境下的两台Nginx + PHP5(FastCGI)服务器,跑多个一般复杂的纯PHP动态程序,单台Nginx + PHP5(FastCGI)服务器跑PHP动态程序的处理能力已经超过“700次请求/秒”,相当于每天可以承受6000万(700*60*60*24=60480000)的访问量(更多信息见此),而服务器的系统负载也不高:

  点击在新窗口中浏览此图片


  安装步骤:
  (系统要求:Linux 2.6+ 内核,本文中的Linux操作系统为CentOS 5.1,另在RedHat AS4上也安装成功)

  一、获取相关开源程序:
  1、利用CentOS Linux系统自带的yum命令安装、升级所需的程序库(RedHat等其他Linux发行版可从安装光盘中找到这些程序库的RPM包,进行安装):

sudo -s
LANG=C
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

  2、RedHat等其他Linux发行版可从安装光盘中找到这些程序库的RPM包(事先可通过类似“rpm -qa | grep libjpeg”的命令查看所需的RPM包是否存在,通常是“xxx-devel”不存在,需要安装)。RedHat可以直接利用CentOS的RPM包安装,以下是RPM包下载网址:
  ①、RedHat AS4 & CentOS 4
  http://mirror.be10.com/centos/4/os/i386/CentOS/RPMS/
  http://mirror.be10.com/centos/4/os/x86_64/CentOS/RPMS/

  ②、RedHat AS5 & CentOS 5
  http://mirror.be10.com/centos/5/os/i386/CentOS/
  http://mirror.be10.com/centos/5/os/x86_64/CentOS/

  ③、RPM包搜索网站
  http://rpm.pbone.net/
  http://www.rpmfind.net/

  3、下载程序源码包:
  本文中提到的所有开源软件为截止到2008年12月17日的最新稳定版。
  ①、从软件的官方网站下载:

mkdir -p /data0/software
cd /data0/software
wget http://sysoev.ru/nginx/nginx-0.7.27.tar.gz
wget http://www.php.net/get/php-5.2.8.tar.gz/from/this/mirror
wget http://php-fpm.anight.org/downloads/head/php-5.2.8-fpm-0.5.10.diff.gz
wget http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.30.tar.gz/from/http://mirrors.24-7-solutions.net/pub/mysql/
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.12.tar.gz
wget “http://downloads.sourceforge.net/mcrypt/libmcrypt-2.5.8.tar.gz?modtime=1171868460&big_mirror=0″
wget “http://downloads.sourceforge.net/mcrypt/mcrypt-2.6.7.tar.gz?modtime=1194463373&big_mirror=0″
wget http://pecl.php.net/get/memcache-2.2.4.tgz
wget “http://downloads.sourceforge.net/mhash/mhash-0.9.9.tar.gz?modtime=1175740843&big_mirror=0″
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.8.tar.gz
wget http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.tar.bz2
wget http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz
  ②、从blog.s135.com下载(比较稳定,只允许在本站,或者在Linux/Unix下通过Wget、Curl等命令下载以下软件):

mkdir -p /data0/software
cd /data0/software
wget http://blog.s135.com/soft/linux/nginx_php/nginx/nginx-0.7.27.tar.gz
wget http://blog.s135.com/soft/linux/nginx_php/php/php-5.2.8.tar.gz
wget http://blog.s135.com/soft/linux/nginx_php/phpfpm/php-5.2.8-fpm-0.5.10.diff.gz
wget http://blog.s135.com/soft/linux/nginx_php/mysql/mysql-5.1.30.tar.gz
wget http://blog.s135.com/soft/linux/nginx_php/libiconv/libiconv-1.12.tar.gz
wget http://blog.s135.com/soft/linux/nginx_php/mcrypt/libmcrypt-2.5.8.tar.gz
wget http://blog.s135.com/soft/linux/nginx_php/mcrypt/mcrypt-2.6.7.tar.gz
wget http://blog.s135.com/soft/linux/nginx_php/memcache/memcache-2.2.4.tgz
wget http://blog.s135.com/soft/linux/nginx_php/mhash/mhash-0.9.9.tar.gz
wget http://blog.s135.com/soft/linux/nginx_php/pcre/pcre-7.8.tar.gz
wget http://blog.s135.com/soft/linux/nginx_php/eaccelerator/eaccelerator-0.9.5.3.tar.bz2
wget http://blog.s135.com/soft/linux/nginx_php/pdo/PDO_MYSQL-1.0.2.tgz


  二、安装PHP 5.2.8(FastCGI模式)
  1、编译安装PHP 5.2.8所需的支持库:

tar zxvf libiconv-1.12.tar.gz
cd libiconv-1.12/
./configure –prefix=/usr/local
make
make install
cd ../

tar zxvf libmcrypt-2.5.8.tar.gz
cd libmcrypt-2.5.8/
./configure
make
make install
/sbin/ldconfig
cd libltdl/
./configure –enable-ltdl-install
make
make install
cd ../../

tar zxvf mhash-0.9.9.tar.gz
cd mhash-0.9.9/
./configure
make
make install
cd ../

ln -s /usr/local/lib/libmcrypt.la /usr/lib/libmcrypt.la
ln -s /usr/local/lib/libmcrypt.so /usr/lib/libmcrypt.so
ln -s /usr/local/lib/libmcrypt.so.4 /usr/lib/libmcrypt.so.4
ln -s /usr/local/lib/libmcrypt.so.4.4.8 /usr/lib/libmcrypt.so.4.4.8
ln -s /usr/local/lib/libmhash.a /usr/lib/libmhash.a
ln -s /usr/local/lib/libmhash.la /usr/lib/libmhash.la
ln -s /usr/local/lib/libmhash.so /usr/lib/libmhash.so
ln -s /usr/local/lib/libmhash.so.2 /usr/lib/libmhash.so.2
ln -s /usr/local/lib/libmhash.so.2.0.1 /usr/lib/libmhash.so.2.0.1

tar zxvf mcrypt-2.6.7.tar.gz
cd mcrypt-2.6.7/
/sbin/ldconfig
./configure
make
make install
cd ../


  2、编译安装MySQL 5.1.30

/usr/sbin/groupadd mysql
/usr/sbin/useradd -g mysql mysql
tar zxvf mysql-5.1.30.tar.gz
cd mysql-5.1.30/
./configure –prefix=/usr/local/webserver/mysql/ –enable-assembler –with-extra-charsets=complex –enable-thread-safe-client –with-big-tables –with-readline –with-ssl –with-embedded-server –enable-local-infile –with-innodb
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
cd ../


  附:以下为附加步骤,如果你想在这台服务器上运行MySQL数据库,则执行以下两步。如果你只是希望让PHP支持MySQL扩展库,能够连接其他服务器上的MySQL数据库,那么,以下两步无需执行。
  ①、以mysql用户帐号的身份建立数据表:

/usr/local/webserver/mysql/bin/mysql_install_db –basedir=/usr/local/webserver/mysql –datadir=/usr/local/webserver/mysql/data –user=mysql

  ②、启动MySQL(最后的&表示在后台运行)

/bin/sh /usr/local/webserver/mysql/bin/mysqld_safe –defaults-file=/usr/local/webserver/mysql/my.cnf &


  3、编译安装PHP(FastCGI模式)

tar zxvf php-5.2.8.tar.gz
gzip -cd php-5.2.8-fpm-0.5.10.diff.gz | patch -d php-5.2.8 -p1
cd php-5.2.8/
./configure –prefix=/usr/local/webserver/php –with-config-file-path=/usr/local/webserver/php/etc –with-mysql=/usr/local/webserver/mysql –with-mysqli=/usr/local/webserver/mysql/bin/mysql_config –with-iconv-dir=/usr/local –with-freetype-dir –with-jpeg-dir –with-png-dir –with-zlib –with-libxml-dir=/usr –enable-xml –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-fpm –enable-force-cgi-redirect –enable-mbstring –with-mcrypt –with-gd –enable-gd-native-ttf –with-openssl –with-mhash –enable-pcntl –enable-sockets
make ZEND_EXTRA_LIBS=’-liconv’
make install
cp php.ini-dist /usr/local/webserver/php/etc/php.ini
cd ../


  4、编译安装PHP5扩展模块

tar zxvf memcache-2.2.4.tgz
cd memcache-2.2.4/
/usr/local/webserver/php/bin/phpize
./configure –with-php-config=/usr/local/webserver/php/bin/php-config
make
make install
cd ../

tar jxvf eaccelerator-0.9.5.3.tar.bz2
cd eaccelerator-0.9.5.3/
/usr/local/webserver/php/bin/phpize
./configure –enable-eaccelerator=shared –with-php-config=/usr/local/webserver/php/bin/php-config
make
make install
cd ../

tar zxvf PDO_MYSQL-1.0.2.tgz
cd PDO_MYSQL-1.0.2/
/usr/local/webserver/php/bin/phpize
./configure –with-php-config=/usr/local/webserver/php/bin/php-config –with-pdo-mysql=/usr/local/webserver/mysql
make
make install
cd ../

  5、修改php.ini文件
  手工修改:查找/usr/local/webserver/php/etc/php.ini中的extension_dir = “./”
  修改为extension_dir = “/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/”
  并在此行后增加以下几行,然后保存:
  extension = “memcache.so”
  extension = “pdo_mysql.so”

  再查找output_buffering = Off
  修改为output_buffering = On

  自动修改:若嫌手工修改麻烦,可执行以下shell命令,自动完成对php.ini文件的修改:

sed -i ’s#extension_dir = “./”#extension_dir = “/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/”\nextension = “memcache.so”\nextension = “pdo_mysql.so”\n#’ /usr/local/webserver/php/etc/php.ini
sed -i ’s#output_buffering = Off#output_buffering = On#’ /usr/local/webserver/php/etc/php.ini

  6、配置eAccelerator加速PHP:

mkdir -p /usr/local/webserver/eaccelerator_cache
vi /usr/local/webserver/php/etc/php.ini
  按shift+g键跳到配置文件的最末尾,加上以下配置信息:

引用

[eaccelerator]
zend_extension=”/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so”
eaccelerator.shm_size=”128″
eaccelerator.cache_dir=”/usr/local/webserver/eaccelerator_cache”
eaccelerator.enable=”1″
eaccelerator.optimizer=”1″
eaccelerator.check_mtime=”1″
eaccelerator.debug=”0″
eaccelerator.filter=”"
eaccelerator.shm_max=”0″
eaccelerator.shm_ttl=”300″
eaccelerator.shm_prune_period=”120″
eaccelerator.shm_only=”0″
eaccelerator.compress=”1″
eaccelerator.compress_level=”9″

  修改配置文件:

vi /etc/sysctl.conf

  输入以下内容:

引用

kernel.shmmax = 134217728

  然后执行以下命令使配置生效:

/sbin/sysctl -p


  7、创建www用户和组,以及供blog.s135.com和www.s135.com两个虚拟主机使用的目录:

/usr/sbin/groupadd www
/usr/sbin/useradd -g www www
mkdir -p /data0/htdocs/blog
chmod +w /data0/htdocs/blog
chown -R www:www /data0/htdocs/blog
mkdir -p /data0/htdocs/www
chmod +w /data0/htdocs/www
chown -R www:www /data0/htdocs/www

  8、创建php-fpm配置文件(php-fpm是为PHP打的一个FastCGI管理补丁,可以平滑变更php.ini配置而无需重启php-cgi):
  在/usr/local/webserver/php/etc/目录中创建php-fpm.conf文件:

rm -f /usr/local/webserver/php/etc/php-fpm.conf
vi /usr/local/webserver/php/etc/php-fpm.conf
  输入以下内容(如果您安装 Nginx + PHP 用于程序调试,请将以下的<value name=”display_errors”>0</value>改为<value name=”display_errors”>1</value>,以便显示PHP错误信息,否则,Nginx 会报状态为500的空白错误页):

view plaincopy to clipboardprint?

  1. <?xml version=“1.0″ ?>  
  2. <configuration>  
  3.   
  4.   All relative paths in this config are relative to php’s install prefix   
  5.   
  6.   <section name=“global_options”>  
  7.   
  8.     Pid file   
  9.     <value name=“pid_file”>/usr/local/webserver/php/logs/php-fpm.pid</value>  
  10.   
  11.     Error log file   
  12.     <value name=“error_log”>/usr/local/webserver/php/logs/php-fpm.log</value>  
  13.   
  14.     Log level   
  15.     <value name=“log_level”>notice</value>  
  16.   
  17.     When this amount of php processes exited with SIGSEGV or SIGBUS …   
  18.     <value name=“emergency_restart_threshold”>10</value>  
  19.   
  20.     … in a less than this interval of time, a graceful restart will be initiated.   
  21.     Useful to work around accidental curruptions in accelerator’s shared memory.   
  22.     <value name=“emergency_restart_interval”>1m</value>  
  23.   
  24.     Time limit on waiting child’s reaction on signals from master   
  25.     <value name=“process_control_timeout”>5s</value>  
  26.   
  27.     Set to ’no’ to debug fpm   
  28.     <value name=“daemonize”>yes</value>  
  29.   
  30.   </section>  
  31.   
  32.   <workers>  
  33.   
  34.     <section name=“pool”>  
  35.   
  36.       Name of pool. Used in logs and stats.   
  37.       <value name=“name”>default</value>  
  38.   
  39.       Address to accept fastcgi requests on.   
  40.       Valid syntax is ’ip.ad.re.ss:port’ or just ’port’ or ’/path/to/unix/socket’   
  41.       <value name=“listen_address”>127.0.0.1:9000</value>  
  42.   
  43.       <value name=“listen_options”>  
  44.   
  45.         Set listen(2) backlog   
  46.         <value name=“backlog”>-1</value>  
  47.   
  48.         Set permissions for unix socket, if one used.   
  49.         In Linux read/write permissions must be set in order to allow connections from web server.   
  50.         Many BSD-derrived systems allow connections regardless of permissions.   
  51.         <value name=“owner”></value>  
  52.         <value name=“group”></value>  
  53.         <value name=“mode”>0666</value>  
  54.       </value>  
  55.   
  56.       Additional php.ini defines, specific to this pool of workers.   
  57.       <value name=“php_defines”>  
  58.         <value name=“sendmail_path”>/usr/sbin/sendmail -t -i</value>  
  59.         <value name=“display_errors”>1</value>  
  60.       </value>  
  61.   
  62.       Unix user of processes   
  63.         <value name=“user”>www</value>  
  64.   
  65.       Unix group of processes   
  66.         <value name=“group”>www</value>  
  67.   
  68.       Process manager settings   
  69.       <value name=“pm”>  
  70.   
  71.         Sets style of controling worker process count.   
  72.         Valid values are ’static’ and ’apache-like’   
  73.         <value name=“style”>static</value>  
  74.   
  75.         Sets the limit on the number of simultaneous requests that will be served.   
  76.         Equivalent to Apache MaxClients directive.   
  77.         Equivalent to PHP_FCGI_CHILDREN environment in original php.fcgi   
  78.         Used with any pm_style.   
  79.         <value name=“max_children”>128</value>  
  80.   
  81.         Settings group for ’apache-like’ pm style   
  82.         <value name=“apache_like”>  
  83.   
  84.           Sets the number of server processes created on startup.   
  85.           Used only when ’apache-like’ pm_style is selected   
  86.           <value name=“StartServers”>20</value>  
  87.   
  88.           Sets the desired minimum number of idle server processes.   
  89.           Used only when ’apache-like’ pm_style is selected   
  90.           <value name=“MinSpareServers”>5</value>  
  91.   
  92.           Sets the desired maximum number of idle server processes.   
  93.           Used only when ’apache-like’ pm_style is selected   
  94.           <value name=“MaxSpareServers”>35</value>  
  95.   
  96.         </value>  
  97.   
  98.       </value>  
  99.   
  100.       The timeout (in seconds) for serving a single request after which the worker process will be terminated   
  101.       Should be used when ’max_execution_time’ ini option does not stop script execution for some reason   
  102.       ’0s’ means ’off’   
  103.       <value name=“request_terminate_timeout”>0s</value>  
  104.   
  105.       The timeout (in seconds) for serving of single request after which a php backtrace will be dumped to slow.log file   
  106.       ’0s’ means ’off’   
  107.       <value name=“request_slowlog_timeout”>0s</value>  
  108.   
  109.       The log file for slow requests   
  110.       <value name=“slowlog”>logs/slow.log</value>  
  111.   
  112.       Set open file desc rlimit   
  113.       <value name=“rlimit_files”>51200</value>  
  114.   
  115.       Set max core size rlimit   
  116.       <value name=“rlimit_core”>0</value>  
  117.   
  118.       Chroot to this directory at the start, absolute path   
  119.       <value name=“chroot”></value>  
  120.   
  121.       Chdir to this directory at the start, absolute path   
  122.       <value name=“chdir”></value>  
  123.   
  124.       Redirect workers’ stdout and stderr into main error log.   
  125.       If not set, they will be redirected to /dev/null, according to FastCGI specs   
  126.       <value name=“catch_workers_output”>yes</value>  
  127.   
  128.       How much requests each process should execute before respawn.   
  129.       Useful to work around memory leaks in 3rd party libraries.   
  130.       For endless request processing please specify 0   
  131.       Equivalent to PHP_FCGI_MAX_REQUESTS   
  132.       <value name=“max_requests”>500</value>  
  133.   
  134.       Comma separated list of ipv4 addresses of FastCGI clients that allowed to connect.   
  135.       Equivalent to FCGI_WEB_SERVER_ADDRS environment in original php.fcgi (5.2.2+)   
  136.       Makes sense only with AF_INET listening socket.   
  137.       <value name=“allowed_clients”>127.0.0.1</value>  
  138.   
  139.       Pass environment variables like LD_LIBRARY_PATH   
  140.       All $VARIABLEs are taken from current environment   
  141.       <value name=“environment”>  
  142.         <value name=“HOSTNAME”>$HOSTNAME</value>  
  143.         <value name=“PATH”>/usr/local/bin:/usr/bin:/bin</value>  
  144.         <value name=“TMP”>/tmp</value>  
  145.         <value name=“TMPDIR”>/tmp</value>  
  146.         <value name=“TEMP”>/tmp</value>  
  147.         <value name=“OSTYPE”>$OSTYPE</value>  
  148.         <value name=“MACHTYPE”>$MACHTYPE</value>  
  149.         <value name=“MALLOC_CHECK_”>2</value>  
  150.       </value>  
  151.   
  152.     </section>  
  153.   
  154.   </workers>  
  155.   
  156. </configuration>  

  9、启动php-cgi进程,监听127.0.0.1的9000端口,进程数为200(如果服务器内存小于3GB,可以只开启64个进程),用户为www:

ulimit -SHn 51200
/usr/local/webserver/php/sbin/php-fpm start
  注:/usr/local/webserver/php/sbin/php-fpm还有其他参数,包括:start|stop|quit|restart|reload|logrotate,修改php.ini后不重启php-cgi,重新加载配置文件使用reload。


  三、安装Nginx 0.7.27
  1、安装Nginx所需的pcre库:

tar zxvf pcre-7.8.tar.gz
cd pcre-7.8/
./configure
make && make install
cd ../

  2、安装Nginx

tar zxvf nginx-0.7.27.tar.gz
cd nginx-0.7.27/
./configure –user=www –group=www –prefix=/usr/local/webserver/nginx –with-http_stub_status_module –with-http_ssl_module
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 8;

error_log  /data1/logs/nginx_error.log  crit;

pid        /usr/local/webserver/nginx/nginx.pid;

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

events
{
 use epoll;
 worker_connections 51200;
}

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

 #charset  gb2312;
     
 server_names_hash_bucket_size 128;
 client_header_buffer_size 32k;
 large_client_header_buffers 4 32k;
 client_max_body_size 8m;
     
 sendfile on;
 tcp_nopush     on;

 keepalive_timeout 60;

 tcp_nodelay on;

 fastcgi_connect_timeout 300;
 fastcgi_send_timeout 300;
 fastcgi_read_timeout 300;
 fastcgi_buffer_size 64k;
 fastcgi_buffers 4 64k;
 fastcgi_busy_buffers_size 128k;
 fastcgi_temp_file_write_size 128k;

 gzip on;
 gzip_min_length  1k;
 gzip_buffers     4 16k;
 gzip_http_version 1.0;
 gzip_comp_level 2;
 gzip_types       text/plain application/x-javascript text/css application/xml;
 gzip_vary on;

 #limit_zone  crawler  $binary_remote_addr  10m;

 server
 {
   listen       80;
   server_name  blog.s135.com;
   index index.html index.htm index.php;
   root  /data0/htdocs/blog;

   #limit_conn   crawler  20;    
                           
   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      1h;
   }    

   log_format  access  ’$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  access;
     }

 server
 {
   listen       80;
   server_name  www.s135.com;
   index index.html index.htm index.php;
   root  /data0/htdocs/www;

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

   log_format  wwwlogs  ’$remote_addr - $remote_user [$time_local] “$request” ‘
              ‘$status $body_bytes_sent “$http_referer” ‘
              ‘”$http_user_agent” $http_x_forwarded_for’;
   access_log  /data1/logs/wwwlogs.log  wwwlogs;
 }

 server
 {
   listen  80;
   server_name  status.blog.s135.com;

   location / {
   stub_status on;
   access_log   off;
   }
 }
}

  ②、在/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


  四、配置开机自动启动Nginx + PHP

vi /etc/rc.local

  在末尾增加以下内容:

引用

ulimit -SHn 51200
/usr/local/webserver/php/sbin/php-fpm start
/usr/local/webserver/nginx/sbin/nginx


  五、优化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


  六、在不停止Nginx服务的情况下平滑变更Nginx配置
  1、修改/usr/local/webserver/nginx/conf/nginx.conf配置文件后,请执行以下命令检查配置文件是否正确:

/usr/local/webserver/nginx/sbin/nginx -t

  如果屏幕显示以下两行信息,说明配置文件正确:
  the configuration file /usr/local/webserver/nginx/conf/nginx.conf syntax is ok
  the configuration file /usr/local/webserver/nginx/conf/nginx.conf was tested successfully

  2、这时,输入以下命令查看Nginx主进程号:

ps -ef | grep “nginx: master process” | grep -v “grep” | awk -F ‘ ‘ ‘{print $2}’

  屏幕显示的即为Nginx主进程号,例如:
  6302
  这时,执行以下命令即可使修改过的Nginx配置文件生效:

kill -HUP 6302

  或者无需这么麻烦,找到Nginx的Pid文件:

kill -HUP `cat /usr/local/webserver/nginx/nginx.pid`


  七、编写每天定时切割Nginx日志的脚本
  1、创建脚本/usr/local/webserver/nginx/sbin/cut_nginx_log.sh

vi /usr/local/webserver/nginx/sbin/cut_nginx_log.sh

  输入以下内容:

引用

#!/bin/bash
# This script run at 00:00

# The Nginx logs path
logs_path=”/usr/local/webserver/nginx/logs/”

mkdir -p ${logs_path}$(date -d “yesterday” +”%Y”)/$(date -d “yesterday” +”%m”)/
mv ${logs_path}access.log ${logs_path}$(date -d “yesterday” +”%Y”)/$(date -d “yesterday” +”%m”)/access_$(date -d “yesterday” +”%Y%m%d”).log
kill -USR1 `cat /usr/local/webserver/nginx/nginx.pid`

  2、设置crontab,每天凌晨00:00切割nginx访问日志

crontab -e

  输入以下内容:

引用

00 00 * * * /bin/bash  /usr/local/webserver/nginx/sbin/cut_nginx_log.sh


  本文若有小的修改,会第一时间在以下网址发布:
  http://blog.s135.com/post/366.htm



  附:文章修改历史

  ● [2008年08月29日] [Version 4.0] 撰写本文

  ● [2008年09月03日] [Version 4.1] 修改了nginx.conf文件有关gzip压缩的项,“gzip_http_version 1.1;”改为“gzip_http_version 1.0;”,增加一项“gzip_vary on;”,目的是为了让Nginx前端的Squid 2.5/2.6缓存服务器能够缓存经过gzip压缩的页面。另外,将nginx版本由0.7.13升级到最新的0.7.14。

  ● [2008年10月06日] [Version 4.2] 增加第七章──“编写每天定时切割Nginx日志的脚本”;升级Nginx版本到0.7.17;升级PHP FastCGI补丁到php-5.2.6-fpm-0.5.9.diff.gz;修改php-fpm.conf配置文件。

  ● [2008年10月26日] [Version 4.3] 升级Nginx版本到0.7.19。

  ● [2008年11月02日] [Version 4.4] 升级MySQL版本到5.1.29-rc。对文中涉及到的开源软件增加blog.s135.com下载点。

  ● [2008年11月11日] [Version 4.5] MySQL编译参数加上对InnoDB存储引擎的支持。

  ● [2008年11月14日] [Version 4.6] 解决在某些64位CentOS系统上,编译PHP时出现的libcrypto和libcurl无法找到的错误;升级Nginx版本到0.7.21。

  ● [2008年11月24日] [Version 4.7] 为PHP增加PDO_MYSQL扩展支持;升级PHP的Memcache扩展到2.2.4版本;升级PCRE版本到0.7.8;升级Nginx版本到0.7.22。

  ● [2008年12月12日] [Version 4.8] 升级Nginx版本到0.7.26;升级MySQL版本到5.1.30。

  ● [2008年12月17日] [Version 4.9] 编译PHP时的“sed -i ’s#-lz -lm -lxml2 -lz -lm -lxml2 -lz -lm -lcrypt#& -liconv#’ Makefile”和“make”两条语句改为“make ZEND_EXTRA_LIBS=’-liconv’”;升级Nginx版本到0.7.27;升级PHP版本到5.2.8;升级PHP FastCGI补丁到php-5.2.8-fpm-0.5.10.diff.gz。

  ● [2008年12月23日] [Version 4.10] 编译PHP时增加此三项支持:–with-mhash –enable-pcntl –enable-sockets

  (全文完)

Tags: , , , , , , , , , , , , ,

技术大类 » Web服务器 | 评论(135) | 引用(0) | 阅读(28604)

ritto Email

2008-8-29 21:48

更新真是迅速呀,刚还在对着文档做你写的第三版的实验呢。 哥们,辛苦了~~ 赞一个

can

2008-8-29 22:11

php-cgi进程经常出现僵尸进程,占用大量cpu,可能是什么原因?

wayne

2008-8-30 09:54

又更新了,学习了,张兄

wayne

2008-8-30 10:10

有一点不是很清楚,为什么这次用ea不用xcache呢,是不是xcache不是很稳定?

张宴对nginx在中国的推广的确是为了不少贡献.

张宴 回复于 2008-9-1 14:53

生产环境下,当缓存的PHP二进制文件太多,以至于超过shm_size后,eAccelerator在性能方面要高于Xcache

chinauui Homepage

2008-8-30 18:35

张大师又出手了

啥时候给我们写一篇简单的squid的配置帮助吧

chinauui Homepage

2008-8-30 18:36

晕!发重复了

支持一下!

den Email Homepage

2008-8-31 02:41

post 上传图片的时候出现:411 Length Required 错误,同样的程序在apache下面没有报错,不知道张兄有没有遇到类似的问题?
smile

dd_macle

2008-8-31 13:29

关注。。。。。

onefish

2008-9-1 10:58

真有3万的并发吗?能否用PHPINFO页面做一个测试结果?按文中配置完后,并未发现比apache高出这么多。甚至不如apache的perfoce方式快?apache与Nginx真有这么大的差距吗?

张宴 回复于 2008-9-1 14:28

下面是用100个并发连接分别去压生产环境中同一负载均衡器VIP下、提供相同服务的两台服务器,一台为Nginx,另一台为Apache,Nginx每秒处理的请求数是Apache的两倍多,Nginx服务器的系统负载、CPU使用率远低于Apache:
(你可以将连接数开到10000~30000,去压Nginx和Apache上的phpinfo.php,用浏览器访问Nginx上的phpinfo.php一切正常,而访问Apache服务器的phpinfo.php,则是该页无法显示。)
(webbench 下载地址:http://blog.s135.com/read.php/288.htm

##### Nginx + PHP #####

[root@localhost webbench-1.5]# webbench -c 100 -t 30 http://192.168.1.21/phpinfo.php
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.

Benchmarking: GET http://192.168.1.21/phpinfo.php
100 clients, running 30 sec.

Speed=102450 pages/min, 16490596 bytes/sec.
Requests: 51225 susceed, 0 failed.

top - 14:06:13 up 27 days,  2:25,  2 users,  load average: 14.57, 9.89, 6.51
Tasks: 287 total,   4 running, 283 sleeping,   0 stopped,   0 zombie
Cpu(s): 49.9% us,  6.7% sy,  0.0% ni, 41.4% id,  1.1% wa,  0.1% hi,  0.8% si
Mem:   6230016k total,  2959468k used,  3270548k free,   635992k buffers
Swap:  2031608k total,     3696k used,  2027912k free,  1231444k cached

————————————————————————————

##### Apache + PHP #####

[root@localhost webbench-1.5]# webbench -c 100 -t 30 http://192.168.1.27/phpinfo.php
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.

Benchmarking: GET http://192.168.1.27/phpinfo.php
100 clients, running 30 sec.

Speed=42184 pages/min, 31512914 bytes/sec.
Requests: 21092 susceed, 0 failed.

top - 14:06:20 up 27 days,  2:13,  2 users,  load average: 62.15, 26.36, 13.42
Tasks: 318 total,   7 running, 310 sleeping,   0 stopped,   1 zombie
Cpu(s): 80.4% us, 10.6% sy,  0.0% ni,  7.9% id,  0.1% wa,  0.1% hi,  0.9% si
Mem:   6230016k total,  3075948k used,  3154068k free,   379896k buffers
Swap:  2031608k total,    12592k used,  2019016k free,  1117868k cached

lostsnow Homepage

2008-9-1 13:55

post 上传图片的时候出现:411 Length Required 错误,同样的程序在apache下面没有报错,不知道张兄有没有遇到类似的问题?

========================

client_max_body_size 20m;
设置一下最大 post大小

leexhwhy Email

2008-9-1 20:51

看了张老师的文章,很想把我们的网站也改成ngnix的,我们的网站是apache+tomcat的,主要做用户子站服务,所以二级域名是个很重要的功能,原来在apache上做url rewrite ,配置如下:
 RewriteEngine On
 RewriteCond %{HTTP_HOST} ^[a-z0-9\-]+\.abc\.com$
 RewriteRule ^/?$ /%{HTTP_HOST}
 RewriteRule ^/([a-z0-9\-]+)\.abc\.com/?$ /site/$1 [R,L]
将leexhwhy.abc.com定向到www.abc.com/site/leexhwhy
请问张老师,在ngnix上能实现这种功能吗?google了没有找到答案。谢谢!

张宴 回复于 2008-9-1 21:27

Nginx对应的rewrite规则如下:

if ($host ~* “^[a-z0-9\-]+\.abc\.com$”)
{
rewrite ^/?$ /$host last;
rewrite ^/([a-z0-9\-]+)\.abc\.com/?$ http://$host/site/$1 permanent;
}

dreampig

2008-9-1 23:15

想知道为什么kernel.shmmax这个要配置成134217728
默认的不可以吗?你这个数字是怎么计算出来的啊?

张宴 回复于 2008-9-2 08:49

因为php.ini中配置了eaccelerator.shm_size=”128″,允许eaccelerator可使用的共享内存大小为128M。

而 134217728bytes / 1024 / 1024 = 128MB

在Linux下,单个进程的最大内存使用量受/proc/sys/kernel/shmmax中设置的数字限制(单位为字节),例如CentOS、Redhat的shmmax默认值为33554432字节(33554432bytes/1024/1024=32MB)。
   
临时更改该值:
echo 字节数 > /proc/sys/kernel/shmmax
   
按照以上方法更改,在每次重启系统时,该值会被自动还原。如果想永久更改,可以修改/etc/sysctl.conf文件,设置:
kernel.shmmax = 字节数

如果你的eaccelerator使用默认的32M共享内存,可以不修改此值。

den Homepage

2008-9-2 01:21

貌似不是 client_max_body_size 的问题… 找了很多资料,始终解决不了..郁闷..

gusingchen

2008-9-2 10:11

since the virtual address space is just 32 bits wide, each process can’t grow beyond 4 GB.

在Linux下,单个进程的最大内存使用量受/proc/sys/kernel/shmmax中设置的数字限制(单位为字节),例如CentOS、Redhat的shmmax默认值为33554432字节(33554432bytes/1024/1024=32MB)。

明镜

2008-9-2 10:22

我做了一个单机上的php-cgi的负载均衡,不知道对稳定性有无好处,请张宴点评
upstream phpool {
       server localhost:9000;
       server localhost:9001;
       server localhost:9002;
       server localhost:9003;
}

       location ~ \.php$ {
           fastcgi_pass   phpool;
           fastcgi_index  index.php;
           include        /etc/nginx/fastcgi_params;
       }

/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 8 -u apache -g apache -f /usr/bin/php-cgi
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9001 -C 8 -u apache -g apache -f /usr/bin/php-cgi
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 8 -u apache -g apache -f /usr/bin/php-cgi
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9003 -C 8 -u apache -g apache -f /usr/bin/php-cgi

张宴 回复于 2008-9-2 18:06

如果在同一台机器上,单独起4组独立的php-cgi进程(每组8个子进程),性能应该不如1组php-cgi进程(32个子进程),因为1组进程,eaccelerator的PHP二进制文件缓存是共享的,1组进程命中率较高。

question

2008-9-2 13:45

nginx配置里没有开启记录日志,为什么总在默认的logs目录记录日志呢(access.log),请问应该如何去掉?

张宴 回复于 2008-9-2 16:35

access_log   off;

明镜

2008-9-2 19:37

对,跑四组的话eaccelerator的缓存不能共享,不过好处是,碰到某组的php假死的话,其他端口就可以接管了,我实测下来似乎发生502错误的概率降低了很多,或者说我这样配置以后还没有遇到

soone

2008-9-3 15:40

作者最好能提出测试数据,确实按照文中配置,真不如apache,没有如文中所说的3万

张宴 回复于 2008-9-3 16:38

上面的回复中已经给出Apache VS Nginx的测试数据。

webbench -c 30000 -t 60 http://yourip/phpinfo.php
设定3万并发连接,压力测试开始后,用你的浏览器访问Nginx上的phpinfo.php一切正常,而访问Apache服务器的phpinfo.php,已经打不开了。再看看系统负载,Nginx远低于Apache。

压力测试工具webbench也需要耗费内存和CPU资源,所以请将webbench装在独立的服务器上,对Apache和Nginx服务器进行压力测试。

放飞天涯

2008-9-3 18:13

所有的步骤都是按上面的装的,只是版本0.7.14。刚安装好什么都没跑就出现
        502 Bad Gateway
——————————————-
        nginx/0.7.14

张宴 回复于 2008-9-3 18:29

后端的php-cgi有问题。编译php的时候在./configure和make的时候,请仔细检查是否有出错提示。因为PHP依赖的库比较多,如果这些被依赖的包找不到,编译时出错的几率较大。

小叶

2008-9-3 18:31

用NGINX时怎么样返回不同状态下的REDIRECT_STATUS,   php以模块方式安装在APACHE下的时候在404的时候可以返回REDIRECT_STATUS =404 普通页面无回值
但是在这里
# PHP only, required if PHP was built with –enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

打出来的无论是什么页面REDIRECT_STATUS都为200
404页面里面对REDIRECT_STATUS进行判断了
if( intval($_SERVER[’REDIRECT_STATUS’])==404 )
{
}else{
exit;
}

xp Email

2008-9-3 21:07

sed -i ’s#-lz -lm -lxml2 -lz -lm -lxml2 -lz -lm -lcrypt#& -liconv#’ Makefile

好像有问题,我一直装不上,找资料才知道是改makefile 在EXTRA_LIBS = ….. -lcrypt 最后加上-liconv

我系统为ubuntu server 8.04

现在通过make了

yyrjw

2008-9-4 17:27

请问下nginx/0.6.31 和0.7.x在性能上面有什么改善没?不知道nginx的缓存功能你用过吗?
用nginx的proxy_store模块缓存静态文件的时候图片好像缓存下来了,html的好像还是直接走后端取的,直接走的proxy_pass做代理,没有用upstream

laoliu

2008-9-5 00:21

按照您的指点,很顺利的配置成功了nginx服务器
可是使用的时候明显发现没有apache速度快,是我哪里参数没配置好么?
CPU 至强 2.8 两颗,内存4G。
晚上测试的,访问量不大。
不过用压力测试软件,nginx确实比apache占系统资源少。

freeke Email

2008-9-5 15:53

张老师您好!

什么时候也把Nginx —>> varnish 也更新总结版本

billy

2008-9-5 22:39

您好,我按照您的文章成功安装了 Nginx 0.6.32 + PHP 5.2.6
但是测试的时候,phpinfo 无任何输出,是一个空白页面。
我又写了一个简单的 echo 输出,却没有问题,实在不知道问题出在哪里了,还望指教。

laoliu

2008-9-6 08:44

哈哈,我的问题解决了,把gzip关掉就快多了。
还有以前不能显示的js也可以了。

laoliu

2008-9-6 09:18

不过把gzip观点,用webbench做压力测试,跟原来apache的结果差不多了:(

windy

2008-9-7 10:47

这个是在64位的系统下面编译的吗?我在64位下面编译总是有问题,奇怪

hqhe Email Homepage

2008-9-7 16:23

Nginx native port to MS Windows

http://ngwsx.eaxi.com/

laoliu

2008-9-8 10:39

今天是我网站访问量比较大的一天,10点左右,我不得不暂时放弃了nginx,恢复成apache
因为服务器的负载比较高,感觉还不如apache
不知道是我哪里设置有问题,还是其他原因。

xi2008wang

2008-9-8 15:38

给你顶一下zan

routerpipe

2008-9-9 10:40

Active connections: 10390
server accepts handled requests
43629083 43629083 259552136
Reading: 87 Writing: 195 Waiting: 10108

我是个人站长不懂技术,网站是phpwind构架的论坛,200万会员,10万贴每日,10万IP每日,php+mysql+xcache+nginx,只有一台服务器,数据库\web\附件都在一个服务器上,每日网卡流量500G以上。

按照这个教程搭建服务器还可以撑得住。(双至强4核CPU+8G内存+raid0 sas硬盘)

上面是早上10点的及时连接数。感觉还可以。

itsme

2008-9-9 12:52

EA和ZEND会不会冲突?另外,建议部分地方进行修改完善,比如,加入MYSQL自动启动,ZENDOPTIMIZER安装等,比较完整的一个系统.

张宴 回复于 2008-9-9 15:01

EA和ZEND可以兼容。
在大型网站中,数据库、cache服务器、web服务器是分开的。本文只讨论web服务器。

whistle

2008-9-9 14:27

为什么上面的Waiting数这么多呢?我的也是,即便是只有自己访问的情况下,请帮忙解答

张宴 回复于 2008-9-9 14:57

active connections — 对后端发起的活动连接数
server accepts handled requests — nginx 总共处理了 43629083 个连接, 成功创建 43629083 次握手 (证明中间没有失败的), 总共处理了 259552136 个请求
reading — nginx 读取到客户端的Header信息数
writing — nginx 返回给客户端的Header信息数
waiting — 开启 keep-alive 的情况下,这个值等于 active - (reading + writing),意思就是Nginx已经处理完成,正在等候下一次请求指令的驻留连接。

所以,在访问效率高,请求很快被处理完毕的情况下,Waiting数比较多是正常的。如果reading + writing数较多,则说明并发访问量非常大,正在处理过程中。

router

2008-9-9 15:26

Active connections: 16186
server accepts handled requests
46882031 46882031 289468913
Reading: 122 Writing: 332 Waiting: 15732

这是现在的连接数。

不错吧!
Centos+ nginx+php+mysql+xcache+tcmalloc+phpwind

yls

2008-9-10 09:59

Active connections: 780
server accepts handled requests
4880347 4880347 15357877
Reading: 4 Writing: 52 Waiting: 724

我也是这么多waiting呀,楼上的也不错呀,共同联系一下技术,QQ:850003176

张宴 回复于 2008-11-4 09:41

active connections — 对后端发起的活动连接数
server accepts handled requests — nginx 总共处理了 43629083 个连接, 成功创建 43629083 次握手 (证明中间没有失败的), 总共处理了 259552136 个请求
reading — nginx 读取到客户端的Header信息数
writing — nginx 返回给客户端的Header信息数
waiting — 开启 keep-alive 的情况下,这个值等于 active - (reading + writing),意思就是Nginx已经处理完成,正在等候下一次请求指令的驻留连接。

所以,在访问效率高,请求很快被处理完毕的情况下,Waiting数比较多是正常的。如果reading + writing数较多,则说明并发访问量非常大,正在处理过程中。

QQ5566572 Email Homepage

2008-9-11 13:16

Discuz! info: Can not connect to MySQL server

Time: 2008-9-11 9:07pm
Script: /index.php

Error: Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)
Errno.: 2002

Similar error report has beed dispatched to administrator before.

这是什么错误!~张宴帮帮我!~

莱鸟

2008-9-12 10:24

为什么我每次重起服务器都要重新