Mac에서 MySQL 설치와 실행 그리고 몇가지 유의사항

리눅스도 apt-get을 쓰느냐 yum을 쓰느냐에 따라서 지원하는 팩키지들이 조금씩 다른데 하물며 리눅스 서버에서만 놀다가 Mac에서 MySQL을 하려고하니 귀찮은게 한두가지가 아니다. 정리해보자.

MySQL 설치

설치는 간단하다. MySQL 홈페이지에서 .dmg 파일을 받아서 깔면 된다. 그런데 요세미티로 업그레이드 한 사람들은 그렇게 간단하진 않다! 일단 현재(2014.11월) MySQL 홈페이지에서 제공하는 설치파일이 10.9 버전까지만 있다. 나도 살짝 당황했다. 어랍쇼? 10.10이 없네? 요세미티에선 안되는건가? 혹시나 싶어 10.9 버전을 받아서 설치했더니… 뚜둥! 설치오류<img fetchpriority=” /> 그래서 나는 요세미티에선 MySQL 안깔린다! 라는 매우 성급한 결론을 내버렸다. 진짜 알깔리는건가? 설마~~ 그럴리가!! 그냥 10.8 버전 설치파일로 깔면 된다. ㅎㅎㅎ 뭐냐? -_-;;;;

이때 설치되는 경로는 아래와 같다.

$> cd /usr/local
$local> ls -al
....생략... mysql -> mysql-5.6.21-osx10.8-x86_64
....생략... mysql-5.6.21-osx10.8-x86_64 

2015년 5월 덧, 주로 맥환경에서 개발하는 분들을 위해서 추천하는 방법은 위와 같은 방법 말고 그냥 HomeBrew를 설치해서 사용하기를 권장한다. 이번에 새로운 맥프레로 갈아타면서 패키지 관리를 이 HomeBrew를 이용해하고 있는데 너무 편하다. MySQL설치도 그냥 고민없이 아래명령어만 입력하면된다.

$> brew install mysql

혹시나 내가 이전에 설치했나? 궁금할때는 brew info 라는 명령어를 이용한다.

$> brew info mysql
mysql: stable 5.6.24 (bottled)
https://dev.mysql.com/doc/refman/5.6/en/
Conflicts with: mariadb, mysql-cluster, mysql-connector-c, percona-server
/usr/local/Cellar/mysql/5.6.23 (9687 files, 339M) *
Poured from bottle
.. 어쩌구 저쩌구 ...
server starting up correctly.

To connect:
    mysql -uroot

To have launchd start mysql at login:
    ln -sfv /usr/local/opt/mysql/*.plist ~/Library/LaunchAgents
Then to load mysql now:
    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
Or, if you don't want/need launchctl, you can just run:
    mysql.server start

이전에 HomeBrew로 설치한적이 있다면 위와 같은 정보를 확인할수있다. 나는 mysql을 미리 띄워놓지않고 필요할때만 서버를 띄워서 개발하는 편이라 mysql.server start 명령어를 애용하는 편이다. 아래에도 이어서 설명이 나오겠지만 HomeBrew의 강점중에 하나는 /usr/local/Cellar 폴더에 패키지를 설치한후 심볼릭 링크를 알아서 만들어주기 때문에 어디서든 명령어만 입력하면 된다. 즉 아래처럼 설치한 경로를 다 입력하지 않아도 되는 장점이 있다.

MySQL 서버 실행하기

리눅스에서 yum으로 mysql을 설치하면 아래와 같이 간단하게 실행할 수 있었다.

$> service mysqld start

하지만 맥은 리눅스가 아니다. 그래서 mysql.server 스크립트를 이용한다.

$> /usr/local/mysql/support-files/mysql.server
Usage: mysql.server  {start|stop|restart|reload|force-reload|status}  [ MySQL server options ]
$> sudo /usr/local/mysql/support-files/mysql.server start

MySQL 접속하기

서버를 실행했다면 이제 mysql 서버에 접속해보자. 보통은 커맨드라인 어디에서든 mysql로 로그인하면 된다. 하지만 그냥 로그인하면 권한이 없는 경우 많다. 그래서 일단 root로 로그인하자. 맥에 처음 mysql을 깔았다면 root는 비밀번호 없이도 로컬에서 접속이 가능할 것이다.

$> mysql -u root  // -uroot 라고 붙여서도 된다.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 528
Server version: 5.6.21 MySQL Community Server (GPL)
... 중략 ...
sql> 

위와 같이 나온다면 일단 접속은 성공한거다!

사용할 DB 만들기

이제 개발에 필요한 혹은 사용할 데이터베이스를 만들어보자.

mysql> create database testdb;
Query OK, 1 row affected (0.00 sec)

그리고 꼭 캐릭터셋을 확인해야한다. mysql을 설치하고 따로 캐릭터셋(charset)을 따로 설정하지 않았다면 latin1 으로 설정되는데 latin1 캐릭터셋을 쓰면 한글은 당연히 안되고 몇몇 특수문자를 사용할경우 DB에서 입력이 안되는 경우가 허다하다. 그래서 반드시 utf-8로 설정되어 있는지 확인해야한다. 확인하는 방법은 다음과 같다.

mysql> show create database testdb;
+----------+-------------------------------------------------------------------+
| Database | Create Database                                                   |
+----------+-------------------------------------------------------------------+
| testdb   | CREATE DATABASE `testdb` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+-------------------------------------------------------------------+
1 row in set (0.00 sec)

젠장 역시나,..-_-;;; latin1으로 되어 있다. 일단 만든건 지우자.

mysql> drop database testdb;
Query OK, 0 rows affected (0.00 sec)

MySQL 기본 캐릭터셋 설정하기

MySQL에서 설정파일을 읽는 순서는 다음과 같다.

  • /etc/my.cnf
  • /etc/mysql/my.cnf
  • /usr/local/mysql/etc/my.cnf
  • ~/.my.cnf

일단 /etc/my.cnf 파일이 있는지 확인하고 없으면 /usr/local/mysql/support-files 폴더에서 my-default.cnf 파일을 복사해온다.

$> cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf

그리고 /etc/my.cnf 파일에 다음 내용을 추가한다.

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

init_connect=SET collation_connection=utf8_general_ci
init_connect=SET NAMES utf8

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

이제 다시 서버를 재시작한다. sudo 권한이 없으면 sudo를 붙인다.

$> sudo /usr/local/mysql/support-files/mysql.server restart

DB 생성 및 생성된 DB 사용자 추가하기

이제 거의 다왔다. 앞에서 설정한 캐릭터셋이 잘 됐는지 일단 확인하자.

mysql> create database testdb;
Query OK, 1 row affected (0.00 sec)

mysql> show create database testdb;
+----------+------------------------------------------------------------------+
| Database | Create Database                                                  |
+----------+------------------------------------------------------------------+
| testdb   | CREATE DATABASE `testdb` /*!40100 DEFAULT CHARACTER SET utf-8 */ |
+----------+------------------------------------------------------------------+
1 row in set (0.00 sec)

오예! 잘 됐다. 이제 권한을 추가하자. 권한을 추가하는 방법은 여러가지가 있지만 그냥 쉬운 grant 명령을 이용하자.

// localhost로 접속만 허용하는 dev 유저 계정 생성
mysql> grant all privileges on testdb.* to dev@localhost identified by 'password123';

// 원격 접속도 허용하는 devmaeul 유저 계정 생성 
mysql> grant all privileges on testdb.* to dev@'%' identified by 'password123';

dev라는 계정을 만들고 이 계정으로 사용할 testdb도 지정해줬으므로 이제 root가 아닌 dev 계정으로 로그인해서 사용할수있는 DB가 보이는지 확인해보자.

$> mysql -u dev -p
Enter password: (앞에서 지정한 패스워드 입력)
... 중략 ...
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| testdb             |
+--------------------+
3 rows in set (0.00 sec)

오예!~ testdb가 보인다! 여기까지 mysql로 개발할때 필요한 기본적인 과정이다.

타임존 설정 (업데이트 2015-08-31)

지금까지 기본적인 설정이 끝나서 문제가 없겠구나 했는데 개발하다보니 하나더 발견했다. 바로 타임존이다. 서버에 시간을 기록하는 상황이 아니면 잘 모르기 때문에 사전에 점검하지 않으면 나중에 운영하다 발견하게 된다. 실제로 최근 2달사이 이 문제를 두번 겪었다. 즉, 타임존 설정을 신경써두지 않으면 한국시간으로 오전 10시에 기록을 했는데 서버는 오전 1시로 인식하고 기록하게 된다는 얘기다. 보통 이 문제를 어떻게 해결하는지는 나는 모르겠다. 그냥 상식적으로 생각해보면 글로벌 서비스라면 UTC로 저장하고 한국에서만 서비스할 생각이라면 한국시간에 맞게 저장하는게 좋지않을까? 라고 단순하게만 생각했다. 하지만 그리 단순한 문제는 아니다. 이 얘기 좀금 있다가 다시하고, 여튼 신경쓰지 않았을때 기본값이 어떻게 들어가 있는지 잘 모르기 때문에 일단 현재 시간이 어떻게 저장되어 있는지부터 확인할 필요가 있다!

$> mysql -uroot
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2015-08-31 02:52:24 |
+---------------------+
1 row in set (0.00 sec)

헐퀴! 현재 한국시간은 오전 11시 52분인데 서버는 새벽 2시란다. UTC로 설정되어 있다. 이번엔 내 로컬PC를 확인해봤다. 헐퀴! 이녀석은 또 제대로 나온다. 아~~ 이게 뭐지? 왜 다른거지? 둘다 특별히 설정한건 없는데,… 라는 생각이 들어서 MySQL 공식 문서를 찾아봤다. 에헤라~ 디야~ 그랬쿠나!! OS의 시간을 그대로 가져온다는구나야~~ http://dev.mysql.com/doc/refman/5.6/en/time-zone-support.html

그래서 현재 내PC와 운영중인 AWS 서버의 시간을 확인해봤다.

$ AWS> date
2015. 08. 31. (월) 03:06:53 UTC

$ local> date
2015년 8월 31일 월요일 12시 06분 35초 KST

자, 여기서 문제가 발생한다. MYSQL은 기본적으로 OS의 서버 시간을 가지고 설정하기 때문에 단순히 글로벌 서비스라서 UTC로 저장하고 국내용 서비스라서 KST로 저장하면 안되는거다. 왜냐면 서버시간을 물고 들어가기 때문에 서버 위에서 돌아가는 모든 어플리케이션도 영향을 받는다. 따라서 서버시간은 그냥 통일해야하는 문제가 먼저인 것이다. 나는 일단 지금 한국에서 개발하니까 한국시간을 기준으로 설정해야겠다.

그럼 타임존 설정은 어떻게 해야지? 간단하다. /etc/localtime 이라는 파일이 있는데 이 파일 설정을 한국시간으로 바꿔주면 된다. 아래와 같이 심볼릭 링크를 걸어주자!

$> ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
$> ls -al | grep /etc/locatime
lrwxrwxrwx  1 root root      30  8월 31 12:17 localtime -> /usr/share/zoneinfo/Asia/Seoul
$> date
2015. 08. 31. (월) 12:18:08 KST

끝~

덧,

도움이 되셨나요? 그럼 광고 한번 클릭!

외부 도메인을 AWS에 설정하기

드디어 서버 이전을 완료했다. 그동안 임시 도메인을 쓰고 있었는데… 도메인 설정까지 완전 이전완료! 그동안 귀찮고 편리하다는 이유만으로 호스팅에 의존하다보니 진작에 알 수 있었던 것들을 이제서야 알게됐다. 특히 도메인 관련!! 내가 너무 모르고 있었나싶다.

최근 AWS에서 라우터를 하나 설정하고 도메인도 하나 샀다. 도메인을사면 자동으로 Hosted Zones이 만들어지는데 이 상태에서 A레코드만 추가하면 wiki.miconblog.com 같은 서버 도메인을 쉽게 만들수있다. 하지만 기존에 샀던 이 도메인을 AWS와 연결하려고 찾아봤더니 AWS 가이드엔 도메인 운영 자체를 AWS로 옮기는 방법만 있지 다른 얘기는 못찾겠다. ㅎㅎㅎ 그래서 진짜 도메인 이전을 하려고 하니 이게 진짜 좀 귀찮터라.. 그러다 오늘 다른 방법을 찾았다.

Hosted Zones 설정

일단 AWS 라우터에 가서 Hosted Zones을 하나 생성한다. 이때 기존에 샀던 도메인 이름을 넣고 생성하면 2개의 레코드가 자동으로 생성되는데, 하나는 네임서버(NS)고 또 하나는 SOA라는 타입의 레코드가 생성된다. 스크린샷 2014-11-14 오후 12.31.21 그리고 여기에 A타입의 레코드를 하나 추가한다. 참고로 A타입 레코드는 IP와 연결해준다.

기존 도메인의 DNS 변경

이제 다음 할일은 기존 도메인을 구입한 사이트에 들어가서 DNS 서버의 주소를 변경해주는 일이다. 앞에서 NS 타입으로 생성된 레코드 정보를 보면 네임서버 주소가 1차에서 4차까지 나와 있다. 요걸 그대로 넣어주면 끝~!!

설정이 끝났다면 이제 여유를 가지고 기다리기만하면 된다.

알고보면 참 별거아닌건데,.. 너무 오래걸렸다. ㅎㅎ

AWS 서버로 이전하기 위해 필요한 지식들 1탄

Cafe24에서 약 2년간 가상 서버 호스팅을 이용하다 이번에 AWS로 넘어왔다. 막상 이사오려니 귀찮은 작업들이 많아서 미루고 미뤄뒀는데, 결국 호스팅 계약 만료일에 이르러서야 실행에 옮겼다. 혹시 잊어먹을까 해서 그동안 했던 작업들을 정리해본다.

1. AWS 계정 만들기

맨 처음 해야할 일은 아마존 웹서비스라고 불리는 AWS 계정을 만드는 일이다. 1년간 무료에 혹해서 일단 만들었는데 신용 카드 정보를 입력해야한다. 이말은 즉, “테스트 서버를 1년간 돌리다 니가 그 서버를 직접 내리지 않으면 난 과금하겠다!” 라는 얘기. 하지만 뭐 이미 난 1년 내내 돌릴 개인 서버가 필요하므로 비용은 일단 무시하고 실행에 옮겼다! 다만 AWS는 초보자가 접근하기엔 무리가 좀 있지 싶다. 필요하다면 AWS Essential 무료 강의를 찾아서 듣길 권한다.

2. EC2 인스턴스 만들기

AWS에서 EC2라고 부르는 녀석은 Cafe24에서 가상 서버 호스팅이라고 부르는 가상 서버와 동일한 녀석이다. 일반적으로 서비스가 커지면 Application 서버와 DB 저장소 뿐만아니라 라우터와 로드 발란서도 두고 캐시 서버도 막 두고 그러던데,.. 솔직히 나도 그러고 싶었다. 개인적으로 블로그 외에 연습용 서비스를 몇개 만들어서 돌리고 있기 때문에 EC2 인스턴스를 여러개 만들어두고 올렸다 내렸다 하고 싶은데, 나중에 과금이 얼마나 될지 가늠이 안되서… 불안하다. 특히 DB를 분리할까말까 엄청 고민을 했다. 하지만 역시나 내 결론은 과금문제..ㅜㅜ.. 그래서 결론은 “EC2 서버 인스턴스 한대를 열씨미 쪼개서 써야겠다.” 라는 결론에 이르렀고 나중에 이사는 그만 다니고 싶어서 평생 AWS에서 살겠다는 각오로 EC2 인스턴스를 어떻게 활용할까 전략을 짰다.

3. EC2 인스턴스 활용 전략

일단 내가 EC2 인스턴스 하나에 개인 블로그를 포함해 몇개의 서비스를 돌릴지 추려봤다.

  1. 워드프레스 블로그 (Nginx + PHP + MySQL)
  2. 개인 위키 페이지 (Nginx + PHP + MySQL)
  3. NodeJS Application N 개 (nodejs + MongoDB)
  4. NodeJS Application M 개 (nodejs + MySQL)
  5. 기타 잡다 저장소

대충 요렇게 정리하고 보니 몇가지 걸림돌이있었다. 이전 서버에선 APM(Apache + PHP + MySQL) 조합을 이용했는데 이번에 Nginx로 갈아타려고 맘먹고 보니 Nginx 설정도 허들중에 하나였다. 물론 그보다 앞서 서버 접근 권한과 계정을 어떻게 정리하고 관리할지도 문제였다.

4. 서버 접근 권한 및 계정 정리

서버 접근 권한은 나에겐 좀 신세계였다. 나는 프로그래밍은 좋아하지만 리눅스라는 서버와는 그렇게 친숙하지 않기 때문에 찾아보고 옆 짝지한테 물어보고 참… 성가시게 굴었네. 학교 다닐때 나도 남들처럼 PC에 리눅스 좀 설치하고 “나 컴터 존나 잘해 리눅스 깔았꺼든.. 나 쫌 짱이지~?” 하며 뻐기고 다닐껄 그랬다. 특히나 리눅스라는걸 딱히 배우거나 공부한적도 없기 때문에 일반적으로 리눅스 유저들이 계정관리를 어떻게하는지 그게 진짜 궁금했다. 근데 나와 같은 궁금증을 가진 사람이 없는건지 다들 대충 쓰는건지 계정을 추가하거나 삭제하는 글들은 쉽게 검색해서 찾을수있는데, 어떤 룰을 가지고 계정관리를 하고 있는지 아무리 찾아도 안나오드라. ㅎㅎ 나만 못찾는건가? (꿍시렁.. 꿍시렁…)

나의 궁금증을 한번더 자극하는 것은 바로 EC2 서버에 접속하기 위한 Key Pair란 녀석이었다. 이전엔 서버 접속을 위해 계정과 비밀번호가 필요했는데 AWS는 비밀번호 자체가 필요없다는 것이다! 오호라~! 맨날 비번 입력하는거 귀찮았는데 이거 정말 좋은데? 라는 생각도 잠시,… ssh 도움말을 좀 읽어보니… ‘아~ 원래 있는거구나…ㅎㅎㅎ’ 암튼 EC2 서버는 공개키를 이용한 접속을 기본으로 제공한다. 이왕 하는 김에 접속 주소와 공개키를 alias로 엮어 놓으면 엄청 편했다. 공개키 생성관련 내용은 아마존 가이드 문서를 참고하시길….

$> vi ~/.bash_profile
alias "aws"="ssh -i [your-key-pair-name].pem ec2-user@xxx.xxx.xxx.xxx"
대충 요렇게 적고,...

$> source ~/.bash_profile
$> aws 

   __|  __|_  )
   _|  (     /   Amazon Linux AMI
  ___|\___|___|

Wow~~ 벌써 연결됐네... 엄청 간단한걸??? 

여튼 EC2 인스턴스를 만들면 ec2-user 라는 계정이 기본으로 생성되는데, 이 녀석은 sudo 권한이 있는 사실상의 루트라고 보면된다. 다만 루트(root)계정과 다른점은 sudo를 쳐야한다는 귀차니즘 정도? 어쨌든 루트 계정은 아니니까 보안 면에서는 일단 안심! 기존에 Cafe24 가상 서버를 사용할땐 어짜피 나 혼자 쓰는 서버고 또 다른 계정을 만드는 것도 귀찮아서 그냥 root로 접속해왔는데, 그때 무차별 패스워드 대입 공격(BruteForce)에 한번 털린 적이 있어서 Fail2ban도 걸어보고 별짓을 다 해봤던거 같다. 애초에 패스워드 접속을 막고 공개키로만 접속했다면 털리는 일은 없었을텐데… 하는 아쉬움을 뒤로하고 어찌됐든 AWS는 ec2-user라는 계정을 기본으로 생성해준다. 그래서 일단 요걸로 당분간 쓰고 필요할때 루트로 작업하는 걸로… 정리

리눅스를 설치하면 기본적으로 root와 더불어 wheel이 라는든가 demon, staff, bin, sshd, ftp 등등 그리고 apache라는 계정은 자동으로 만들어 주는지 어쨌는지는 모르겠지만 암튼 여러 계정을 자동으로 생성해준다. 어떤 계정들이 있는지 확인을 위해서는 /etc/passwd 파일을 확인해보면 된다.

$> cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
....
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
ec2-user:x:500:500:EC2 Default User:/home/ec2-user:/bin/bash
nginx:x:498:498:Nginx web server:/var/lib/nginx:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
....

보통 계정이 생성된 순서대로 기록되기 때문에 ec2-user 까지가 아마도 EC2 인스턴스를 만들면 자동으로 생성해주는게 아닐까 생각된다. 처음에 인스턴스 생성하고 확인해보지 않아서 정확히는 모르겠지만 그럴 가능성이 99.9% 일듯… 참고로 adduser 라는 명령으로 특별한 옵션없이 계정을 생성하면 생성된 계정의 ID는 500번 이후의 번호를 할당받는데, ec2-user가 500인걸로 봐서는 기본 셋팅후 가장먼저 생성한 계정이 아닐까 싶다. 그리고 ec2-user 이후로는 내가 설치한 프로그램의 돌아갈때 필요한 권한을 얻기 위해 자동으로 생성된 녀석이다.

그나저나 난 apache를 깐 기억이 없는데,.. 저 계정은 언제 생성된거징? 리눅스 설치하면 자동으로 생성되는건가? 아시는 분?? 댓글좀… 굽씬굽씬~

5. 계정과 프로세스 그리고 파일 및 폴더 소유자

그동안 리눅스 서버를 만지작 거리면서 계정은 서버에 접근하기 위한 일종의 로그인 유저, 그 이상 그 이하도 아니라서 크게 신경쓰지 않았다! 하지만 이 계정이 참 중요하다는 사실을 nginx에 워드프레스를 깔면서 새삼 실감했다. 어쩜 “개발자라면서 그건 기본인데 그것도 몰랐냐?” 할수도 있지만… 그래요 전 몰랐어요 흑흑… 지금이라도 알아서 참 다행이야!! 아는게 중요한게 아니라 제대로 이해했다는게 중요!!

일단 리눅스에서 프로그램을 실행시키면 누가 그 프로그램을 실행시켰는지 ps 명령어를 통해 알수있다.

$> ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Oct13 ?        00:00:01 /sbin/init
root         2     0  0 Oct13 ?        00:00:00 [kthreadd]
root         3     2  0 Oct13 ?        00:00:01 [ksoftirqd/0]
... 
mysql      447 32720  0 Nov03 ?        00:01:04 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysq
root       473     2  0 Oct13 ?        00:00:00 [md]
root       598     2  0 Oct13 ?        00:00:00 [khungtaskd]
... 

ps -ef 라는 명령을 치면 엄청 많이 나오기 때문에 필요한 것들만 필터해서 찾을수있는데 이때 grep를 사용하면 된다. grep는 정규식을 의미한다는건 참고로 알아두자!

$> ps -ef | grep nginx
nginx    17077 17075  0 Nov04 ?        00:00:05 php-fpm: pool www
nginx    17078 17075  0 Nov04 ?        00:00:05 php-fpm: pool www
...
root     26088     1  0 06:18 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx    26090 26088  0 06:18 ?        00:00:00 nginx: worker process
nginx    26400 17075  0 07:04 ?        00:00:00 php-fpm: pool www
ec2-user 26785 26605  0 09:06 pts/0    00:00:00 grep nginx

여기서 보면 nginx의 마스터 프로세스는 root가 실행시켰다. 그리고 실제로 동작하는 워크 프로세스는 nginx 라는 계정으로 실행됐다. 서버가 실행중에 항상 떠있는 데몬을 띄우기 위해서는 service 라는 명령을 이용해 프로그램을 실행시키는 경우가 있는데 service 명령은 ec2-user 계정으로는 권한이 없어서 실행이 안된다. 따라서 sudo를 사용하거나 root로 로그인 해야한다.

ec2-user $> sudo service nginx start
ec2-user $> sudo su
root $> service nginx start

암튼 이렇게 데몬으로 서비스되는 녀석들은 루트가 실행하고 실제 프로그램이 동작할때는 루트 권한을 주면 안되기 때문에 워커 프로세스에는 다른 권한으로 동작시키는 것 같다. 그래서 nginx 라는 계정이 nginx를 설치할때 자동으로 생성되고 이 계정으로 실제 nginx가 실행된다.

여기서 엔진엑스 서버가 nginx 계정으로 실행되는게 매우 중요한데 그 이유는 바로 워드프레스 때문이다. 워드프레스는 테마나 플러그인을 자동으로 다운받고 설치하는데 이때 다운받고 설치하는 일을 엔진엑스 프로세스가 하기 때문에 프로세스의 권한으로 파일을 생성하고 소유하게 된다.

아직 쓸 얘기가 많은데.. 오늘은 너무 많이 써서… 일단 내일 다시 To be continues….