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