当前位置

弃用.htaccess改用httpd.conf设置Apache

James Qi 在 2021年5月13日 - 11:44 提交

我们使用的MediaWiki和Drupal都支持LAMP架构,安装包中都带有一个默认的.htaccess来支持Apache的设置,我们虽然以前也看过文章建议有服务器完整权限的用户不要用.htaccess而是使用httpd.conf,但为了修改.htaccess随时生效就偷懒没有把.htaccess中的设置迁移到httpd.conf中。

最近把几台国外服务器从8核CPU、16G内存升级为12核高主频CPU、48G内存,在花钱添置硬件性能的同时,也考虑到通过其它软件的办法来让网站访问更快,找了几篇文章:

另外找了点资料,一次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对这个文件内容的解析。

自由标签:

添加新评论

Plain text

  • 不允许使用HTML标签。
  • 自动将网址与电子邮件地址转变为链接。
  • 自动断行和分段。