Comment inclure conditionnellement des fichiers dans vhost Nginx?

12

Dans les lignes ci-dessous, je pourrais avoir un fichier de configuration spécifique au site qui contient des fastcgi_params supplémentaires uniques à 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 j'obtiens est:

nginx: [Emerg] la directive "include" n'est pas autorisée ici dans ...

Mise à jour

J'ai pensé que plutôt que de vérifier séparément, je pouvais laisser inclure le chèque 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.

Xeoncross
la source
Avez-vous trouvé une solution à ce problème? Je suis dans le même bateau et je me demande comment tu as fait ça?
jackweirdy
Désolé, je pense que j'ai finalement résolu le problème d'une manière différente.
Xeoncross

Réponses:

8

includefait son travail lors du démarrage du serveur - les variables d'exécution comme $hostne peuvent pas être utilisées, ni ne peuvent être utilisées dans un ifcontexte, comme vous l'avez découvert.

Vous devez diviser les serverblocs pour différents hôtes. Pardon!

Shane Madden
la source
31

Eh bien, c'est plutôt vieux, mais de toute façon, j'ai trouvé une solution.

J'ai une configuration avec des vhosts configurés dans ce style:

/etc/nginx/sites-enabled/site.com.conf

Au lieu de vérifier si le fichier existe (ce qui n'est pas possible), je fais simplement:

include /etc/nginx/sites-customizations/site.com.*.conf

De cette façon, je peux simplement créer un fichier dans le sites-customizationsdossier-qui, selon ma convention, est nommé de la même manière que la configuration principale. Les *œuvres à peu près comme le cas, car il ne se brise pas s'il n'y a pas de fichiers de configuration supplémentaires. Si vous le souhaitez, cela vous permet également d'ajouter plusieurs configurations supplémentaires dans des fichiers séparés.

user158786
la source
5

Je sais que c'est vieux mais la solution pourrait aider quelqu'un qui cherche une réponse comme moi.

J'avais un tas de redirections que je devais inclure pour un hôte spécifique uniquement et bien que ce includene soit pas autorisé dans la ifdirective, j'ai fini par ajouter l' ifintérieur du fichier que j'incluais ...

J'ai donc un include /etc/nginx/conf.d/redirectset à l'intérieur de ce fichier j'ai:

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

Je profite de l' glob()expansion du modèle de fonction, qui est utilisée par nginx dans la includedirective, 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 qu'à un seul fichier et ne fera pas nginx se plaindre si le fichier n'existe pas. Cependant, les variables ne sont pas autorisées dans les directives include, vous devez donc fournir une valeur fixe dans <hostname>. Nous avons dû créer un script qui génère des fichiers .conf individuels (un par vhost).

Éditer

Comme l'a souligné Gerald Schneider , je proposais de conserver $hostle remplaçant, ce qui n'est pas autorisé. J'ai changé la suggestion ci-dessus.

Alberto Pastore
la source
1
la variable $hostne fonctionnera toujours pas ici.
Gerald Schneider
Désolé, vous avez raison, les variables ne sont pas autorisées dans les directives include. Nous utilisons un script python qui crée un seul fichier .conf pour chaque vhost d'une liste, mais nous utilisons largement les écarts par vhost supplémentaires "personnalisés" par rapport à la norme.
Alberto Pastore