본문 바로가기

Dev/PHP

[PHP] Ubuntu Linux에서의 LEMP 스택 + Laravel 개발 환경 설치 매뉴얼

 

 

 

작성일 기준으로 범용적으로 사용되고 있는 PHP 개발 스택인 LEMP 스택 설치 매뉴얼입니다.

LEMP스택은 Linux / (E) Nginx / MySQL / PHP의 약자입니다. (N은 E로 치환해서 부르는 듯합니다.)

 

이와 비슷한 스택으로는 LAMP 스택이 있고, 오히려 이쪽이 오래 사용되었습니다.

A는 Apache의 약자입니다.

 

본 포스팅은 Ubuntu 18.04 / 19.10 / 20.04 환경에서 LEMP 스택과 Laravel 프레임워크 개발 환경을 구축하는 매뉴얼입니다.

따라서 Ubuntu가 아닌 다른 리눅스 체계에서는 설치 방법이 다소 다를 수 있음을 알려드립니다.

 

1. Nginx 설치

$ sudo apt-get update
$ sudo apt-get install nginx

 

*만약 Apache 서버가 설치되었고, 실행 중인 상태라면 일단 Apache 서버를 죽이고 설치하시길 바랍니다.

Nginx와 Apache 서버는 기본 포트가 80번으로 설정되기 때문에 Nginx가 기동 하지 않습니다.

본인의 Apache 서버가 80번 포트를 사용하고 있지 않다면 서버를 죽이지 않고 그냥 설치해도 무방합니다.

 

설치가 완료되었다면 웹 브라우저에서 localhost:80으로 접속해서 Welcome to nginx!로 시작하는 웹 페이지가 나오는지 확인합니다.

(접속 포트 설정을 통해 변경할 수 있습니다.)

 

 

위와 같은 페이지가 출력된다면 정상적으로 설치가 완료된 것입니다.

 

2. MySQL 설치

Mysql은 작성일 기준으로 버전 명세 없이 설치할 경우 5.7 버전으로 설치됩니다.

mysql5.1 이후부터는 플러그인 API가 도입됨으로 인 해 초기 세팅으로는 sudo 권한이 아니면 root 계정으로 접속할 수가 없습니다.

 

사실 sudo mysql -u root -p로 한 번만 접속해서 사용자용 계정을 만들어 그것을 이용하는 것이 가장 바람직합니다.

 

본 포스팅 시리즈에서는 편의상 root 계정을 사용하는 것을 예시로 작성되므로, 아래의  링크를 참조해서 설치해 줍니다.

 

2020/03/12 - [Dev/etc] - Linux 환경에서의 MySql5.1~ 설치와 root 계정 접속 세팅

 

Linux 환경에서의 MySql5.1~ 설치와 root 계정 접속 세팅

본 포스팅은 Linux(Ubuntu) 환경에서 mysql 설치와, mysql root 계정 접속 세팅 방법을 설명합니다. mysql 5.1 버전 이 후부터는 플러그인 개념이 도입되면서 초기 상태만으론 sudo권한 없이는 mysql의 root 계정..

dev-overload.tistory.com

 

(선택사항) 위 과정이 완료되었다면, 추가로 workbench를 설치하면 생산성에 도움이 됩니다.

더보기
$ sudo apt-get install mysql-workbench

 

 

Mysql-workbench는 DB를 시각적으로 쉽게 편집, 생성, 관리하는 도구입니다.

단순히 편의성을 위한 도구이므로, 설치하지 않아도 무방합니다. 

 

3. PHP 설치

$ sudo apt-get install php php-fpm php-mysql

 

php-mysql은 php에서 mysql로 접속할 수 있게 하는 필수 패키지입니다.

php-fpm은 Nginx에서 동적인 페이지 구현을 위해 설치해야 할 필수 패키지입니다.

Nginx는 Apache와는 다르게 php모듈이 포함되어 있지 않기 때문에, 반드시 설치해주어야 합니다.

Apache 개발 환경의 경우 별도 설치할 필요가 없습니다.

 

저의 경우, php는 작성일 기준 7.3 버전으로 설치되었습니다.

(과거 버전을 설치할 경우 버전을 붙여 주어야 합니다만, Laravel 프레임워크가 지원하는 PHP 버전은 7.1 버전 이상이므로 가능하다면 최신 버전을 설치하는 것을 권장합니다.)

 

설치가 완료되었으면 다음으로 php.ini을 편집합니다.

 

지금부터는 본인이 설치한 php 버전을 유념하면서 진행해 주시길 바랍니다.

 

본 가이드에서는 nano 에디터를 사용합니만, 어느 에디터를 사용해도 무방합니다.

 

$ sudo nano /etc/php/7.3/fpm/php.ini

 

문서 내 cgi.fix_pathinfo=1로 되어 있는 부분의 주석( ; )을 제거하고

보안을 위해 페이지가 없을 경우에 cgi가 인접한 페이지를 찾지 않도록, 값을 1에서 0으로 변경해줍니다.

(nano 에디터 기준 ctrl + w를 누른 다음 cgi.fix_pathinfo를 입력하면 손쉽게 색인 가능합니다.)

 

설정이 완료되었다면 php-fpm을 재시작해서 설정을 적용해 주도록 합니다.

 

$ sudo service php7.3-fpm restart

 

4. Nginx Php 연동 설정

$ sudo nano /etc/nginx/sites-available/default

 

default 파일은 1단계에서 nginx 설치를 마치고 브라우저에서 localhost:80을 열었을 때 뜨는 기본 페이지의 설정 파일입니다.

default 파일에는 아래의 내용이 작성되어 있습니다.

 

server {
        listen 80 default_server;
        listen [::]:80 default_server;
		
	root /var/www/html;
        
        index index.html index.htm index.nginx-debian.html;

        server_name _;

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

 

여기서, php 연동을 위해 아래와 같이 수정해 줍니다.

 

server {
        listen 80 default_server;
        listen [::]:80 default_server;
		
        root /var/www/html;

        index index.php index.html index.htm index.nginx-debian.html;

        server_name [서버 이름 및 ip주소];

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

        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
        }

        location ~ /\.ht {
            deny all;
        }
}

 

추가 해준 항목은 아래와 같습니다.

1. index 항목에 index.php 파일 추가.

2. servcer_name에 서버 이름 및 ip주소 추가

3. .php로 끝나는 파일의 요청이 들어왔을 때 php-fpm 패키지를 참조하도록 추가.

(설치되어있는 php-fpm 버전에 맞게 입력해 주어야 합니다.)

 

4. .ht 로 시작하는 파일은 접근을 거부하도록 추가합니다. 이는 htaccess, htpasswd 등 설정 파일, 인증 파일에 대한 직접 접근을 막겠다는 의미입니다.

이 파일에 대한 직접 접근을 허용할 경우 심각한 보안상 위험을 초래할 수 있습니다.

 

작성 후, 아래의 명령어를 통해 코드가 제대로 작성되었는지 테스트 후, 서버를 재시작합니다.

명령어 $ sudo nginx -t를 실행할 때 터미널에서 오류를 뱉는다면 각 블록의 괄호가 제대로 닫혔는지, 문법 오류는 없는지 확인합니다.

 

$ sudo nginx -t
$ sudo service nginx restart

 

이로써 LEMP 스택 구축은 모두 완료되었습니다.

 

5. Composer 패키지 매니저 설치

Laravel 프레임워크를 설치하기 위해서는 패키지 관리자 설치를 선행해야 할 필요가 있습니다.

Laravel은 기본적으로 composer라는 패키지 관리자를 이용합니다.

https://getcomposer.org/

 

Composer

A Dependency Manager for PHP Latest: 1.9.2 Getting Started Download Documentation Browse Packages Issues GitHub

getcomposer.org

 

$ cd
$ curl -sS https://getcomposer.org/installer | php
$ sudo mv composer.phar /usr/local/bin/composer

 

설치 이후에 사용자 경로에(/home/유저명) composer.phar가 생성되게 됩니다.

이 파일은 글로벌로 사용하기 위해 /usr/local/bin/composer로 옮겨줍니다.

 

이제 Laravel 프레임워크를 설치할 준비가 되었습니다.

 

6. Laravel 설치

https://laravel.kr/docs/6.x/installation

 

라라벨 6.x - 설치하기

라라벨 한글 메뉴얼 6.x - 설치하기

laravel.kr

이 항목은 Laravel 공식 도큐먼트를 참고해도 무방하지만 도큐먼트에서 설명하지 않는 내용을 포함해 대략적인 내용을 기술합니다.

 

Laravel 프레임워크를 사용하기 위해서는 아래의 PHP 확장 모듈 설치 조건을 충족해야 합니다.

 

PHP >= 7.1.3
BCMath PHP Extension
Ctype PHP Extension
JSON PHP Extension
Mbstring PHP Extension
OpenSSL PHP Extension
PDO PHP Extension
Tokenizer PHP Extension
XML PHP Extension

 

위 모듈이 설치되어 있는지 확인하는 방법은 아래와 같습니다.

 

$ php -m

[PHP Modules]
calendar
Core
ctype
date
dom
exif
fileinfo
filter
ftp
gettext
hash
...

 

모듈을 대조해보고 없는 것은 apt-get install을 통해 추가해 줍니다.

php 모듈 패키지 이름은 php-* 로 시작합니다. (ex: apt-get install php-mbstring)

 

모듈 추가가 완료되었다면 composer를 이용해 laravel/installer를 설치합니다.

 

$ composer global require laravel/installer

 

만약, 필요한 PHP 확장 모듈이 설치되지 않았다면 이 단계에서 필요한 모듈이 없다는 에러를 출력합니다.

에러를 확인하고 누락된 모듈을 설치해줍니다.

설치가 완료되었다면, 시스템이 laravel 명령어를 찾을 수 있도록 환경 변수를 추가해 줍니다.

 

$ nano ~/.bashrc

#[아래 내용을 파일 최 하단에 추가해 줍니다.]
PATH=$PATH:$HOME/.config/composer/vendor/bin

 

작성 후, 아래의 명령어로 추가한 환경 변수를 시스템에 적용해 줍니다.

 

$ source ~/.bashrc

 

이제 laravel 명령어를 사용할 수 있습니다.

프로젝트를 생성하고 싶은 디렉터리로 이동 후 아래의 명령어를 사용해 신규 프로젝트를 생성합니다.

 

$ laravel new test

 

composer 명령어 실행 때와 마찬가지로, 여기서도 PHP 모듈이 설치되지 않았다면 에러를 출력합니다.

터미널에서 출력해주는 에러 로그를 살펴보고, 없는 패키지를 설치한 후 다시 명령어를 입력하면 정상적으로 프로젝트가 생성됩니다.

 

이제 test라는 이름의 프로젝트가 생성되었습니다.

아래는 방금 생성한 Laravel프로젝트의 디렉토리 구조입니다.

 

$ tree -L 1
.
├── README.md
├── app 				(dir)
├── artisan
├── bootstrap 			(dir)
├── composer.json
├── composer.lock
├── config 				(dir)
├── database 			(dir)
├── package.json
├── phpunit.xml
├── public 				(dir)
├── resources 			(dir)
├── routes 				(dir)
├── server.php
├── storage 				(dir)
├── tests 				(dir)
├── vendor				(dir)
└── webpack.mix.js

10 directories, 8 files

 

생성한 프로젝트의 웹  페이지에 띄우기 위한 방법은 여러 가지가 있지만, 먼저 테스트를 위해 php 내장 서버를 열어 포트 번호를 할당받는 것으로 테스트가 가능합니다.

 

$ php artisan serve

 

위 명령어는 기본적으로 8000번 포트로 서버 포트를 할당받지만, 이미 8000번 포트가 다른 곳에서 할당되어 있는 경우 8001... 8002등으로 할당받습니다.

 

 

터미널에서 출력해주는 포트 번호를 확인하고 브라우저에 접속해 정상적으로 세팅되었는지 확인합니다.

 

 

Laravel이라는 문구가 보이면 모든 패키지 설정이 정상적으로 설치된 것입니다.

하지만 이는 개발을 위해 php 내장 서버로 실행한 것이므로, 이후 Nginx에 연결하는 작업이 필요합니다.

 

7. Laravel 프로젝트 Nginx 연결

/etc/nginx/sites-available에 앞서 생성한 test프로젝트와 동일한 이름으로 파일을 생성하고 내용을 기입합니다. (파일 이름 설정은 권장 사항입니다. 다른 이름으로 해도 무방합니다. ex: test_dev, test_open, etc...)

 

$ sudo nano /etc/nginx/sites-available/test

#[아래의 내용을 입력합니다]

server {
        listen 81;
        listen [::]:81;
		
	root /var/www/test/public;

	index index.php index.html index.htm index.nginx-debian.html;

        server_name [서버 이름 및 ip주소];

        location / {
        	try_files $uri $uri/ /index.php?$query_string =404;
        }
        
        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
        }
        
        location ~ /\.ht {
            deny all;
        }
}

 

기본적으로 default에 있는 코드를 그대로 가져와도 되지만, 포트번호와 root 경로는 반드시 변경해 주도록 합니다.

포트 번호는 이미 80번 경로가 default로 사용되고 있으므로 본 예시에서는 81번으로 설정합니다.

또한, default파일의 서버 블록에 존재했던 default_server 설정은 하나의 서버 블록에만 존재해야 하므로 지금 작성하는 test 파일에서는 제외합니다.

default_server 설정은, 도메인 적용 시 프로젝트에서 지정한 도메인이 아닐 경우에 처리하는 서버 블록임을 의미합니다.

 

root에 작성한 test/public 경로는 Laravel 프로젝트의 루트 경로로, 현재는 var/www/ 경로에 없지만 작성 이후 심볼릭 링크를 통해 해당 경로에 추가해 줄 예정이므로 미리 작성해 줍니다.

 

[중요!]

또한 코드 블록 location / 에서

try_files $uri $uri/ =404;

try_files $uri $uri/ /index.php?$query_string =404;

로 변경해 줍니다.

 

변경하는 이유는, 이 구문을 넣지 않을 경우 설정한 root 디렉터리에 페이지 소스가 있음에도 페이지를 찾지 못하는 현상이 발생합니다.

따라서, 위 구문을 통해 페이지에 대한 모든 요청을 Laravel 프로젝트의 프런트 컨트롤러인 index.php로 거쳐 모든 http 요청을 처리하도록 해야 정상적으로 각 페이지들이 동작합니다.

참고로 index.php의 경로는 생성한 Laravel 프로젝트의 public/ 디렉터리에 존재합니다.

 

작성이 완료되었으면 test 파일을 sites-enabled/ 디렉터리로 심볼릭 링크를 만들어줍니다.

 

$ sudo ln -s /etc/nginx/sites-available/test /etc/nginx/sites-enabled/

 

이제 Nginx 서버에서 81번 포트를 test 프로젝트에 할당할 준비가 끝났습니다.

이제 /var/www 디렉터리에 사전에 만들어둔 test 프로젝트를 심볼릭 링크로 연결합니다.

(권장하지는 않지만 프로젝트를 통째로 옮겨도 되고 하드 링크로 연결해도 됩니다.)

 

$ sudo ln -s /home/유저명/test /var/www

 

sites-enabled/test가 제대로 작성되었는지 테스트 후, Nginx 서버를 재시작합니다.

 

$ sudo nginx -t
$ sudo service nginx restart

 

8. Laravel 프로젝트 Log 파일 접근 권한 설정

이제 81번 포트로 접속하면 아마도 프로젝트로 요청은 가지만 Log 접근 권한 에러를 뱉어낼 수도 있습니다.

 

 

이 경우, 생성한 Laravel 프로젝트에서 Log 파일들을 서버가 읽고 쓸 수 있도록 권한을 부여해야 합니다.

권한 조정이 필요한 파일들은 Laravel 프로젝트 내 bootstrap/storage/ 디렉터리입니다.

아래의 명령어로 해당 디렉터리의 하위 파일들의 읽고 쓰기 권한을 부여하도록 합니다.

$ sudo chmod 777 -R [프로젝트 경로]/bootstrap
$ sudo chmod 777 -R [프로젝트 경로]/storage

 

이상으로 LEMP 스택 개발 환경 구축이 완료되었습니다.

다음 포스팅에서는 Laravel 프로젝트에서 DB 마이그레이션과 MySQL 연결에 대해 작성할 예정입니다.