본문 바로가기

Dev/PHP

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

 

Laravel PHP Framework

 

 

본 포스팅은 Arch Linux에서 LEMP을 스택 구축하기 위한 매뉴얼입니다.

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

 

이전에 Ubuntu Linux 환경에서 LEMP 스택을 구축하는 포스팅을 업로드한 바가 있습니다.

Ubuntu에서 LEMP 스택을 구축하실 분은 아래의 포스팅을 참고해주세요.

2020/02/01 - [Dev/PHP] - [PHP] Ubuntu Linux에서의 LEMP 스택 + Laravel 개발 환경 설치 매뉴얼

 

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

작성일 기준으로 범용적으로 사용되고 있는 PHP 개발 스택인 LEMP 스택 설치 매뉴얼입니다. LEMP스택은 Linux / (E)Nginx / MySQL / PHP의 약자입니다. (N은 E로 치환해서 부르는 듯합니다.) 이와 비슷한 스택

dev-overload.tistory.com

 

 

본 포스팅은 Arch Linux가 구축이 되어있음을 전제로 진행됩니다.

Ubuntu에서 설치할 때와 과정은 유사하지만 권한 설정과 시스템 구조, 서버 설정 구조가 조금 다르므로 모든 Linux와 과정이 일치하지는 않습니다.

 

만약 Arch Linux가 구축되어있지 않다면 아래의 포스팅을 참고해주세요.

2020/09/10 - [Dev/linux] - [Linux] Install Arch Linux on Virtual Box

 

Install Arch Linux on Virtual Box

본 포스팅은 Virtual Box에서 Arch Linux를 설치하는 과정에 대한 기록입니다. 설치 환경은 Windows10에서 VirtualBox를 통해 UEFI 소프트웨어 인터페이스 상에서 진행되었습니다. 만약 BIOS 환경에서 구축을 �

dev-overload.tistory.com

1. Nginx 설치

$ sudo pacman -Syu
$ sudo pacman -S nginx

패키지 업데이트 후, nginx를 설치합니다.

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

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

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

 

여기서 Ubuntu에서의 구축과 다른 점이 한 가지 나왔습니다.

nginx 설치 직후, sudo systemctl status nginx 명령어로 nginx의 상태를 살펴보겠습니다.

 

 

보다시피 Arch Linux는 패키지를 설치했다고 해서 설치한 패키지가 실행되는 것이 아닙니다.

아래의 명령어로 항시 실행하도록 설정하겠습니다.

 

#[nginx 실행]
$ sudo systemctl start nginx

#[시스템이 부팅되었을 때 자동으로 실행한다.]
$ sudo systemctl enable nginx

nginx가 활성화되었습니다.

앞으로는 리눅스를 부팅할 때마다 자동으로 활성화될 것입니다.

 

sudo systemctl status nginx 명령어로 nginx의 상태를 확인해 보면 위 사진과 같이 경고를 띄우는 경우가 있습니다.

이는 nginx.conf 파일에 정적인 데이터를 저장할 해쉬 테이블 사이즈를 지정하지 않아서 생기는 문제로, 아래의 명령어를 통해 추가해 주면 문제는 해결 됩니다.

 

$ sudo nano /etc/nginx/nginx.conf

# http블럭 안 server{ } 블럭 위에 구문 추가.
types_hash_max_size 4096;

# 문서 저장 후 닫고 아래의 명령어 수행

$ sudo systemctl status nginx

 

 

경고문이 없어진 것을 확인 할 수 있습니다.

 

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

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

 

 

 

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

 

2. MySQL(MariaDB) 설치

작성일 기준으로 Arch Linux 기본 패키지 목록에는 Mysql이 없습니다.

따라서 Mysql과 그 기반이 같은 MariaDB를 설치하도록 하겠습니다.

Mysql과 구조와 기능은 거의 동일합니다.

(터미널에서 접속할 때도 mysql -u root -p과 같이 접속 가능합니다.)

 

$ sudo pacman -S mariadb
$ sudo mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql

 

마찬가지로 systemctl로 활성화시켜줍니다.

$ sudo systemctl start mariadb
$ sudo systemctl enable mariadb

 

 

mysql은 5.1 이후부터는 플러그인 API가 도입됨으로 인 해 초기 세팅으로는 sudo 권한이 아니면 root 계정으로 접속할 수가 없습니다. MariaDB는 Mysql5.5 이상의 버전을 기반으로 개발되었습니다.

따라서 설치된 MariaDB 또한 root 권한 접속 및 계정을 생성하기 위해서는 별도의 조치를 취해야 합니다.

 

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

 

만약, root 계정을 sudo 권한 없이 사용해야 하는 상황이라면 아래의 링크를 참조해주세요.

 

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

 

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

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

dev-overload.tistory.com

 

3. PHP 설치

$ sudo pacman -S php php-fpm

Ubuntu에서 세팅할 때는 php-mysql을 설치해야 했지만 Arch Linux에서는 설치할 필요가 없습니다.

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

 

php-fpm을 활성화시켜줍니다.

$ sudo systemctl start php-fpm
$ sudo systemctl enable php-fpm

 

 

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

$ sudo nano /etc/php/php.ini

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

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

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

 

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

$ sudo systemctl restart php-fpm

 

4. Nginx PHP 연동 설정

Nginx에 프로젝트를 배포할 때는 /etc/nginx/nginx.conf 파일에서 각 프로젝트별 서버 정보를 관리합니다.

하지만 nginx.conf 파일을 직접 제어하는 것은 권장하지 않는데, 그 이유는 프로젝트가 많아질수록 관리하기가 까다롭고 파일의 길이가 길어져 가독성도 떨어지기 때문입니다.

따라서, 각 프로젝트별 서버 정보를 각각의 파일로 관리할 필요가 있는데, Ubuntu 등의 Linux에서는 이를 nginx.conf파일과 sites-available, sites-enabled 디렉터리로 나누어 효율적으로 관리합니다.

 

각 디렉터리와 파일의 역할은 다음과 같습니다.

 

  • sites-available: 배포할 프로젝트의 서버 설정 파일 배치
  • sites-enabled: sites-available 디렉터리의 설정 파일들을 심볼릭 링크로 지정한다.
  • nginx.conf: 실제 nginx에 배포될 서버 정보를 sites-enabled에서 include 해 가져온다.

이를 좀 더 알기 쉽게 그림으로 표현하자면 아래와 같습니다.

 

 

sites-enabled에 있는 설정 파일을 nginx.conf에 include해서 설정 정보를 받는다.

 

 

 

Ubuntu에서는 nginx를 설치 할 때 이를 자동으로 생성해줍니다.

하지만 Arch Linux에서는 sites-available, sites-enabled 디렉터리가 따로 존재하지 않습니다.

따라서 사용자가 직접 해당 구조를 만들어주어야 합니다.

 

먼저, 아래의 명령어로 디렉터리를 생성해줍니다.

 

$ sudo mkdir /etc/nginx/sites-available
$ sudo mkdir /etc/nginx/sites-enabled

 

다음으로 nginx.conf에서 sites-enabled/*에 있는 파일들을 읽어 들일 수 있도록 처리합니다.

$ sudo nano /etc/nginx/nginx.conf

# http블럭 안 server{ } 블럭 아래에 구문 추가.
include sites-enabled/*;

 

 

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

$ sudo nginx -t
$ sudo systemctl restart nginx

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

 

 

이제 프로젝트가 배포될 디렉터리를 생성합니다.

사실 어디에 생성해도 무방하지만 저는 Ubuntu에서 구축할 때와 동일한 경로에 지정하겠습니다.

(이 경로 또한 Ubuntu에서는 자동으로 생성해줍니다.)

$ sudo mkdir /var/www

 

 

5. Composer 패키지 매니저 설치

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

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

 

https://getcomposer.org/

 

Composer

A Dependency Manager for PHP Latest: 1.10.13 (changelog) A preview release for our next major version is available!Try out 2.0.0-RC1 (changelog) now using composer self-update --preview 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을 설치하기 위해서는 php 확장 모듈을 설치해야 한다고 설명되어있지만, Arch Linux에서는 별도 설치할 필요가 없습니다.

아래의 명령어로 바로 Laravel을 설치합니다.

 

$ composer global require laravel/installer

 

 

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

 

$ nano ~/.bashrc

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

#환경 변수 적용
$ source ~/.bashrc

 

이제 laravel 명령어를 사용해 프로젝트를 추가할 수 있습니다.

저는 /home/사용자/ 디렉터리에 test라는 이름의 프로젝트를 생성하겠습니다.

 

$laravel new test

 

 

Arch Linux - Laravel porject create

 

 

아래는 방금 생성한 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 내장 서버를 열어 접속해봅니다.

 

$ cd test
$ php artisan serve

 

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

 

 

 

 

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

 

 

 

 

위와 같은 페이지가 열리면 모든 설치 과정이 정상적으로 완료된 것입니다.

이제 처음 설치한 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.html;
	
	server_name localhost;
	location / {
		try_files $uri $uri/ /index.php?$query_string = 404;
	}
	location ~\.php {
		include fastcgi.conf;
		fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
	}
	location ~/\.ht {
		deny all;
	}
}

 

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

 

[중요!]

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

 

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

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

참고로 index.php의 경로는 생성한 Laravel 프로젝트의 public/ 디렉터리에 존재합니다.
(따라서 위 코드에서 root 항목의 경로를 test/public 으로 설정합니다.)

 

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

 

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

 

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

이제 /var/www 디렉터리에 사전에 만들어둔 test 프로젝트를 심볼릭 링크로 연결하고 nginx와 php-fpm을 재시작합니다.

 

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

$ sudo systemctl start php-fpm
$ sudo systemctl restart nginx

 

 

파일 배치와 서버 설정은 완료되었습니다.

하지만 이대로 서버를 구동하면 Nginx가 배포한 프로젝트의 위치에 접근할 수 있는 권한이 없기 때문에 (13: Permission denied) 에러가 발생합니다. 
아래의 명령어로 nginx가 프로젝트에 접근할 수 있도록 허용합니다.

 

$ setfacl -m u:http:x /home/유저명
$ setfacl -m u:http:rwx /home/유저명/test/

 

또한 서버가 Laravel 프로젝트의 로그 파일을 읽고 쓸 수 있도록 권한을 부여해야 합니다.

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

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

 

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

 

이제 설정한 81번 포트로 접속해봅니다.

 

 

 

 

이상으로 Arch Linux - LEMP 스택 + Laravel 환경 구축이 완료되었습니다.