Nginx como proxy para o tomcat com subdiretório

1

Desejo configurar um proxy Nginx para o servidor Tomcat com o nome do meu domínio, como

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

Aqui está minha configuração Nginx server 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 ##

}

Encontrei 2 problemas aqui:

O primeiro problema :

se TOM_CAT_INSTALL_DIR/webapps/sample/ contiver uma página estática hello.jsp , funcionará com URL:

example.com/demo/app1/

mas não funciona com URL:

example.com/demo/app1

Por que devo adicionar uma barra no final / no final da URL para que o proxy nginx funcione?

O segundo problema :

Se TOM_CAT_INSTALL_DIR/webapps/manager contiver um arquivo index.jsp , que é uma página dinâmica, não funciona com URL

example.com/demo/manager/

O URL se torna

example.com/manager/....

Seguido por uma longa lista de parâmetros.

se eu adicionar manualmente /demo/ string ao URL do navegador da web, isso funcionará novamente.

Como devo fazer o proxy nginx funcionar com o subdiretório /demo/ ?

Atualização: Descobri que o problema de reescrita ausente para o subdiretório do gerenciador do tomcat é que, no arquivo index.jsp, o request.getContextPath() NÃO incluirá automaticamente / demo / subdirecotry na URL. Parece que temos que modificar manualmente o código do arquivo .jsp.

Se você não sabe como modificar o código jsp como eu, você pode contorná-lo usando o código abaixo em 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;
        }
    
por Xianlin 23.05.2014 / 08:13

1 resposta

2

Acho que você adicionou algo / extra em suas configurações de configuração ...

Veja esta linha:

proxy_pass http://IP_ADD_TOMCAT_SERVER:8080/;

você precisa remover a barra final e ela deve funcionar bem.

assim:

proxy_pass http://IP_ADD_TOMCAT_SERVER:8080;

experimente e veja se as coisas correm bem !!

Atualização # 1 Acabei de perceber que você tem outro erro "mesmo erro de digitação" no seu location /

remova a segunda barra e ela deve funcionar bem !!

assim: location /demo { em vez disso location /demo/ {

Atualização # 1: você pode testar seu URL usando este

$ curl -I http://yoururl.com

e veja o resultado que você recebe. dessa forma você sabe se está funcionando ou não.

Atualização 3:

sua configuração para trabalhar com qualquer extensão .jsp deve ter esse código em seu vhost:

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

também para que /demo funcione, você precisa adicionar o código de reescrita abaixo de server_name example.com

rewrite ^/(.*)$ /demo/$1;
    
por 23.05.2014 / 09:35