Es gibt eine Situation, in der Sie einen komplexen Fall auf einem Remotecomputer beheben müssen, der Zugriff auf den Server jedoch nur über VPN mit Einschränkungen für offene Ports erfolgt. In dem Artikel möchte ich meinen Kollegen eine kleine „Diskussion“ zum Thema Remote-Debugging über SSH unter VPN geben, um wertvolle Zeit bei der Einrichtung zu sparen. Ich halte die Mission für erfüllt, wenn dieser Mann jemandem nützlich ist.
SpoilerDer Server wurde jeweils für Ubuntu bereitgestellt, außerdem befinden sich alle Servereinstellungen unter Ubuntu. Auf dem lokalen Computer - Mac, aber hier benötigen wir nur den SSH-Client und die IDE mit einem Debugger für xdebug, daher sind die Einstellungen relativ universell.
Einführung
Es gibt also einen Remote-Server hinter einem geschützten Schaltkreis. Auf dem Server im Docker wurde ein Microservice mit aktiviertem xdebug aktiviert. Der Zugriff von außen erfolgt nur über SSH und über VPN.
Zweck
Zweck: Starten des Remote-Debuggens eines Mikrodienstes lokal über xdebug.
Lass uns gehen ...
1. Konfigurieren Sie sshd auf einem Remote-Server
Das erste, worauf Sie achten sollten, ist, dass Sie sshd auf dem Server so konfigurieren müssen, dass Sie Verbindungen von jeder IP-Adresse akzeptieren können, nicht nur von 127.0.0.1. Standardmäßig ist diese Option deaktiviert.
Hier wird root benötigt. Wir gehen davon aus, dass Sie es haben :-)
sudo echo "GatewayPorts yes" >> /etc/ssh/sshd_config sudo service ssh restart
2. Ermitteln Sie die Adresse des Hostcomputers im Docker-Netzwerk
Da
xdebug im Docker ausgeführt wird und sich mit dem lokalen Computer verbindet (und in meinem Fall diese IP nicht aufgelöst wird, da es sich um eine VPN-Verbindung handelt), ist es hilfreich, die IP des Hostcomputers im Docker-Netzwerk zu ermitteln. Dies kann mit dem Befehl (auf dem Server ausführen) erfolgen:
ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+'
Angenommen, das Team hat "172.17.0.1" ausgegeben.
3. Wir registrieren die IP des Remote-Hosts in den xdebug-Einstellungen im Container
Ein Beispiel für einen Ersatz durch sed, aber Sie können auch Stifte im Editor verwenden, wie Sie es bevorzugen:
sed -i 's/xdebug.remote_host=.*/xdebug.remote_host=172.17.0.1/' /usr/local/etc/php/conf.d/xdebug.ini
Ohne von der Registrierkasse abzuweichen, schreiben wir den "richtigen" Port für das Debuggen vor. In meinem Fall wird der Microservice auf einer Reihe von nginx & php-fpm ausgelöst, und
normalerweise ist Port 9000 unter php-fpm belegt . Daher verwende ich Port 9001 zum Debuggen.
sed -i 's/xdebug.remote_port=.*/xdebug.remote_port=9001/' /usr/local/etc/php/conf.d/xdebug.ini
Hier sollte überprüft werden, ob das Remote-Debugging grundsätzlich aktiviert ist: "xdebug.remote_enable = 1"
grep xdebug.remote_enable /usr/local/etc/php/conf.d/xdebug.ini
In der Regel werden diese Einstellungen mit der Docker-Datei verbunden oder über das Volume bereitgestellt.
Auf dem Server ist alles fertig. Jetzt werden wir zum lokalen Computer übertragen, um einen Tunnel zu bauen.4. Leiten Sie den SSH-Tunnel an den Remote-Server weiter
Der Tunnel wird durch den Befehl ausgelöst (auf dem lokalen Computer ausgeführt):
SSH -R 9001:0.0.0.0:9001 user@remote_server
An diesem Ort klingt magische Musik. Das Haupt-Setup ist fertig, dann nur die Debugging-Umgebung.
IDE-Setup
Normalerweise verwende ich vscode, sodass der Debugger über Port Listening problemlos startet. Ich werde ein Beispiel für eine Konfiguration für vscode geben (fügen Sie einfach einen Knoten zu launch.json hinzu):
{ "name": "Listen for XDebug", "type": "php", "request": "launch", "port": 9001, "cwd": "${workspaceFolder}", "pathMappings": { "/repo": "${workspaceRoot}" } },
"PathMappings" ist die Regel für die Zuordnung von Verzeichnissen der lokalen und Remote-Computer, wobei "/ repo" das Verzeichnis mit dem debuggten Code im Docker ist. Der Debugger muss in der Lage sein, durch die Dateien und Haltepunkte zu navigieren.
PS Nun, Potest?
Führen Sie den Netcat auf dem lokalen Computer aus und hören Sie zu:
nc -l 9001
Führen Sie das einzeilige Skript im Docker aus und drucken Sie:
php -r 'print("Hi!" . PHP_EOL);'
Auf dem lokalen Computer sollten die Rufzeichen xdebug angezeigt werden:
<?xml version="1.0" encoding="iso-8859-1"?> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug"...
Hurra! Alles ist fertig.
Jetzt können Sie Ihren Lieblingscode auf dem Remote-Computer in der IDE debuggen. Bei der beschriebenen Methode gibt es ein offensichtliches Minus: die Neukonfiguration von sshd auf dem Server. Vielleicht gibt es einen „ruhigeren“ Weg. In jedem Fall freue ich mich über Ihre Kommentare und Vorschläge.
Vielen Dank für Ihre Aufmerksamkeit!