LINUX.ORG.RU

Обращение из CGI скрипта к MySQL не проходит... (SentOS 6)

 ,


2

1

Спокойно описываю ситуацию:

Я написал скрипт с помощью MySQL connector c++, который обращается к MySQL. Когда я запускаю его с консоли сервера SentOS. Все работает нормально.

Running 'SELECT 'Hello World!' AS _message'... ... MySQL replies: Hello World! ... MySQL says it again: Hello World!

А кода я вызываю его с удаленного компьютера, к примеру http://10.208.22.16/cgi-bin/test1

Он выдаёт: Running 'SELECT 'Hello World!' AS _message'... # ERR: SQLException in test1.cpp(main) on line 47 # ERR: Can't connect to MySQL server on '127.0.0.1' (13) (MySQL error code: 2003, SQLState: HY000 )

Если выключаю MySQL - картинка не меняется. Что-то не дает скрипту обратится к MySQL.

К примеру: http://sigmavet.ru/cgi-bin/test1 - На такой же SentOS - все работает

А на моём сервере (такой же SentOS) - такая же версия SentOS, Apache и MySQL. Хоть ты тресни не работает! Специально собирал, что бы отрабатывать скрипты дома, а на рабочий сервер только выкладывать результаты...

Хоть что-нибудь посоветуйте.... Всю голову сломал...

С уважением, Павел.

Прочтите, пожалуйста

http://dev.mysql.com/doc/refman/5.0/en/can-not-connect-to-server.html

И убедитесь что это не про ваш сервер (который не работает):

The error (2002) Can't connect to ... normally means that there is no MySQL server running on the system or that you are using an incorrect Unix socket file name or TCP/IP port number when trying to connect to the server. You should also check that the TCP/IP port you are using has not been blocked by a firewall or port blocking service.

znenyegvkby
()

SentOS

нет такой ОС

SQLException in test1.cpp(main) on line 47 # ERR: Can't connect to MySQL server on '127.0.0.1'

В указанной строке (47) есть установка параметров подключения к СУБД. Предполагаю, что скрипт в момент запуска через http://10.208.22.16/cgi-bin/test1 не может достучаться до 127.0.0.1. Или сервер Мускуля-таки не на 127.0.0.1 крутится (относительно скрипта).

bvn13 ★★★★★
()
Ответ на: комментарий от bvn13

Скрипт с консоли работает!

root@test:# netstat -nap | grep mysql tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 31911/mysqld

Вот исходник:

#include <stdlib.h> #include <iostream>

// Include directly the different // headers from cppconn/ and mysql_driver.h + mysql_util.h // (and mysql_connection.h). This will reduce your build time!

#include «mysql_connection.h» #include <cppconn/driver.h> #include <cppconn/exception.h> #include <cppconn/resultset.h> #include <cppconn/statement.h> using namespace std; int main(void) { cout << endl; cout << «Running 'SELECT 'Hello World!' AS _message'...» << endl; try { sql::Driver *driver; sql::Connection *con; sql::Statement *stmt; sql::ResultSet *res; // Create a connection

driver = get_driver_instance();

con = driver->connect(«tcp://127.0.0.1:3306», «root», «password»); // Connect to the MySQL test database con->setSchema(«test»); stmt = con->createStatement(); res = stmt->executeQuery(«SELECT 'Hello World!' AS _message»);

while (res->next()) { cout << «\t... MySQL replies: »; // Access column data by alias or column name cout << res->getString(«_message») << endl; cout << «\t... MySQL says it again: »; // Access column fata by numeric offset, 1 is the first column cout << res->getString(1) << endl; }

delete res; delete stmt; delete con;

} catch (sql::SQLException &e) { cout << «# ERR: SQLException in » << __FILE__; cout << "(" << __FUNCTION__ << ") on line " << __LINE__ << endl; cout << «# ERR: » << e.what(); cout << " (MySQL error code: " << e.getErrorCode(); cout << ", SQLState: " << e.getSQLState() << " )" << endl; } cout << endl; return EXIT_SUCCESS; }

paolo64
() автор топика
Ответ на: комментарий от paolo64

Показывайте тогда конфу мускула. Может быть у вас элементарный skip-networking. И что значит скрипт в консоле работает? Локальный запуск на той же машине? Дак локально мускул через сокет полезет, а тут вы хотите запустить с удаленного компа. P.S.: код выше не читабелен, отформатируйте, пожалуйста, с помощью lorcode.

znenyegvkby
()
Ответ на: комментарий от paolo64

А, блин

А кода я вызываю его с удаленного компьютера, к примеру http://10.208.22.16/cgi-bin/test1

Вот исходник:

con = driver->connect(«tcp://127.0.0.1:3306», «root», «password»);

Вы что, пытаетесь подключиться с компа на удаленный мускул сервер с помощью локального адреса?! Я что-то не верно понял, или ШТА?!

znenyegvkby
()
Ответ на: комментарий от znenyegvkby

[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0

[mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid

paolo64
() автор топика
Ответ на: комментарий от znenyegvkby

Ха! На этом элементе

con = driver->connect(«tcp://127.0.0.1:3306», «root», «password»);

работает очень большая система. Я просто хотел дома работать, а не на сервере в интернете....

paolo64
() автор топика
Ответ на: комментарий от paolo64

Ну так и следует базу дома развернуть себе тестовую!

bvn13 ★★★★★
()
Ответ на: комментарий от paolo64

#include <stdlib.h>

#include <iostream>

// Include directly the different

// headers from cppconn/ and mysql_driver.h + mysql_util.h

// (and mysql_connection.h). This will reduce your build time!

#include «mysql_connection.h»

#include <cppconn/driver.h>

#include <cppconn/exception.h>

#include <cppconn/resultset.h>

#include <cppconn/statement.h>

using namespace std;

int main(void)

{

cout << endl;

cout << «Running 'SELECT 'Hello World!' AS _message'...» <<

endl;

try {

sql::Driver *driver;

sql::Connection *con;

sql::Statement *stmt;

sql::ResultSet *res;

// Create a connection

driver = get_driver_instance();

con = driver->connect(«tcp://127.0.0.1:3306», «root», «1961164»);

// Connect to the MySQL test database

con->setSchema(«test»);

stmt = con->createStatement();

res = stmt->executeQuery(«SELECT 'Hello World!' AS _message»);

while (res->next()) {

cout << «\t... MySQL replies: »;

// Access column data by alias or column name

cout << res->getString(«_message») << endl;

cout << «\t... MySQL says it again: »;

// Access column fata by numeric offset, 1 is the first column

cout << res->getString(1) << endl;

}

delete res;

delete stmt;

delete con;

} catch (sql::SQLException &e) {

cout << «# ERR: SQLException in » << __FILE__;

cout << "(" << __FUNCTION__ << ") on line " << __LINE__ << endl;

cout << «# ERR: » << e.what();

cout << " (MySQL error code: " << e.getErrorCode();

cout << ", SQLState: " << e.getSQLState() << " )" << endl;

}

cout << endl;

return EXIT_SUCCESS;

}

paolo64
() автор топика
Ответ на: комментарий от paolo64

Перво-наверно, пожалуйста, прочтите описание разметки LORCODE

www.linux.org.ru/help/lorcode.md

И перед тем как отправить сообщение — хотя бы мельком посмотрите его с помощью функции «Предпросмотр».
Теперь далее:

Посмотрите: http://sigmavet.ru/cgi-bin/test1
Работает-же!

Вы же сами сказали в ОП, что это совсем другой сервер. М.б. там другая конфигурация. Телепатов в треде нет, к сожалению.
И последнее

datadir=/var/lib/mysql 
socket=/var/lib/mysql/mysql.sock 
user=mysql
log-error=/var/log/mysqld.log 
pid-file=/var/run/mysqld/mysqld.pid
Вы хотите сказать что это вся ваша конфигурация? Вы хотите открыть доступ к серверу mySQL из вне. Дак как хотя бы элементарное
bind-address  =  0.0.0.0

znenyegvkby
()
Ответ на: комментарий от bvn13

Это уже делал!
Этот метод дает возможность достучаться «вживую» до MySQL
А мне это надо!

Ведь ДВА года я работаю по этой схеме, решил облегчить себе работу, и на тебе.

Уже четверо суток бьюсь... И сносил систему и ...

paolo64
() автор топика
Ответ на: комментарий от paolo64

root@test:# netstat -nap | grep mysql tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 31911/mysqld

0.0.0.0:3306

А, все. Вижу.
В самом первом комментарии я вам привел цитату из доков MySQL. Вы сказали что к вам это не относится.

You should also check that the TCP/IP port you are using has not been blocked by a firewall or port blocking service.

Как вы это проверяли? Элементарный telnet-коннент к удаленной машине по 3306 что говорит?

telnet {ADDR_YOUR_SERVER} 3306 

znenyegvkby
()
Ответ на: комментарий от paolo64

Сейчас поглядел, у Вас на сервере sigmavet.ru Мускуль смотрит в мир, значит, у пользователя нет прав на подключение извне.

Нужно добавить привилегии для используемого пользователя на все машины, а не только локалхост.

bvn13 ★★★★★
()
Ответ на: комментарий от bvn13

Нужно добавить привилегии для используемого пользователя на все машины, а не только локалхост.

А как добавить-то???!!!

paolo64
() автор топика
Ответ на: комментарий от paolo64

telnet 127.0.0.1 3306

Я же попросил вас подключиться с той машины, с которой вы подключаетесь к удаленному серверу.

telnet !АДРЕС_ВАШЕГО_СЕРВЕРА! 3306

znenyegvkby
()
Ответ на: комментарий от paolo64

Если я решу эту проблему - напьюсь.

И Вас приглашаю... четвертые сутки пошли.

Я 21 год с этим работаю и на тебе... (мне 52)

paolo64
() автор топика
Ответ на: комментарий от bvn13

смотрит в мир, значит, у пользователя нет прав на подключение извне.

Если нет прав, то появляется ведь ошибка

SQLSTATE[HY000] [1130] Host __ is not allowed to connect to this server

а не

Can't connect to MySQL server on '127.0.0.1' (13)

Здесь же именно нет возможности подключиться к самому серверу.

znenyegvkby
()
Ответ на: комментарий от paolo64

Я 21 год с этим работаю и на тебе... (мне 52)

Еще немного и посчитаю вас троллем, покинув тред :)
Вы так и не показали результат telnet подключения с вашей машины на удаленный сервер (не локальный адрес!)

znenyegvkby
()
Ответ на: комментарий от znenyegvkby

У меня под Windows нет telnet-a...

Да и зачем?

К MySQL подключается CGI скрипт.

paolo64
() автор топика
Ответ на: комментарий от paolo64

Я бы и рад помочь, но вы же троллите. Прямым текстом.

У меня под Windows нет telnet-a...

Я 21 год с этим работаю и на тебе... (мне 52)

http://www.it-rem.ru/kak-vklyuchit-telnet-v-windows-7.html

Да и зачем?

Затем, что если не сможете подключиться, значит будете знать что проблема точно в сервере, и будетм искать что у вас блокирует mysql на стороне сервера.
Если же подключитесь, но получите что-то типа «Host __ is not allowed to connect to this server», будете знать что проблема только в привилегиях.
В обоих случаях вам помогут здесь, но вы зачем-то предлагаете погадать на вашей кофейной гуще. Вполне естественно, что я подозреваю в вас тролля, вы не находите? :)

znenyegvkby
()
Ответ на: комментарий от paolo64

Это я к тому, что через них проще дать необходимые права.

Предлагаю воспользоваться каким-нибудь мануалом и создать нового пользователя (только не для localhost, а либо '*' - на все компы, либо '10.208.22.16' - на конкретный айпишник, если это внешний айпишник)

bvn13 ★★★★★
()
Ответ на: комментарий от bvn13

ТС, на сервере http://sigmavet.ru стоит какой-нибудь phpMyAdmin или adminer?

Стоп. Дак на sigmavet итак все работает. ТС же написал в ОП.

К примеру: http://sigmavet.ru/cgi-bin/test1 - На такой же SentOS - все работает

ping sigmavet.ru -> 62.76.187.154
telnet 62.76.187.154 3306
...
Connected to 62.76.187.154.
...

А вас просят решить проблему для

к примеру http://10.208.22.16/cgi-bin/test1

telnet 10.208.22.16 3306 
...
Trying 10.208.22.16...
telnet: Unable to connect to remote host: Connection timed out
znenyegvkby
()
Ответ на: комментарий от znenyegvkby

Насколько я понял, 10.208.22.16 - локальный комп, а sigmavet.ru - тот, где все работает. И на локальном поднят скрипт, в котором коннект к локальному мускулю, которого нет. А на рабочем - есть мускуль, смотрящий в мир. И нужно локальный скрипт натравить на удаленный мускуль.

ТС, я прав?

bvn13 ★★★★★
()
Ответ на: комментарий от znenyegvkby

Я не нашел в Панели управления «Компонентов»..

paolo64
() автор топика
Ответ на: комментарий от bvn13

Насколько я понял, 10.208.22.16 - локальный комп, а sigmavet.ru - тот, где все работает. И на локальном поднят скрипт, в котором коннект к локальному мускулю, которого нет. А на рабочем - есть мускуль, смотрящий в мир. И нужно локальный скрипт натравить на удаленный мускуль.

ТС, я прав?

ВЫ ПРАВЫ НА 100%!!!

paolo64
() автор топика
Ответ на: комментарий от bvn13

А на рабочем - есть мускуль, смотрящий в мир

Я же сам ставил его. (yum install mysql и т.д.)

И вопросов не возникало....

paolo64
() автор топика
Ответ на: комментарий от bvn13

Ааа. Ну жесть конечно, раз так. Т.е. после того, как он обращается запросом

http://10.208.22.16/cgi-bin/test1

Убеждая нас в том, что с адреса 10.208.22.16 чудесным образом коннект будет производителься к нужному ему серверу, а после говоря

И Вас приглашаю... четвертые сутки пошли.
Я 21 год с этим работаю и на тебе... (мне 52)

А теперь, _внезапно_ утверждая, что 10.208.22.16 это та машина _с которой_ он хочет подключиться

ВЫ ПРАВЫ НА 100%!!!

Попутно приправляя весь этот бред фразами, а-ля

Я не нашел в Панели управления «Компонентов»..

Вы все еще верите что он не тролль?
2 paolo64 я сливаюсь из треда. Бог в помощь :) (если ты все же не тролль, в чем я уже сильно сомневаюсь, то ответ выше уже дал тебе bvn13, просто добавь привелегии)

GRANT SELECT/UPDATE/ALL/ETC ON base.table TO YOUR_USER@IP/range/%/etc IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
/thread

znenyegvkby
()
Ответ на: комментарий от paolo64

Да хватит уже троллить! Сколько можно-то блин? Выше уже все сказали вам, и как решить проблему показали. Что за бред

http://10.208.22.16/cgi-bin/test1

Ну окей, давайте поверим вашим словам, предположим что вы не тролль, и bvn13 вас правильно понял. Вы хотите подключиться из этого скрипта к серверу 62.76.187.154 (sigmavet.ru)
Тогда, какого извиняюсь [censored], у вас в скрипте

con = driver->connect(«tcp://127.0.0.1:3306», «root», «1961164»);

127.0.0.1, Карл! А не 62.76.187.154. Вы делаете это так жирно, и все еще надеетесь что после этого кто-то будет вам чем-то помогать?!

znenyegvkby
()
Ответ на: комментарий от znenyegvkby

Ну окей, давайте поверим вашим словам, предположим что вы не тролль, и bvn13 вас правильно понял. Вы хотите подключиться из этого скрипта к серверу 62.76.187.154 (sigmavet.ru)

Неверно!

Я хочу подключиться к моему локальному серверу 10.208.22.16

paolo64
() автор топика
Ответ на: комментарий от paolo64

А на рабочем - есть мускуль, смотрящий в мир. И нужно локальный скрипт натравить на удаленный мускуль.
ТС, я прав?

ВЫ ПРАВЫ НА 100%!!!

Вы хотите подключиться из этого скрипта к серверу 62.76.187.154 (sigmavet.ru)

Неверно!
Я хочу подключиться к моему локальному серверу 10.208.22.16

Ну наконец-то. Давай до свидания!

znenyegvkby
()
Ответ на: комментарий от znenyegvkby

setsebool httpd_can_network_connect=1

И в этом была вся проблема!!!

ВСЁ ЗАРАБОТАЛО!!!

В другой конференции помогли!

А тролль - что под этим понимается?

paolo64
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.