Comment héberger plusieurs sites MVC3 sur un seul hôte virtuel exécutant Apache2?

J’essaie de configurer mod_mono avec Apache2 sur OSX. Je voudrais exécuter plusieurs projets MVC3 sur le même hôte virtuel, mais pour une raison quelconque, seul le premier répertorié fonctionne. Toute aide à ce sujet serait très appréciée car il n’ya pas beaucoup de documentation à ce sujet. J’ai essayé de nombreuses options de configuration, dont aucune ne semble fonctionner.

Listen *:9005  DocumentRoot "/Library/WebServer/vhosts/api" ServerName api MonoAutoApplication disabled Alias /gamecenter "/Library/WebServer/vhosts/api/gamecenter" AddMonoApplications gamecenter "/gamecenter:/Library/WebServer/vhosts/api/gamecenter" MonoServerPath gamecenter "/usr/bin/mod-mono-server4" MonoDebug gamecenter true MonoSetEnv gamecenter MONO_IOMAP=all MonoUnixSocket gamecenter-stage /tmp/mod_mono_server_gc  Allow from all Order allow,deny MonoSetServerAlias gamecenter SetHandler mono SetOutputFilter DEFLATE SetEnvIfNoCase Request_URI "\.(?:gif|jpe?g|png)$" no-gzip dont-vary  Alias /gamecenter-stage "/Library/WebServer/vhosts/api/gamecenter-stage" MonoServerPath gamecenter-stage "/usr/bin/mod-mono-server4" MonoDebug gamecenter-stage true MonoSetEnv gamecenter-stage MONO_IOMAP=all AddMonoApplications gamecenter-stage "/gamecenter-stage:/Library/WebServer/vhosts/api/gamecenter-stage" MonoUnixSocket gamecenter-stage /tmp/mod_mono_server_gcs  Allow from all Order allow,deny MonoSetServerAlias gamecenter-stage SetHandler mono SetOutputFilter DEFLATE SetEnvIfNoCase Request_URI "\.(?:gif|jpe?g|png)$" no-gzip dont-vary   AddOutputFilterByType DEFLATE text/html text/plain text/xml text/javascript   

Votre problème est que votre pseudonyme et votre chemin physique sont identiques, donc apache ne sait pas lequel servir.

NOTE: Je donne la réponse basée sur la configuration générale d’Apache2, et non sur mod_mono, peut-être que mod_mono fait quelque chose pour empêcher cela, je ne place pas les applications MVC dans une boîte * nix avant 🙂

En tous cas…

Si vous regardez vos configurations de chemin, vous avez …

 /Library/WebServer/vhosts/api /Library/WebServer/vhosts/api/gamecenter /Library/WebServer/vhosts/api/gamecenter-stage 

sans vos alias en place, ceux-ci résolvent déjà les chemins que vous essayez de cartographier.

 /Library/WebServer/vhosts/api = / /Library/WebServer/vhosts/api/gamecenter = /gamecenter /Library/WebServer/vhosts/api/gamecenter-stage = /gamecenter-stage 

Votre dire alors à Apache

 / = / /gamecenter = /gamecenter /gamecenter-stage = /gamecenter-stage 

Lorsque Apache essaie de délivrer le contenu s’il n’y a pas de sous-correctif ou de barre oblique existante (comme dans les 2 derniers), il va automatiquement sous-corriger le dossier avec un / puis émettre une redirection (306 je crois) :

 /gamecenter to /gamecenter/ 

Avec l’alias en place pour lui dire qu’Alias ​​… est à l’emplacement x, il doit alors essayer de faire un service pour servir

 /gamecenter/ 

ou

 /gamecenter/gamecenter/../ (Because in terms of folder structure the alias name is 1 folder level down in the web than it is physically) 

et finit par être confus, tout comme le fait tout hôte virtuel lorsqu’il est incapable de résoudre le chemin, et qu’il renvoie la racine du site Web.

Cependant, comme je le dis, il s’agit d’un comportement Apache NON MONO, il est possible que mod_mono modifie le pipeline de traitement de manière à modifier ce comportement.

Ce que je recommanderais est de diviser cela en 3 hôtes virtuels que vous pouvez faire très facilement, même sur une seule IP.

La première chose que vous voudrez faire est quelque part dans votre fichier de configuration principal Apache, avoir un

 Listen 9005 

déclaration. Cela fera que toutes les instances virtuelles écoutent sur ce port ainsi que sur tout autre port configuré EG: 80

Ensuite, assurez-vous que vous avez un hôte virtuel catch all default, cela interceptera tout nom de serveur non mappé ailleurs:

  DocumentRoot "/some/folder/where/the/default/is/" #Followed by other server directives. NOTE: there is NO servername line  

Une fois que vous avez cette configuration, déplacez-vous sur votre sous-domaine “api”

  ServerName api DocumentRoot "/Library/WebServer/vhosts/api/" #Other required directives here  

À ce stade, je vais faire une pause pour discuter de votre nom de domaine. S’il s’agit d’un système de test interne (ce que je soupçonne), vous trouverez la vie avec des domaines virtuels beaucoup plus facile si vous installez un serveur DNS sur votre boîte, puis définissez-le comme domaine maître à l’aide d’une adresse réseau interne privée.

PAR EXEMPLE:

Créez une zone racine et appelez-la “mydevnetwork.local”

puis ajoutez les noms de machine:

EG: si votre pc s’appelle devpc1, créez une adresse IP pour “devpc1.mydevnetwork.local” et donnez à votre PC une adresse IP statique de EG: 192.168.50.1

Ensuite, définissez un alias pour cela

api.mydevnetwork.local = devpc1.mydevnetwork.local

Iv’e n’a pas la place pour faire un post complet de configuration DNS ici, mais j’espère que vous aurez l’idée.

Une fois DNS (ou les entrées de fichier hôte au minimum) configuré, vos hôtes virtuels sous Apache deviennent vraiment faciles à gérer:

  ServerName api.mydevnetwork.local DocumentRoot "/Library/WebServer/vhosts/api/" #Other required directives here  

et facile à déplacer vers une autre machine si vous en avez besoin.

Vous pouvez définir le rest de vos hôtes virtuels de la même manière

  ServerName gamecenter.mydevnetwork.local DocumentRoot "/Library/WebServer/vhosts/api/gamecenter/" #Other required directives here   ServerName gamecenter-stage.mydevnetwork.local DocumentRoot "/Library/WebServer/vhosts/api/gamecenter-stage/" #Other required directives here  

Remarque: Définissez les chemins comme ci-dessus, et même si cela fonctionne, je vous conseille vivement de donner à chacun son dossier unique, je fais généralement quelque chose comme:

 wwwroot api.mydevnetwork.local htdocs <-- Web files go here cgi-bin <-- cgi scripts go here and it's mapped to /cgi-bin/ logs <-- logs here access <-- htpasswd files here 

J'espère que si ce qui précède n'est pas une solution complète, vous pourriez au moins avoir d'autres idées d'investigation.