OS X 10.11 앨 캐피탄에 LEMP 개발환경 설치하기 (Nginx, MySQL, PHP 7.0)

업데이트: 2015.12. PHP 7.0 릴리즈에 맞춰 수정되었습니다.

LEMP 소프트웨어 스택은 동적 웹 어플리케이션을 구현하기 위해서 필요한 Linux + Nginx + MySQL + PHP를 모아서 부르는 말이라고 합니다. (LNMP가 아니고 LEMP인게 특이하네요.)

이 포스팅에서는 OS X 10.11 앨 캐피탄(El Capitan)에 LEMP 기반 웹 개발환경을 설치하는 방법에 대해서 소개합니다. OS X 10.11에는 보안 강화를 위해 루트리스(Rootless)가 도입되었는데요, 이제 일반 사용자가 /usr/bin 폴더에 접근할 수 없게 되었습니다. 앞으로 다룰 내용들은 Jonas Friedmann의 포스팅을 토대로 루트리스 환경에 맞게 수정되었습니다.

출처: Install Nginx, PHP-FPM, MySQL and phpMyAdmin on OS X Mavericks or Yosemite


1. Xcode 설치

가장 먼저 최신 버전의 Xcode를 설치해야 합니다. 이후에 설치할 프로그램들이 사용하는 라이브러리들이 Xcode 에서 제공하는 커맨드 라인 툴에 포함되어 있기 때문입니다. 앱스토어에서 Xcode 7 이상을 다운받습니다. Mac App Store에서 Xcode 다운받기

Xcode_store

다운이 완료되면 Xcode를 실행한 후 사용자 동의(Agree)를 누릅니다.

Xcode_agree

이제 터미널(Terminal.app)을 열고 다음과 같이 명령어를 칩니다.

$ xcode-select --install

Software Update가 뜨게 되는데 여기서 Install을 눌러서 계속 진행합니다. 설치가 완료되면 Xcode 메뉴 중 Preference에서 Locations 탭에 들어가셔서 다음과 같이 Command Line Tools가 지정되어 있는지 확인합니다.

Xcode_preferences


2. Homebrew 설치

홈브류는 맥에서 리눅스 패키지를 손쉽게 설치할 수 있는 패키지 관리자입니다. 클린 설치한 OS X 10.11의 경우 터미널에 다음과 같이 명령어를 입력하여 설치합니다. 그 외의 상황에서는 이 포스팅을 참고하여 진행합니다.

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

설치가 완료되면 다음과 같이 입력하여 혹시 있을지 모르는 패키지 충돌을 체크합니다.

$ brew doctor

brew 자체를 최신으로 유지하기 위해 다음과 같이 입력합니다.

$ brew update && brew upgrade

3. PHP-FPM 설치

PHP-FPM은 PHP와 웹 서버(Nginx)를 연결해주는 모듈입니다. Homebrew에는 PHP-FPM의 설치정보가 기본적으로 포함되어 있지 않기 때문에 다음과 같이 입력하여 formula를 추가하여 줍니다. formula는 어떤 위치에서 파일을 받아야 하는지를 담고 있는 파일입니다.

$ brew tap homebrew/dupes
$ brew tap homebrew/php

이제 다음과 같이 입력하여 PHP를 설치합니다. 버전의 경우 php55나 php56 등과 같이 선택할 수 있습니다.

$ brew install --without-apache --with-fpm --with-mysql php70

Terminal_message

설치가 완료된 후 터미널에 표시된 대로 명령어를 추가 입력하여, 시스템이 재시작 될 때 자동으로 서비스가 시작되도록 설정합니다.

$ mkdir -p ~/Library/LaunchAgents
$ ln -sfv /usr/local/opt/php70/homebrew.mxcl.php70.plist ~/Library/LaunchAgents

다음으로 타임존 설정을 합니다. /usr/local/etc/php/7.0/php.ini 파일을 열어 다음과 같이 date.timezone 부분을 주석 해제하고 Asia/Seoul이라고 입력합니다.

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Asia/Seoul;

다음과 같이 입력하면 PHP-FPM이 시작됩니다.

$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php70.plist

설치가 제대로 되었는지 확인을 위해서는 다음과 같이 입력합니다.

$ lsof -Pni4 | grep LISTEN | grep php

아래와 같이 9000번 포트에서 응답을 대기하고 있으면 정상적으로 설치된 것입니다.

php-fpm   687 user    6u  IPv4 0x0000000000000000      0t0  TCP 127.0.0.1:9000 (LISTEN)
php-fpm   688 user    0u  IPv4 0x0000000000000000      0t0  TCP 127.0.0.1:9000 (LISTEN)
php-fpm   689 user    0u  IPv4 0x0000000000000000      0t0  TCP 127.0.0.1:9000 (LISTEN)

4. MySQL 설치

이번에는 MySQL을 설치합니다.

$ brew install mysql

설치를 마치면 다음과 같이 입력하여 PHP-FPM과 마찬가지로 시스템이 시작될 때 자동 실행하도록 합니다.

$ ln -sfv /usr/local/opt/mysql/*.plist ~/Library/LaunchAgents
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist

설치를 마친 후에 다음과 같이 입력하여 보안 설정을 합니다. MySQL은 최초 설치시에 보안적으로 느슨하게 설정되어 있는데 이를 재설정하는 것입니다.

mysql_secure_installation

이제 순서적으로 나오는 질문에 다음과 같이 답변합니다.

Enter current password for root (enter for none): <엔터 입력>
Set root password? [Y/n]  Y
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n]  Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y

이제 다음과 같이 입력하면 root 사용자로 접속하게 됩니다.

$ mysql -u root -p

5. phpMyAdmin

phpMyAdmin은 오랜동안 사랑받아 왔던 MySQL 관리자 인터페이스입니다. 설치를 위해선 autoconf라는 모듈을 먼저 설치해야 합니다.

$ brew install autoconf

설치가 완료되면 다음과 같이 phpMyAdmin을 설치합니다.

$ brew install phpmyadmin

6. Nginx 설치

Nginx(엔진엑스)는 Apache 이후로 각광받고 있는 웹서버입니다. 다음과 같이 설치합니다.

$ brew install nginx

다음과 같이 입력하여 자동 실행되도록 합니다. 아래 방법은 80번 포트를 사용하기 위해서 /Library 폴더에 넣고 root 권한을 주는 방법입니다.

$ sudo ln -sfv /usr/local/opt/nginx/*.plist /Library/LaunchDaemons
$ sudo chown root:wheel /Library/LaunchDaemons/homebrew.mxcl.nginx.plist
$ sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.nginx.plist

이제 http://localhost:8080에 접속하여 다음과 같이 화면이 뜨는지 확인합니다.

Nginx running

Nginx를 중지하려면 다음과 같이 입력합니다.

$ sudo launchctl unload /Library/LaunchDaemons/homebrew.mxcl.nginx.plist

7. 환경설정

이제부터 사이트 추가에 필요한 환경설정을 해봅니다. 먼저 /usr/local/etc/nginx/nginx.conf 파일을 다음과 같이 수정합니다. 가장 압축적으로 기본적인 사항만 담겨 있기 때문에 포함되지 않은 내용은 추가가 필요할 수 있습니다.

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include             mime.types;
    default_type        application/octet-stream;

    sendfile            on;
    keepalive_timeout   65;

    index               index.php index.html;

    include servers/*;
}

이제 /usr/local/etc/nginx/servers 폴더에 site.conf와 같이 설정파일을 추가하여 다음과 같이 입력합니다. 이 설정파일은 여러 개를 지정할 수 있습니다. server_name 부분은 뒤에서 설정할 개발용 도메인을 설정하는 부분입니다. /Users/user/Sites/site 부분은 실제로 지정할 홈 폴더로 지정합니다.

server {
	listen		80;
	server_name	site.app;
	root		/Users/user/Sites/site;

	location / {
		try_files $uri $uri/ =404;
	}

	location ~ \.php$ {
		try_files	   $uri = 404;
		fastcgi_pass   127.0.0.1:9000;
		fastcgi_index  index.php;
		fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
		include		   fastcgi_params;
	}

	error_page 404 /404.html;
	error_page 500 502 503 504 /50x.html;
}

phpMyAdmin을 실행하기 위해 /usr/local/etc/nginx/servers/phpmyadmin.conf 파일을 다음과 같이 작성합니다.

server {
    listen       80;
    server_name  pma.app;
    root         /usr/local/share/phpmyadmin;

    location ~ \.php$ {
        try_files      $uri = 404;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

이제 변경사항을 적용하려면 nginx를 재시작해야 합니다. 앞으로도 nginx 등의 서비스를 시작/정지/재시작 할 일이 많기 때문에 단축 명령어를 설정하겠습니다. 먼저 ~/.bash_aliases 파일을 다음과 같이 작성합니다.

alias nginx.start='sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.nginx.plist'
alias nginx.stop='sudo launchctl unload /Library/LaunchDaemons/homebrew.mxcl.nginx.plist'
alias nginx.restart='nginx.stop && nginx.start'
alias php-fpm.start="launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php70.plist"
alias php-fpm.stop="launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.php70.plist"
alias php-fpm.restart='php-fpm.stop && php-fpm.start'
alias mysql.start="launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist"
alias mysql.stop="launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist"
alias mysql.restart='mysql.stop && mysql.start'
alias nginx.logs.error='tail -250f /usr/local/etc/nginx/logs/error.log'
alias nginx.logs.access='tail -250f /usr/local/etc/nginx/logs/access.log'
alias nginx.logs.default.access='tail -250f /usr/local/etc/nginx/logs/default.access.log'
alias nginx.logs.default-ssl.access='tail -250f /usr/local/etc/nginx/logs/default-ssl.access.log'
alias nginx.logs.phpmyadmin.error='tail -250f /usr/local/etc/nginx/logs/phpmyadmin.error.log'
alias nginx.logs.phpmyadmin.access='tail -250f /usr/local/etc/nginx/logs/phpmyadmin.access.log'

그리고 ~/.bash_profile 파일을 다음과 같이 작성합니다.

source ~/.bash_aliases

이제 새 터미널을 실행해서 다음과 같이 입력해서 서비스를 정지하고 시작합니다.

$ nginx.stop
$ nginx.start

여기까지 진행 하셨다면 /Users/user/Sites/site/index.php 파일을 생성하신 후 다음과 같이 입력하여 테스트 페이지를 생성해보겠습니다.

<?php
    phpinfo();

개발용 도메인 적용을 위해서 관리자 권한으로 /private/etc/hosts 파일을 수정합니다.

$ vi /private/etc/hosts

다음과 같이 아래 두 줄을 추가합니다.

##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1       localhost
255.255.255.255 broadcasthost
::1             localhost
127.0.0.1       site.app
127.0.0.1       pma.app

이제 http://site.app에 접속하셔서 다음과 같은 창이 뜨면 PHP가 정상적으로 동작하는 것을 확인하실 수 있게 됩니다.

Success


8. Composer 설치

Composer는 PHP계의 npm같은 패키지 매니저입니다. 터미널에서 다음과 같이 입력하여 설치합니다.

$ curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer

이렇게 로컬에 구성된 웹 개발환경은 이후 Laravel 등의 개발에 유용하게 사용하실 수 있습니다. Laravel 구동은 위의 환경설정에서 Pretty URL을 지원하기 위해 /usr/local/etc/nginx/servers/site.conf 파일에서 try_files 부분을 다음과 같이 수정하면 됩니다.

location / {
    try_files $uri $uri/ /index.php?$query_string;
}
comments powered by Disqus