我们目标是在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
没有评论