Как разместить несколько сайтов MVC3 на одном виртуальном хосте под управлением Apache2? - PullRequest
21 голосов
/ 08 июня 2011

Я пытаюсь настроить 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 Ответ

3 голосов
/ 12 октября 2011

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

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

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

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

/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), по сути говоря, сообщив браузеру: перенаправление из EG:

/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)

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

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

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

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

Listen 9005

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

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

<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-сервер на своем компьютере, а затем установите его в качестве основного домена, используя частный адрес внутренней сети.

EG:

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

затем добавьте к нему имена машин:

EG: если ваш компьютер называется devpc1, создайте IP-адрес для "devpc1.mydevnetwork.local" и присвойте вашему компьютеру статический IP-адрес EG: 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>

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

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

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

...