| 제목 | Live Host 에서 database.php 설정방법이 궁금합니다. | ||
|---|---|---|---|
| 카테고리 | CI 2, 3 | ||
| 글쓴이 | bsc0227 | 작성시각 | 2018/01/17 23:11:13 |
|
|
|||
|
안녕하세요. 코드이그나이터에 빠져 열심히 코딩중인 학생입니다. 현재 제 프로젝트를 라이브로 돌려보고싶어서 이리저리 해보는중인데요, 로컬에서 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
한대승님 답변 감사드립니다! 종원님과 대승님이 말씀해주신것처럼 내부아이피로 바꿔테스트해보니 잘 됩니다! 감사드립니다! 이제 어떤식으로 동작하는건지 조금이나마 이해했습니다..ㅎㅎ |