Назад | Перейти на главную страницу

Странный доступ к каталогам в apache с несколькими приложениями servicestack, размещенными с помощью mod_mono

У меня есть веб-сервер (Linux, Ubuntu 16.04) с apache. Я использую его для размещения некоторых приложений ASP.NET с моно, разработанными с использованием инфраструктуры ServiceStack. Вот моя конфигурация vhost

<VirtualHost *:443>
    ServerName myhost

    ServerAdmin me@myhost
    DocumentRoot /var/www/

    ErrorLog ${APACHE_LOG_DIR}/myhost-error.log
    CustomLog ${APACHE_LOG_DIR}/myhost-access.log combined

    SSLEngine on
    SSLCertificateFile    /etc/letsencrypt/live/myhost/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/myhost/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/myhost/fullchain.pem

    Header always set Strict-Transport-Security "max-age=15768000"

    <Directory /var/www>
       AllowOverride Nonehackathon
       deny from all
    </Directory>

    # Configure the myservice backend and frontend

    <Directory /var/www/myservice/backend>
       AllowOverride None
       Order allow,deny
       allow from all
    </Directory>

    Alias /myservice "/var/www/myservice/frontend"
    Alias /csc "/var/www/myservice/frontend"
    <Directory /var/www/myservice/frontend>
       AllowOverride None
       Order allow,deny
       allow from all
    </Directory>

    MonoMaxActiveRequests 150 
    MonoMaxWaitingRequests 150 
    MonoSetEnv MONO_THREADS_PER_CPU=100

    MonoServerPath "/usr/bin/mod-mono-server4"
    MonoServerPath backend "/usr/bin/mod-mono-server4"
    MonoApplications backend "/myservice/backend:/var/www/myservice/backend"
    KeepAliveTimeout 5
    Alias /myservice/backend "/var/www/myservice/backend"

    <Location /myservice/backend>
       Allow from all
       Order allow,deny
       MonoSetServerAlias backend
       SetHandler mono
    </Location>
    <Directory /var/www/myservice/backend>
       AllowOverride None
       Order allow,deny
       allow from all
    </Directory>

    # Configure the test sites for the myservice

    <Directory /var/www/test/myservice/backend>
       AllowOverride None
       Order allow,deny
       allow from all
    </Directory>

    Alias /test/myservice "/var/www/test/myservice/frontend"
    Alias /test/csc "/var/www/test/myservice/frontend"
    <Directory /var/www/test/myservice/frontend>
       AllowOverride None
       Order allow,deny
       allow from all
    </Directory>

    MonoServerPath test_backend "/usr/bin/mod-mono-server4"
    MonoApplications test_backend "/test/myservice/backend:/var/www/test/myservice/backend"

    <Location /test/myservice/backend>
       Allow from all
       Order allow,deny
       MonoSetServerAlias test_backend
       SetHandler mono
    </Location>


    # Configure WebDav access

    Alias /webdav "/var/www/webdav"
    <Location /webdav>
       Options Indexes
       DAV On
       AuthType Basic
       AuthName "webdav"
       AuthUserFile /etc/apache2/webdav.password
       Require valid-user
       Order allow,deny
       allow from all
    </Location>
</VirtualHost>

Это работает более или менее, но все равно вызывает некоторую ошибку в журналах apache:

==> /var/log/apache2/myhost-error.log <==
[Tue Jun 13 09:00:27.874100 2017] [access_compat:error] [pid 62595:tid 140403123173120] [client 1.2.3.4:53342] AH01797: client denied by server configuration: /var/www/items, referer: https://myhost/csc/

==> /var/log/apache2/myhost-access.log <==
1.2.3.4 - - [13/Jun/2017:09:00:27 +0200] "GET /myservice/backend/items/42 HTTP/1.1" 200 578 "https://myhost/csc/" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; SD; rv:11.0) like Gecko"

Итак, клиент пытается получить доступ к действующему маршруту в бэкэнде (/ myservice / backend / items / 42) через флот (myhost / csc) и получает правильный результат от службы, но по какой-то причине apache пытается получить доступ к этому элементу непосредственно из каталога htdocs (/ var / www / items) первый. Кто-нибудь видит, откуда эта ошибка?

Итак, просматривая биты конфигурации, которые могут соответствовать вашему запросу, я вижу следующее, которое может соответствовать /myservice/backend/items/42 дорожка:

Alias /myservice "/var/www/myservice/frontend"
Alias /myservice/backend "/var/www/myservice/backend"
<Location /myservice/backend>

Все это кажется довольно противоречивым и запутанным. Чтобы выяснить, что вступит в силу, нужно более внимательно прочитать правила обработки, чем вы могли бы надеяться. Убирайся!

Я призываю вас попытаться устроить так, чтобы:

  • нет необходимости знать, вступает ли в силу директива Alias ​​или директива Location.
  • Самая конкретная директива Alias ​​идет первой в вашем файле. Последнее предположительно не действует.
  • Директивы псевдонима в основном предназначены для отображения запросов на области вне корня документа. В корне документа я бы использовал mod_rewrite. Подумайте о том, чтобы сделать его перенаправлением на стороне клиента, чтобы у вас не было нескольких URL-адресов, указывающих на один и тот же контент.
  • Прочтите ноты об использовании блоков местоположения для контроля доступа и убедитесь, что вы этого не делаете. Я не знаком с Mono, но полагаю, он не должен использовать пути внутри корня вашего документа?
  • Если ваш материал WebDAV использует <Directory> блок, а не <Location>?

После того, как URL-путь будет сопоставлен с каталогом, вы не хотите иметь несколько определений для <Directory /var/www/myservice/backend>. В настоящее время они выглядят одинаково, но со временем могут расходиться и создавать путаницу.

Я не уверен, что случилось с вашим запросом, но уверены ли вы, что эти две строки журнала совпадают? С одной стороны, у вас ошибка, а 200 статус с другой. Рассмотрите возможность использования curl, а не браузера, чтобы избежать запуска подзапросов.

Я подозреваю, что к тому времени, когда вы так или иначе приведете в порядок свою конфигурацию, ваша проблема исчезнет. Может быть, вы поймете это по ходу дела, или, может быть, он просто исчезнет, ​​или, может быть, его даже не было в самом начале (например, это был продукт запутанных записей журнала из разных запросов). Если бы не эти вещи, могла ли эта ошибка возникнуть из-за вашего моно-приложения?