Я полагаю, что причина, по которой у меня (и, как я полагаю, у большинства людей) есть проблема с этим, заключается в том, что пользователь на сервере mysql разрешен только с «localhost», а не 127.0.0.1, IP-адрес локальный.
Я получил это на работу, выполнив следующие шаги:
Шаг 1: разрешить хост 127.0.0.1 для целевого пользователя
SSH обычно на вашем сервере и войдите в систему как пользователь root mysql, затем введите команду:
GRANT ALL ON yourdbname.* TO yourdbuser@127.0.0.1 IDENTIFIED BY 'yourdbpassword';
Ключ, конечно, указывает 127.0.0.1 выше.
Шаг 2: Запустите локальный SSH-туннель к MySQL
Теперь вы можете запустить локальный SSH-туннель к удаленному серверу MySQL, например:
ssh -vNg -L 33306:127.0.0.1:3306 sshuser@remotehost.com
-v
заставляет ssh работать в подробном режиме, который помогает увидеть, что происходит. Например, при попытке подключения вы увидите вывод отладочной информации, такой как эта, на консоли терминала:
debug1: client_input_global_request: rtype hostkeys-00@openssh.com want_reply 0
debug1: Connection to port 33306 forwarding to 127.0.0.1 port 3306 requested.
и выводить, когда вы закрываете соединение:
debug2: channel 2: is dead
debug2: channel 2: garbage collecting
debug1: channel 2: free: direct-tcpip: listening port 33306 for 127.0.0.1 port 3306, connect from 127.0.0.1 port 52112 to 127.0.0.1 port 33306, nchannels 3
-N
заставляет ssh не выдавать команды, а просто подождать после установления соединения.
-g
позволяет удаленным хостам подключаться к локальным перенаправленным портам. Не совсем уверен, если это необходимо, но это может быть полезно для мультиплексирования нескольких соединений через один туннель SSH.
-L
Это основной параметр, который указывает локальный порт 33306
для подключения к локальному IP-адресу удаленного хоста 127.0.0.1
и порт mysql удаленного хоста, обычно 3306
.
Вы можете использовать любые механизмы / другие параметры, необходимые после этого для подключения через SSH к удаленному хосту. В моем случае я использую ключевые файлы, настроенные в моем ~/.ssh/config
, поэтому мне просто нужно указать user@host
, чтобы войти.
При вводе такой команды SSH запускается на переднем плане, поэтому я могу легко закрыть ее с помощью Ctrl + C
. Если вы хотите запустить этот туннель в фоновом режиме, вы можете добавить -f
, чтобы сделать это.
Шаг 3. Подключение из PHP / других совместимых с MySQL методов
SSH-туннель, запущенный сверху на вашем локальном хосте, будет вести себя точно так же, как если бы ваш mysql работал на 127.0.0.1
. Я использую порт 33306
(обратите внимание на тройку 3), который позволяет мне запускать мой локальный сервер sql на своем обычном порту. Теперь вы можете подключиться, как обычно. Команда mysql
на терминале выглядит следующим образом:
mysql -h 127.0.0.1 -P 33306 -u yourmysqluser -p
где -P
(заглавная P) указывает порт, к которому локальный конец вашего SSH-туннеля принимает соединения. Важно использовать 127.0.0.1
IP-адрес вместо localhost
, потому что mysql cli попытается использовать сокет linux для подключения.
Для строк подключения PHP моя строка имени источника данных (для моей конфигурации Yii2) выглядит следующим образом:
'dsn' => 'mysql:host=127.0.0.1;dbname=yourdbname;port=33306',
Пароли и имена пользователей указываются как обычно.