Há uma situação em que você precisa corrigir um caso complexo em uma máquina remota, mas o acesso ao servidor é apenas sob VPN com restrições nas portas abertas. No artigo, quero compartilhar com meus colegas uma pequena "discussão" sobre o tópico de depuração remota via SSH sob VPN para economizar um tempo valioso na instalação. Considero a missão cumprida se este homem for útil a alguém.
SpoilerO servidor foi implantado no Ubuntu, respectivamente, além disso, todas as configurações do servidor estarão no Ubuntu. Na máquina local - Mac, mas aqui só precisamos do cliente SSH e do IDE com um depurador para xdebug, portanto as configurações são relativamente universais.
Introdutório
Portanto, há um servidor remoto atrás de um circuito protegido. No servidor na janela de encaixe, um microsserviço com o xdebug ativado. Há acesso externo apenas via SSH e via VPN.
Finalidade
Objetivo: iniciar a depuração remota de um microsserviço localmente através do xdebug.
Vamos lá ...
1. Configure o sshd em um servidor remoto
A primeira coisa que você deve prestar atenção é que você precisa configurar o sshd no servidor para permitir que você aceite conexões de qualquer IP, não apenas o 127.0.0.1. Por padrão, esta opção está desativada.
É aqui que a raiz é necessária. Vamos assumir que você o possui :-)
sudo echo "GatewayPorts yes" >> /etc/ssh/sshd_config sudo service ssh restart
2. Descubra o endereço da máquina host na rede docker
Como o
xdebug é executado no docker e se conecta à máquina local (e, no meu caso, esse IP não resolve, porque é uma conexão VPN), é útil conhecer o IP do computador host na rede do docker. Isso pode ser feito usando o comando (executado no servidor):
ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+'
Suponha que a equipe tenha emitido "172.17.0.1"
3. Registramos o IP do host remoto nas configurações do xdebug no contêiner
Um exemplo de substituição através do sed, mas você também pode usar canetas no editor, para quem é mais conveniente:
sed -i 's/xdebug.remote_host=.*/xdebug.remote_host=172.17.0.1/' /usr/local/etc/php/conf.d/xdebug.ini
Sem sair da caixa registradora, prescrevemos a porta "correta" para depuração. No meu caso, o microsserviço é gerado em um monte de nginx e php-fpm e,
normalmente, a porta 9000 está ocupada em php-fpm e, portanto, uso a porta 9001 para depuração.
sed -i 's/xdebug.remote_port=.*/xdebug.remote_port=9001/' /usr/local/etc/php/conf.d/xdebug.ini
Vale a pena verificar aqui que a depuração remota está, em princípio, ativada: "xdebug.remote_enable = 1"
grep xdebug.remote_enable /usr/local/etc/php/conf.d/xdebug.ini
Normalmente, essas configurações são conectadas ao Dockerfile ou montadas via volume.
Tudo está pronto no servidor. Agora somos transferidos para a máquina local para construir um túnel.4. Encaminhe o túnel SSH para o servidor remoto
O túnel é gerado pelo comando (executado na máquina local):
SSH -R 9001:0.0.0.0:9001 user@remote_server
Nesse lugar, música mágica soa. A configuração principal é concluída, somente o ambiente de depuração.
Configuração do IDE
Normalmente, eu uso o vscode, para que o depurador pela porta seja iniciado sem problemas. Vou dar um exemplo de uma configuração para vscode (basta adicionar um nó ao launch.json):
{ "name": "Listen for XDebug", "type": "php", "request": "launch", "port": 9001, "cwd": "${workspaceFolder}", "pathMappings": { "/repo": "${workspaceRoot}" } },
“PathMappings” é a regra para mapear diretórios das máquinas local e remota, em que “/ repo” é o diretório com o código depurado na janela de encaixe. O depurador precisa poder navegar pelos arquivos e pontos de interrupção.
PS Bem, mais potente?
Execute o netcat na máquina local e ouça:
nc -l 9001
Execute o script de linha única na janela de encaixe e imprima:
php -r 'print("Hi!" . PHP_EOL);'
Na máquina local, devemos ver os indicativos xdebug:
<?xml version="1.0" encoding="iso-8859-1"?> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug"...
Viva! Está tudo pronto.
Agora você pode depurar seu código favorito na máquina remota no IDE. Há um óbvio menos no método descrito: reconfiguração do sshd no servidor. Talvez exista uma maneira mais "silenciosa". De qualquer forma, terei prazer em seus comentários e sugestões.
Obrigado pela atenção!