2013-10-13 5 views
2

dotcloud предоставляет много полезной информации в качестве переменных окружения, но мой nginx.conf не может получить доступ к переменным среды. Что хорошего в этом?с использованием переменных dotcloud env в nginx.conf

Вот сценарий: Я хотел бы, чтобы перенаправить определенные URL-адрес из моей www статической службы моей rest службы, так что я в настоящее время жестко прописывать целевой URL в nginx.conf. Я бы предпочел использовать переменную DOTCLOUD_REST_HTTP_HOST, так как это позволило бы моей службе легко мигрировать.

+0

Отключить ли dotCloud доступ к команде 'env' conf? http://wiki.nginx.org/CoreModule#env –

ответ

4

Это хороший случай для использования сценарий postinstall для вашего обслуживания. dotCloud предоставляет build hooks для запуска на каждом этапе цикла push и deploy, а крюк postinstall работает последним, где он имеет доступ ко всем переменным среды. Вы можете прочитать переменные от ~/environment.json или от фактической среды (файл немного более надежный, поскольку то, что попадает в окружающую среду, может варьироваться в зависимости от типа сервиса по историческим причинам).

Вот пример dotcloud.yml:

www: 
    approot: www 
    type: static 
    environment: 
    LIMITRATEVAR: 2k 

и пример nginx.conf (найденный в WWW/nginx.conf):

# limitratevar should get set in dotcloud.yml's environment section 
# or via `dotcloud env set limitratevar` if you want to set it for all services. 
# And then use a postinstall script to update this nginx.conf with sed 
limit_rate LIMITRATEVAR; 

и, наконец, пример postinstall (найденный в WWW/постустановочных), где считывается значение $ LIMITRATEVAR вне среды и обновляется nginx.conf с помощью sed:

#!/usr/bin/env bash 

# files named "postinstall" will get run automatically when the code is deployed 
# to the container where your service runs. 
# See: 
# http://docs.dotcloud.com/guides/build-file/#prebuild-postbuild-postinstall-build-hooks 
# http://docs.dotcloud.com/guides/hooks/#post-install 

# Make sure we error-out if there are any problems 
set -e 
echo "Updating the limit_rate to $LIMITRATEVAR" 
sed -i.original "s/LIMITRATEVAR/$LIMITRATEVAR/g" ~/current/nginx.conf 
echo "nginx.conf updated. Original stored in nginx.conf.original" 
2

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

На верхнем уровне конфигурации:

env MYVAR; 

На уровне Http:

perl_set $myvar 'sub { return $ENV{"MYVAR"}; }'; 

Тогда, например, на уровне сервера:

root $myvar; 
+0

DotCloud включает мой файл 'nginx.conf' внутри глобального блока' server {} '. Поскольку я не контролирую конфигурацию верхнего уровня, я не могу использовать директиву 'env'. – prideout

+0

Gotcha. В этом случае у меня ничего нет, извините. –

+0

Вам нужно поговорить с тем, кто контролирует, тогда :) –

 Смежные вопросы

  • Нет связанных вопросов^_^