Как передать переменные среды ImageMagick дворнягам nginx?

Приложение My Rails использует ImageMagick, но при попытке выполнить команду ImageMagick («идентифицировать») приложение терпит неудачу. Я исправил эту проблему при разработке (где я использую Apache/Passenger), передав следующие переменные среды в моей конфигурации Apache:

  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?

Спасибо!


person Mouthbreather    schedule 22.03.2010    source источник


Ответы (1)


Короче говоря, вы ничего не передаете через переменные среды с nginx, вы используете заголовки HTTP или параметры fastcgi.

В вашем случае вам даже не нужно, потому что вы делаете все правильно и запускаете дворняг как отдельный процесс - задайте переменные среды в ИХ среде. Nginx по сути не имеет к этому никакого отношения.

Nginx не работает с переменными среды и, вероятно, не будет в течение очень долгого времени, пока кто-то по ошибке не взломает для него сторонний модуль, и тогда он все равно не будет поддерживаться в основном потоке.

Для этого есть множество причин, в основном связанные с дизайном, безопасностью, администрированием, но, в конечном счете, мнение разработчика и сообщества заключается в том, что работа с переменными среды не является местом HTTPd, когда HTTPd предназначен для работы с ресурсами, которые могут не находиться на той же машине (как вы передаете переменные среды процессам, прослушивающим другую машину поблизости?).

Кроме того, пассажир является сторонним модулем и несколько нарушен как с точки зрения реализации, так и с точки зрения дизайна, поскольку он противоречит тому, для чего предназначен nginx, потому что он запускает процессы приложения внутри nginx (здесь вы МОЖЕТЕ передавать переменные среды в теории, но nginx не предназначен для работы).

Рекомендуемый метод для обработки таких вещей — запустить ваше приложение вне nginx (используя там переменные среды, если хотите), а затем либо прокси, либо fastcgi передать вашему приложению, при необходимости включив в заголовки или параметры fastcgi необходимые дополнительные данные. . Кроме того, ваше приложение может иметь какой-то способ определить правильные настройки внутри него, например файл settings.local (это довольно часто встречается в настройках Python).

Есть множество способов сделать это, не заставляя nginx работать с переменными окружения.

person Anonymous    schedule 19.04.2010