Il existe une situation où vous devez résoudre un cas complexe sur une machine distante, mais l'accès au serveur est uniquement sous VPN avec des restrictions sur les ports ouverts. Dans l'article, je veux partager avec mes collègues une petite «discussion» sur le sujet du débogage à distance via SSH sous VPN afin de gagner un temps précieux sur la configuration. Je considère la mission accomplie si cet homme est utile à quelqu'un.
SpoilerLe serveur a été déployé sur Ubuntu, respectivement, de plus tous les paramètres du serveur seront sous Ubuntu. Sur la machine locale - Mac, mais ici, nous n'avons besoin que du client SSH et de l'EDI avec un débogueur pour xdebug, donc les paramètres sont relativement universels.
Introduction
Il y a donc un serveur distant derrière un circuit protégé. Sur le serveur dans le docker, un microservice avec xdebug activé. Il n'y a accès de l'extérieur que via SSH et via VPN.
But
Objectif: démarrer localement le débogage distant d'un microservice via xdebug.
Allons-y ...
1. Configurer sshd sur un serveur distant
La première chose à laquelle vous devez faire attention est que vous devez configurer sshd sur le serveur afin qu'il vous permette d'accepter les connexions de n'importe quelle IP, pas seulement 127.0.0.1. Par défaut, cette option est désactivée.
C'est là que root est nécessaire. Nous supposerons que vous l'avez :-)
sudo echo "GatewayPorts yes" >> /etc/ssh/sshd_config sudo service ssh restart
2. Trouvez l'adresse de la machine hôte dans le réseau docker
Étant donné que
xdebug s'exécute dans Docker et se connecte à la machine locale (et dans mon cas, cette IP ne se résout pas, car il s'agit d'une connexion VPN), il est utile de connaître l'IP de la machine hôte sur le réseau Docker. Cela peut être fait en utilisant la commande (exécutée sur le serveur):
ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+'
Supposons que l'équipe ait émis "172.17.0.1"
3. Nous enregistrons l'IP de l'hôte distant dans les paramètres xdebug du conteneur
Un exemple de remplacement via sed, mais vous pouvez également utiliser des stylos dans l'éditeur, pour qui c'est plus pratique:
sed -i 's/xdebug.remote_host=.*/xdebug.remote_host=172.17.0.1/' /usr/local/etc/php/conf.d/xdebug.ini
Sans sortir de la caisse enregistreuse, nous prescrivons le port "correct" pour le débogage. Dans mon cas, le microservice est déclenché sur un tas de nginx & php-fpm et
généralement le port 9000 est occupé sous php-fpm , et donc j'utilise le port 9001 pour le débogage.
sed -i 's/xdebug.remote_port=.*/xdebug.remote_port=9001/' /usr/local/etc/php/conf.d/xdebug.ini
Il vaut la peine de vérifier ici que le débogage à distance est, en principe, activé: "xdebug.remote_enable = 1"
grep xdebug.remote_enable /usr/local/etc/php/conf.d/xdebug.ini
En règle générale, ces paramètres sont câblés au Dockerfile ou montés via le volume.
Tout est prêt sur le serveur. Nous sommes maintenant transférés sur la machine locale pour construire un tunnel.4. Transférer le tunnel SSH au serveur distant
Le tunnel est levé par la commande (exécuté sur la machine locale):
SSH -R 9001:0.0.0.0:9001 user@remote_server
Dans ce lieu, la musique magique sonne. La configuration principale est terminée, puis uniquement l'environnement de débogage.
Configuration IDE
Habituellement, j'utilise vscode, donc le débogueur via l'écoute de port démarre sans problème. Je vais donner un exemple de configuration pour vscode (ajoutez simplement un noeud à launch.json):
{ "name": "Listen for XDebug", "type": "php", "request": "launch", "port": 9001, "cwd": "${workspaceFolder}", "pathMappings": { "/repo": "${workspaceRoot}" } },
«PathMappings» est la règle de mappage des répertoires des machines locales et distantes, où «/ repo» est le répertoire avec le code débogué dans le menu fixe. Le débogueur doit pouvoir naviguer dans les fichiers et les points d'arrêt.
PS Eh bien, le plus puissant?
Exécutez le netcat sur la machine locale et écoutez:
nc -l 9001
Exécutez le script sur une seule ligne dans le menu fixe et imprimez:
php -r 'print("Hi!" . PHP_EOL);'
Sur la machine locale, nous devrions voir les indicatifs d'appel xdebug:
<?xml version="1.0" encoding="iso-8859-1"?> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug"...
Hourra! Tout est prêt.
Vous pouvez maintenant déboguer votre code préféré sur la machine distante dans l'IDE. Il y a un inconvénient évident dans la méthode décrite: reconfiguration de sshd sur le serveur. Peut-être existe-t-il un moyen plus «silencieux». En tout cas, je serai heureux de vos commentaires et suggestions.
Merci de votre attention!