Apache2 cgi 在 odbc db 访问时崩溃(但从 shell 运行良好)

Apache2 cgi 在 odbc db 访问时崩溃(但从 shell 运行良好)

问题概述(详情如下):

当我尝试连接到 ODBC 数据源时,我遇到了 apache2 + ruby​​ 集成问题。主要问题归结为这样一个事实:从交互式 shell 运行良好的脚本在从 apache2 以 cgi 形式运行时,会导致数据库连接行上的 ruby​​ 崩溃。不尝试访问 ODBC 数据源的 Ruby cgi 运行良好。并且(再次)从命令行(或 cron)执行时,使用 ODBC 连接到数据库的 ruby​​ 脚本运行良好。当我使用 perl 而不是 ruby​​ 时,此行为是相同的。

因此,问题似乎出在 apache2 为 ruby​​(perl)提供的环境上,但我无法弄清楚问题出在哪里或如何处理。

有人对如何使这些 cgi 脚本正常工作有什么建议吗?

我尝试了很多不同的方法来实现这一点,如果有帮助的话,我很乐意提供任何方面的更多细节。


细节:

Mac OS X Server 10.5.8 Xserve 2 x 2.66 双核 Intel Xeon (12 GB) Apache 2.2.13

ruby 1.8.6(2008-08-11 补丁级别 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(离线模式:在标准输入中输入名称=值对)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%

) 典型的崩溃日志行:
十二月 22 14:02:38 gamma ReportCrash[79237]: 为进程 perl[79236] 制定崩溃报告
十二月 22 14:02:38 gamma ReportCrash[79237]: 已将崩溃报告保存到 /Library/Logs/CrashReporter/perl_2009-12-22-140237_HTCF.crash,使用 uid: 0 gid: 0, euid: 0 egid: 0
十二月 22 14:03:13 gamma ReportCrash[79256]: 为进程 perl[79253] 制定崩溃报告
十二月 22 14:03:13 gamma ReportCrash[79256]: 已将崩溃报告保存到/Library/Logs/CrashReporter/perl_2009-12-22-140311_HTCF.crash 使用 uid: 0 gid: 0, euid: 0 egid: 0

答案1

此类问题通常是由于环境变量在 shell 中以某种方式设置,但在 cgi 或 cron 下运行脚本时取消设置或以不同方式设置。通常,它们涉及对文件或可执行文件的路径的假设。

答案2

您是否尝试过对驱动器进行碎片整理?

答案3

我曾经遇到过类似的问题,当时有一个使用了一些复杂的 CGI 脚本的旧版 Python Web 应用程序。其中一个脚本崩溃了,Apache 日志中出现了奇怪的加载器错误,例如:

Failed to load libgcc_s.so.1

事实证明,在这种特定的 Apache 配置下,CGI 脚本的内存上限似乎为 64MB,而某个特定请求使用的内存远超 64MB。一些扩展模块与 pthreads 的 libgcc_s 链接,因此在导入这些模块时,进程已经达到上限,然后 — — 崩溃!

我会手动运行脚本时检查其 RSS。如果这是一个大型进程,请尝试设置限制内存改为更大的值,比如 128MB 或 256MB。

RLimitMEM 128MB

相关内容