前两天想放一份pdf的文档到测试服务器上供别人下载,由于公司采用的是apache + 应用服务器的方式来做部署的。之前由于采用的是apache + mod_jk + jboss的部署方案,服务器上的配置基本都是按照这种方式来配置的,后来升级过一次,采用了apache + mod_proxy + jetty的方式进行部署。以为这种方式与之前的方式,只是从中间代理至后端应用服务器有变动,不会影响之前的apache的配置。因为按照之前的配置,静态文件放在htdocs目录下,直接可以供外部用户进行访问。但试了一把,死活不可以,一直报404无法找到文件的错误。后来反复研究httpd.conf文件的配置,终于找到了问题源,是因为配置的代理,将所有请求均指向了后端应用服务器,那即使有些用户只是想访问静态资源,也会被代理至后端jetty服务器。即使在上面配置好了静态资源存放的路径,仍无法访问静态资源文件。现将解决问题的思路梳理一下。
httpd.conf :apache的全局配置文件,在其中可以配置线程数、虚拟服务器地址、反向代理、域名及url跳转规则等等。如果你无法访问静态资源文件,首先就要看该文件中的配置是否正确。
问题一:配置访问路径时,在Directory目录下进行了配置,且服务启动完全正常,但通过外部访问时,总是报403错误。
查了一下error_log日志,结果里面有一条错误日志,如下:
[Mon Feb 27 20:12:262012] [error] [client 10.19.16.17] Symbolic link not allowed or link target notaccessible: /usr/alibaba/httpd
后经排查是由于其中的Options参数设置的问题,Options参数设置问题,修改如下:
<Directory /> Options None AllowOverride None </Directory> <Directory"/usr/alibaba/httpd/htdocs"> Options None AllowOverride None Order allow,deny Allow from all </Directory>
修改后的配置如下所示:
<Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory"/usr/alibaba/httpd/htdocs"> Options Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory>
问题二:apache服务单独启动时,htdocs中的静态资源可以访问,但当它和jetty同时启动时,结果服务器一切正常,但浏览器总报404找不到该资源。感觉超诡异,郁闷了半天。后来反复查看httpd.conf配置文件,在最后发现有这样的一个配置:
<IfModule mod_proxy.c> ProxyRequests Off ProxyPreserveHost On <Directory proxy:*> Order allow,deny Allow from all </Directory> ProxyPassMatch ^/(.*)$ http://localhost:9000 min=5 smax=16 ttl=600timeout=30 </IfModule>
该段配置表明已经开启了代理的功能,将只要是用户请求/下的所有请求均发送到应用服务器去做处理。问题就出在了这里,本来只对某些目录下的访问才需要到应用服务器,其它的可通过静态服务器处理掉。结果按这种方式的话,即使需要处理的静态资源也被发往了后端应用服务器,造成不必要的资源浪费。
修改配置如下:
<IfModule mod_proxy.c> ProxyRequests Off ProxyPreserveHost On <Directory proxy:*> Order allow,deny Allow from all </Directory> ProxyPassMatch ^(edison)/(.*)$ http://localhost:9000 min=5 smax=16ttl=600 timeout=30 </IfModule>
修改完后,重启apache及jetty服务器,一切访问正常。问题得以解决。
从上述问题可以看出,采用apache + mod_jk + jboss的配置与采用apache + mod_proxy+ jetty的配置虽然大部分类似,但mod_proxy中具有代理和反向代理的配置,尤其在配置这些地方时需要当心。