CI 묻고 답하기

제목 Live Host 에서 database.php 설정방법이 궁금합니다.
카테고리 CI 2, 3
글쓴이 bsc0227 작성시각 2018/01/17 23:11:13
댓글 : 12 추천 : 0 스크랩 : 0 조회수 : 21452   RSS

안녕하세요.

코드이그나이터에 빠져 열심히 코딩중인 학생입니다.

현재 제 프로젝트를 라이브로 돌려보고싶어서 이리저리 해보는중인데요, 

로컬에서 apache로 돌렸을땐 잘 작동했는데 똑같은 프로젝트를 라이브로 올리니깐 에러가 납니다.. ㅠㅠ..

이 에러가 왜 나는지, 무엇이 잘못된건지 궁금합니다.

 

Live Host의 os환경은 AWS EC2 t2.micro Ubuntu 16.04 입니다.

현재 코드이그나이터는 최신버젼을 사용중이고, (3.1.7 이었던것 같습니다.)

php 7.0.22 를 사용중입니다.

데이터베이스는 mysql  Ver 15.1 Distrib 10.0.33-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2 를 사용중입니다.

웹서버는  Apache/2.4.18 (Ubuntu) 를 사용중입니다.

데이터베이스 port는 3306을 사용중입니다.

 

아래는 제가 연습하려고 작성한 코드들 입니다.

 

database.php

 

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

$active_group = 'bsc';
$query_builder = TRUE;

$db['default'] = array(
	'dsn'	=> '',
	'dbport' => '3306',
	'hostname' => 'localhost',
	'username' => '',
	'password' => '',
	'database' => '',
	'dbdriver' => 'mysqli',
	'dbprefix' => '',
	'pconnect' => FALSE,
	'db_debug' => (ENVIRONMENT !== 'production'),
	'cache_on' => FALSE,
	'cachedir' => '',
	'char_set' => 'utf8',
	'dbcollat' => 'utf8_general_ci',
	'swap_pre' => '',
	'encrypt' => FALSE,
	'compress' => FALSE,
	'stricton' => FALSE,
	'failover' => array(),
	'save_queries' => TRUE
);

$db['bsc'] = array(
	'dsn'	=> '',
	'dbport' => '3306',
	'hostname' => 'mydomain.com',
	'username' => 'username',
	'password' => 'password',
	'database' => 'mydatabase',
	'dbdriver' => 'mysqli',
	'dbprefix' => '',
	'pconnect' => TRUE,
	'db_debug' => (ENVIRONMENT !== 'production'),
	'cache_on' => FALSE,
	'cachedir' => '',
	'char_set' => 'utf8',
	'dbcollat' => 'utf8_general_ci',
	'swap_pre' => '',
	'encrypt' => FALSE,
	'compress' => FALSE,
	'stricton' => FALSE,
	'failover' => array(),
	'save_queries' => TRUE
);

 

Main.php (controller 입니다)

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Main extends CI_Controller{
    function __construct()
    {       
        parent::__construct();
        //중복되는 부분은 생성자에서 작업해주는것이 좋다.
        $this->load->database(); //database 라이브러리 로드
        $this->load->model('main_model'); //topic_model.php 로드
    }


	public function index(){
		echo '안녕하세요. 이것은 CodeIgniter 연습 main controller 입니다.';
		$this->load->view('header');
		$this->load->view('home/home_page');
		$this->load->view('footer');
		//view를 가져올때에는 이런식으로 가져온다.
	}

	public function get_topic(){
		$topics = $this->main_model->gets(); //main_model Object의 function을 실행시켜 결과값을 객체로 가져옴

		$this->load->view('header');
		$this->load->view('home/list_page', array('topics'=>$topics));//이런식으로 view에 객체(혹은 array)형태로 model을 전달함
		$this->load->view('footer');
	}
}

 

main_model.php (Model 입니다.)

<?php
//model의 클래스명 규칙
// 클래스명은 반드시 대문자 컨트롤러명_model 로 지정한다.
// 그리고 반드시 CI_Model을 상속받는다.

class Main_model extends CI_Model{

	function __construct(){
		parent::__construct();
	}

	public function gets(){
		//데이터를 가져오는 코드
		//아래는 현재 설정한 DB에 접속하는 인스턴스이다.
		//query안의 문자열로 쿼리를 날리고 result()으로 결과값을 가져온다.
		//return $this->db->query('SELECT * FROM topic')->result(); //쿼리를 날려 가져온 결과를 객체로 리턴해준다. result_array(); 로 하면 array로 리턴해준다.
		return $this->db->get('topic')->result();
	}

	public function get($topic_id){
		//topic 테이블에서 id를 넘겨서 조건검색한다. 결과는 한줄만 가져올것이므로 row()로 가져온다.
		return $this->db->get_where('topic', array('id' => $topic_id ))->row(); //active record 방식의 코딩법. 이것의 장점은 DB의 이식성이 좋아짐.(다른 DB로 옮길때 수정할필요가 없음)
		# return $this->db->qurey('SELECT * FROM topic WHERE id='.$topic_id)->result(); 와 똑같은 것임.
	}

}
?>

 

에러 문구는 아래와 같습니다.

 

A PHP Error was encountered

Severity: Warning

Message: mysqli::real_connect(): (HY000/2002): Connection timed out

Filename: mysqli/mysqli_driver.php

Line Number: 201

Backtrace:

File: /home/ubuntu/www/application/controllers/Main.phpLine: 9Function: database

File: /home/ubuntu/www/index.phpLine: 315Function: require_once

--------------------------------------------------------------------------------------------------

A Database Error Occurred

Unable to connect to your database server using the provided settings.

Filename: core/CodeIgniter.php

Line Number: 518

 

 

무엇이 문제인가요??ㅠㅠ.. 

작은 조언이라도 좋으니 도움을 주신다면 정말 감사드립니다..

 

태그 database,live host,초보
 다음글 CI 3.1.6 버전에서 mysql 4.0.3 버전에 ...
 이전글 insert_batch 작업 중 memory fatal... (6)

댓글

한대승(불의회상) / 2018/01/18 08:56:15 / 추천 1
디비 접속이 되지 않았습니다. 디비 접속정보 다시 확인해 보세요. 웹서버와 디비서버가 분리되어 있다면 방화벽도 점검해 보세요.
kaido / 2018/01/18 10:27:28 / 추천 1

아마존의 방화벽은 2종류가 있습니다.

웹 포트 들어가는 방화벽하고, DB 서버 접속 방화벽 2종류가 있습니다.

AWS 사용법에 대해서 무료로 자료 공개가 되어있습니다.

http://www.pyrasis.com/private/2014/09/30/publish-the-art-of-amazon-web-services-book

참고해 보세요 ^^

 

bsc0227 / 2018/01/18 10:29:44 / 추천 0

안녕하세요 한대승님.

조언 주셔서 감사합니다! 

현재 대승님께서 조언주신대로 디비 접속정보를 확인해보고있지만, 딱히 특별한 문제를 찾지 못했습니다..

 

라이브서버에 ssh로 접속해서 sudo vi /etc/mysql/mariadb.conf.d 에 접속하여

50-server.cnf에 들어가 bind-address=127.0.0.1 부분도 주석처리 해줬구요,

데이터베이스에 외부접근할 계정도 grant 설정 해줬습니다.

grant all privileges on mydatabase.* to username@'%' identified by 'password';

또한 aws 에 보안그룹에도 MYSQL/Aurora - tcp - 3306 포트를 열어준 상태입니다.

하지만 여전히 live host에 db가 연결이 안되고 있습니다. 오히려 이제는 Message: mysqli::real_connect(): (HY000/2002): Connection refused 에러가 발생하고있는데요.. 포트도 다 열어줬고 권한도 다 줬는데 왜 Connection refused 에러가 발생하는걸까요..??

kaido / 2018/01/18 10:34:29 / 추천 1

내부 설정만 하시면 안되고 외부 설정도 하셔야 합니다 ^^

아마존 콘솔로 들어가셔서 EC2에 네트워크 항목 받아보시면 포트 설정이 있습니다.

변종원(웅파) / 2018/01/18 10:51:56 / 추천 1
콘솔에서 mysql 접속되는지 확인해보세요.
bsc0227 / 2018/01/18 17:03:01 / 추천 0

kaido님 조언 주셔서 감사합니다! 일단 kaido님께서 조언해주신대로 외부설정 또한 한 상태입니다..

security group에서 인바운드 및 아웃바운드 모두 MYSQL/Aurora - 3306 포트를 열어준 상태입니다.

제가 라이브서버와 데이터베이스 서버를 따로 두고 사용하는게 아니라

ec2 안에서 웹서버와 mariaDB서버를 같이 돌리고 있는 것 같습니다.

(제가 아직 많이 초보라서 자세히는 잘 모르겠습니다 ㅠㅠ.. 일단 ec2 인스턴스 하나에 apache와 mariaDB 둘 다 설치했습니다., 그래서 제 생각으로는 하나의 ec2 인스턴스 안에서 웹서버와 데이터베이스 서버가 함께 돌고있는것 같습니다.)

그 외 어떤부분에서 포트를 설정해야하는지 잘 모르겠습니다.. 

 

아래는 제가 세팅해놓은 security group의 설정상태입니다.

security group 인바운드

-----------------------------------------------------------

유형  |  프로토콜  |  포트범위  |  소스  

HTTP  |  TCP  |  80  |  0.0.0.0/0

HTTP  |  TCP  |  80  |  ::/0

SSH  |  TCP  |  22  |  0.0.0.0/0

MYSQL/Aurora  |  TCP  |  3306  |  0.0.0.0/0   <-- 이렇게 해도 되는건지 잘 모르겠습니다..

HTTPS  |  TCP  |  443  |  0.0.0.0/0

HTTPS  |  TCP  |  443  |  ::/0

----------------------------------------------------

 

security group 아웃바운드

-----------------------------------------------------------

유형  |  프로토콜  |  포트범위  |  소스  

모든 트래픽  |  모두  |  모두  |  0.0.0.0/0

MYSQL/Aurora  |  TCP  |  3306  |  0.0.0.0/0  

MYSQL/Aurora  |  TCP  |  3306  |  ::/0 

----------------------------------------------------

 

 

 

변종원님 답변 감사드립니다! 일단 콘솔에서는 접속이 정상적으로 됩니다. 쿼리도 잘 날려지구요.. 근데 live host에만 왜 접속이 안되는건지 의문입니다..ㅠ 

변종원(웅파) / 2018/01/18 17:13:22 / 추천 1

한 서버에 apache, mysql이 같이 있다면 포트 설정이 필요없습니다.

hostname을 localhost로 바꾸세요.

저렇게 도메인으로 접속하면 외부 인터넷망을 타고 다시 돌아들어오게 되서 접속속도가 떨어질 수 있습니다.

트래픽도 발생하구요. 내부끼리는 내부아이피를 사용하셔야 합니다. (아마존에선 프라이빗 아이피)

bsc0227 / 2018/01/18 17:15:18 / 추천 0

변종원님 답변 감사드립니다!

그렇다면 CodeIgniter에서 database.php안의 hostname을 제가 AWS에서 설정해놓은 도메인명이 아닌 localhost로 설정하면 된다는 말씀이신가요? 근데 제가 원하는건 실제로 서비스할때처럼 환경을 만들어보고싶은건데 실서비스를 할때에도 내부아이피로 외부접속을 설정하나요?

변종원(웅파) / 2018/01/18 17:44:49 / 추천 1

bsc0227/ 내부 서비스들은 내부 아이피로 연결합니다. 클라우드들 보시면 vm당 퍼블릭아이피와 프라이빗 아이피가 할당되어 있습니다.

실서비스이면 더욱더 내부 아이피로 연결해야죠. 외부아이피 사용하면 트래픽 비용 발생합니다. 속도도 느리구요

bsc0227 / 2018/01/18 18:10:13 / 추천 0
변종원님 답변감사드립니다! 종원님의 말씀을 제가 이해하기로는 CodeIgniter에서 데이터베이스 서버에 접속 시 외부아이피 말고 내부아이피로 접근해야한다는 말씀으로 이해했습니다. 이게 맞나요? 
한대승(불의회상) / 2018/01/18 18:15:23 / 추천 1
localhost 를 127.0.0.1 로 바꿔 테스트 해보세요.
bsc0227 / 2018/01/18 18:19:11 / 추천 0

한대승님 답변 감사드립니다! 종원님과 대승님이 말씀해주신것처럼 내부아이피로 바꿔테스트해보니 잘 됩니다!

감사드립니다! 이제 어떤식으로 동작하는건지 조금이나마 이해했습니다..ㅎㅎ