묻고답하기
XE mysqli_innodb 설치 진행 안되는 문제, sock 방식 연결
2016.04.06 19:45
# 설치 시도 XE 버전 : XE v1.8.18 (가장 최신)
# 문제점 : XE 설치 창에서 "DB 정보 입력" 부분에서 > "환경 설정" 으로 진행 불가함.
sock 방식으로 연결을 하기위해, 적절히 DB 정보를 입력해 준것 같은데.
DB 정보를 입력해도 mysqli 및 mysqli_innodb 선택 후 진행하면 진행이 안됨.
브라우져의 XE 상에서 에러 메시지나 아무런 메시지도 없음. 무반응. DB 계정 정보 비번등은 정확함.
mysql 및 mysql_innodb 선택 후 진행하면 정상적으로 > "환경 설정" 으로 진행 설치됨.
단순히 PHP 버전과의 호환성 문제 인지, 아니면 제가 서버 설정을 잘 못 한것인지 알 수 없네요 ㅠ_ㅜ
공부한다고 많이 공부해서 적절히 설정한 것 같은데 무반응이라서 멘붕 상태 입니다.
# 시스템 사양 및 설치 항목 :
* OS : Linux CentOS 7
* Apache : httpd-2.4.6-40.el7.centos.x86_64
* DB : mariadb-server-5.5.44-2.el7.centos.x86_64
* PHP : php-5.4.16-36.el7.x86_64
* PHP 관련 주요 모듈 :
기본적인 것들은 대부분 설치 하였고, 중요 모듈 들은 아래와 같음.
php-mysqlnd-5.4.16-36.el7.x86_64 PHP 5.4 이상이라서 php-mysql(미설치) 대신 php-mysqlnd만 설치
php-fpm-5.4.16-36.el7.x86_64 현재 PHP-FPM 상태 세팅되어 있음
php-pecl-zendopcache-7.0.5-1.el7.x86_64 PHP 5.4 버전이라 임의로 설치함
php-pecl-apcu-4.0.10-1.el7.x86_64 유저캐시 지원용 임의로 설치함
# 시스템 설정 : 글이 길어질 수 있어서, 세부적인 설정을 제외한 중요 항목들만 글에 적음.
(설치 방법) 위의 것들 모두 yum 으로 간편하게 설치 한 후에 아래와 같이 중요 항목들 설정함.
sock 방식을 사용하기 위해서 연동 관련 설정은 정상적으로 처리한 듯 보임. 모두 nobody 유저로 가동함.
* Apache : Event-MPM 방식으로 작동함. PHP-FPM 과 sock 방식으로 연결되어 있음.
User nobody
Group nobody
<IfModule mpm_event_module> Event-MPM 방식 작동 하도록 적절히 설정함
<FilesMatch \.php$>
SetHandler "proxy:unix:/var/run/php5-fpm.sock|fcgi://127.0.0.1/" PHP-FPM 과 sock 방식 연결됨
</FilesMatch>
AddType text/html .php
DirectoryIndex index.php
</IfModule>
<VirtualHost *:80> 가상 호스트 지정 사용함 (여러 홈페이지 운영위해)
ServerName domain.com
ServerAlias www.domain.com
ServerAdmin webmaster@domain.com
DocumentRoot "/home/username/public_html" 사용자 계정 특정 폴더에 임의로 웹 서비스함
<Directory "/home/username/public_html"> 접근 권한은 적절히 주었음. drwxrwxr-x
Options FollowSymLinks XE 설치를 위한 최소 권한
AllowOverride FileInfo XE 설치를 위한 최소 권한 : All 해도 증상 동일함
Require all granted
RewriteEngine On rewrite_mod 정상 작동 중 (활성화)
</Directory>
</VirtualHost>
* PHP : Mariadb 와 sock 방식 연결에 문제 없게 하려고, PHP 설정에도 기본 socket 위치 설정함.
[Pdo_mysql]
pdo_mysql.default_socket = /var/lib/mysql/mysql.sock
[MySQL]
mysql.default_socket = /var/lib/mysql/mysql.sock
[MySQLi]
mysqli.default_socket = /var/lib/mysql/mysql.sock
[apcu] 및 [opcache] 등은 적절히 값은 설정 했음.
* PHP-FPM : Apache 와 현재 정상적으로 sock 방식으로 연결 작동하는 듯 보임? phpinfo 는 잘 보임.
listen = /var/run/php5-fpm.sock
listen.owner = nobody
listen.group = nobody
listen.mode = 0660
user = nobody
group = nobody
* DB : PHP(PHP-FPM) 과 MariaDB 는 sock 방식으로 연결 설정 하였음. MariaDB 기본 InnoDB.
잘안되길래 /var/lib/mysql/ 폴더권한 혹시 몰라 777완전 오픈 하였으나 증상 동일함. sock파일 정상 생성됨.
[mysqld]
basedir = /var/lib/mysql
port = 3306
socket = /var/lib/mysql/mysql.sock
secure_auth = 1
skip-networking
[client]
socket = /var/lib/mysql/mysql.sock
# 증상에 대한 개인적인 생각 : 무엇이 문제인지 알 수 없음 ㅠ_ㅜ
Apache, php, php-fpm, MariaDB 모두 Log 에 딱히 에러 찍히는 것은 없는 듯;;
CentOS 7 상에서 Apache, PHP-FPM, MariaDB 프로세스는 정상 가동중.
1. 일단 Apache > PHP 및 PHP-FPM 은 정상적으로 sock 방식 연결 되는 듯 보임. phpinfo 정상 표시 작동.
일반적인 정적 웹페이지 및 DB 미사용 php 작동에는 이상 없는 듯
(웹프로그래머가 아니라서 확실 한 것은 아님 ^^;;)
2. PHP 및 PHP-FPM > MariaDB 와의 sock 방식 연결 역시 제대로 되는 듯??? 보임???
이건 확답하기가 쉽지 않음 ㅠ_ㅜ mysql 및 mysql_innodb 방식 선택 후 XE 설치는 되는데.
mysqli 및 mysqli_innodb 선택 후 진행하면 진행이 안되고 (다음 페이지 안가고) 무반응 이니;;
콘솔 상에서 MariaDB 정상적으로 접속 및 작동함.
3. 중요!!
짧은 견해로 보아, sock 방식 연결을 사용해서 XE 를 설치 할 경우...
XE 설치 할 때 일반적인 방식인 DB 호스트네임: 127.0.0.1 혹은 localhost / DB Port: 3306 가 아니라
문제 안생기도록 DB 호스트네임: localhost / DB Port: /var/lib/mysql/mysql.sock 이런 방식 혹은
DB 호스트네임: localhost:/var/lib/mysql/mysql.sock / DB Port: 3306 (Port 중요하지 않으나 기본값)
이런식으로 지정해 주어야 하는 것으로 알고 있습니다. 맞는지 모르겠네요??
xe\classes\db\DBMysql.class.php 및 DBMysqli.class.php 참고해 보았더니 둘 다 가능할 듯 보임??
DB Port: 미지정시 경고 메시지 나오고 진행 불가라 두번째 방식의 경우는 기본값 3306 그대로 냅둠.
아무튼 ^^;; 이렇게 진행하면 mysql 방식 진행되나 mysqli 방식은;; 선택은 가능하나 무반응...
4. 예상되는 상황과 질문 ㅠ_ㅜ
이것 저것 설정을 많이 변경해 보고, 권한도 최대한 777 완전 오픈해보고 해봐도 증상 동일 한듯 보임.
단순히 PHP 5.4 에서는 XE 가 호환성 문제로 비정상 작동되는 것인지??
아님 PHP 5.4 이상이라서 php-mysql(미설치) 대신 php-mysqlnd만 설치 했는데 이 부분이 문제 일까요?
아니면 제가 웹프로그래머가 아니라서 자세히는 모르겠는데.
xe\classes\db\DBMysql.class.php 및 DBMysqli.class.php 소스를 보면.
mysql 방식은 DB 호스트네임과 DB Port 를 ':' 방식으로 연결해 주어서 sock 방식 접속이 가능한데.
mysql 방식은 mysqli_connect() 부분에 보면 ':' 연결하지 않고 호출 시 각각 변수로 넘겨 주어서,
sock 방식 연결이 불가능한 걸까요??
아니면 제가, 하나의 웹서버에 모두 설치되어 있고 sock 방식을 사용해서 3306 포트를 방화벽에서 오픈하지 않았는데 그게 문제 일까요??
아~ mysqlnd 관련 모듈은 아래와 같은 것들이 정상 로드 된 것 같습니다.
mysqlnd_mysqli.so
mysqlnd_mysql.so
mysqlnd.so
pdo_mysqlnd.so
php - m | grep mysql
mysql
mysqli
mysqlnd
뭐가 문제 인지 모르겠네요 ㅠ_ㅜ
첨부파일로 phpinfo 파일 첨부하였습니다 ㅠ_ㅜ
내부에서 테스트용으로 쓰는 서버라서 도메인은 실제 도메인이 아닌 변경 하였습니다.
고수님들의 답변을 간절히 기다리고 있습니다.
- [2019/08/02] 포럼 Which One is Better Mysql or MariaDB? *2
- [2018/09/03] 묻고답하기 [보안] 이번에 XE4 오픈소스 게시판을 utf-8 버전으로 업그레이드 했는데... *2
- [2017/04/19] 묻고답하기 견적내기페이지 문의 *1
- [2016/12/20] 묻고답하기 XE mySQL에서 *1
- [2016/03/24] 묻고답하기 폴더안 txt 문서를 php explode 하여 mysql 에 넣는 과정이 안됩니다ㅠㅠ
댓글 3
-
으흥
2016.04.07 19:30
-
기진곰
2016.04.09 10:55
이미 해결하셨지만 참고하시라고 댓글 남깁니다.
DB 호스트: localhost, DB 포트: 3306으로 지정하면 포트를 무시하고 자동으로 소켓을 사용합니다. XE와 무관한 PHP 자체의 기능이므로, 그냥 localhost와 3306으로 두고 설치하시면 됩니다. 괜히 복잡하게 생각하신 듯...
그리고 PHP 5.4 이상 버전과 php-mysql/php-mysqlnd 선택은 아무 상관이 없습니다. 취향에 따라 선택해서 쓰시면 되는 거지, 버전에 따라 강제되지 않습니다.
-
으흥
2016.04.09 21:22
오호~호~ ^^ 정말이네요. 감사 합니다 ㅠ_ㅜ
XE 1.5 1.7 1.8 각각 마지막 버전(최신)에 테스트 해봤더니 잘되네요.
심각하게 들어가서 괜한 삽질을 ㅠ_ㅜ (소스 수정 필요 없네요)
혹시 몰라 다른분들을 위해서 추가 정보 남깁니다.
* (단일서버 상에서 아파치 + MariaDB(MySQL)를 운영하는 경우) 를 가정하여, 보안을 위해서 MariaDB(MySQL)에 대한 외부접속 차단 하기 위해서 MariaDB(MySQL) 설정에 skip-networking 를 적용한 경우, 서버내에서 유닉스 소켓 접속만을 허용하게 됩니다.
(즉, 꼭 필요한 경우가 아니라면 세팅하지 않는 것을 권장함 ^^;;)
이 경우 유닉스 소켓의 기본 생성 위치를 MariaDB(MySQL) 및 php.ini 설정에 동일 하게 설정해 주어야함.
XE 설치시에는 (소스파일 수정 안해도) 앞서 기진곰 님이 말씀 하신대로.
DB 호스트네임: localhost / DB Port: 3306 (임시입력) 해주면 정상적으로 자동으로 유닉스 소켓으로 연결 되네요 ^^
단, 제가 삽질한 이유 중 하나인, DB 호스트네임을 127.0.0.1 로 지정하면 안됩니다.
마지막으로 MariaDB(MySQL) 접속과 관련된 이런저런 문제점 해결방법에 대해서 참고할 만한 주소를 남겨 드립니다.
http://egloos.zum.com/postback/v/3406296
자답;; 글 삭제 할려다가 혹시라도 참고 하실분 계실까봐 남겨 둡니다.
먼저 저는 웹프로그래머가 아니라서;;
XE 소스를 완벽히 이해하고 수정한 것이 아니기 때문에 문제가 있을 수도 있으니;;
테스트 용도로만 사용 부탁드립니다.
# 수정전 참고 사항 : socket 연결 관련 부분 설명
mysql 및 mysql_innodb 연결시 XE 에서 사용하는 함수 mysql_connect 는 socket 연결시
host 부분에 localhost:/var/lib/mysql/mysql.sock 식으로 적어서 연결이 가능함 (그래서 작동 됬던것)
예시) mysql_connect(localhost:/var/lib/mysql/mysql.sock,username,password)
mysqli 및 mysqli_innodb 연결시 XE 에서 사용하는 함수 mysqli_connect 는 socket 연결시 꼭!!
mysqli_connect(host,username,password,dbname,port,socket) 순서로 입력해 주어야함.
즉, 아래 예시와 같은 방식으로 연결이 불가능 하여 DB 연결이 안됬던 것임
잘못된 작동 예시) mysqli_connect(localhost:/var/lib/mysql/mysql.sock,username,password ...
# 수정 방법 : xe/classes/db/DBMysqli.class.php 와 DBMysqli_innodb.class.php 파일을 수정함
44번째 줄 부근 function __connect($connection) 함수 수정
// Attempt to connect
if(strpos($connection["db_hostname"], ':') === false && $connection["db_port"])
{
$result = @mysqli_connect($connection["db_hostname"]
, $connection["db_userid"]
, $connection["db_password"]
, $connection["db_database"]
, $connection["db_port"]);
}
else
{
$exarr = explode(':', $connection["db_hostname"]);
$result = @mysqli_connect($exarr[0]
, $connection["db_userid"]
, $connection["db_password"]
, $connection["db_database"]
, $connection["db_port"]
, $exarr[1]);
}
=> 수정 내용 if 검사 부분(한줄)과 else 부분을 수정하였음.
# XE 설치 과정에서 sock 방식 설치 하는 방법
DB 호스트네임: localhost:/var/lib/mysql/mysql.sock (본인의 MariaDB(MySQL) Socket 파일 위치)
DB Port: 3306
입력 후 설치함.