제목 | 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
한대승님 답변 감사드립니다! 종원님과 대승님이 말씀해주신것처럼 내부아이피로 바꿔테스트해보니 잘 됩니다! 감사드립니다! 이제 어떤식으로 동작하는건지 조금이나마 이해했습니다..ㅎㅎ |