问题概述(详情如下):
尝试连接到ODBC数据源时遇到了apache2 + ruby集成问题。 主要的问题归结为,从apache2作为cgi运行时,交互式shell运行正常的脚本会在数据库连接线上发生ruby。 不尝试访问ODBC数据源的Ruby cgi的工作正常。 而且(再次)ruby脚本连接到数据库与ODBC做罚款从命令行(或cron)执行。 当我使用perl而不是ruby时,这种行为是相同的。
所以,这个问题似乎是由apache2为ruby(perl)提供的环境,但我无法弄清楚什么是错的,或者该怎么做。
有没有人有任何build议如何让这些CGI脚本正常工作?
我已经尝试了许多不同的事情来实现这个目标,如果能够提供帮助,我很乐意提供任何方面的更多细节。
细节:
Mac OS X Server 10.5.8 Xserve 2 x 2.66双核Intel Xeon(12 GB)Apache 2.2.13
ruby1.8.6(2008-08-11 patchlevel 287)[universal-darwin9.0] ruby-odbc 0.9997
dbd-odbc(0.2.5)
dbi(0.4.3)
mod_ruby 1.3.0
Perl – 5.8.8
DBI – 1.609
DBD :: ODBC – 1.23
odbc驱动程序:DataDirect SequeLink v5.5(/Library/ODBC/SequeLink.bundle/Contents/MacOS/ivslk20.dylib)
odbc数据源:FileMaker Server 10(v10.0.2.206)
)一个最小版本的脚本(匿名),将在apache中崩溃,但从shell成功运行:
#!/usr/bin/ruby require 'cgi' require 'odbc' cgi = CGI.new("html3") aConnection = ODBC::connect('DBFile', "username", 'password') aQuery = aConnection.prepare("SELECT zzz_kP_ID FROM DBTable WHERE zzz_kP_ID = 81044") aQuery.execute aRecord = aQuery.fetch_hash.inspect aQuery.drop aConnection.disconnect # aRecord = '{"zzz_kP_ID"=>81044.0}' cgi.out{ cgi.html{ cgi.body{ "<pre>Primary Key: #{aRecord}</pre>" } } }
从一个shell运行这个例子:
gamma%./minimal.rb(离线模式:在标准input中inputname = value对)Content-Type:text / html Content-Length:134
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML><BODY><pre>Primary Key: {"zzz_kP_ID"=>81044.0}</pre></font></BODY></HTML>% gamma%
)典型的崩溃日志行:
Dec 22 14:02:38 gamma ReportCrash [79237]:为进程perl编写崩溃报告[79236]
Dec 22 14:02:38 gamma ReportCrash [79237]:已保存的crashreport到/Library/Logs/CrashReporter/perl_2009-12-22-140237_HTCF.crash使用uid:0 gid:0,euid:0 egid:0
Dec 22 14:03:13 gamma ReportCrash [79256]:为进程perl编写崩溃报告[79253]
Dec 22 14:03:13 gamma ReportCrash [79256]:保存的crashreport到/Library/Logs/CrashReporter/perl_2009-12-22-140311_HTCF.crash使用uid:0 gid:0,euid:0 egid:0
像这样的问题通常是由于环境variables在shell中以某种方式设置的,但是当脚本在cgi或cron下运行时,可以取消设置或设置不同。 通常它们涉及到文件或可执行文件的path的假设。
你有尝试整理驱动器碎片?
我曾经有一个非常类似的问题,一个传统的Python Web应用程序,使用了几个粗糙的CGI脚本。 其中一个在apache日志中加载了奇怪的加载器错误,例如:
Failed to load libgcc_s.so.1
事实certificate,在这个特定的Apacheconfiguration下,CGI脚本似乎有一个64MB的内存限制,一个特定的请求远远超过了64MB。 有些扩展模块与libgcc_s链接在一起,所以当它们被导入的时候,这个过程已经达到了极限,并且被打了个马枪。
手动运行时,我会检查脚本的RSS。 如果这是一个很大的过程,尝试将RLimitMEM设置为更大的东西,比如128MB或256MB。
RLimitMEM 128MB