Tenho tentado fazer o nginx fazer o proxy reverso gacamole, mas não tive muito sucesso. Para isso, nos últimos dias, tenho seguido vários howto's descrevendo como instalar o nginx, o guacamole e configurar o nginx para fazer o proxy da porta Tomcat 8080. Tenho a sensação de que estou quase lá, mas simplesmente não consigo fazer o último passo...
Em uma máquina Ubuntu 22.04.05 LTS, instalei o nginx e o Tomcat9 prontos para uso. Em seguida, apaguei o arquivo /etc/nginx/sites-available/default, removi o symlink para esse arquivo em /etc/nginx/sites-enabled e reiniciei o nginx.
Então eu instalei o guacamole (1.55, guacd e o webapp no tomcat). Depois de ter feito isso, eu posso chegar ao webapp de outra máquina usando http://nginx-handbook.test:8080/guacamole . Então, o guacamole funciona.
Agora, para a parte do proxy: criei um arquivo guacamole.conf em /etc/nginx/conf.d com o seguinte conteúdo:
server {
listen 80;
server_name nginx-handbook.test;
access_log /var/log/nginx/guac_access.log;
error_log /var/log/nginx/guac_error.log;
location = / {
proxy_pass http://127.0.0.1:8080/guacamole;
proxy_buffering off;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
client_max_body_size 1g;
access_log off;
}
}
Reiniciei o nginx e tentei acessar o guacamole de outro servidor usando http://nginx-handbook.test/ , mas estou recebendo um erro 404.
Eu sei que o proxy funciona (mais ou menos), porque minhas ações estão sendo registradas nos logs do proxy:
(guac_access.log)
192.168.56.1 - - [11/Sep/2024:16:07:38 +0000] "GET /guacamole/ HTTP/1.1" 404 197 "-"
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/128.0.0.0 Safari/537.36"
192.168.56.1 - - [11/Sep/2024:16:07:40 +0000] "GET /guacamole/ HTTP/1.1" 404 197 "-"
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/128.0.0.0 Safari/537.36"
(guac_error.log)
2024/09/11 16:07:38 [error] 29619#29619: *1
"/usr/share/nginx/html/guacamole/index.html" is not found (2: No such file or
directory), client: 192.168.56.1, server: nginx-handbook.test, request: "GET
/guacamole/ HTTP/1.1", host: "nginx-handbook.test"
2024/09/11 16:07:40 [error] 29619#29619: *1
"/usr/share/nginx/html/guacamole/index.html" is not found (2: No such file or
directory), client: 192.168.56.1, server: nginx-handbook.test, request: "GET
/guacamole/ HTTP/1.1", host: "nginx-handbook.test"
Embora o erro seja bem claro (nginx está procurando por guacamole em /usr/share/nginx/html), não entendi muito bem. Esperava redirecionar para a porta 8080 e deixar o Tomcat fazer o resto.
A raiz /usr/share/nginx/html não está definida em nenhum dos outros arquivos de configuração do nginx.
Devo definir a diretiva root para apontar para /var/lib/tomcat/webapps ? Isso não foi documentado em nenhum lugar nos howto's que vi.
Qualquer ajuda seria muito apreciada.
Com sua configuração, quando você faz uma solicitação para
http://nginx-handbook.test/
, ela aparece no backend (tomcat) como:(Isso é de
/var/log/tomcat9/localhost_access_log*txt
.)Isso retorna a seguinte resposta ao navegador:
Então agora seu navegador busca
http://nginx-handbook.test/guacamole/
, o que resulta em:E, notavelmente, essa solicitação não aparece no log de acesso do Tomcat. Isso porque você está usando
=
em sualocation
diretiva:O
=
meio "somente corresponde a este bloco quando a solicitação for para/
, e para nada mais ". Isso significa que uma solicitação para qualquer coisa diferente dehttp://nginx-handbook.text/
não será enviada por proxy para o backend e resultará em mensagens como esta em/var/log/nginx/guac_error.log
:A solução é remover o
=
:Esse é um problema resolvido! Mas agora, uma solicitação para
http://nginx-handbook.test/guacamole/
resulta na seguinte solicitação no log de acesso do Tomcat:O que?
Isso ocorre porque você precisa terminar o caminho de destino na sua
proxy_pass
diretiva com um/
:Agora, uma solicitação
http://nginx-handbook.test/
resulta na seguinte solicitação no log de acesso do Tomcat:Note que isso não resulta mais em um redirecionamento, porque estamos solicitando
/guacamole/
(que é onde o guacamole está hospedado), em vez de/quacamole
. Isso permite que tudo funcione, e o navegador carrega com sucesso a página de login do guacamole.