我已经设置了开发中的Passenger(Mac OS X),它完美无缺。唯一的问题是后来出现的:现在我有一个自定义GEM_HOME
路径和 ImageMagick 二进制文件安装在"/usr/local"
. 我可以将它们放在获取源的 shell rc 文件之一中,这解决了从控制台生成的进程的环境变量;但是乘客呢?以这种方式运行时,同一个应用程序找不到我的宝石。
4 回答
我知道两种解决方案。第一个(在此处记录)与 manveru 的基本相同——直接在您的代码中设置 ENV 变量。
第二个是围绕Passenger 使用的Ruby 解释器创建一个包装器,并在此处记录(查找passenger_with_ruby)。要点是您创建(并在 Apache 配置中将 PassengerRuby 指向)/usr/bin/ruby_with_env,这是一个可执行文件,其中包括:
#!/bin/bash
export ENV_VAR=value
/usr/bin/ruby $*
两者都有效;我认为,前一种方法不那么骇人听闻。
在执行任何要求之前(尤其是在要求 rubygems 之前),您可以执行以下操作:
ENV['GEM_HOME'] = '/foo'
这将更改此进程内的环境变量。
我发现如果你在计算机上有 root 权限,那么你可以在“envvars”文件中设置必要的环境变量,apachectl 将在启动 Apache 之前执行这个文件。
envvars 通常位于 apachectl 所在的同一目录中 - 在 Mac OS X 上,它位于 /usr/sbin。如果找不到,请查看 apachectl 脚本的源代码。
更改 envvars 文件后,使用“apachectl -k restart”重新启动 Apache。
我也遇到过这个问题。看起来,Passenger 没有传递使用SetEnv
apache 指令设置的值——这很不幸。
也许可以在您的 environment.rb 或 boot.rb 中设置环境变量(假设您正在谈论 Rails 应用程序;我不熟悉 Rack,但大概它具有类似的功能)