之前传出的nginx漏洞其实不算是nginx的问题,而是spawn-fcgi的漏洞。张宴的博客总结了一份比较简单的方法(再提供一种解决Nginx文件类型错误解析漏洞的方法),利用正则规避了这个问题。不过这些解决方法都是治标不治本,我个人建议使用php-fpm代替spawn-fcgi

php-fpm曾经是PHP项目的一个补丁,旨在将FastCGI进程管理整合进PHP包中。现在我们可以在最新的PHP 5.3.2的源码树里下载得到直接整合了php-fpm的分支,据说下个版本会融合进PHP的主分支去。

相对spawn-fcgiphp-fpm在CPU和内存方面的控制都更胜一筹,而且前者很容易崩溃,必须用crontab进行监控,而php-fpm则没有这种烦恼。

如果你使用Ubuntu/Debian而且不想编译,可以尝试这个方法,安装最新的PHP 5.3.2及php-fpm 0.6包。但我个人使用的过程中发现这种方式可能导致一些像mcrypt等扩展无法使用,所以还是采用了源码安装的方式。


先确定安装了subversion等一些包

 

$ sudo apt-get install bison libxml2-dev libbz2-dev libpcre3-dev libssl-dev zlib1g-dev libmcrypt-dev libmhash-dev libmhash2 libcurl4-openssl-dev libpq-dev libpq5 libsyck0-dev
$ svn co http://svn.php.net/repository/php/php-src/branches/PHP_5_3_FPM php_5_3_fpm$ cd php_5_3_fpm

请先确定已经安装了autoconf2.13这个包,注意版本号。新版本的autoconf可能会导致无法生成配置文件

$ ./buildconf --force

配置你的php,一定要有--enable-fpm

$ ./configure --enable-fpm --with-foo --enable-bar...

我使用的配置方式,ubuntu的很多开发包没有安装,所以这个步要安装各种开发包,挺花时间的。

$ ./configure --enable-fastcgi --enable-fpm --with-mcrypt --with-zlib --enable-mbstring --with-pdo --with-pgsql --with-curl --disable-debug --enable-pic --enable-inline-optimization --with-xml --enable-sockets --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex --with-mhash --enable-xslt --enable-memcache --enable-zip --with-pcre-regex --with-gd --with-sqlite --enable-exif --enable-zip --enable-ftp --with-pear --with-libxml-dir --with-mysql --with-openssl

编译和安装

$ sudo make && make install

安装后修改/usr/local/etc/php-fpm.conf,把所有的nobody改成你运行php-fpm的用户组和用户名,一般是www-data。修改一下,如果你的服务器内存比较小,建议从5开始递增修改,子进程会占用比较多的内存。

<value name="max_children">5</value>

完成后,运行

php-fpm -c /path/to/your/php.ini

这个操作没有回显,默认在127.0.0.1:9000打开一个PHP的fastcgi服务,用类似spawn-fcgi的方法把php文件的处理pass给php-fpm即可。记得加入下面的参数,以避免一些古怪的问题引起502 Gateway错误。

  location ~ \.php$ {    fastcgi_pass   127.0.0.1:9000;    fastcgi_index  index.php;    fastcgi_param  SCRIPT_FILENAME  /path/to/your/root$fastcgi_script_name;    fastcgi_connect_timeout 60;    fastcgi_send_timeout 180;    fastcgi_read_timeout 180;    fastcgi_buffer_size 128k;    fastcgi_buffers 4 256k;    fastcgi_busy_buffers_size 256k;    fastcgi_temp_file_write_size 256k;    fastcgi_intercept_errors on;    include fastcgi_params;  }
web服务器 | 评论(0) | 引用(0) | 阅读(7411)