29

tl;博士版

如何在不nginx破坏? example.com_tomcathttp://127.0.0.1:8080/blah/pageContext


Tomcat 设置

存在一个tomcat 7 webapp,blah部署了一个.war文件并位于/var/lib/tomcat7/webapps/blah/.

tomcat在本地运行并可在http://127.0.0.1:8080. 多个 webapps 正在运行,可以在以下位置访问:

  • 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 webapps。这适用于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.comhttp://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}/pathwebapp 资源的相对路径。我认为这是处理内部 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而不是/blah/formservlet 实际存在的位置。


我还尝试了其他方法,包括指向blah.comtomcat 根本身。这在某种意义上是有效的,你可以blah通过,blah.com/blah/但这并不是我们真正想要的。

此外,仍然能够blah通过example.com/blah/.

显然,这是为nginx新手准备的,但请帮助我(和未来的新手)解决这个问题,因为我无法找到明确的解决方案,并且nginx文档也使用了帮助。

4

4 回答 4

39

一种可能的解决方案是在其中创建一个虚拟主机tomcat并将其设置blahROOT新主机上的应用程序。nginx将仍然传递请求到tomcat本地主机,包括请求的主机头,tomcat 将使用正确的上下文处理其余部分。

设置虚拟主机

  1. 向部分添加Host条目Engine$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>
    
  2. 创建appBase目录$CATALINA_HOME/blahApps/

  3. 配置context$CATALINA_HOME/blahApps/ROOT/META-INF/context.xml

    <Context path="/" 
        antiResourceLocking="false" />
    
  4. 部署blah$CATALINA_HOME/blahApps/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;
  }
}
于 2013-11-12T05:50:36.587 回答
5

为我工作:

环境:

  • 亚马逊AWS
  • Ubuntu 14.04 TLS / 64 位
  • Nginx
  • 雄猫 7
  • 甲骨文 JDK 1.7

脚步:

1)安装Oracle JDK

http://www.webupd8.org/2012/01/install-oracle-java-jdk-7-in-ubuntu-via.html

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.2) 创建我的站点文件夹并提取我的上下文

3.3) 添加这一行来设置 my_site:

server {
   listen   80;
   server_name my_site;
   #
   access_log /my_site_log/access-timed-combined.log timed_combined;
   error_log  /my_site_log/error.log;
   #
   root   /my_site_folder;
   index  index.html index.jsp;
   #
   location @MyContext {
      sendfile off;
      proxy_pass         http://127.0.0.1:8080;
      proxy_redirect     default;

      proxy_set_header   Host             $host;
      proxy_set_header   X-Real-IP        $remote_addr;
      proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
      proxy_max_temp_file_size 0;

      #this is the maximum upload size
      client_max_body_size       10m;
      client_body_buffer_size    128k;

      proxy_connect_timeout      90;
      proxy_send_timeout         90;
      proxy_read_timeout         90;

      proxy_buffer_size          4k;
      proxy_buffers              4 32k;
      proxy_busy_buffers_size    64k;
      proxy_temp_file_write_size 64k;
   }
   #
   location ~ "^/MyContext/*" {
      try_files $uri @MyContext;
   }
}

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
于 2015-01-11T01:19:11.140 回答
0

我可以通过一些修改来解决同样的问题,所以我留下记录。我使用 Ubuntu 14.04,我用sudo apt-get install tomcat7.

我已经有一个用 lein(clojure 应用程序)生成的 war-demo.war 文件,并从 tomcat 的管理器 webapp 安装(加载)。战争被复制到/usr/lib/tomcat7

为nginx制作conf文件

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;
    }
}

修改server.xml中/var/lib/tomcat7/conf

<Host name="clojure2.example.com" appBase="wardemo"                                                                   
    unpackWARS="true" autoDeploy="true">                                                                               
</Host> 

复制战争文件

  1. 在 `/var/lib/tomcat7 中创建一个 wardemo 目录
  2. 将wardemo目录下的war-demo.war复制为ROOT.war

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

于 2015-11-12T00:48:37.580 回答
0

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

1)为应用程序创建虚拟主机。您需要将 HOST 添加到 /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>

2) 将您的应用程序放到 /var/lib/tomcat7 的“webapps”文件夹中

3)启动tomcat - 之后您将能够在本地访问您的应用程序进入yourapp.com:8080(假设tomcat不在80端口上工作,因为该端口 - 80 - 正在被NGINX监听,所以需要端口)

3)转到Nginx配置并放置以下行

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;
 }
}

4)重启NGINX

于 2016-02-19T14:09:44.420 回答