Chemin racine du domaine nginx dynamique basé sur le nom d'hôte?

11

J'essaie de configurer mon serveur de développement nginx / PHP avec une configuration de base vhost maître / catch-all afin que je puisse créer des ___.framework.locdomaines illimités selon les besoins.

server {
        listen 80;
        index index.html index.htm index.php;

        # Test 1
        server_name ~^(.+)\.frameworks\.loc$;
        set $file_path $1;
        root    /var/www/frameworks/$file_path/public;

        include /etc/nginx/php.conf;
}

Cependant, nginx répond avec une erreur 404 pour cette configuration. Je sais que nginx et PHP fonctionnent et ont la permission parce que la localhostconfiguration que j'utilise fonctionne très bien.

server {
        listen 80 default;
        server_name localhost;
        root /var/www/localhost;
        index index.html index.htm index.php;

        include /etc/nginx/php.conf;
}

Que dois-je vérifier pour trouver le problème? Voici une copie de ce php.conf qu'ils chargent tous les deux.

location / {
        try_files $uri $uri/ /index.php$is_args$args;
}

location ~ \.php$ {

        try_files $uri =404;

        include fastcgi_params;
        fastcgi_index index.php;

        # Keep these parameters for compatibility with old PHP scripts using them.
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        # Some default config
        fastcgi_connect_timeout        20;
        fastcgi_send_timeout          180;
        fastcgi_read_timeout          180;
        fastcgi_buffer_size          128k;
        fastcgi_buffers            4 256k;
        fastcgi_busy_buffers_size    256k;
        fastcgi_temp_file_write_size 256k;
        fastcgi_intercept_errors    on;
        fastcgi_ignore_client_abort off;
        fastcgi_pass 127.0.0.1:9000;

}
Xeoncross
la source

Réponses:

12

Pourquoi ne pas simplement utiliser:

server_name *.frameworks.loc;
root /var/www/frameworks/$http_host/public;
Michael Hampton
la source
C'est exactement ce que je cherchais!
Xeoncross
13

La configuration de Nginx n'est pas un programme, c'est une déclaration. Lorsque vous utilisez une configuration comme celle-ci:

server {
        server_name ~^(.+)\.frameworks\.loc$;
        ...
        set $file_path $1;
        root    /var/www/frameworks/$file_path/public;
}

Il n'y a aucun moyen de s'assurer que votre setdirective s'exécutera avant root.

Mais il y a un truc avec la mapdirective que j'aime utiliser. Elle repose sur un fait mapévalué avantlocation

http {
  map $http_host $rootpath {
    ~^(.?<mypath>+)\.frameworks\.loc$  $mypath;
    default                            /      ;
  }
  ....
  root /var/www/frameworks/$rootpath
}
DukeLion
la source
Cela semble amusant, je prévois de jouer plus avec la carte maintenant. Je ne savais pas non plus que les fichiers de configuration n'étaient pas traités de manière linéaire.
Xeoncross
Quel est l'intérêt $mypathici? Il n'est utilisé nulle part.
kodeart
@kodeart $mypathest le groupe de résultats pour l'expression régulière ~^(.?<mypath>+)\.frameworks\.loc$et $rootpathle résultat de l'astuce de la carte entière.
Fabio Montefuscolo
4

En plus de la grande réponse de DukeLion , je devais changer de ligne

~^(.?<mypath>+)\.frameworks\.loc$ $mypath;

à

~^(?P<mypath>.+)\.frameworks\.loc$ $mypath;

dans mon /etc/nginx/nginx.confdossier comme suggéré ici .

Ajouter

root /var/www/frameworks/$rootpath

en /etc/nginx/sites-available/defaulta bien fonctionné après cela.

zub0r
la source
0

Peut-être que vous pouvez également regarder lighttpd. Il prend en charge exactement ce que vous demandez ici. Il s'agit de mod_evhost .

Activer evhost

Ajoutez les lignes suivantes dans votre lighttpd.conf. Si vous utilisez la distribution de base Debian / Ubuntu, il suffit de créer un lien logiciel ou de copier depuis /etc/lighttpd/conf-available/10-evhost.confvers /etc/lighttpd/conf-enabled/.

    # http://redmine.lighttpd.net/wiki/1/Docs:ModEVhost
    server.modules + = ("mod_evhost")
    evhost.path-pattern = "/ home / www /% _"

Le %_(caractère générique) dans evhost.path-patten signifie utiliser le nom de domaine complet (par exemple, www.example.com). Une demande pour www.example.com sera automatiquement dirigée vers la racine du document /home/www/www.example.com/.

Ajouter un site supplémentaire est aussi simple que de créer un autre répertoire sous /home/wwwavec un nom de domaine complet. Aucune modification du fichier de configuration Lighttpd.

Il existe d'autres caractères génériques et peuvent être utilisés pour créer une structure de répertoires. Ils sont comme suit

    %% => signe%
    % 0 => nom de domaine + tld
    % 1 => tld
    % 2 => nom de domaine sans tld
    % 3 => nom du sous-domaine 1
    % 4 => nom du sous-domaine 2
    % _ => nom de domaine complet

Les informations détaillées sont ici .

PS: L' activation de PHP est également facile si vous êtes sur la plate-forme Debian / Ubuntu. Activez simplement 10-fastcgi.confet 15-fastcgi-php.conf.

John Siu
la source
0

NGINX utilise la bibliothèque d'expressions régulières PCRE.
Depuis la server_namedirective NGINX v0.8.25, permet des captures nommées .

Les captures nommées dans les expressions régulières créent des variables ( 0.8.25 ) qui peuvent plus tard être utilisées dans d'autres directives Lors de l'utilisation de parenthèses nommées, NGINX définit automatiquement une variable pour chaque parenthèse nommée, lors de l'évaluation des noms de serveur (je suppose).

J'utilise l'extrait de code suivant pour "clôturer" les environnements des développeurs. «Utilisateur» désigne son nom d'utilisateur et «proj» le projet sur lequel il travaille:

# ...
server_name ~^(?<user>[^.]+)\.(?<proj>[^.]+).dev.local-server.com;
root /home/$user/www/$proj;
# ...

Notez que la configuration de nginx est déclarative, et en tant que telle, les déclarations statiques peuvent toujours être plus rapides par rapport aux valeurs et variables calculées au moment de l'exécution. L'évaluation des expressions régulières est relativement coûteuse, je suppose qu'elle doit être utilisée avec parcimonie dans des environnements (de production) fortement chargés.

Stéphane
la source