Nginx 作为带有子目录的 tomcat 的代理

Nginx 作为带有子目录的 tomcat 的代理

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

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

这是我的 Nginxserver block配置

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包含index.jsp动态网页文件,则无法使用 URL 进行工作

example.com/demo/manager/

URL 变为

例如.com/manager/....

接下来是一长串参数。

如果我手动将/demo/字符串添加到 Web 浏览器 URL,它就会再次起作用。

我应该如何让 nginx 代理与子目录一起工作/demo/

更新:我发现 tomcat 管理器子目录缺少重写问题是在 index.jsp 文件中,不会request.getContextPath()自动将 /demo/ 子目录添加到 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;
        }

答案1

我认为您/在配置设置中添加了一些额外的东西......

看看这一行:

proxy_pass http://IP_ADD_TOMCAT_SERVER:8080/;

您需要删除尾随的斜杠,它就可以正常工作。

像这样:

proxy_pass http://IP_ADD_TOMCAT_SERVER:8080;

尝试一下,看看是否顺利!!

更新#1我刚刚注意到你的另一个错误是“同样的拼写错误”location /

删除第二个斜线就可以正常工作了!!

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

更新 #1:你可以用这个测试你的网址

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

答案2

我的情况 http://localhost:8080/demo 第一页可以正常工作,但是图像和其他组件无法从服务器获取因此我添加了以下映射

server {
    listen       80;
    listen       [::]:80;
    server_name  www.example.org example.org;

    #remove /demo if it come to URI otherwise it add two time for call proxy
    rewrite ^/demo(.*)$ $1;
    rewrite ^/(.*)$ /demo/$1;

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

相关内容