2008-03-07
Lighttpd和RoR安装配置的疑难解答
关键字: lighttpd
之前写过一篇在Linux平台上安装和配置Ruby on Rails详解,可能是有点高估了Linux的普及和应用程度,无数安装和配置的问题都以各种方式向我涌过来。这里集中的提供一下疑难解答:
一、到底我应该用Lighttpd,还是Nginx/Mongrel?
现在Nginx/Mongrel的部署方式越来越受欢迎了,很多人置疑Lighttpd/FastCGI,并且现在也涌现了一些比Mongrel性能更好的例如Thin,ebb等ruby应用服务器,那Lighttpd/FastCGI真的过时了吗?
大家有兴趣可以看一下我这篇文章:RoR部署方案深度剖析,Lighttpd提供了很多其他Web服务器不具备的优势,可以最大化FastCGI的性能。现在Mongrel/Thin/ebb都利用了一些多线程或者事件IO机制来提供并发性能,这是FastCGI所不具备的,但遗憾的是Rails框架是单线程的,最终还是必须单进程单线程来执行Rails请求,所以这些并发优势无用武之地。但一些其他Ruby的Web框架例如camping,weavers已经开始支持ruby多线程,提供了比Rails好得多的性能,mongrel/ebb只有在这些web框架上面才能发挥其性能优势。
有人会问,Rails会不会改成多线程?我认为不可能:一来Rails的多进程被证明是一种古老的、但是高可靠性、高扩展性的部署方式,没有改的必要性;二来真要改成多线程,改动实在太大了,整个底层框架都要改。
所以只要你还是用Rails框架,Lighttpd/FastCGI就是性能最好的部署方案。
二、ubuntu Linux安装ruby碰到的缺少readline,zlib库的问题?
有些人的ubuntu安装的库不全,比方说缺少readline库,缺少zlib库,可能会导致自己手工编译安装ruby的失败,那么就用apt-get先把库安装好。
三、Lighttpd安装遇到的缺少pcre库的问题?
RHEL/CentOS用户可能要用yum安装一下pcre/pcre-devel这两个库,ubuntu用户用apt-get安装一下,Linux熟手也可以自己下载源代码编译安装,Pcre是Perl兼容的正则表达式库,Lighttpd的Rewrite功能需要它。
四、Lighttpd配置过程当中遇到的种种问题?
1、我用的是ubuntu,你说的控制脚本rc.lighttpd我跑不了,执行就会报错
rc.lighttpd这个脚本是针对SuSE Linux写的,此外还提供了一个rc.lighttpd.redhat是针对RedHat Linux写的,没有针对ubuntu的版本,但是你自己写一个控制脚本,也不过是举手之劳:
创建一个shell脚本,内容如上,chmod u+x lighttpd.sh,这个脚本就可以用来启动关闭和重起lighttpd了
2、启动Lighttpd的时候报错,说XXX目录找不到
Lighttpd启动之后默认情况下会写access log,error log,如果你启动了压缩过程,还会把文件压缩过的版本放在压缩目录下面,所以检查一下你的lighttpd.conf配置文件,是不是这些目录还没有,或者路径不对。
3、启动lighttpd可以访问,但如果配置了Rails,就无法启动
如果无法启动,要学会自己看Lighttpd的error log和Rails项目的log目录下面的fastcgi crash log,在这两个log文件当中可以找到出错原因。其中一种常犯的错误是:Rails项目在Windows上面创建和开发,最后部署到Linux Server上面。这种情况下dispatch.fcgi这个脚本的ruby解析器路径是 #!c:/ruby/bin/ruby.exe 这个路径在Linux上面肯定是错误的,你可以改成#!/usr/bin/env ruby,或者干脆在Linux上面创建该Rails项目。此外在windows上面创建的Rails项目,dispatch.fcgi没有可执行权限,这也需要你在Linux上面先赋予可执行权限才行。你可以尝试着手工运行该脚本cd public && ./dispatch.fcgi,看看是否可以运行。
4、启动lighttpd报错,说找不到socket路径
我在前面安装文档中给出来的配置内容如下:
就算照抄你要改改路径吧?这个demo当中的socket路径是/tmp/lighttpd/socket/rails.socket,那你要照抄,先检查一下有没有/tmp/lighttpd/sock目录总是应该的吧?其实用啥路径都无妨,关键就是别照抄,领会原理,根据自己的环境做相应的调整。
5、lighttpd可以启动,但是访问Rails应用出现404错误,找不到页面
在lighttpd的虚拟域配置里面有一项
意思是当lighttpd找不到URL对应的硬盘文件,就会调用Rails的dispatch.fcgi去处理该URL请求,这也是lighttpd访问Rails的主要方式,其性能比URL转发要快。如果你在配置文件里面忽略了这一行,lighttpd就会直接返回404错误,而不是交给Rails处理。
6、重起lighttpd以后,fastcgi进程不关闭,导致多次重起lighttpd之后,fastcgi进程堆积越来越多?
正常情况下,关闭Lighttpd以后,dispatch进程就会销毁,但是在dispatch进程处理请求的时候关闭lighttpd,dispatch进程并不会马上关闭,而是处理完毕当前请求,才会关闭掉。一些极端情况下,可能会导致dispatch进程一直不关闭,dispatch进程就会越来越多。解决办法很简单 killall -9 dispatch.fcgi,只管杀进程就好了。
7、我的lighttpd和FastCGI部署在不同的服务器,怎么配置呢?
这种情况下,Lighttpd只是连接远程服务器的TCP端口,而不负责启动dispatch.fcgi进程,因此需要自己写脚本启动关闭dispatch.fcgi进程。lighttpd提供了一个spawn-fcgi的程序,可以用来启动dispatch.fcgi进程,监听TCP端口,你可以自己写一个shell脚本来完成这个工作。另外spawn-fcgi还可以启动dispatch.fcgi进程,创建本机的unix socket端口,和本机lighttpd通讯,例如:
例如:
执行 ./dispatch.sh start 将启动10个dispatch.fcgi进程,在/tmp/lighttpd/sock目录下面创建了10个unix socket文件,然后配置lighttpd去连接这10个socket文件:
这样做的好处是,每次重新部署应用,就不需要重起lighttpd了,只需要执行自己的dispatch.sh来重起dispatch.fcgi进程就可以了。同时也可以很好的解决上一个fastcgi进程堆积的问题。
如果远程部署,配置方式是一样的,就是lighttp连接的端口改为:
dispatch.sh创建dispatch.fcgi进程的时候,使用 -t 参数创建tcp端口,而不是 -s 创建unix socket文件即可。
一、到底我应该用Lighttpd,还是Nginx/Mongrel?
现在Nginx/Mongrel的部署方式越来越受欢迎了,很多人置疑Lighttpd/FastCGI,并且现在也涌现了一些比Mongrel性能更好的例如Thin,ebb等ruby应用服务器,那Lighttpd/FastCGI真的过时了吗?
大家有兴趣可以看一下我这篇文章:RoR部署方案深度剖析,Lighttpd提供了很多其他Web服务器不具备的优势,可以最大化FastCGI的性能。现在Mongrel/Thin/ebb都利用了一些多线程或者事件IO机制来提供并发性能,这是FastCGI所不具备的,但遗憾的是Rails框架是单线程的,最终还是必须单进程单线程来执行Rails请求,所以这些并发优势无用武之地。但一些其他Ruby的Web框架例如camping,weavers已经开始支持ruby多线程,提供了比Rails好得多的性能,mongrel/ebb只有在这些web框架上面才能发挥其性能优势。
有人会问,Rails会不会改成多线程?我认为不可能:一来Rails的多进程被证明是一种古老的、但是高可靠性、高扩展性的部署方式,没有改的必要性;二来真要改成多线程,改动实在太大了,整个底层框架都要改。
所以只要你还是用Rails框架,Lighttpd/FastCGI就是性能最好的部署方案。
二、ubuntu Linux安装ruby碰到的缺少readline,zlib库的问题?
有些人的ubuntu安装的库不全,比方说缺少readline库,缺少zlib库,可能会导致自己手工编译安装ruby的失败,那么就用apt-get先把库安装好。
三、Lighttpd安装遇到的缺少pcre库的问题?
RHEL/CentOS用户可能要用yum安装一下pcre/pcre-devel这两个库,ubuntu用户用apt-get安装一下,Linux熟手也可以自己下载源代码编译安装,Pcre是Perl兼容的正则表达式库,Lighttpd的Rewrite功能需要它。
四、Lighttpd配置过程当中遇到的种种问题?
1、我用的是ubuntu,你说的控制脚本rc.lighttpd我跑不了,执行就会报错
rc.lighttpd这个脚本是针对SuSE Linux写的,此外还提供了一个rc.lighttpd.redhat是针对RedHat Linux写的,没有针对ubuntu的版本,但是你自己写一个控制脚本,也不过是举手之劳:
#!/bin/sh
case "$1" in
start)
/usr/local/lighttpd/sbin/lighttpd -f /etc/lighttpd/lighttpd.conf > /dev/null 2>&1
;;
stop)
killall lighttpd
;;
restart)
$0 stop
sleep 1
$0 start
;;
*)
echo "Usage: lighttpd.sh {start|stop|restart}"
;;
esac
exit 0
创建一个shell脚本,内容如上,chmod u+x lighttpd.sh,这个脚本就可以用来启动关闭和重起lighttpd了
2、启动Lighttpd的时候报错,说XXX目录找不到
Lighttpd启动之后默认情况下会写access log,error log,如果你启动了压缩过程,还会把文件压缩过的版本放在压缩目录下面,所以检查一下你的lighttpd.conf配置文件,是不是这些目录还没有,或者路径不对。
3、启动lighttpd可以访问,但如果配置了Rails,就无法启动
如果无法启动,要学会自己看Lighttpd的error log和Rails项目的log目录下面的fastcgi crash log,在这两个log文件当中可以找到出错原因。其中一种常犯的错误是:Rails项目在Windows上面创建和开发,最后部署到Linux Server上面。这种情况下dispatch.fcgi这个脚本的ruby解析器路径是 #!c:/ruby/bin/ruby.exe 这个路径在Linux上面肯定是错误的,你可以改成#!/usr/bin/env ruby,或者干脆在Linux上面创建该Rails项目。此外在windows上面创建的Rails项目,dispatch.fcgi没有可执行权限,这也需要你在Linux上面先赋予可执行权限才行。你可以尝试着手工运行该脚本cd public && ./dispatch.fcgi,看看是否可以运行。
4、启动lighttpd报错,说找不到socket路径
我在前面安装文档中给出来的配置内容如下:
$HTTP["host"] == "www.xxx.com" {
server.document-root = "/yourrails/public"
server.error-handler-404 = "/dispatch.fcgi"
fastcgi.server = (".fcgi" =>
("localhost" =>
("min-procs" => 10,
"max-procs" => 10,
"socket" => "/tmp/lighttpd/socket/rails.socket",
"bin-path" => "/yourrails/public/dispatch.fcgi",
"bin-environment" => ("RAILS_ENV" => "production")
)
)
)
}
就算照抄你要改改路径吧?这个demo当中的socket路径是/tmp/lighttpd/socket/rails.socket,那你要照抄,先检查一下有没有/tmp/lighttpd/sock目录总是应该的吧?其实用啥路径都无妨,关键就是别照抄,领会原理,根据自己的环境做相应的调整。
5、lighttpd可以启动,但是访问Rails应用出现404错误,找不到页面
在lighttpd的虚拟域配置里面有一项
server.error-handler-404 = "/dispatch.fcgi"
意思是当lighttpd找不到URL对应的硬盘文件,就会调用Rails的dispatch.fcgi去处理该URL请求,这也是lighttpd访问Rails的主要方式,其性能比URL转发要快。如果你在配置文件里面忽略了这一行,lighttpd就会直接返回404错误,而不是交给Rails处理。
6、重起lighttpd以后,fastcgi进程不关闭,导致多次重起lighttpd之后,fastcgi进程堆积越来越多?
正常情况下,关闭Lighttpd以后,dispatch进程就会销毁,但是在dispatch进程处理请求的时候关闭lighttpd,dispatch进程并不会马上关闭,而是处理完毕当前请求,才会关闭掉。一些极端情况下,可能会导致dispatch进程一直不关闭,dispatch进程就会越来越多。解决办法很简单 killall -9 dispatch.fcgi,只管杀进程就好了。
7、我的lighttpd和FastCGI部署在不同的服务器,怎么配置呢?
这种情况下,Lighttpd只是连接远程服务器的TCP端口,而不负责启动dispatch.fcgi进程,因此需要自己写脚本启动关闭dispatch.fcgi进程。lighttpd提供了一个spawn-fcgi的程序,可以用来启动dispatch.fcgi进程,监听TCP端口,你可以自己写一个shell脚本来完成这个工作。另外spawn-fcgi还可以启动dispatch.fcgi进程,创建本机的unix socket端口,和本机lighttpd通讯,例如:
例如:
#!/bin/sh
DISPATCH_PATH=/yourrailsapp/public/dispatch.fcgi
SOCKET_PATH=/tmp/lighttpd/socket
RAILS_ENV=production
export RAILS_ENV
case "$1" in
start)
for num in 0 1 2 3 4 5 6 7 8 9
do
/usr/local/lighttpd/bin/spawn-fcgi -f $DISPATCH_PATH -s $SOCKET_PATH/rails.socket-$num
done
;;
stop)
killall -9 dispatch.fcgi
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: dispatch.sh {start|stop|restart}"
;;
esac
exit 0
执行 ./dispatch.sh start 将启动10个dispatch.fcgi进程,在/tmp/lighttpd/sock目录下面创建了10个unix socket文件,然后配置lighttpd去连接这10个socket文件:
$HTTP["host"] =~ "www.xxx.com$" {
server.document-root = "/yourrails/public"
server.error-handler-404 = "/dispatch.fcgi"
fastcgi.server = (".fcgi" =>
(
("socket"=>"/tmp/lighttpd/socket/rails.socket-0"),
("socket"=>"/tmp/lighttpd/socket/rails.socket-1"),
("socket"=>"/tmp/lighttpd/socket/rails.socket-2"),
("socket"=>"/tmp/lighttpd/socket/rails.socket-3"),
("socket"=>"/tmp/lighttpd/socket/rails.socket-4"),
("socket"=>"/tmp/lighttpd/socket/rails.socket-5"),
("socket"=>"/tmp/lighttpd/socket/rails.socket-6"),
("socket"=>"/tmp/lighttpd/socket/rails.socket-7"),
("socket"=>"/tmp/lighttpd/socket/rails.socket-8"),
("socket"=>"/tmp/lighttpd/socket/rails.socket-9")
)
)
}
这样做的好处是,每次重新部署应用,就不需要重起lighttpd了,只需要执行自己的dispatch.sh来重起dispatch.fcgi进程就可以了。同时也可以很好的解决上一个fastcgi进程堆积的问题。
如果远程部署,配置方式是一样的,就是lighttp连接的端口改为:
("host"=>"192.168.0.1, "port"=>3001),
("host"=>"192.168.0.1, "port"=>3002),
......
dispatch.sh创建dispatch.fcgi进程的时候,使用 -t 参数创建tcp端口,而不是 -s 创建unix socket文件即可。
评论
rurukevin
2008-06-04
robbin大哥,有个问题想询问一下,我看你们也用的是x86_64位操作系统,我服务器也是64位的,但是在装RMagick的时候遇到这样的问题:./ext/RMagick/RMagick.so: libgomp.so.1: shared object cannot be dlopen()ed – /home/myusername/install/RMagick-1.15.9/./ext/RMagick/RMagick.so (LoadError)
在网上查了下,这个似乎是gcc的一个bug,是不是升级安装下gcc可以解决?你有遇到类似的问题吗?
望赐教
在网上查了下,这个似乎是gcc的一个bug,是不是升级安装下gcc可以解决?你有遇到类似的问题吗?
望赐教
robbin
2008-03-10
inosin 写道
如果配置其他选项是不是需要这样:
...
("allow-x-send-file"=>"enable", "socket"=>"/tmp/lighttpd/socket/rails.socket-0"),
("allow-x-send-file"=>"enable", "socket"=>"/tmp/lighttpd/socket/rails.socket-1"),
("allow-x-send-file"=>"enable", "socket"=>"/tmp/lighttpd/socket/rails.socket-2"),
("allow-x-send-file"=>"enable", "socket"=>"/tmp/lighttpd/socket/rails.socket-3"),
...
有没有便捷点的方法?
...
("allow-x-send-file"=>"enable", "socket"=>"/tmp/lighttpd/socket/rails.socket-0"),
("allow-x-send-file"=>"enable", "socket"=>"/tmp/lighttpd/socket/rails.socket-1"),
("allow-x-send-file"=>"enable", "socket"=>"/tmp/lighttpd/socket/rails.socket-2"),
("allow-x-send-file"=>"enable", "socket"=>"/tmp/lighttpd/socket/rails.socket-3"),
...
有没有便捷点的方法?
只能这样配置
inosin
2008-03-07
如果配置其他选项是不是需要这样:
...
("allow-x-send-file"=>"enable", "socket"=>"/tmp/lighttpd/socket/rails.socket-0"),
("allow-x-send-file"=>"enable", "socket"=>"/tmp/lighttpd/socket/rails.socket-1"),
("allow-x-send-file"=>"enable", "socket"=>"/tmp/lighttpd/socket/rails.socket-2"),
("allow-x-send-file"=>"enable", "socket"=>"/tmp/lighttpd/socket/rails.socket-3"),
...
有没有便捷点的方法?
...
("allow-x-send-file"=>"enable", "socket"=>"/tmp/lighttpd/socket/rails.socket-0"),
("allow-x-send-file"=>"enable", "socket"=>"/tmp/lighttpd/socket/rails.socket-1"),
("allow-x-send-file"=>"enable", "socket"=>"/tmp/lighttpd/socket/rails.socket-2"),
("allow-x-send-file"=>"enable", "socket"=>"/tmp/lighttpd/socket/rails.socket-3"),
...
有没有便捷点的方法?
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 1773517 次
- 性别:

- 来自: 上海

- 详细资料
搜索本博客
我的相册
douban.JPG
共 37 张
共 37 张
链接
最新评论
-
AJAX与RIA技术之我见
快一年过去了,不知robbin对RIA的看法是否有变化?是否会觉得Flex+RO ...
-- by chenjf2k -
Ruby和Rails的缺点
我刚才翻到了以前的文章,看到javaeye的服务器: HP DL145 G1, ...
-- by 木哥哥 -
我为什么鼓吹facebook,为 ...
悄悄的说一句,javaeye如果要找大树好乘凉,那大概还是OpenSocial比 ...
-- by hax -
用Google的网站流量分析系 ...
俺觉得这个分析只能是一个粗略的。比如trends不区分子域名的,更不要说一个大型 ...
-- by hax -
用Google的网站流量分析系 ...
robbin同志,我觉得这个search有点问题,CSDN的第一个关键字莫名其妙 ...
-- by hax






评论排行榜