Nginx配置将站点直接通过上下文传递给tomcat webapp tl;dr版本

Nginx配置将站点直接通过上下文传递给tomcat webapp tl;dr版本,nginx,tomcat7,Nginx,Tomcat7,如何将nginx设置为example.com的反向代理,以在http://127.0.0.1:8080/blah/而不中断页面上下文 Tomcat设置 存在一个webapp,blah,与.war文件一起部署,位于/var/lib/tomcat7/webapps/blah/中 tomcat正在本地运行,可在http://127.0.0.1:8080。多个Web应用程序正在运行,可在以下位置访问: http://127.0.0.1:8080/blah/ http://127.0.0.1:8080

如何将
nginx
设置为
example.com
的反向代理,以在
http://127.0.0.1:8080/blah/
而不中断
页面上下文


Tomcat设置 存在一个webapp,
blah
,与
.war
文件一起部署,位于
/var/lib/tomcat7/webapps/blah/

tomcat
正在本地运行,可在
http://127.0.0.1:8080
。多个Web应用程序正在运行,可在以下位置访问:

  • http://127.0.0.1:8080/blah/
  • http://127.0.0.1:8080/foo/
  • http://127.0.0.1:8080/bar/
端口
8080
被防火墙从外部阻止

Nginx设置
nginx
作为网守在服务器上运行。一个站点可以访问上面提到的所有本地tomcat Web应用程序。对于
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/;
  }
}
问题:如何配置其他站点以直接访问
blah
? 在
/etc/nginx/sites enabled/
下,将设置一个额外的站点文件来路由
http://blah.com
http://127.0.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>

window.location.href=“${pageContext.request.contextPath}/form”
装载废话
如果没有自动重定向,请遵循以下步骤

该页面点击正常,但重定向到
/blah/blah/form
而不是实际存在servlet的
/blah/form


我还尝试了其他方法,包括将
blah.com
指向tomcat根目录本身。从某种意义上说,您可以通过
blah.com/blah/
访问
blah
,但这并不是我们真正想要的

此外,仍然可以通过
example.com/blah/
访问
blah
,这是完全可以接受的(也是需要的)


显然,这是针对
nginx
新手的,但请帮助我(以及未来的新手)澄清这一点,因为我无法找到清晰的解决方案,
nginx
文档也使用帮助。

一个可能的解决方案是在
tomcat
并将
blah
设置为新主机上的
ROOT
应用程序
nginx
将仍然向本地主机上的
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>
    
    <Context path="/" 
        antiResourceLocking="false" />
    
  • blah
    部署到
    $CATALINA_HOME/blahaps/ROOT
    。这可能很简单,只需将
    blah.war
    更改为
    ROOT.war

  • 确保
    nginx
    仍处于激活状态 只需将
    blah.com
    的代理请求发送到localhost和
    tomcat
    即可完成其余任务:

    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;
      }
    }
    
    这是我的工作:

    环境:

    • 亚马逊AWS
    • Ubuntu 14.04 TLS/64位
    • Nginx
    • 雄猫7
    • OracleJDK1.7
    步骤:

    1) 安装Oracle JDK

    2) 智能安装tomcat7

    3) 配置我的上下文 3.1)-在/etc/tomcat7/Catalina/localhost中添加mi_context_file.xml

    <Context path="/MyContext" docBase="local_path_to_my_context_files" privileged="true" reloadable="true">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    
    3.4)重新启动nginx和tomcat7。如果您的上下文没有启动,请进入Tomcat7管理器并检查tomcat日志,或者从tomcat管理器url重新启动您的上下文

    3.5)在tomcat应用程序上下文中输入:

    http://yoursite/MiContext
    
    4) Nginx参考资料:

    Running Jenkins behind Nginx
    https://wiki.jenkins-ci.org/display/JENKINS/Running+Jenkins+behind+Nginx
    
    Load Balancing Apache Tomcat with nginx
    http://blogs.mulesoft.org/load-balancing-apache-tomcat-with-nginx/
    
    Nginx + Apache Tomcat Configuration Example
    http://www.mkyong.com/nginx/nginx-apache-tomcat-configuration-example/
    
    Configuring Nginx for Apache Tomcat 7
    http://blog.rezajp.info/posts/configuring-nginx-for-apache-tomcat-7/
    
    Install Tomcat with Nginx on Ubuntu 13.04 (Server)
    http://www.laurii.info/2013/10/install-tomcat-nginx-ubuntu-server-13-04/
    
    Nginx - Java servers like Jetty, GlassFish and Tomcat
    http://wiki.nginx.org/JavaServers
    
    Nginx - JavaHandler
    http://wiki.nginx.org/JavaHandler
    
    Virtual Host + Nginx + Tomcat
    http://www.javacodegeeks.com/2013/02/virtual-host-nginx-tomcat.html
    

    我可以通过一些修改来解决同样的问题,所以我留下了记录。 我使用Ubuntu14.04,安装tomcat时使用了
    sudo-apt-get-install-tomcat7

    我已经有了一个由lein(clojure应用程序)生成的war-demo.war文件,并从tomcat的ManagerWebApp安装(加载)。战争是在
    /usr/lib/tomcat7
    中复制的

    为nginx生成conf文件 在
    /var/lib/tomcat7/conf
    
    
    复制war文件
  • 在`/var/lib/tomcat7中创建wardemo目录
  • 将wardemo目录中的war-demo.war复制为ROOT.war

  • 就这样,我不需要其他配置。在
    /var/lib/tomcat7/conf/Catalina
    中,我们有clojure2.example.com目录。我可以在目录中添加更多的配置

    我的调整方式:与其他类似,但有一些不同 系统-Ububtu 14.04

    1) 为应用程序创建虚拟主机。您需要将主机添加到/etc/tomcat7中的server.xml中

        <Host name="yourapp.com" appBase="webapps/yourapp" unpackWars="true" autoDeploy="true">
              <Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="virtual_log." suffix=".txt" timestamp="true" />
               <Context path="" docBase="path to your war" debug="0" reloadable="true" />
             <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="virtual_log." suffix=".txt" pattern="common" />
      </Host>
    

    4) 重新启动NGINX

    根目录在NGINX的默认文件中应该是什么样子。另外,如何在blahaps/ROOT/中部署ROOT.war,我可以问一下最后一部分
    server{…}
    放在哪里吗?
    server {
        listen  80; 
        server_name clojure2.example.com;
    
        location / { 
            proxy_pass                          http://127.0.0.1:8008/;
            proxy_set_header Host               $host;
            proxy_set_header X-Real-IP          $remote_addr;  
            proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
        }
    }
    
    <Host name="clojure2.example.com" appBase="wardemo"                                                                   
        unpackWARS="true" autoDeploy="true">                                                                               
    </Host> 
    
        <Host name="yourapp.com" appBase="webapps/yourapp" unpackWars="true" autoDeploy="true">
              <Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="virtual_log." suffix=".txt" timestamp="true" />
               <Context path="" docBase="path to your war" debug="0" reloadable="true" />
             <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="virtual_log." suffix=".txt" pattern="common" />
      </Host>
    
    server {
      listen  80; 
      server_name yourapp.com;
      root            /var/lib/tomcat7/webapps/yourapp
    
     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;
     }
    }
    
    server {
      listen  80; 
      server_name rootapp.com; # this is app that is ROOT
      root            /var/lib/tomcat7/webapps
    
     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;
     }
    }