The Pursuit of Happyness

컴포넌트 사용


http://www.hanbit.co.kr/book/look.html?isbn=978-89-6848-225-0


PHP에서의 컴포넌트는 PHP 애플리케이션의 특정 문제를 해결하도록 도와주는 코드 모음이다. 기술적으론느 한가지 문제를 해결하는 데 관련된 클래스, 인터페이스, 트레이트의 모음이다.컴포넌트를 이루는 클래스, 인터페이스, 트레이트는 보통 동일한 네임스페이스 하위에 위치한다.


- 좋은 컴포넌트의 특징

-- 목적이 정확하다.

-- 작다.

-- 협력적이다.

-- 충분한 테스트를 거쳤다.

-- 문서화 수준이 높다.


- 컴포넌트 선택

-- 패키지스트에서 찾을 수 있음 

https://packagist.org


- 컴포넌트 사용

-- 컴포저를 사용한다.

https://getcomposer.org

-- 컴포저는 CLI로 동작하는 PHP 컴포넌트 의존성 관리자

-- 컴포저를 실행하면 해당 프로젝트에 필요한 컴포넌트와 의존성 컴포넌트를 프로젝트 폴더에 다운로드 하여 설치해준다.

-- 컴포저 설치


> curl -sS https://getcomposer.org/installer | php

> mv composer.phar /usr/local/bin/composer

> chmod +x /usr/local/bin/composer


첫 명령어는 getcomposer.org 사이트에서 installer 스크립트를 다운로드해서 php 로 실행하는 명령어로 그 결과 composer.phar 파일을 생성하는데, composer.phar 파일은 컴포저 바이너리 파일이다.

생성된 바이너리 파일을 실행이 가능한 위치 (/usr/local/bin) 에 composer 라는 이름으로 이동하고 나서 실행 가능한 권한을 준다.

-- 컴포저 사용법

1. 패키지스트에서 필요한 컴포넌트를 검색한다.

2. PHP 컴포넌트는 vendor / package 형식으로 되어 있다.

3. 아래 명령어를 프로젝트 루트 폴더에서 실행하면 컴포저가 flysystem  컴포넌트를 다운로드해서 vendor 폴더에 설치해 주고, composer.json 파일과 composer.lock 파일을 생성해 준다. composer.json 에는 프로젝트를 위해 설치한 콤포넌트 정보가 기록되며, composer.lock 에는 콤포넌트 설치 시점의 정보들이 기록된다.


> composer require league/flysystem






Comment +0

PHP 표준 권장안


http://www.hanbit.co.kr/book/look.html?isbn=978-89-6848-225-0


PHP에는 다른 언어들과 달리 콤포넌트를 이용하여 코드를 재활용하는 부분이 어려웠는데, 표준 (코딩 규약이나 composer 등) 을 이용하면 누군가 훌륭한 사람들이 만들어 놓은 많은 라이브러리를 활용하여 빠르고 안정적인 코딩이 가능하다.


PSR - PHP Standard Recommendation (PHP 표준 권장안)


http://www.php-fig.org/psr/


현재 채택되어진 PSR-1, PSR-2, PSR-3, PSR-4, PSR-6, PSR-7 을 참고 (책에서는 PSR-6, PSR-7은 언급되지 않음)


- PSR-1 요약

-- 파일은 <?php 나  <? 태그만 사용해야 한다.

-- 파일은 BOM (byte order mark) 이 없는 UTF-8 인코딩을 사용한다.

-- 파일은 클래스, 함수, 상수 등의 심볼을 정의하거나 결과물을 만들어 내거나 세팅에 필요한 것들을 정의 해야 하며 두 가지를 같이 처리하지 않는다.

-- 네임스페이스와 클래스는 반드시 autoloading PSR을 따른다.

-- 클래스 이름은 첫글자를 대문자로 적는다.

-- 상수는 대문자와 언더스코어 (_) 만을 이용한다.

-- 메써드 이름은 낙타표기법을 따른다.


- PSR-2 요약

-- PSR-1을 따른다.

-- 띄어쓰기는 스페이스 4칸 (탭은 쓰지 말것!)

-- 라인 길이는 80자 이내로 하는 것을 권장한다. (No Hard Limit, Soft Limit 120)

-- 네임스페이스 선언 이후에는 한줄을 비운다. use 선언들 이후에도 한줄을 비운다.

-- 클래스 및 메써드를 여닫는 괄호는 다음줄에 한다.

-- 모든 속성과 메써드에는 가시성 키워드를 선언해야 하며, abstract 와 final 키워드는 가시성 키워드 앞에 온다. static 키워드는 가시성 키워드 뒤에 둔다. (ex final private static function functionName())

-- if, else 등의 제어 키워드 뒤에는 반드시 공백을 하나 둔다. 시작 괄호는 같은 줄에 끝나는 괄호는 내용이 끝난 다음 줄에 둔다. 시작괄호 뒤나 끝 괄호 앞에 공백을 둘 필요는 없다.


- PSR-3 은 Logger 사용에 대한 부분


- PSR-4 은 오토로더 사용법에 대한 부분으로 런타임시 필요에 따라 PHP 클래스, 인터페이스, 트레이스를 찾아 인터프리터로 불러오게 된다. PSR-4 오토로더 표준을 지원하는 PHP 컴포넌트와 프레임워크들은 단 하나의 오토로더만으로 인터프리터로 불러올 수 있다.

기존의 include, require 등을 사용하거나 제작자들만의 __autoload() spl_autoload_register() 함수를 이용하는 대신 파일시스템 디렉터리와 PHP 네임스페이스만으로 코드를 구성함으로써 기존 코드를 수정하지 않고도 사용이 가능하다. 네임스페이스에 있는 클래스, 인터페이스, 트레이트는 src/ 하위에 있는 디렉터리 혹은 PHP 파일에 매핑된다.


- PSR-6 은 Cache interface


- PSR-7 은 HTTP message interface 



Comment +0

모던 PHP 특징


http://www.hanbit.co.kr/book/look.html?isbn=978-89-6848-225-0


- 네임스페이스

-- PHP 코드를 운영체제의 파일시스템 디렉터리 구조처럼 가상 계층 구조로 격리시켜준다.

-- 키워드 namespace, use


- 인터페이스

-- interface 를 정의하고 implements 해서 쓸 수 있다.


- 트레이트

-- 서로 상속관계로 묶기 애매하고 인터페이스로 공통 요소를 추상화 하기도 힘든 경우 사용

-- Trait을 사용할 클래스에 필요한 변수와 메써드를 정의하고, 각 클래스에서 use 키워드를 이용해서 trait 기능을 이용한다.

ex) 영화와 게임 클래스를 만든다고 하면, 둘 간에 상속관계도 없고, 추상화 할 요소도 없다. 각 클래스에 이름이라는 속성과 setName, getName 이라는 메써드만 공통적으로 사용된다면 아래와 같이 trait을 이용할 수 있다.


<?php

trait MediaMetaData 

{

    protected $mediaName;

    public function setMediaName($mediaName)

    {

        $this->mediaName = $mediaName;

    }

    public function getMediaName()

    {

        return $this->mediaName;

    }

} 


<?php

class Movie 

{

    use MediaMetaData;

} 


<?php

$movieTest = new Movie();

$movieTest->setMediaName("Test Movie");

echo $movieTest->getMediaName();


- 제네레이터

-- Iterator 와 달리 요구가 있을 때마다 반복적으로 값을 계산해서 돌려주는 기능

-- 계산 결과를 메모리에 모두 올릴 필요가 없어 매우 효율적인 운영이 가능


아래 예제에서 arrayOld 의 경우 $length 크기의 배열을 생성해서 전달

반면에 arrayGen의 경우 foreach에서 호출시 마다 다음 값만 생성해서 전달


<?php

function arrayOld($length)

{

        $ret = [];

        for ($i = 0;$i < $length; $i++)

        {

                $ret[$i] = $i;

        }

        return $ret;

}


function arrayGen($length)

{

        for ($i = 0;$i < $length; $i++)

                yield $i;

}


$len = 100000


foreach (arrayOld($len) as $i)

    echo $i . PHP_EOL;


foreach (arrayGen($len) as $i)

    echo $i . PHP_EOL; 




- 클로저

-- 생성 당시 자신의 주변 상태를 캡슐화한 함수 (함수 포인터라고 생각하면 된다.)


<?php

$closure = function ($name) {

        return sprintf("Hi %s", $name);

};


echo $closure("Tom") . PHP_EOL;




-  PHP 를 이용하여 http 서비스 테스트 하기

명령 프롬프트에서 다음과 같이 입력하면 8000 포트로 동작하는 http 서버를 띄울 수 있다. 한번에 하나의 요청씩만 처리하기 때문에 개발 테스트 용으로는 쓸수 있으나 Production 서비스 용으로는 적합하지 않다.


php -S localhost:8000


Comment +0

MySQL 을 관리하면서 가장 기본으로 필요한 것은 계정 생성 및 권한을 관리하는 것입니다.


사용자 계정과 관련된 구문은 다음과 같습니다.


 ALTER 

 사용자 정보를 변경  

 ex) ALTER USER 'testuser'@'localhost' PASSWORD EXPIRE;

 CREATE

 사용자 계정 생성  

 ex) CREATE USER 'testuser'@'%' IDENTIFIED BY 'password';

 DROP

 사용자 계정 삭제 

 ex)  DROP USER 'testuser';

 GRANT

 사용자 계정에 권한을 부여 

 ex) GRANT ALL PRIVILEGES ON testdb.* TO 'testuser'@'localhost' IDENTIFIED BY'password';

 RENAME

 사용자 계정을 변경 

 ex) RENAME USER 'testuser'@'localhost' TO 'testuser2'@'127.0.0.1';

 REVOKE

 사용자 계정의 권한을 제거 

 ex) REVOKE ALL PRIVILEGES ON testdb.* FROM 'testuser'@'localhost'; 

 SET PASSWORD

 사용자 계정의 비밀번호 변경 

 ex) SET PASSWORD FOR 'testuser'@'localhost' = password('new_password'); 


사용자 계정을 새로 생성하여 권한을 바로 부여하는 경우에는 CREATE 과정을 생략하고 바로 GRANT 구문만 사용해도 됩니다.

반대로 계정을 삭제하는 경우에는 권한을 제거하지 않고 바로 DROP 하면 계정이 삭제 됩니다.


사용자의 권한을 확인하기 위해서는 다음의 구문을 사용합니다.


 mysql> SHOW GRANTS FOR 'testuser'@'localhost';



사용자가 가질수 있는 권한은 종류가 매우 많습니다.

많이 쓰이는 권한은 다음과 같습니다.


ALL [PRIVILEGES] : 모든 권한


CREATE : 데이터베이스 혹은 테이블 생성 권한


DELETE : DELETE 구문을 사용할 수 있는 권한


DROP : 데이터베이스, 테이블 혹은 뷰를 삭제할 수 있는 권한


INSERT : INSERT 구문 사용 권한


LOCK TABLES : SELECT 구문시 테이블에 락을 걸수 있는 권한


SELECT : SELECT 구문 사용 권한


SUPER: admin 권한


UPDATE : UPDATE 구문 사용 권한


Comment +0

CentOS 설치 후에 어플리케이션 설치 및 설정 후 무언가 제대로 되지 않는다면 대부분 SELinux 설정 때문인 경우가 많습니다.


SELinux 에 대해서 알아보도록 하겠습니다.


SELinux란 Security-Enhanced Linux 의 줄임말로 보안이 향상된 리눅스라고 정의되어 있습니다.


보안과 사용자 편의는 양날의 검인지라, 보안이 향상되었다는 것은 무언가 사용하기 불편할 수 있다라는 의미입니다.


SELinux 상에서는 각 응용 프로그램에 대해서 접근이 가능한 설정 파일이나 사용할 수 있는 폴더의 위치에 대해서 권한이 명확하게 정의가 되었습니다.


예를 들자면 httpd 프로세스가 php 를 통해서 특정 경로에 파일을 write 하는 것도 SELinux context type이 맞아야만 가능합니다.


또한 mysql 의 DB 경로를 변경할 때에도 해당 폴더에 맞는 SELinux context type 이어야 가능합니다.



1. SELinux 기본


SELinux는 enforcing, permissive, disabled 세 가지 정책을 설정할 수 있습니다.


enforcing 의 경우 보안 정책을 적용하는 것이고, permissive 의 경우는 경고만 보여주고, disabled 는 아예 로딩하지 않는 것입니다.


그리고 targeted, minimum, mls 등의 타입을 지정할 수 있습니다.


targeted는 지정된 프로세스들을 보호하는 것이고, minimum 은 targeted 를 변형하여 선택된 프로세스만 보호하는 것이고, mls 는 여러 레벨로 보안을 설정하는 것입니다.


현재 설정을 확인하기 위해서는 getenforce 명령어를 사용합니다.


# getenforce


그리고 임시 설정 변경을 위해서는 setenforce 명령어를 이용하면 됩니다. (리부팅시 원래 상태로 돌아옴)


SELinux 설정을 permissive 로 변경


# setenforce 0


SELInux 설정을 enforcing 으로 변경


# setenforce 1


영구적인 설정 변경을 위해서는 아래의 설정파일을 열어서 변경하면 됩니다.


# vi /etc/selinux/config 



2. chcon 을 이용한 context type 변경


SELinux 를 사용하지 않으면 설정에 문제는 사라지겠지만 보안이 약해지는 문제가 있습니다. 따라서 SELinux 를 적용한 상태에서 특정 폴더 혹은 파일의 context type 을 상황에 맞게 적용하는 방법에 대해서 설명 드리겠습니다.


이전에 mysql 설정 포스팅에서도 잠깐 소개되었었는데, mysql의 DB 경로를 변경하는 경우에 대해서 설명해 보겠습니다. 


기본 경로 (/var/lib/mysql)를 /datadir 로 변경한다고 가정하면, 아래와 같이 새 DB 경로의 context 를 변경해 주면 mysql 프로세스가 사용이 가능한 권한을 얻게 됩니다.


# chcon --reference=/var/lib/mysql -R /datadir


또한 php 프로세스가 httpd 상에서 파일 쓰기 권한이 필요하다면, 권한이 필요한 경로 (/var/www/html/phpfile) 에 다음과 같이 설정해 주면 됩니다.  


# chcon -t httpd_sys_rw_content_t -R /var/www/html/phpfile



3. SELinux 설정값 확인 및 변경


이번에는 getsebool / setsebool 명령어를 이용해서 SELinux 설정을 확인하고 변경해 보겠습니다.


httpd 프로세스에서 네트워크 연결 허용 여부를 결정하는 SELinux 설정은 httpd_can_network_connect 입니다.


아래와 같이 입력하여 현재 설정값을 확인해 봅니다.


# getsebool httpd_can_network_connect


혹은 getsebool -a 후에 grep 으로도 확인할 수 있습니다.


위의 연결을 허용해 주고 싶으면 아래와 같이 입력하면 됩니다.


# setsebool -P httpd_can_network_connect on


on 대신 1을 입력해도 됩니다.


반대로 연결을 허용하지 않겠다면,


# setsebool -P httpd_can_network_connect off


off 대신 0을 입력해도 됩니다.






Comment +0

SSH 서버에 접속할 때, 비밀번호 입력 모드가 매우 늦게 뜨거나, 입력 후에도 로그인까지 상당히 오랜 시간이 걸리는 경우가 있습니다.

(30초에서 2분정도 걸리는 경우도 있다고 하네요..)


원인을 파악하기 위해서 ssh 접속시 "-vvv" 옵션을 추가하면 ssh 접속을 위해서 주고 받는 정보들이 자세히 나오게 됩니다.

내용을 살펴보면 ssh 접속이 느린 이유가 나오는데요, 대표적인 케이스 두 가지에 대한 해결책을 정리해 보았습니다.


1. GSSAPI 인증문제

SSH 로그인 시에 SSH 클라이언트는 몇 가지 인증 과정을 거치는데요, 그 중에 GSSAPI 인증이라는 단계가 있습니다. 이 과정은 SSH 서버가 GSSAPI 서버에 접속해서 클라이언트의 유효성을 인증받는 과정이 들어가 있는데, 이 과정이 실패할 때 SSH 세션이 시작되는 것이 상당히 지연되기도 합니다. 

해결책은 SSH 설정에서 GSSAPI 인증을 사용하지 않게 해 주는 것입니다.

SSH 설정 파일을 열어서 GSSAPIAuthentication 을 검색합니다.


$ vi /etc/ssh/sshd_config 


해당 항목의 값을 "no" 로 설정합니다.


GSSAPIAuthentication no

 

SSH 서버를 재시작 합니다.


$ systemctl restart sshd


2. 역방향 DNS 조회 문제

SSH 접속이 느려지는 다른 문제로는 역방향 DNS 조희 입니다. SSH 서버가 클라이언트로부터 로그인 요청을 받으면, 서버는 보안상의 이유로 클라이언트의 IP에 대해서 역방향 DNS를 조회합니다. 만약 역방향 조회가 실패하면 timeout 시간 만큼 접속이 늦어집니다.


역방향 DNS 조회 기능을 사용하지 않게 해주기 위해서 설정 파일을 엽니다.


$ vi /etc/ssh/sshd_config 


UseDNS 라는 항목을 검색해서 아래와 같이 해당 항목의 값을 "no"로 설정합니다.


UseDNS no


참고로 제가 설치한 CentOS에서는 "UseDNS yes" 가 주석처리 되어 있었는데, 주석을 풀고 값을 no로 설정했을 때 문제가 해결되었습니다.


SSH 서버를 재시작 합니다.


$ systemctl restart sshd






Comment +0

실제 MySQL을 운영할 때는 replication을 많이 구성하게 됩니다.

Replication 은 목적에 따라 다양한 형태로 구성될 수 있는데, 여기서는 기본적인 Master - Slave 구조를 설정해 보겠습니다.

MySQL의 복제 방식은 Master서버에서 bin_log 를 생성한 후에 Slave 서버가 bin_log 내용을 받아와서 query를 재생하는 방식으로 처리됩니다.


0. Master - Slave Replication 구성을 위해서 DB 로 사용할 서버를 두 대 준비합니다.

편의상 Master 서버의 Private IP 는 10.0.0.51, Slave 서버의 Private IP는 10.0.0.61 이라고 하겠습니다.


1. [Master] 먼저 Master 서버의 my.cnf 설정에 다음의 내용을 추가하여 bin 로그를 활성화 합니다.


[mysqld]

log-bin=mysql-bin

server-id=51


log-bin 에는 bin 로그가 생성될 파일 이름을 지정해 줍니다. 서버의 default 값을 사용하고 싶다면 "log-bin" 이라고만 적어줘도 됩니다.

그리고 server-id는 replication 구성 내에서 unique 한 값을 적어줘야 합니다. DB가 많지 않다면 Private IP 마지막 자리를 적어주면 겹치지 않습니다.


그리고 MySQL을 재시작하여 bin 로그가 생성되는지 확인합니다.


# systemctl restart mysqld


bin 로그는 MySQL 데이터베이스 경로에 생성되며 위에서 지정한 파일 명으로 생성됩니다. (mysql-bin.000001, mysql-bin.000002, ...)

또한 mysql-bin.index 라는 파일이 생성되어 bin 로그를 생성한 시점부터의 로그 파일 리스트가 기록됩니다.


2. [Master] Replication 에서 사용할 계정을 생성합니다.

MySQL을 실행해서 Replication 에서 사용할 계정을 아래와 같이 생성합니다.


# GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.0.0.%' IDENTIFIED BY 'password';


Private IP 대역 10.0.0.x 에 대해 "repl" 이라는 계정으로 비밀번호 "password" 로 replication 을 허용하겠다는 의미 입니다.


3. [Master] Replication 시작 위치를 확인합니다.

Replication 위치를 제대로 맞춰주기 위해서 지금부터 Master DB의 백업이 완료될 때 까지 DB 접속을 차단하는 것이 좋습니다. query가 실행되면 replication 지점이 변경될 수 있습니다.

다음의 명령어로 replication 위치를 확인합니다.


mysql> show master status\G


만약을 대비하여 File 과 Position 값을 기록해 둡니다.


4. [Master] DB를 백업합니다.

# mysqldump --all-databases --master-data -u root -p > dbdump.db

--master-data 라는 옵션을 주게되면 dbdump.db 파일에 replication 지점이 같이 저장됩니다.

Master DB에서의 할일은 끝났습니다. 


5. [Slave] my.cnf에 다음의 내용을 추가합니다.


[mysqld]

server-id=61


slave 서버에서의 데이터 변경 방지를 위해서 read_only 를 추가할 수 있습니다.


[mysqld]

read_only


Slave 에서도 relay 로그 외에 별도의 bin 로그가 필요하다면 log-bin 옵션을 추가해도 됩니다.

MySQL을 재시작하여 설정을 반영 시킵니다.


# systemctl restart mysqld


6. [Slave] DB 리스토어

Master에서 백업한 데이터를 복사해서 restore 합니다.


# mysql -u root -p < dbdump.db


7. [Slave] Slave DB에서 Master DB의 Replication 지점을 설정합니다.


mysql> CHANGE MASTER TO 

        ->      MASTER_HOST='10.0.0.51'

        ->      , MASTER_USER='repl'

        ->      , MASTER_PASSWORD='password'

        ->      , MASTER_LOG_FILE='mysql-bin.000004'

        ->      , MASTER_LOG_POS=120;


MASTER_LOG_FILE 과  MASTER_LOG_POS는 dbdump.db 파일에서 읽어도 되고, 3번에서 기록해 둔 값을 적어줘도 됩니다.

그리고 Slave 를 시작합니다.


mysql> start slave;


Slave DB의 상태를 확인합니다.


mysql> show slave status\G



8. 기타

* MySQL에서의 DB 백업과 리스토어는 데이터베이스를 그대로 이미지 떠서 rsync 시키는 방법을 사용하실 수 있습니다. InnoDB 엔진을 사용하는 경우에는 반드시 MySQL 서비스를 중지시키고 하는 것을 권장하고 그 외의 기본 엔진에 대해서는 서비스 중지 없이 Lock을 걸고 진행할 수 있습니다.


* 하나의 bin 로그 파일이 너무 커지는 것을 막기 위해서 bin 로그 파일 사이즈를 제한할 수 있습니다. 

최소값은 4096이며 최대값은 1073741824 (1GB) 입니다. default 설정은 1073741824 입니다.


[mysqld]

max_binlog_size=1G



* bin 로그가 서버에 무한히 쌓이는 것을 방지하기 위해서 다음의 옵션을 통해서 일정 기간이 지나면 삭제되도록 설정할 수 있습니다.

아래는 7일 (일주일) 이 지난 로그를 삭제하는 옵션입니다. 최대 99일까지 설정이 가능하며 0을 쓰면 삭제하지 않습니다.


[mysqld]

expire_logs_days=7







Comment +0

이전 포스팅에서 CentOS 7.x 서버에 MySQL 5.6 을 설치해 보았습니다.  [MySQL 설치 다시보기]


이번 포스팅에서는 MySQL 설치 후에 필요한 세팅에 대해서 알아보도록 하겠습니다.


MySQL은 시작할 때 /etc/my.cnf 파일을 읽어서 필요할 설정을 하게 됩니다.


아래 명령으로 해당 파일을 열어서 편집합니다.


vi /etc/my.cnf


파일을 열어보면 [mysqld], [mysqld_safe] 와 같이 설정 영역이 나뉘어져 있습니다. 설정은 반드시 필요한 영역에 적어줘야 합니다.


1. DB 경로 설정

- [mysqld] 에 있는 datadir 의 경로를 변경해 줍니다. datadir을 변경할 때는 변경할 datadir의 context를 같이 변경해 주어야 합니다.


[mysqld]

datadir=/var/lib/mysql


- context 변경 (mysql DB 경로를 /datadir 로 변경했다고 가정) 

다음 중 하나만 실행해 주면 됩니다.


  • selinux 상에서 context 변경


- semanage 설치


yum install policycoreutils-python


- context 설정 변경


semanage fcontext -a -t mysqld_db_t "/datadir(/.*)?"


- 변경된 설정 적용


restorecon -Rv /datadir


  • chcon 을 이용해서 context 직접 변경


chcon --reference=/var/lib/mysql /datadir


    2. 기본 DB 엔진 설정

    - 테이블을 생성할 때 기본으로 사용할 DB 엔진을 설정할 수 있습니다. 트랜젝션을 지원하는 InnoDB 엔진을 기본으로 설정하려면 다음을 추가해 주면 됩니다.


    [mysqld]

    default-storage-engine=InnoDB


    MySQL 4.x 버전에서는 default-storage-engine 대신 default-table-type 이라는 옵션을 사용했었는데, 5.x 버전에서는 이 설정이 있으면 에러가 나면서 MySQL이 실행되지 않습니다.


    3. 인코딩 설정

    - 한글이나 일본어 중국어 등의 문자를 사용하는 경우 utf8 방식으로 인코딩을 하여 저장하는 것이 편리합니다.

    인코딩에 대해서는 데이터가 저장될 때의 인코딩과 클라이언트와 서버간의 주고 받는 데이터의 인코딩 등이 다르게 설정될 수 있으므로, 데이터 저장에 대한 것은 [mysqld] 영역에 클라이언트 접속시의 기본 인코딩은 [client] 영역에 다음과 같이 적어 주면 됩니다.


    [mysqld]

    character-set-server=utf8

    collation-server=utf8_general_ci


    [client]

    default-character-set=utf8


    MySQL에서는 서버, 데이터베이스, 테이블, 컬럼에 대해서 각각의 인코딩 방식을 적용할 수 있습니다. 이미 생성된 데이터베이스나 테이블 등은 백업 / 리스토어 시에 해당 인코딩 설정이 붙어서 오기 때문에 기존에 생성된 데이터베이스, 테이블, 컬럼에 대해서는 alter 명령어로 변경해 주는 작업이 필요할 수 있습니다.


    4. Slow Query 로그 설정

     - MySQL의 성능을 모니터링 하기 위해서 필요한 설정입니다. MySQL 서버에서 처리하는 query 중에 지나치게 오랜 시간이 소요되어 퍼포먼스에 영향을 주는 query가 없는지 혹은 index를 타지 않아 문제의 소지가 될 만한 query가 있는지를 로그에 남기는 작업입니다.

    slow-query-log 는 Slow Query 로그를 남긴다는 설정입니다. slow-query-log=1 과 같은 의미 입니다.

    long_query_time은 Slow Query 로그에 남길 기준 시간을 초단위로 설정합니다.

    log_queries_not_using_indexes 는 index를 타지 않는 Query를 로그에 기록합니다.


    [mysqld]

    slow-query-log

    long_query_time=2

    log_queries_not_using_indexes



    slow_query_log_file 옵션으로 파일명을 별도로 설정을 하지 않았다면, MySQL DB가 설치된 경로에 localhost-slow.log 파일에 Slow Query 로그가 생성됩니다.


    5. Max Connections 설정

    최대 접속 가능 클라이언트 숫자 지정 (default 151)


    [mysqld]

    max_connections=500



    6. Timeout 시간 지정

    default 28800


    [mysqld]

    wait_timeout=60











    Comment +0

    CentOS 7.x 에서는 기본으로 MySQL 대신 Maria DB 패키지 정보가 들어있어서 MySQL 설치를 위해서는 repository를 추가로 설치해 줘야 합니다.


    아래의 명령어를 이용하여 mysql-community repo를 설치합니다.

    rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm


    현재 MySQL 5.7 이 배포중에 있으나 위의 repo를 추가한 경우 MySQL 5.6이 기본으로 설정되어 있습니다.

    MySQL 5.7은 기존 버전에 비해서 상당한 변화가 있었기 때문에 다음 포스팅에서 다시 다루기로 하고 일단은 5.6 버전을 설치해 보겠습니다.


    아래 명령어로 MySQL을 설치합니다.

    yum install mysql-community-server


    아래 명령어를 이용해서 MySQL 서비스를 실행합니다.

    # systemctl start mysqld


    기본 세팅에서 DB는 /var/lib/mysql 에 저장이 되며, /var/log/mysqld.log 파일에 로그 기록이 남습니다.

    기본 세팅에서는 별도의 비밀번호 입력없이 아래와 같이 입력해서 로그인 할수 있습니다.

    mysql


    MySQL의 보안을 위해서 root 계정에 비밀번호를 설정하고, anonymous 계정을 삭제합니다.

    mysql_secure_installation

    실행하면 먼저 현재 설정된 MySQL root 비밀번호를 입력하라고 나오고, 입력후에는 MySQL root 비밀번호를 변경 할지를 물어보고, anonymous 계정을 삭제할 것인지 물어봅니다. 그리고 root 계정에 대해서 원격 서버에서의 접속을 허용할 것인지 설정하고 나면 test 데이터 베이스를 삭제할 것인지를 물어보는데, MySQL 5.6에서는 기본으로 test 데이터 베이스가 존재하지 않기 때문에 삭제하겠다고 하면 에러 메시지가 나오게 됩니다. 에러가 나도 보안 설정 진행에는 문제가 없습니다. 그리고 변경된 계정 정보를 바로 반영할 것인지를 설정하면 끝납니다.


    마지막으로 아래 명령어를 이용해서 서버 재시작시 MySQL 서비스가 실행되도록 합니다.

    systemctl enable mysqld




    Comment +0

    아래 그림에서 처럼 Host A (클라이언트) 에서 Host B (서버) 로 SSH를 이용해서 서버에 접속을 하면 둘 사이에 연결이 이루어 지는데, 이 연결 통로를 터널이라고 한다. 이 연결은 암호화 등을 통해 보호되며, 포트 포워딩을 이용하여 다른 애플리케이션이 이 터널을 이용할 수 있다.

     


    터널링은 크게 Local Port Forwarding 과 Remote Port Forwarding 으로 나눠진다.

    - Local Port Forwarding은 로컬 서버에서 리모트 서버의 특정 포트에서 동작하고 있는 애플리케이션에 접속이 필요한 경우 사용한다.

    예를 들어 방화벽이 설정되어 22번 (SSH) 포트는 열려 있으나, 3306번 (MySQL) 포트가 막혀 있는 리모트 서버에 대해, 터널링을 이용하면 외부에서 MySQL에 접속할 수 있는 터널을 생성해 준다.

    Local Port Forwarding 은 다음과 같은 형식으로 사용할 수 있다.

     $ ssh -L[bind_address:]port:host:hostport user@hostname


    SSH 터널링 (SSH연결을 통해 localhost의 3306번 포트로 들어오는 트래픽을 serverurl.com 서버의 3306번 포트로 포워딩한다.)

     $ ssh -L 3306:localhost:3306 test@serverurl.com

    터널링이 연결된 상태에서 MySQL 접속 (MySQL 클라이언트를 로컬호스트 (3306번 포트) 로 접속을 하면 serverurl.com의 MySQL서버에 접속하게 된다.

     $ mysql -h localhost -u mysqluser


    - Remote Port Forwarding은 리모트 서버의 애플리케이션이 클라이언트의 특정 포트에 접속이 필요한 경우 사용할 수 있다. 

    Remote Port Forwarding 은 다음과 같은 형식으로 사용할 수 있다.

     $ ssh -R[bind_address:]port:host:hostport user@hostname




    Comment +0