Как мне разместить несколько сайтов MVC3 на одном виртуальном хостинге под управлением Apache2?

#apache #asp.net-mvc-3 #mono #mod-mono #osx-snow-leopard

#apache #asp.net-mvc-3 #mono #mod-mono #osx-snow-leopard

Вопрос:

Я пытаюсь настроить mod_mono с помощью Apache2 в OSX. Я хотел бы запустить несколько проектов MVC3 на одном виртуальном хостинге, но по какой-то причине работает только первый из перечисленных. Любая помощь по этому вопросу была бы высоко оценена, поскольку документации по этому вопросу не так много. Я перепробовал множество различных параметров конфигурации, ни один из которых, похоже, не работает.

 Listen *:9005
<VirtualHost *: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
  <Location /gamecenter>
    Allow from all
    Order allow,deny
    MonoSetServerAlias gamecenter
    SetHandler mono
    SetOutputFilter DEFLATE
    SetEnvIfNoCase Request_URI ".(?:gif|jpe?g|png)$" no-gzip dont-vary
  </Location>

  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
  <Location /gamecenter-stage>
    Allow from all
    Order allow,deny
    MonoSetServerAlias gamecenter-stage
    SetHandler mono
    SetOutputFilter DEFLATE
    SetEnvIfNoCase Request_URI ".(?:gif|jpe?g|png)$" no-gzip dont-vary
  </Location>

  <IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/javascript
  </IfModule>
</VirtualHost>
  

Комментарии:

1. Здравствуйте, вы уже решили эту проблему? У меня та же проблема.

2. пока ничего. я перепробовал все конфигурации, которые смог найти, и ни одна из них, похоже, не решает эту проблему. тем не менее, посмотрите.

3. если вы собираетесь отклонить голосование и отредактировать мой вопрос, сначала убедитесь, что знаете, о чем этот вопрос.

4. @крис, не мог бы ты изменить местоположения на директивы каталогов и протестировать?

Ответ №1:

ваша проблема в том, что ваш псевдоним и физический путь — одно и то же, поэтому apache не знает, какой из них обслуживать.

ПРИМЕЧАНИЕ: Я даю ответ, основанный на общей конфигурации Apache2, а не на mod_mono, возможно, mod_mono делает что-то, чтобы предотвратить это, я раньше не устанавливал приложения MVC в поле * nix 🙂

В любом случае…

если вы посмотрите на свои конфигурации path, у вас есть…

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

без ваших псевдонимов они уже соответствуют путям, которые вы пытаетесь сопоставить.

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

Затем вы говорите Apache, что

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

Когда Apache пытается доставить содержимое, если в файле нет подфикса или существующей косой черты (как в последних 2), он автоматически подфиксирует папку с помощью /, а затем отправит перенаправление (я полагаю, 306), по сути, указывая браузеру перенаправить, например,:

 /gamecenter to /gamecenter/
  

С установленным псевдонимом, чтобы сообщить ему этот псевдоним… находится в местоположении x, затем он должен попытаться принять решение обслуживать

 /gamecenter/
  

или

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

и в конечном итоге я запутываюсь, и то же самое делает любой настроенный виртуальный хост, когда он не может разрешить путь, и это возвращает корень веб-сайта.

Однако, как я уже СКАЗАЛ, это обычное поведение Apache, отличное от MONO, возможно, что mod_mono может каким-то образом изменить конвейер обработки, что может изменить это поведение.

Что я бы рекомендовал, так это разделить это на 3 виртуальных хоста, что вы можете сделать очень легко даже на одном IP.

Первое, что вы захотите сделать, это где-нибудь в вашем главном файле конфигурации Apache установить

 Listen 9005
  

инструкция. Это заставит ВСЕ виртуальные экземпляры прослушивать этот порт, а также любой другой настроенный порт, НАПРИМЕР: 80

Затем убедитесь, что у вас установлен виртуальный хост catch all по умолчанию, он будет перехватывать любое имя сервера, не отображенное в другом месте:

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

Как только вы это настроите, перейдите на свой поддомен «api»

 <VirtualHost *>
  ServerName api
  DocumentRoot "/Library/WebServer/vhosts/api/"
  #Other required directives here
</VirtualHost>
  

На этом этапе я собираюсь сделать паузу, чтобы обсудить ваше доменное имя. Если это внутренняя тестовая система (а я подозреваю, что это так), то вам станет намного проще работать с виртуальными доменами, если вы установите DNS-сервер на своем компьютере, а затем настройте его как главный домен, используя частный адрес внутренней сети.

НАПРИМЕР:

Создайте корневую зону и назовите ее «mydevnetwork.local»

затем добавьте к нему имена компьютеров:

НАПРИМЕР: если ваш компьютер называется devpc1, создайте IP-адрес для «devpc1.mydevnetwork.local» и присвоите вашему компьютеру статический IP-адрес, НАПРИМЕР: 192.168.50.1

Затем установите псевдоним для этого, чтобы

api.mydevnetwork.local = devpc1.mydevnetwork.local

У меня нет возможности опубликовать здесь пост о полной настройке DNS, но, надеюсь, вы поняли идею.

Как только у вас будет настроен DNS (или, как минимум, записи в файле хоста), вашими виртуальными хостами под управлением Apache станет действительно легко управлять:

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

и при необходимости легко перенести на другую машину.

Вы можете настроить остальные ваши виртуальные хосты почти таким же образом

 <VirtualHost *>
  ServerName gamecenter.mydevnetwork.local
  DocumentRoot "/Library/WebServer/vhosts/api/gamecenter/"
  #Other required directives here
</VirtualHost>

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

Обратите внимание, что iv’e установил пути такими же, как указано выше, и даже если это сработает, я бы настоятельно рекомендовал вам предоставить каждому из них собственную уникальную папку, я обычно делаю что-то вроде:

 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
  

Надеюсь, если вышеописанное не является полным решением, вы могли бы, по крайней мере, извлечь из него некоторые дополнительные идеи для исследования.

Комментарии:

1. Я потерял надежду, что где-то есть решение. Я обязательно попробую и сообщу об этом. Спасибо.

2. @крис, у тебя это сработало? Проблема, с которой я сталкиваюсь, заключается в том, что при настройке нескольких виртуальных хостов появляется несколько экземпляров mod-mono-server4. Я хотел бы иметь возможность запускать несколько приложений MVC из одного экземпляра mod-mono-server4, но я не смог выяснить, как. Это похоже на вашу проблему?