Nginx作为tomcat子目录的代理

我想为我的域名如Tomcat服务器设置一个Nginx代理服务器

example.com/demo/sample example.com/demo/manager example.com/demo/other_apps ... 

这是我的Nginx server blockconfiguration

 server { listen 80; server_name example.com; location /demo/ { 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_set_header Host $host; proxy_pass http://IP_ADD_TOMCAT_SERVER:8080/; } location ~ /\.ht { deny all; } ## Only allow these request methods ## if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 444; } ## Do not accept DELETE, SEARCH and other methods ## } 

我在这里遇到了两个问题:

第一个问题

如果TOM_CAT_INSTALL_DIR/webapps/sample/包含一个静态页面hello.jsp ,它适用于URL:

example.com/demo/app1/

但不适用于URL:

example.com/demo/app1

为什么我必须在URL的末尾添加一个尾部的斜杠/以使nginx代理工作?


第二个问题

如果TOM_CAT_INSTALL_DIR/webapps/manager包含一个dynamic网页的index.jsp文件,它不适用于URL

example.com/demo/manager/

URL变成

example.com/manager / ….

后面跟着一长串参数。

如果我手动添加/demo/string到Web浏览器的URL,它再次工作。

我应该如何使nginx代理与子目录/demo/

更新:我发现tomcatpipe理器子目录丢失的重写问题是在index.jsp文件中, request.getContextPath()不会自动将/ demo / subdirecotry添加到URL中。 看来我们必须手动修改.jsp文件的代码。

如果您不知道如何修改jsp代码,您可以在Nginx中使用下面的代码来解决这个问题

 # Must add the trailing '/' for both location and proxy_pass location /demo/ { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_pass http://TOM_CAT_SERVER_IP_ADDR:8080/; } # ONLY work for manager apps, for other apps, # You must add more rewrite rules like the below location /manager/ { rewrite ^/(.*)$ /demo/$1 last; } 

我想你在你的configuration设置中增加了一些东西…

看这条线:

 proxy_pass http://IP_ADD_TOMCAT_SERVER:8080/; 

你需要删除后面的斜杠,它应该工作正常。

喜欢这个:

 proxy_pass http://IP_ADD_TOMCAT_SERVER:8080; 

试试看,看看事情是否正常!

更新#1我刚刚注意到,你有另一个错误“相同的错字”在您的location /

删除第二斜线,它应该工作正常!

像这样: location /demo {而不是这个location /demo/ {

更新#1:你可以使用这个testing你的url

 $ curl -I http://yoururl.com 

看看结果会给你什么 这样你就知道它是否工作。

更新#3:

您使用任何.jsp扩展名的设置应该在您的虚拟主机中有这样的代码:

 location ~ \.jsp$ { proxy_pass http://localhost:8080; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; } 

也得到/demo工作,你需要添加重写代码下面的server_name example.com

 rewrite ^/(.*)$ /demo/$1;