加快Tomcat 6中的图像

时间:2020-03-06 14:29:40  来源:igfitidea点击:

在tomcat 6中,我有一个运行openbluedragon的servlet,所有内容都会编译并快速运行,除了图像外,它们确实滞后了很多。对图片投放有任何建议优化吗?

这是我的server.xml:

<Service name="Catalina">

      <Connector port="8009" protocol="AJP/1.3" />
      <Connector port="8080" maxThreads="100" protocol="HTTP/1.1" connectionTimeout="20000" />
      <Engine name="Standalone" defaultHost="hostname.whatever" jvmRoute="ajp13">

      <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
      <Host name="hostname.whatever"  appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
        ...context
      </Host>

    </Engine>
  </Service>

解决方案

如果可以选择,则可以在应用程序之前添加反向代理。在工作中,我有一个Apache Web服务器,可以接收所有入站HTTP连接。基于URL,它可以将请求转发到另一台服务器,也可以提供内容本身。我已经使用这种方法来加速为Trac网站提供静态内容。 ProxyPass和ProxyPassReverse伪指令是我们开始寻找是否走这条路的好地方。

举一个简单的例子,如果我们有一个名为/ images的虚拟目录,Apache可以处理对该目录中某些内容的任何请求,并将其他所有内容转发到Tomcat实例。语法非常全面。如果完全没有任何方法可以识别静态内容,那么这将是可行的方法。

Apache不是这里的唯一选择。我认为所有现代Web服务器都包含类似的功能。如果我今天开始,我可能会改用LigHTTPd,因为它做的更少。

甚至可能还有缓存反向代理,它们会自动为我们解决。我对它们中的任何一个都不熟悉。

另一种选择是使用apache作为前端,将tomcat与mod_jk连接。这样,我们可以让apache提供静态内容(例如图片,css,javascript),并让tomcat生成动态内容。可能需要做一些工作来将静态内容与动态内容分开,但是对我来说非常有用。

在Unix上,使用Apache作为前端是一个不错的选择,因为绑定到端口80时,我们通常被迫以root用户身份运行。 Apache知道绑定端口后如何放弃root权限,而Tomcat则不知道。我们不希望面向公众的服务器以root身份运行。

(这类似于反向代理答案,但不涉及代理,而是mod_jk)

我们是否一遍又一遍地提供相同的图像集?在那种情况下,添加一个添加合理的Expires标头的servlet过滤器可能会节省tomcat的大量工作。这样做不会提高投放图片的速度,只会减少需要处理的请求数量。网上有很多例子。