#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, но я не смог выяснить, как. Это похоже на вашу проблему?