0

我的 Rails 应用程序使用 ImageMagick,但该应用程序在尝试执行 ImageMagick 命令(“识别”)时失败。通过在我的 Apache 配置中传递以下环境变量,我在开发中解决了这个问题(我正在运行 Apache/Passenger):

  SetEnv MAGICK_HOME /opt/local/var/macports/software/ImageMagick/6.5.9-0_0+q16
  SetEnv DYLD_LIBRARY_PATH /opt/local/var/macports/software/ImageMagick/6.5.9-0_0+q16/opt/local/lib
  SetEnv PATH /usr/bin:/opt/local/var/macports/software/ImageMagick/6.5.9-0_0+q16/opt/local/bin

但是,我的生产环境正在运行 Nginx 和 Mongrel(不是我设置的),我不确定如何将这些变量传递给应用程序。我的 nginx.conf 文件目前如下:

# user and group to run as
user  mouthbreather mouthbreather;

worker_processes  4;

# pid of nginx master process
pid /var/run/nginx.pid;

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 $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

  access_log  /var/log/engineyard/nginx/access.log  main;
  error_log  /var/log/engineyard/nginx/error.log notice;

  sendfile on;

  tcp_nopush        on;
  tcp_nodelay       on;

  gzip              on;
  gzip_http_version 1.0;
  gzip_comp_level   2;
  gzip_proxied      any;
  gzip_buffers      16 8k;
  gzip_types        text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;

  include /etc/nginx/sites/*.conf;
}

所以我的问题是:

  1. 如何确定我的 MAGICK_HOME 在哪里生产?
  2. 如何通过 nginx.conf 将这些变量传递给应用程序?

谢谢!

4

1 回答 1

4

简而言之,您不会通过环境变量使用 nginx 传递任何内容,而是使用 HTTP 标头或 fastcgi 参数。

在您的情况下,您甚至不需要这样做,因为您正在正确地做事并将 mongrel 作为一个单独的进程运行 - 在他们的环境中设置环境变量。Nginx 与它完全无关。

Nginx 不适用于环境变量,并且可能在很长一段时间内都无法使用,直到有人错误地为它破解了第三方模块,然后它仍然不会在主流中得到支持。

造成这种情况的原因有很多,主要是设计、安全、管理相关,但最终开发人员和社区认为,当 HTTPd 被设计为处理可能的资源时,处理环境变量不是 HTTPd 的地方不在同一台机器上(如何将环境变量传递给在附近另一台机器上监听的进程?)。

此外,passenger 是一个第三方模块,在实现和设计方面都有些破损,因为它违反了 nginx 的设计目的,因为它在 nginx 中运行应用程序进程(在这里你可以在理论上传递环境变量,但这不是 nginx 的工作方式)。

处理此类事情的推荐方法是在 nginx 之外启动您的应用程序(如果您愿意,可以使用那里的环境变量),然后将代理或 fastcgi 传递给您的应用程序,可选择在 headers 或 fastcgi 参数中包含必要的额外数据. 或者,您的应用程序可能有一些方法来确定其中的正确设置,例如 settings.local 文件(这在 python 设置中相当常见)。

有很多方法可以在不让 nginx 处理环境变量的情况下做到这一点。

于 2010-04-19T21:04:24.063 回答