我們使用的MediaWiki和Drupal都支持LAMP架構,安裝包中都帶有一個默認的.htaccess來支持Apache的設置,我們雖然以前也看過文章建議有服務器完整權限的用戶不要用.htaccess而是使用httpd.conf,但為了修改.htaccess随時生效就偷懶沒有把.htaccess中的設置遷移到httpd.conf中。
最近把幾台國外服務器從8核CPU、16G内存升級為12核高主頻CPU、48G内存,在花錢添置硬件性能的同時,也考慮到通過其它軟件的辦法來讓網站訪問更快,找了幾篇文章:
- Apache英文官方文檔:When (not) to use .htaccess files
- 翻譯成中文的文檔:《Apache中為什麼不使用.htaccess文件?》
- 一篇英文博客:Stop using .htaccess files! No, really.
另外找了點資料,一次SSD固态硬盤的随機訪問速度大約在0.1ms左右(4k随機讀取速度在40MB/s左右時),一個html頁面中可能包含多個圖片、css、js,然後每個連接都去訪問多次SSD下不同目錄的.htaccess,所以一個html頁面的訪問花在硬盤.htaccess查找和讀取的時間可能是在大約0.1 * 10 * 5 = 5ms左右,這隻是我自己的估算,網上暫時沒有找到更權威的評測數據。
雖然幾毫秒在一次訪問中所占比例不大,但如果一台服務器上每天的訪問量達到百萬、千萬級别的話,也還是對性能稍有影響的。于是決定還是棄用.htaccess改用httpd.conf來設置Apache。
先從我自己的博客開始改起,以前的.htaccess内容分離了一部分放在80端口的http訪問虛拟主機中,修改httpd-vhost.conf(注意,這裡的httpd-vhost.conf和後面的httpd-ssl.conf都是在httpd.conf中使用Include語句引用的):
<VirtualHost *:80>
ServerName jamesqi.com
ServerAlias m.jamesqi.com
ServerAdmin webmaster@jamesqi.com
DocumentRoot /xxx/www/jamesqi.com/
<Directory /xxx/www/jamesqi.com/>
# 2021-5-12 注釋掉 # AllowOverride All
AllowOverride None
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule "^.well-known/acme-challenge" - [L]
RewriteRule "(^|/)\." - [F]
# Rewrite from http to https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
</Directory>
</VirtualHost>
這裡AllowOverride改為了None後,.htaccess就不起作用了,保留了.htaccess中SSL驗證和http跳轉的設置在這裡。
再修改httpd-ssl.conf中443端口https訪問的設置:
<VirtualHost _default_:443>
# General setup for the virtual host
DocumentRoot "/xxx/www/jamesqi.com"
ServerName jamesqi.com
ServerAlias m.jamesqi.com
ServerAdmin webmaster@jamesqi.com
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
SSLCertificateFile "/yyy/jamesqi.com/cert.pem"
SSLCertificateKeyFile "/yyy/jamesqi.com/privkey.pem"
SSLCertificateChainFile "/yyy/jamesqi.com/fullchain.pem"
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/xxx/www/jamesqi.com">
SSLOptions +StdEnvVars
# 2021-5-12 #AllowOverride All
AllowOverride None
Include conf/extra/htaccess/jamesqi.com.htaccess
</Directory>
這是用Include再引入一個文件jamesqi.com.htaccess,以免https-ssl.conf文件太長,而jamesqi.com.htaccess實際上就是以前放在jamesqi.com/下的.htaccess,再感覺别的文章中說的,修改一點點:
# Pass all requests not referring directly to files in the filesystem to
# index.php. Clean URLs are handled in drupal_environment_initialize().
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^ /index.php [L]
上面紅色的斜杠/是新加的,我自己測試沒有加也是可以的,沒有遇到報錯,不過還是根據其它文檔做了修改,也許以後還會修改其它類似的地方。
把.htaccess廢棄改用httpd.conf文件最大的好處是在性能上,每次用戶訪問可以少了很多磁盤訪問的過程,另外還有一點好處:Drupal升級的時候不需要複制以前的.htaccess文件到新版本目錄了。
補充:https://stackoverflow.com/questions/25063677/how-much-does-using-htaccess-files-slow-down-website-performance-especially-wit
這篇問答中有人說:1500行的.htaccess影響12ms,3000行的.htaccess影響25-35ms,我上面的估算5ms隻考慮了磁盤讀取,沒有考慮apache對這個文件内容的解析。
评论