【问题标题】:Spring mvc tomcat application deploySpring mvc tomcat 应用部署
【发布时间】:2012-11-11 08:57:52
【问题描述】:

我有一个可以工作的 spring mvc 应用程序。我想让它可供测试用户查看。我已经购买了域名/设置名称服务器和所有 dns 的东西。

我通过这样的本地主机访问我的应用程序:

localhost:8080/myApp

但在现实世界中,我想像mydomain.com 一样访问它。所以我搜索了很多,发现人们将 nginx 推荐为“最快”的这些东西。所以安装了nginx,配置如下:

server {

  listen 80;

  server_name www.mydomain.com mydomain.com;
  location / {
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://localhost:8080;
    }

} #end server

问题:

当我访问mydomain.com 时,我会看到著名的tomcat 页面If you're seeing this page via a web browser, it means you've setup Tomcat successfully. Congratulations!

如果我手动转到mydomain.com/myApp,那么一切都会按预期进行。

问题:

我有没有办法配置它来执行以下操作:

当我在地址栏输入 mydomain.com 时,我会转到 mydomain.com/myApp

或者我在这种情况下完全关闭。有更简单的方法吗?

更新:

根据 fvu 的建议,当我将 ROOT 更改为其他目录然后将我的 up 部署到 ROOT 目录中时,我从 tomcat 得到 404:

type Status report

message

description The requested resource is not available.

我可以从服务器日志中检索到这个错误:

SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.util.Log4jConfigListener
java.lang.IllegalStateException: Web app root system property already set to different value: 'webapp.root' = [/tomcat_9090/webapps/myApp/] instead of [/tomcat_9090/webapps/ROOT
/] - Choose unique values for the 'webAppRootKey' context-param in your web.xml files!

更新二:

当我将配置更改为:

proxy_pass http://localhost:8080/myApp/;

该网站看起来可以正常工作,但实际上并没有。链接不起作用,css/js 无法加载。

【问题讨论】:

  • 最简单的方法是将您的应用安装为 Tomcat 中的根应用,as explained here
  • 重新更新:请参阅 stackoverflow.com/questions/5014651/webapproot-in-spring 了解有关此 Spring 相关问题的信息、解决方案和有用的指针
  • 另外,您可能没有取消部署您最初加载的应用程序(如/myApp)?我只会一直加载 1 个副本。
  • 谢谢你帮我运行它,我会把它作为备份解决方案(它不是很干净,你必须同意,但它有效)
  • 太棒了 :-) 同意,这不是可以想象的最干净的解决方案,但是将应用程序放在 servlet 容器的根目录中总是有点混乱......

标签: tomcat spring-mvc nginx


【解决方案1】:

如果您使用proxy_pass http://localhost:8080/myApp/; 配置 nginx,唯一的问题是如何创建链接和资源,以便它们使用预期的 base-url 路径,而不是默认的 Tomcat Servlet 路径。

如果您能够使用 Spring Framework 3.1+,则新的 Profiles 功能 可以帮助根据活动配置文件定义不同的 base-url,就像其他 Web 框架一样:路径将在runtime中决定,具体取决于服务器或环境。

例如,假设至少有 2 个属性文件(production.properties 和 dev.properties)在每个文件上声明了 baseurl 字段:

  • 生产.属性

    baseurl = //yourdomain.com
    
  • dev.properties

    baseurl = //localhost:8080/myApp
    

然后使用你最喜欢的 Spring 方式,为每个不同的环境加载属性,例如:

<util:properties id="properties" location="classpath:META-INF/default.properties" />
....
<beans profile="development">
    <util:properties id="properties" location="classpath:META-INF/dev.properties" />
</beans>

根据前面的要求,您可以在任何 JSP 模板页面中定义 base 标签

<spring:eval expression="@properties['baseurl']" var="baseurl" />

<base href="${baseurl}/" />

最后你可以将所有链接和资源声明为相对路径

<link rel="stylesheet" href="css/app.css">
<script src="js/libs/jquery-1.7.1.min.js"></script>
<a href="">Home</a>
<a href="about">About</a>
...

如果由于任何原因您在使用 base 标记时遇到问题,您也可以使用 ${baseurl} 声明每个链接:&lt;link rel="stylesheet" href="${baseurl}/css/app.css"&gt;

使用此解决方案,每台服务器都将拥有各自的活动配置文件,并且所有链接和资源都在运行时更新,正如预期的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-24
    • 2018-03-28
    • 2020-04-17
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多