Apache-2.2

Apache 2.4 上的伺服器配置拒絕客戶端

  • April 30, 2022

我們已將多個 Drupal 7 / 8 站點遷移到一個新堆棧,其中主要更改是用 Apache 2.4 和 PHP-FPM 替換 Apache 2.2 和 FastCGI。

我們在多個站點上出現以下錯誤:

$$ Fri Oct 19 09:06:26.333135 2018 $$ $$ :error $$ $$ pid 6415:tid 140550690748160 $$ $$ client 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 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/htmlforOrderAllow/ 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 的處理程序上?

最後,我設法解決了這個問題。

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,所以這對我們來說並不重要)。

引用自:https://serverfault.com/questions/936267