web-dev-qa-db-fra.com

Comment incluez-vous conditionnellement des fichiers dans NGinx Vhost?

Dans les lignes ci-dessous, je peut avoir un fichier de configuration spécifique à un site contenant un fichier supplémentaire FastCGI_Params unique sur ce site. Si ce fichier existe, je veux le charger.

server {
        listen 80 default;
        server_name _;
        root /path/www/$Host;

        # Pass PHP scripts to php-fastcgi listening on port 9000
        location ~ \.php {
                include fastcgi_params;
                fastcgi_pass 127.0.0.1:9000;


                if (-f /path/www/$Host/nginx.conf) {
                        include /path/www/$Host/nginx.conf;
                }
        }
}

Cependant, cela ne fonctionne pas et l'erreur que je reçois est:

nGINX: [SIGH] "Inclure" la directive n'est pas autorisée ici dans ...

Mettre à jour

Je pensais que plutôt que de vérifier séparément, je pourrais laisser inclure vérifier pour moi.

server {
        listen 80 default;
        server_name _;
        root /path/www/$Host;

        # Pass PHP scripts to php-fastcgi listening on port 9000
        location ~ \.php {
                include fastcgi_params;
                fastcgi_pass 127.0.0.1:9000;

                include /path/www/$Host/*.nginx;
        }
}

Cependant, cela ne semble pas fonctionner.

13
Xeoncross

include fait sa chose pendant les variables de démarrage du serveur, comme $Host Ne peut pas être utilisé, il n'est pas possible d'utiliser un contexte if, comme vous l'avez découvert.

Vous auriez besoin de séparer les blocs server pour différents hôtes. Désolé!

9
Shane Madden

Je profite de l'expansion du modèle de fonction glob(), qui est utilisée par NGinx dans la directive include et fonctionne bien sur mes serveurs Debian.

Dans votre cas, essayez de remplacer cette ligne:

include /path/www/$Host/nginx.conf;

avec celui-ci:

include /path/www/<hostname>/nginx[.]conf;

c'est un masque de fichier qui ne correspond à un seul fichier et ne fabrique pas NGinx se plaindre si le fichier n'existe pas. Cependant, les variables ne sont pas autorisées dans les directives, vous devez donc fournir une valeur fixe dans <hostname>. Nous avons dû créer un script qui génère des fichiers individuels .conf (un par vhost).

Éditer

AS Gerald Schneider a souligné, je suggais de garder $Host Dans le remplacement, qui n'est pas autorisé. J'ai changé la suggestion ci-dessus.

5
Alberto Pastore

Je sais que c'est vieux mais une solution pourrait aider quelqu'un à la recherche d'une réponse comme je l'ai fait.

J'ai eu un tas de redirections que je devais inclure uniquement pour un hôte spécifique et _ include n'est pas autorisé dans la directive if, j'ai fini par ajouter le if à l'intérieur du Fichier j'avais compris ...

Donc j'ai un include /etc/nginx/conf.d/redirects et à l'intérieur de ce fichier que j'ai:

if ($Host = "www.example.com") {
    # Some conf or redirects for this site only.
}
5
Titi