gentoo下配置nginx+php-fpm fastcgi

我们目标是在Gentoo下搭建一个可以跑ShopEx的环境。我们采用性能比较好的nginx + php fast cgi组合,php-cgi采用php-fpm进行管理。这点有别于国内流行的lighthttpd的spwn程序来管理php-cgi进程。目前在php-5.3.2的源码中已经出现了php-fpm的踪迹,它很有可能并入到php的官方版本中。下面是具体的安装流程说明

先做一些前期准备工作,检查/etc/portage目录下是否有这两个目录

package.use
package.keywords

如果没有则建立之

mkdir -pv /etc/portage/package.use
mkdir -pv /etc/portage/package.keywords/

这两个目录将用来存放emerge时改变的编译指令参数

nginx

nginx很方便,只要执行
设置启用fastcgi

echo “www-servers/nginx fastcgi” >> /etc/portage/package.use/nginx

开始构建

emerge nginx

检查一下

eix nginx

如果一切顺利,那么“Installed version”中将会看到fastcgi是红色高亮的

php

php fast cgi就比较没法了,在gentoo的主线中并没有php fast cgi版本,我们只能下载第三方的ebuild版本。操作方法如下
建立第三方ebuild目录

mkdir -pv /usr/local/portage/dev-lang

修改make.conf

echo “PORTDIR_OVERLAY=/usr/local/portage” >> /etc/make.conf

下载打好补丁的ebuid

cd /tmp
wget http://dev-null.org.ua/files/php_ebuild_5.2.8-r2.tar.gz
tar xf php_ebuild_5.2.8-r2.tar.gz
cp -vrf php /usr/local/portage/dev-lang/

转到扩展emerge目录

cd /usr/local/portage/dev-lang/php/

修正一下php-fpm的下载地址

sed -i “s,php-fpm.anight.org/downloads/archive/php-\${PV%\.\*},php-fpm.org/downloads,” php-5.2.8-r2.ebuild

生成环境

ebuild php-5.2.8-r2.ebuild digest

设置php的规格

echo “dev-lang/php  cgi apache2 fpm gd mysql xml xmlreader xmlwriter json sqlite” >> /etc/portage/package.use/php

开始构建

emerge php-5.2.8-r2.ebuild

emerge的过程中发生php源码包php-5.2.8.tar.bz2无法下载的情况,直接cd到目录

pushd /usr/portage/distfiles/

然后下载源码包

wget  http://shopexts.googlecode.com/files/php-5.2.8.tar.bz2

弹回/usr/local/portage/dev-lang/php/

popd

再次

emerge php-5.2.8-r2.ebuild

在补丁跟踪列表中,我们得到一个好消息,在php 5.3的svn中已经看到了php-fpm的代码,估计不久的将来php的主线包会保护php-fpm,那样就不用这么麻烦了。

配置

配置php-fpm

修改运行php的用户为apache

sed -i ‘s,<!–.*<value name=\”user\”>nobody</value>.*–>,<value name=\”user\”>apache</value>,’ /etc/php/cgi-php5/php-fpm.conf

修改运行php的组为apache

sed -i ‘s,<!–.*<value name=\”group\”>nobody</value>.*–>,<value name=\”user\”>apache</value>,’ /etc/php/cgi-php5/php-fpm.conf

启动php

/etc/init.d/php-fpm start

加入到自启动列表

rc-update add php-fpm default

配置nginx

/etc/nginx/nginx.conf

user apache apache;
worker_processes 1;
error_log /var/log/nginx/error_log info;
events {
worker_connections  8192;
use epoll;
}
http {
include         /etc/nginx/mime.types;
default_type    application/octet-stream;
log_format main
‘$remote_addr – $remote_user [$time_local] ‘
‘”$request” $status $bytes_sent ‘
‘”$http_referer” “$http_user_agent” ‘
‘”$gzip_ratio”‘;
client_header_timeout   10m;
client_body_timeout     10m;
send_timeout            10m;
connection_pool_size            256;
client_header_buffer_size       1k;
large_client_header_buffers     4 2k;
request_pool_size               4k;
gzip on;
gzip_min_length 1100;
gzip_buffers    4 8k;
gzip_types      text/plain;
gzip_disable “MSIE [1-6]\.”; #log format
output_buffers  1 32k;
postpone_output 1460;
sendfile        on;
tcp_nopush      on;
tcp_nodelay     on;
keepalive_timeout       75 20;
ignore_invalid_headers  on;
index index.html;
server {
listen          0.0.0.0;
server_name     localhost;
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php?$1;
}
location ~ .*\.php?$ {
include /etc/nginx/php_fcgi.conf;
}
access_log      /var/log/nginx/localhost.access_log main;
error_log       /var/log/nginx/localhost.error_log info;
root /var/www/localhost/htdocs;
}
}

/etc/nginx/php_fcgi.conf

fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
#
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;

测试一下nginx的配置

nginx -t

如果没有错误,尝试启动nginx

/etc/init.d/nginx start

我们将nginx加入自启动序列

rc-update add nginx default

Zend Optimizer

这个玩意不是源码包,是直接的二进制文件,安装起来比较搞,直接emerge 会有这样的错误提示:

!!! All ebuilds that could satisfy “dev-php5/ZendOptimizer” have been masked.

下载好文件

cd /usr/portage/distfiles
wget http://shopexts.googlecode.com/files/ZendOptimizer-3.3.9-linux-glibc23-i386.tar.gz

建立关键字过滤

mkdir -pv /etc/portage/package.keywords/
echo “dev-php5/ZendOptimizer ~x86″ >> /etc/portage/package.keywords/dev-php5

开始构建

emerge ZendOptimizer

重启一下php

/etc/init.d/php-fpm restart

测试

验证一下我们安装是否正确

echo “<?php phpinfo();” > /var/www/localhost/htdocs/index.php

然后去浏览器一下,如果一切顺利应该能看到类似这样的信息
常见错误

[emerg]: unknown directive “fastcgi_pass” in /etc/nginx/php_fcgi.conf:1

nginx的use没有添加fastcgi

[warn]: 8192 worker_connections are more than open file resource limit: 1024

内核限制了最大文件描述符是1024,调大一点

echo “fs.file-max = 65536 ” >>  /etc/sysctl.conf
echo “* soft 8192″ >> /etc/security/limits.conf
echo “* hard 16384″ >> /etc/security/limits.conf

参考资料

环境搭建原始资料

补丁的跟踪列表

ebuild中文手册

http://gentoo.linuxsir.org/doc/cn/ebuild-fuq.xml

gentoo下安装php5

  1. 没有评论

  1. 2010年03月27日

Verify Code   If you cannot see the CheckCode image,please refresh the page again!