Expression non évaluée dans httpd.conf

J’essaie de trouver un moyen de basculer entre les projets et la production / développement via des variables d’environnement. Cependant quand je fais ceci:

Define PROJECT_ROOT osenv('APACHE_PROJECT_ROOT') LogMessage ${PROJECT_ROOT}

Le côté droit de l’expression Définir est traité comme une piqûre et n’est pas évalué. Le résultat est “osenv (‘APACHE_PROJECT_ROOT’)” au lieu de la variable d’environnement elle-même. Aucune suggestion?

edit: Des précisions supplémentaires car ce post n’obtient pas les vues ou les réponses que j’attendais. Je veux avoir un environnement de development , de staging et de production .

Sur ma machine de development , je m’attends à avoir plusieurs projets Apache en cours d’exécution, chacun avec un fichier de parameters virtualhost . Le chemin d’access correct au répertoire et aux parameters virtualhost peut être dérivé des variables d’environnement (OS) APACHE_PROJECT_ROOT et APACHE_ACTIVE_PROJECT .

L’environnement de staging et de production fonctionnerait de manière similaire (peut-être simplifié car il n’y a qu’un seul projet par droplet. Il me semble que le bon sens est d’avoir un seul fichier http.conf, où les variables d’environnement du système d’exploitation déterminent les sites chargés. vraiment trouver des ressources à ce sujet cependant.

Define n’est pas documenté comme prenant une expression en tant qu’argument, il n’est donc pas surprenant que la valeur soit la valeur littérale que vous spécifiez.

Vous pouvez utiliser des variables d’environnement natives directement en tant que valeurs avec la syntaxe $ {VAR} dans la plupart des contextes car la raison pour laquelle la configuration est lue est gérée. Cela résout tous les chemins d’access aux répertoires DocumentRoot ou log, mais ne vous fournit pas de conditions.

La manière la plus raisonnable de faire des conditions lors de l’parsing du fichier de configuration est de passer -D pour spécifier l’environnement dans lequel vous vous trouvez et ensuite de modifier les directives utilisées.

Je prends une approche quelque peu différente de ce que j’estime être essentiellement le même problème. Je n’ai qu’un seul fichier de parameters virtualhost et définissez tous mes parameters. Ensuite, j’utilise différents noms d’hôte pour accéder aux différents projets / environnements. Par exemple,

  DocumentRoot "/var/www/html/project1/develop" ServerName project1-develop ErrorLog "logs/project1-develop-error.log" CustomLog "logs/project1-develop-access.log" common # other configuration settings...   DocumentRoot "/var/www/html/project1/staging" ServerName project1-staging ErrorLog "logs/project1-staging-error.log" CustomLog "logs/project1-staging-access.log" common # other configuration settings...   DocumentRoot "/var/www/html/project1/production" ServerName project1-production ErrorLog "logs/project1-production-error.log" CustomLog "logs/project1-production-access.log" common # other configuration settings...   DocumentRoot "/var/www/html/project2/develop" ServerName project2-develop ErrorLog "logs/project2-develop-error.log" CustomLog "logs/project2-develop-access.log" common # other configuration settings...  # repeat for as many hosts as necessary... 

Puis, dans /etc/hosts je définis des entrées DNS pour les noms d’hôtes qui pointent vers localhost (où j’exécute Apache, vous utiliseriez simplement le serveur que vous utilisez):

 127.0.0.1 project1-develop 127.0.0.1 project1-staging 127.0.0.1 project1-production 127.0.0.1 project2-develop # repeat as necessary 

Et maintenant, je peux accéder à chacun de mes environnements, par exemple http://project1-develop , http://project1-staging etc.

Je me rends compte que ce n’est pas une réponse à votre question précise concernant l’utilisation des variables d’environnement, mais j’espère que cela sera utile de toute façon.

Vous pouvez utiliser le mot-clé If , voir http://httpd.apache.org/docs/2.4/mod/core.html#if

Quelque chose comme:

  LogMessage "this is staging"  

(vous avez aussi des déclarations Elseif et Else )

Et la même chose pour les autres environnements. Bien sûr, vous metsortingez d’autres directives dans chaque instruction If . Vous pouvez même utiliser SetEnv pour positionner une variable d’environnement Apache que vous pourriez utiliser dans d’autres directives (directives de réécriture, directives de journalisation, etc.).

Des exemples complets de fonctionnalités If disponibles sur http://httpd.apache.org/docs/2.4/expr.html

Je recommande également de mettre chaque bloc de configuration, par environnement, dans des fichiers spécifiques, puis d’utiliser les directives Include .