Apache 2.4 上的伺服器配置拒絕客戶端
我們已將多個 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/html
forOrder
和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 的處理程序上?
最後,我設法解決了這個問題。
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,所以這對我們來說並不重要)。