Apache 2.4 上的服务器配置拒绝客户端

Apache 2.4 上的服务器配置拒绝客户端

我们已将多个 Drupal 7 / 8 站点迁移到新堆栈,其中主要的变化是用 Apache 2.4 和 PHP-FPM 替换 Apache 2.2 和 FastCGI。

我们的多个站点都出现以下错误:

[2018 年 10 月 19 日星期五 09:06:26.333135] [:error] [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 路由(D7 上的 hook_menu)定义的其他路径上。

这是虚拟主机文件:

<VirtualHost *:80>
 ServerName example.com
 ServerAlias www.example.com
 ServerAdmin [email protected]
 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 [email protected]
 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/htmlforOrder以及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 文件- 我们使用常规Drupal 7 .htaccess 文件修改如下: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 模块及其重定向是问题所在,因为我们还遇到了由核心和默认 .htaccess 文件处理的其他自定义 Drupal 菜单路径的问题。

也许问题出在 php-fpm Apache 的处理程序上?

答案1

最后,我终于解决了这个问题。

由于某种原因,mod_evasive 阻止了某些请求,尽管我们使用与 Apache 2.2 相同的配置,但它处理 X-Forwarded-For 的方式似乎与带有 mod_extract_forwarder 的 Apache 2.2 不同,因此将我们的某些异步请求检测为 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(我们的应用程序前面有带有 DDOS 保护的 WAF,所以这对我们来说并不那么重要)。

答案2

尚无法评论,但您没有使用 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 更改为您在 php-fpm 池中设置的 sock 文件,或者使用正确的端口将 localhost/ 部分更改为 localhost:port/(再次在 php-fpm 池中配置)

相关内容