Как передать переменные среды ImageMagick шавкам nginx? - PullRequest
0 голосов
/ 22 марта 2010

Приложение 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?

Спасибо!

1 Ответ

4 голосов
/ 20 апреля 2010

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

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

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

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

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

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

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

...