Apache + mod_proxy + Jetty无法访问静态资源的问题

jinhonglu 2012-02-29

前两天想放一份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参数设置问题,修改如下:

  1. <Directory />  
  2.     Options None  
  3.     AllowOverride None  
  4. </Directory>  
  5. <Directory"/usr/alibaba/httpd/htdocs">  
  6.     Options None  
  7.     AllowOverride None  
  8.     Order allow,deny  
  9.     Allow from all  
  10. </Directory>  

修改后的配置如下所示:

  1. <Directory />  
  2.     Options FollowSymLinks  
  3.     AllowOverride None  
  4. </Directory>  
  5. <Directory"/usr/alibaba/httpd/htdocs">  
  6.     Options Indexes FollowSymLinks  
  7.     AllowOverride None  
  8.     Order allow,deny  
  9.     Allow from all  
  10. </Directory>  

问题二:apache服务单独启动时,htdocs中的静态资源可以访问,但当它和jetty同时启动时,结果服务器一切正常,但浏览器总报404找不到该资源。感觉超诡异,郁闷了半天。后来反复查看httpd.conf配置文件,在最后发现有这样的一个配置:

  1. <IfModule mod_proxy.c>  
  2.    ProxyRequests Off  
  3.    ProxyPreserveHost On  
  4.    <Directory proxy:*>  
  5.        Order allow,deny  
  6.        Allow from all  
  7.    </Directory>  
  8.        ProxyPassMatch ^/(.*)$ http://localhost:9000 min=5 smax=16 ttl=600timeout=30  
  9. </IfModule>  

修改配置如下:

  1. <IfModule mod_proxy.c>  
  2.    ProxyRequests Off  
  3.    ProxyPreserveHost On  
  4.    <Directory proxy:*>  
  5.        Order allow,deny  
  6.        Allow from all  
  7.    </Directory>  
  8.        ProxyPassMatch ^(edison)/(.*)$ http://localhost:9000 min=5 smax=16ttl=600 timeout=30  
  9. </IfModule>  

修改完后,重启apache及jetty服务器,一切访问正常。问题得以解决。

从上述问题可以看出,采用apache + mod_jk + jboss的配置与采用apache + mod_proxy+ jetty的配置虽然大部分类似,但mod_proxy中具有代理和反向代理的配置,尤其在配置这些地方时需要当心。

相关推荐