如何在不nginx
的情况下example.com
将tomcat
设置为http://127.0.0.1:8080/blah/
的本地正在运行的pageContext
网络应用的反向代理?
存在tomcat 7网络应用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
作为网守在服务器上运行。一个站点可以访问上面提到的所有本地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.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>
此页面已被点击,但重定向转到/blah/blah/form
而不是/blah/form
,其中servlet实际存在。
我还尝试过其他方法,包括将blah.com
指向tomcat根目录。从某种意义上说,这可以通过blah
转到blah.com/blah/
,但这并不是我们想要的。
此外,仍然可以通过blah
访问example.com/blah/
完全可以接受(并且需要)。
显然,这是针对nginx
新手的,但是帮助我(以及未来的新手)清楚了解这一点,因为明确的解决方案让我不知所措,nginx
文档也使用了帮助。
答案 0 :(得分:32)
一种可能的解决方案是在tomcat
内 create a virtual host ,并将blah
设置为新主机上的ROOT
应用。 nginx
会将仍然传递请求传递给localhost上的tomcat
,包括请求的主机头,tomcat将使用正确的上下文处理其余的请求。
在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>
创建appBase
目录$CATALINA_HOME/blahApps/
使用context
$CATALINA_HOME/blahApps/ROOT/META-INF/context.xml
<Context path="/"
antiResourceLocking="false" />
将blah
部署到$CATALINA_HOME/blahApps/ROOT
。这可能就像将blah.war
更改为ROOT.war
。
nginx
仍然是copacetic 只需将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;
}
}
答案 1 :(得分:5)
这项工作对我来说:
环境:
步骤:
1)安装Oracle JDK
http://www.webupd8.org/2012/01/install-oracle-java-jdk-7-in-ubuntu-via.html
2)aptitude安装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
答案 2 :(得分:0)
我可以通过一些修改解决同样的问题,所以我留下了记录。
我使用Ubuntu 14.04,我用sudo apt-get install tomcat7
安装了tomcat。
我已经有一个用lein(clojure应用程序)生成的war-demo.war文件,并从tomcat的管理器webapp安装(加载)。战争复制在/usr/lib/tomcat7
。
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;
}
}
/var/lib/tomcat7/conf
<Host name="clojure2.example.com" appBase="wardemo"
unpackWARS="true" autoDeploy="true">
</Host>
就是这样,我不需要其他配置。在/var/lib/tomcat7/conf/Catalina
中,我们有clojure2.example.com目录。我可以在目录中添加更多配置。
答案 3 :(得分: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