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

Клиент отклонен конфигурацией сервера на Apache 2.4

Мы перенесли несколько сайтов Drupal 7/8 в новый стек, где основные изменения заключались в замене Apache 2.2 и FastCGI на Apache 2.4 и PHP-FPM.

У нас есть следующая ошибка на нескольких сайтах:

[Пт, 19 октября, 09: 06: 26.333135 2018] [: ошибка] [pid 6415: tid 140550690748160] [клиент 93.xxx.xxx.xxx:0] клиент отклонен конфигурацией сервера: /var/www/html/example.com / js, реферер: https://www.example.com/some-page

Путь / js исходит из Модуль JS Drupal, но это происходит на других путях, определенных нашими собственными маршрутами Drupal (hook_menu на D7).

Это файл vhost:

<VirtualHost *:80>
 ServerName example.com
 ServerAlias www.example.com
 ServerAdmin admin@mycompany.com
 UseCanonicalName Off

 DocumentRoot /var/www/html/example.com

 ErrorLog /var/www/logs/example.com.error.log
 LogLevel warn
 CustomLog /var/www/logs/example.com.log combined
 <Directory /var/www/html/example.com>
    Options -Indexes +FollowSymLinks +ExecCGI
    AllowOverride All
    Require all granted
  </Directory>

</VirtualHost>

<IfModule mod_ssl.c>
<VirtualHost *:443>
 Protocols h2 http/1.1
 ServerName example.com
 ServerAlias www.example.com
 ServerAdmin admin@example.com
 UseCanonicalName Off

 DocumentRoot /var/www/html/example.com

 ErrorLog /var/www/logs/example.com.error.log
 LogLevel warn
 CustomLog /var/www/logs/example.com.log combined
 <Directory /var/www/html/example.com>
    Options -Indexes +FollowSymLinks
    AllowOverride All
    Require all granted
  </Directory>

SSLCertificateFile /etc/letsencrypt/live/www.example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.example.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

Я пытался grep /etc/ и /var/www/html для Order и Allow / Deny (Старый синтаксис Apache 2.2), но я не смог найти ничего важного, только одна вещь, которая исходит из файлов конфигурации Apache по умолчанию, и она находится в операторе if, который не будет работать в нашем случае)

Мы также добавили Options -MultiViews в наш Drupal .htaccess, чтобы исправить еще одну проблему с Apache 2.4, не уверен, что она актуальна.

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

Любая помощь будет оценена по достоинству.

Обновить

Мы используем mod_mpm_event, если это имеет какое-то значение.

Файл Apache php.conf:

AddType text/html .php

DirectoryIndex index.php

<IfModule  mod_php5.c>
    <Proxy "unix:/var/run/php-fpm/default.sock|fcgi://php-fpm">
        ProxySet disablereuse=off
    </Proxy>
    <FilesMatch \.php$>
        SetHandler proxy:fcgi://php-fpm
    </FilesMatch>
</IfModule>

файл .htaccess - мы используем обычный Файл .htaccess Drupal 7 со следующими изменениями: правила перезаписи модуля JS выше любых других правил перезаписи (строка 62)

RewriteCond %{REQUEST_URI} ^\/([a-z]{2}\/)?js\/.*
RewriteRule ^(.*)$ js.php?q=$1 [L,QSA]
RewriteCond %{QUERY_STRING} (^|&)q=((\/)?[a-z]{2})?(\/)?js\/.*
RewriteRule .* js.php [L]

В дополнение к этому мы добавили Options -MultiViews как уже упоминалось в исходном вопросе.

Я не думаю, что проблема заключается в модуле JS и его перенаправлениях, поскольку у нас также есть проблемы с другими настраиваемыми путями меню Drupal, которые обрабатываются ядром и файлом .htaccess по умолчанию.

Может быть, проблема в обработчике Apache php-fpm?

Наконец, мне удалось решить проблему.

mod_evasive по какой-то причине блокировал некоторые запросы, хотя мы используем ту же конфигурацию, что и с Apache 2.2, похоже, что он обрабатывает X-Forwarded-For иначе, чем Apache 2.2 с mod_extract_forwarder, и поэтому обнаруживает некоторые из наши асинхронные запросы как DDOS.

Чтобы убедиться, что это проблема, я использовал ab -n 100 -c 5 -p payload.txt -T 'application/x-www-form-urlencoded' https://www.example.com/js/mycallback и сразу же увидел ошибки в нашем журнале ошибок, и после отключения mod_evasive они остановились.

Мы закончили тем, что полностью отключили mod_evasive (у нас есть WAF с защитой от DDOS перед нашими приложениями, так что в любом случае это не так важно для нас).

Пока не могу комментировать, но вы используете не php-fpm, а mod_php, так как у вас нет обработчика в обоих виртуальных хостах, и я не думаю, что Apache будет счастлив включить поддержку HTTP2 без обработчика.

<FilesMatch "\.php$">
    <If "-f %{REQUEST_FILENAME}">
        SetHandler "proxy:unix:/run/php-fpm/whatever.sock|fcgi://localhost/"
    </If>
</FilesMatch>

Вам нужно будет изменить этот /run/php-fpm/whatever.sock в файл sock, который вы настроили в своем пуле php-fpm, или изменить localhost / part на localhost: port /, используя правильный порт (опять же, настроенный в пул php-fpm)