当前位置: 首页 > 知识库问答 >
问题:

Nginx配置将站点直接传递到带有上下文的tomcat webapp

华俊弼
2023-03-14

如何将Nginx设置为example.com到本地运行的Tomcatwebapp的反向代理,而不破坏PageContext

存在一个tomcat 7 webappblah,它与.war文件一起部署,位于/var/lib/tomcat7/webapps/blah/中。

Tomcat在本地运行,可以通过http://127.0.0.1:8080访问。多个webapp正在运行,可以在以下站点访问:

    null

端口8080在外部被防火墙阻塞。

Nginx作为网守在服务器上运行。一个站点可以访问上面提到的所有本地tomcat WebApp。这适用于example.com:

server {
listen  80; 
server_name example.com;
root /var/lib/tomcat/webapps/ROOT/;

  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://127.0.0.1:8080/;
  }
}

/etc/nginx/sites-enabled/下,设置了一个附加的站点文件,以便将http://blah.com路由到http://127.0.1:8080/blah/

server {
  listen  80; 
  server_name blah.com *.blah.com;
  root /var/lib/tomcat/webapps/blah/;

  location / { 
    proxy_set_header X-Forwarded-Host   $host;
    proxy_set_header X-Real-IP          $remote_addr;  
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
    proxy_pass                          http://127.0.0.1:8080/blah/;
  }
}

此设置将额外的blah添加到上下文路径,创建404页,因为路径/blah/blah/不存在,这是有意义的。在nginx中是否有一种简单的方法可以将blah.com传递给webapp根目录?

在webapp中,我使用${pageContext.request.contextPath}/path作为webapp资源的相对路径。我认为这是处理内部tomcat路径的正确方法,但这可能是问题的一部分吗?我相信这就是为什么我在路由中获得额外的blah,创建404页面。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta http-equiv="refresh" content="0; url=${pageContext.request.contextPath}/form">
  <script type="text/javascript">
    window.location.href = "${pageContext.request.contextPath}/form"
  </script>
  <title>Load BLAH</title>
</head>
<body>
  <p>If you are not redirected automatically, follow this <a href="${pageContext.request.contextPath}/form">link</a>.</p>
</body>
</html>

这个页面被点击了,但是重定向到/blah/blah/form,而不是servlet实际存在的/blah/form

显然,这是针对nginx新手的,但请帮助我(以及未来的新手)清除这个问题,因为我无法找到明确的解决方案,而且nginx文档也使用该帮助。

共有1个答案

姜羽
2023-03-14

一个可能的解决方案是在Tomcat中创建虚拟主机,并将blah设置为新主机上的root应用程序。Nginx将仍然传递请求到localhost上的tomcat,包括请求的主机头,tomcat将使用正确的上下文处理其余的请求。

>

  • $catalina_home/conf/server.xml引擎部分添加主机

    <Engine name="Catalina" defaultHost="localhost">
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
      </Host>
      <Host name="blah.com" appBase="blahApps" 
          unpackWARS="true" autoDeploy="true">
          <Alias>www.blah.com</Alias>
      </Host>
    </Engine>
    

    创建appbase目录$catalina_home/blahapps/

    <Context path="/" 
        antiResourceLocking="false" />
    
    server {
      listen  80; 
      server_name blah.com www.blah.com;
    
      location / { 
        proxy_pass                          http://127.0.0.1:8080/;
        proxy_set_header Host               $host;
        proxy_set_header X-Real-IP          $remote_addr;  
        proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
      }
    }
    

  •  类似资料:
    • 问题内容: 上周受本文启发,我正在重构我必须更明确地将上下文(数据库池,会话存储等)传递给处理程序的应用程序。 但是,我遇到的一个问题是,如果没有全局模板映射,我的自定义处理程序类型(要满足)上的方法将无法再访问该映射以呈现模板。 我需要保留全局变量,或者将我的自定义处理程序类型重新定义为结构。 有没有更好的方法来实现这一目标? func.go struct.go 有没有更干净的方法将实例传递给?

    • 本文向大家介绍Nginx 配置多站点vhost 的方法,包括了Nginx 配置多站点vhost 的方法的使用技巧和注意事项,需要的朋友参考一下 假设你想在Linux Nginx中用不同的域名访问不同的目录,这时就要配置多个vhost,具体配置如下,假设网站根目录设定在/var/www/ 1、在/var/www/下新建两个目录 2、编辑/etc/nginx/nginx.conf 3、在/etc/ng

    • 问题内容: 关于此问题,有什么方法可以将[文件从ASP.NET应用程序直接上传到Amazon S3并具有进度条? -—编辑---- 两天后,仍然没有直接的运气。发现了一件看起来很有前途但又不是免费的东西:http : //www.flajaxian.com/ 使用Flash通过进度条直接上传到S3。 问题答案: 我也在寻找解决方案。也许这会有所帮助, 来自AWS Dev Commnity, 但在许

    • 本文向大家介绍Nginx配置txt、pdf、doc、xls等文件直接下载的方法,包括了Nginx配置txt、pdf、doc、xls等文件直接下载的方法的使用技巧和注意事项,需要的朋友参考一下 使用Nginx时,如果要让一些附件比如 txt,pdf,doc等不直接在浏览器打开,而弹出另存为的对话框(也就是下载) 则可以在nginx的加上头配置如下: 如果客户端请求的文件以txt、pdf、doc、xl

    • 问题内容: tl; dr: 有人知道如何在不设置PATH环境变量的情况下,以代码形式将chromedriver的路径传递给selenium- webdriver吗? 我正在尝试将selenium-webdriver与chrome一起使用,但宁愿不实际安装chromedriver并操纵路径。我有以下代码: 在路径中未设置chromedriver的情况下,将引发错误: 我不想设置路径,所以我从npm安

    • 我用Android将图像上传到Firebase存储。我有一个应用程序,它可以在抓拍照片后立即发送图像。 但我想创建一个应用程序,在发送前在ImageView中显示照片。我想在照片下面写一些文字,然后把它们都上传。 我应该使用哪些工具来执行此操作?我要从存储器下载毕加索。但我无法管理如何在捕获照片后显示ImageView,然后编写一些文本(如名称或描述)并将其发送给Firebase。第二个挑战是如何