Вопрос или проблема
У меня есть небольшой скрипт на Python для сбора результатов домашнего задания и онлайн-занятий студентов из таблицы allstudentsAnswers20BE.
Он отлично работает на моей старой веб-странице общего хостинга.
На новом облачном сервере Ubuntu 20.04 у меня возникает ошибка “connection refused”.
У меня нет опыта работы с облачным сервером.
Я разрешил порты 33060 и 3306 в UFW.
Мой IP дома не фиксированный.
Когда я запускаю свой скрипт на Python, я получаю эту ошибку при попытке подключения к облачному серверу:
pymysql.err.OperationalError: (1130, “183.206.16.30′ is not allowed to
connect to this MySQL server”)
netstat показывает, что mysqld прослушивает порты 33060 и 3306, поэтому я разрешил оба в брандмауэре ufw.
Подключаясь к облачному серверу через ssh, я выполнил:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Я изменил строку bind-address на 0.0.0.0 (я также пробовал *)
Я перезапустил mysql: sudo systemctl restart mysql
Должно быть что-то еще, что нужно настроить на сервере.
Есть ли советы, что это может быть, пожалуйста, мне действительно нужно, чтобы это работало.
Я также получил эту информацию (предположим, мой облачный IP 123.456.789.123):
pedro@ebs-105422:~$ nc -v -w 2 123.456.789.123 3306
Connection to 123.456.789.123 3306 port [tcp/mysql] succeeded!
pedro@ebs-105422:~$
Это означает, что mysqld прослушивает на 3530? Или это PID mysqld?
pedro@ebs-105422:~$ sudo netstat -tap | grep mysql
tcp 0 0 0.0.0.0:mysql 0.0.0.0:* LISTEN 3530/mysqld
tcp6 0 0 [::]:33060 [::]:* LISTEN 3530/mysqld
pedro@ebs-105422:~$
Ниже приведено из mysql на сервере, подтверждающее порт 3306
mysql> show variables where variable_name in (‘hostname’,’port’);
+—————+————+
| Variable_name | Value |
+—————+————+
| hostname | ebs-105422 |
| port | 3306 |
+—————+————+
2 rows in set (0.01 sec)mysql>
Я разобрался, этот ответ предназначен, чтобы помочь любому, у кого может быть та же проблема. Это, вероятно, не так безопасно, с открытым портом 3306, но a) у меня только домашнее задание, b) все равно нужны имя пользователя и пароль.
Когда вы создаете пользователя в mysql, это выглядит примерно так, также когда вы делаете это через ssh на сервере:
CREATE USER ‘peter’@’localhost’ IDENTIFIED BY ‘password’;
GRANT ALL PRIVILEGES ON some_db.* TO ‘peter’@’localhost’;
Если вы хотите удаленный доступ, вам нужно изменить данные пользователя (или создать нового пользователя):
RENAME USER ‘peter’@’localhost’ TO ‘peter’@’%’;
GRANT ALL ON somedb.* TO ‘peter’@’%’;
% здесь, очевидно, представляет любой IP
Затем также через ssh на сервере:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
найдите строку, содержащую
bind-address = 127.0.0.1
измените это на
bind-address = 0.0.0.0
ctrl X, чтобы выйти из nano
nano спрашивает, хотите ли вы сохранить, нажмите y, затем enter, чтобы сохранить в том же месте, где вы открыли /etc/mysql/mysql.conf.d/mysqld.cnf
Затем (на сервере):
sudo systemctl restart mysql
После этого мой скрипт на Python работал нормально из оболочки Idle:
def mysqlRemoteAttn(clas):
# Подключение к удаленной базе данных MySQL
conn = pymysql.connect(
host="123.456.789.123",
port=3306,
user="myusername",
password = 'mypassword',
db='allstudentsdb',
)
cur = conn.cursor()
sql = f"SELECT studentnr, attn_this_week FROM allstudents{clas}"
cur.execute(sql)
output = cur.fetchall()
# Закрытие соединения
conn.close()
return output
# Получение посещаемости с веб-страницы MySQL
results = mysqlRemoteAttn(clas)
Ответ или решение
Чтобы обеспечить удаленный доступ к MySQL на сервере под управлением Ubuntu 20.04, необходимо выполнить несколько важных шагов. Рассмотрим процесс подробно, чтобы избежать ошибок и убедиться, что ваш скрипт на Python сможет беспрепятственно подключиться к базе данных.
Шаг 1: Настройка конфигурации MySQL
-
Изменение конфигурации MySQL: Откройте файл конфигурации MySQL для редактирования. Используйте команду:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Найдите строку:
bind-address = 127.0.0.1
Измените её на:
bind-address = 0.0.0.0
Это позволит MySQL принимать подключения с любого IP-адреса. Завершите редактирование и сохраните изменения с помощью
Ctrl + X
, затемY
и нажмитеEnter
. -
Перезапуск службы MySQL:
После изменения конфигурации перезапустите MySQL, чтобы изменения вступили в силу:sudo systemctl restart mysql
Шаг 2: Настройка политики доступа MySQL
-
Создание или изменение учетной записи пользователя:
Откройте сессию MySQL, используя команду:mysql -u root -p
После входа создайте нового пользователя или измените существующего, чтобы он мог подключаться удаленно. Например, если пользователь ‘peter’, выполните:
RENAME USER 'peter'@'localhost' TO 'peter'@'%';
%
означает, что пользователь сможет подключаться с любого IP-адреса. -
Предоставление прав доступа пользователю:
Выдайте необходимые права пользователю:GRANT ALL PRIVILEGES ON some_db.* TO 'peter'@'%'; FLUSH PRIVILEGES;
Это обеспечит, что пользователь имеет необходимые привилегии для взаимодействия с базой данных.
Шаг 3: Настройка брандмауэра
- Проверка правил UFW:
Убедитесь, что порты 3306 и 33060 открыты в брандмауэре, чтобы обеспечить доступ к MySQL:sudo ufw allow 3306 sudo ufw allow 33060
Проверьте статус UFW командой:
sudo ufw status
Рекомендации по безопасности
Ваш домашний IP-адрес является динамическим, что может вызвать сложности с безопасностью. Рассмотрите возможность использования VPN или других средств для безопасного подключения. Вместо открытия всемирного доступа к MySQL, лучше минимизировать риск доступа, используя надежные политики доступа и обновления программного обеспечения безопасности.
Следуя этим шагам, ваш Python-скрипт должен успешно подключаться к базе данных MySQL на сервере Ubuntu 20.04. Если возникнут дополнительные вопросы, обратитесь к официальной документации MySQL либо проконсультируйтесь с квалифицированным специалистом для получения детальных разъяснений.