JBoss 作为 http 服务器?
Posted
技术标签:
【中文标题】JBoss 作为 http 服务器?【英文标题】:JBoss as an http server? 【发布时间】:2013-09-16 00:54:56 【问题描述】:我正在尝试编写一个 web 应用程序,其中服务器端仅提供 json/REST 服务,并且 gui 使用异步 XHR 以 html5、主干、木偶等编写。 html、js、css 等是静态的和可缓存的(部署到生产环境时)。
我需要将它部署到 JBoss EAP6(对于这个问题,大致相当于 AS7)。在开发过程中,我希望能够编辑我的 javascript 和 html 模板,并让结果立即在浏览器中可见。在生产中,我需要分解我的静态内容(前端),而不是部署在任何类型的 Java EE 结构中(因此,没有战争或耳朵(或 sar))。
所以,基本上,我需要像往常一样将战争部署到 jboss,并且我还需要 jboss 作为应用程序静态部分的 http 服务器。
我曾想过将我的内容复制到 EAP6 根目录下的welcome-content
目录中。虽然这可以毫无问题地提供内容,但我无法使用这种结构进行开发,因为我无法忍受将更改复制到不同目录的时间开销。我还在开发环境中尝试了从welcome-content
到我的静态内容的符号链接,但这在这个版本的 jboss 中不起作用。
编辑:我有一些答案告诉我如何解决这个问题,但我并没有真正陷入解决方法——这很容易。我真的在专门寻找如何配置 jboss 来提供静态内容。
TIA。
【问题讨论】:
这个问题主要是生产问题,而不是开发问题。 那么为什么不把所有的静态内容放在一个单独的战争中呢?就此而言,为什么 JBoss 完全提供静态内容?无论如何,我遇到的大多数生产环境在他们的应用服务器前面都有一个网络服务器(apache、nginx)。该网络服务器可用于提供(静态)网络内容 我目前正在处理爆炸战争中的内容,以便继续开发。然而,jboss 可以做静态内容的事情——它已经用它的welcome-content
目录做到了,我正在寻找具体如何配置 jboss 来做这件事。
我猜你会继续得到解决方法的建议,因为我(我敢说我们?)不明白为什么你有这个奇怪的要求
this 是您使用 Wildfly 的方式,但可能只是您无法在 AS7 中这样做。
【参考方案1】:
您可以像往常一样部署静态 html/css/js,并使用工具为您实时将更改注入 DOM。我现在正在使用grunt-contrib-watch 使用 GruntJS 进行此操作,并且效果很好。
【讨论】:
【参考方案2】:更新TL;DR
我想最初的问题在被问到 5 年多之后现在早就解决了。如果有人真的坚持使用 JBoss 作为静态文件 web 服务器,那么问题中提到的解决方案就是解决方案 - 使用 welcome-content
目录。使用 EAP6,您必须从 RedHat 获得有效的付费订阅才能在生产中使用它,以及他们的 knowledge base does provide the same answer。
由于不再是 2013 年,因此复制一堆静态文件确实不应该成为问题,并且大多数 IDE 都可以很好地处理这个问题(仅复制更改的文件等)。
对于从谷歌来到这里的其他人,恕我直言,为这项工作指出正确的工具并分离后端和前端部署更有益(顺便说一句,Nginx 早在 2013 年之前就已经可用,而 Apache 一直在这里,好吧,从永远 :) ) .
虽然可以通过 JBoss 托管您的静态 Web 资产,但它是对 Java Web 服务器的一种相当低效的使用。由于您的前端与您的 java 后端完全分离,为什么不将其部署到专用的 Web 服务器 - 例如 Nginx 或 Apache,这将大大提高效率并适合提供静态内容。(或者如果是带有 Undertow 的专用 Wildfly你必须)
如果您只有一个 JBoss 实例或更复杂的部署,您无需指定,但像您这样的用例的一个常见场景如下:
[Nginx server:80] <--> [JBoss server:8080]
- location / |- your-backend.war
root /path/to/frontend (web context /myapp/api)
- location /api
proxy_pass http://backend
前往Nginx documentation 了解更多信息。
使用专用网络服务器的优势:
您可以同时将其用作负载均衡器,只需添加更多 Jboss 实例,更新上游配置,您就有了可扩展的后端,耶 前端的部署只是将静态文件复制到相应文件夹 - 无需重新启动,您可以配置路径以适合您的文件夹结构。 Nginx(或配置良好的 Apache)可以轻松处理极端负载,它使用事件机制而不是线程,+ 你可以摆弄缓存策略等 您可以将 Java Web 服务器从提供静态 Web 资产的开销中解脱出来,并且可以对其进行调整以使其最擅长 - 为您的 Java Web 服务提供服务 您可以使用不同的主机名部署多个 Web 前端或多个项目,因此您可以在同一物理服务器上托管应用程序的开发和测试版本,并将它们绑定到例如 https://dev.myapp.com 和 https://test.myapp.com 您可以使用 Web 服务器进行 SSL 卸载 - 再次减轻您的 JBoss 应用服务器处理 SSL 的负担。【讨论】:
我不是故意惹怒你的:)我已经更新了答案。 好的,我已经删除了我原来的评论,因为它不合适,对不起。但是,我仍然强调您正在回答错误的问题(大部分答案)。链接到 jboss 之后的所有内容都是意见而非事实,并且适用性有限。堆栈溢出积极地试图阻止两者。这个问题不需要关于nginx的深入教程。【参考方案3】:JBoss EAP 7.x 更新
为了补充 Zach Lysobey 的回答,JBoss EAP 7.x 让 Undertow 强调了 https/2 服务器。因此,它具有自己的属性,并具有以下基本属性:
<subsystem xmlns="urn:jboss:domain:undertow:1.0">
<buffer-caches>
<buffer-cache name="default" buffer-size="1024" buffers-per-region="1024" max-regions="10"/>
</buffer-caches>
<server name="default-server">
<http-listener name="default" socket-binding="http" />
<host name="default-host" alias="localhost">
<location name="/" handler="welcome-content" />
</host>
</server>
<servlet-container name="default" default-buffer-cache="default" stack-trace-on-error="local-only" >
<jsp-config/>
<persistent-sessions/>
</servlet-container>
<handlers>
<file name="welcome-content" path="$jboss.home.dir/welcome-content" directory-listing="true"/>
</handlers>
</subsystem>
参考:Undertow.io
Cli 命令
因此,您可以使用 CLI 命令和 subsystem=undertow 更改属性:
/subsystem=undertow/server=default-server/http-listener=default:write-attribute(name=url-charset,value="utf-8")
Undertow 中的静态内容
另一个question 描述了类似的情况,官方文档描述了用于提供静态文件的文件处理程序。
Cli 命令创建文件处理程序:
/subsystem=undertow/configuration=handler/file=new-file-handler:add(path="$jboss.home.dir/welcome-content")
【讨论】:
以上是关于JBoss 作为 http 服务器?的主要内容,如果未能解决你的问题,请参考以下文章
使用Javassist对字节码操作为JBoss实现动态"AOP"框架
在 Wildfly/Jboss 中部署 ear 期间如何防止 HTTP 404
Angular 2 应用程序部署在 JBOSS 6.4 eap 上,Java 服务作为后端