我们使用的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对这个文件内容的解析。
评论