apache + mod_proxy + jetty无法访问静态资源的问题

Posted zhaozheng7758

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了apache + mod_proxy + jetty无法访问静态资源的问题相关的知识,希望对你有一定的参考价值。

前两天想放一份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中具有代理和反向代理的配置,尤其在配置这些地方时需要当心。

以上是关于apache + mod_proxy + jetty无法访问静态资源的问题的主要内容,如果未能解决你的问题,请参考以下文章

为Apache启用mod_proxy做正向代理反向代理

Apache 使用 mod_proxy 和大文件返回 502 Bad Gateway

Apache反向代理Tomcat(mod_proxy方式)

apache tomcat + apache httpd + mod_proxy + mod_rewrite + 表单发布数据

在 apache http 服务器上设置 mod_proxy

在 apache http 服务器上设置 mod_proxy