Ubuntu 20.04 LTS 에서 웹서버(Apache + PHP + MySQL) 구성하기

HYEONG HWAN, MUN/ 11월 15, 2021/ 미분류/ 3 comments

이 글에서는 Ubuntu 20.04 LTS 운영체제에서 APM 웹서버를 구축하는 방법에 대해 설명하도록 하겠습니다.

저는, Ubuntu 9.04 버전부터 10년 넘게 구축 방법을 작성/유지보수 하고 있는데, 그동안 별 문제가 없었습니다.
또한, 설치 성공 후기 글이 많으니 올바르게 설명하고 있는 것 같습니다. 혹시라도, 구축 중 문의사항이 생기면 댓글이나 Contact 로 알려주세요.

일반 사업체 및 실무 서비스에서 사용할 수 있는 안정적인 구축 방법을 설명 하겠습니다.


LTS 란 무엇인가?

* LTS 버전이란? Long Term Support 의 약자입니다. Ubuntu Canonical Group에서 10년간의 패키지 유지보수, 업데이트를 제공합니다.
개별 소프트웨어의 버그나, 보안상의 문제가 생기면 (해당 소프트웨어의 Lifetime이 끝났을지라도) Ubuntu Canonical Group 에서 유지보수를 제공합니다.
현재 무료 리눅스 배포판 중에서 10년 업데이트를 지원하는 운영체제는 Ubuntu 뿐입니다.

* 왜 10년 업데이트? Kiosk나 기타 Embeded 기기에서 제품설계 및 구축 운용까지 몇년(1~4년)이 걸립니다. 제품 출시 후 얼마지나지 않아 운영체제의 업데이트가 중단된다면 문제가 생기겠죠.
요즘에는 응용소프트웨어 분야에서도 이와 같이 LTS 라는 용어를 사용하는 추세입니다.  큰 변화 없이(코어의 major 버전번호 변함없음) 업데이트 유지보수를 장기간 제공합니다. 이 경우, 소프트웨어를 도입하려는 고객이 늘어나고, 3rd party software 가 늘어나는 장점이 있습니다.

< Ubuntu 유지보수 제공 현황표 >

참고 : Ubuntu Support - https://en.wikipedia.org/wiki/Ubuntu#Releases

다수의 서버를 구축할 때, 모든 서버의 운영체제(OS)를 동일하게 선택하는 것이 좋습니다. 예상하지 못한 문제가 발생할 확률이 크게 줄어듭니다.

대다수의 클라우드 호스팅 업체에서는 유지보수 기간이 긴 LTS 버전만을 선택할 수 있도록 하고 있습니다.
현재는 구축하면 2030년까지 운영할 수 있는 Ubuntu 20.04 LTS 버전을 가장 권장합니다.

 

ARM CPU

원래 서버시장은 Intel CPU 가 거의 독점하고 있었습니다.

하지만 AMD CPU 가 성능이 더 좋으면서, 더 저렴하게 나오면서 클라우드 서버 시장을 먹고 있습니다.
저는 현업에서 99% 이상 AMD CPU 서버를 사용하고 있습니다. (이유는, 더 성능이 좋고, 더 저렴하니까)

그런데 Amazon, Google, Apple 같은 우수한 클라우드 호스팅 기업들에서 자체 CPU를 만들기 시작했고 완성했으며, 2021년 현재 성공적으로 보급 사용하고 있습니다.
이 CPU들은 AMD보다 저렴하고, 성능이 우수합니다. (저도 AMD 에서 ARM 으로 교체하려고 검토 중입니다.)

따라서 이 글에서는 이러한 ARM CPU 설정에 대해서 약간 더 설명하도록 하겠습니다.

AWS Graviton (G Class), Apple M1, Arduino 에서는 ARM 관련 부분을 함께 읽어보셔야 합니다.

 


* 리눅스 명령어 환경으로 접속하는 방법을 모른다면 이 글로 이동하세요.
리눅스 명령어 환경으로 원격 접속하는 방법 : https://blog.lael.be/post/7574

* 리눅스 설치 후 기초 원격접속 설정을 하려면 이 글로 이동하세요.
리눅스 서버 ssh 원격접속 설정하기 : https://blog.lael.be/post/7678

* VI 에디터(리눅스 편집기) 사용하는 방법https://blog.lael.be/post/7321

* Ubuntu 클라우드 서버호스팅을 찾는 중이라면 https://blog.lael.be/post/44 글로 이동하세요.

* 서버에 파일을 업로드하고 싶다면 Filezilla 를 사용해보세요. https://filezilla-project.org/

* 유료 도메인을 구매 하려면 https://blog.lael.be/post/6357 글로 이동하세요.

 

이 글의 모든 단계는 root 권한으로 진행합니다.


1) root 권한으로 상승

서버의 최고관리자(root) 권한을 획득합니다. 우리는 서버를 이용하는 것을 넘어서, 서버를 조작할 예정이기 때문에 최고관리자 권한이 필요합니다.
이미 root 계정으로 로그인 했다면 이 단계를 건너 뛸 수 있습니다.

# whoami
# sudo su

 

2) 쉘 기본 언어값 변경

서버 운영 중에 문제가 발생했을 때 구글 검색을 할 수 있게 하는 기초 작업입니다.
쉘의 기본 언어값영어로 변경합니다.
시스템의 변화가 생기는 것은 아니며, 오직 쉘 메세지영어로 바뀝니다.

qwerty 라고 입력해봅시다. 반드시 qwerty 라고 입력하세요.
(참고 : 의미없는 명령어이며 무조건 에러가 발생합니다. 에러메세지 테스트 용도임.)

# qwerty

이미 영어메시지가 출력된다면 다음 단계로 넘어가세요.

< 그림 : 동일한 서버. 메세지 언어설정만 다름 >

영어가 아닐 경우 다음 명령어를 사용하여 변경.

# vi /etc/default/locale
LANG="en_US.UTF-8"

k3

 

3) 시스템 정보 확인

먼저, 이 서버의 사양을 확인해 보도록 하자.
아래에 몇개의 서버 정보 확인 명령어를 적어두었으며, 나중에 서버 장애가 생겼을 때 이러한 명령어를 사용해 문제의 원인을 파악할 수 있어야 한다.
한번씩 입력해 보는 것을 추천함.

설치된 운영체제 버전 정보 확인

# lsb_release -a

CPU 모델 확인

# cat /proc/cpuinfo | grep "model name" | head -1

CPU 코어수 확인

# cat /proc/cpuinfo | grep "model name" | wc -l

 

시스템 메모리 정보 확인

# free -m

총 메모리 : total, 사용가능 메모리 : available

비 필수적인 캐시 메모리를 정리하기

# sync && echo 3 > /proc/sys/vm/drop_caches

일반적으로는 OS가 캐시메모리를 관리하기 때문에 굳이 사용할 필요없지만, Server Administrator 라면 알아두면 좋다. 위 명령어 입력 후 free -m 명령어를 다시 입력해보자.

디스크 파티션 확인

# lsblk

Type 이 disk, part 인 것의 항목을 확인해보자.

디스크 파티션 확인 (fdisk)

# fdisk -l

결과 화면이 약간 어려울 수 있으니 그냥 한번 읽어보고 넘어가도록 하자.

 

디스크 여유 공간 확인

# df -h

Mount 가 (/) 인 것의 Size, Used, Avail, Use 를 확인해 두도록 하자. 디스크가 가득 차면 실행 중인 어플리케이션에 심각한 문제를 줄 수 있다.

 

부팅 시간 확인

# who -b

서버 부하량, 부팅 시간, 서버 접속자 확인

# w

시스템 서비스 확인

# systemctl list-unit-files
# systemctl list-unit-files --state=enabled

운영체제가 부팅될 때 시스템 서비스로서 실행되는 프로그램의 목록을 확인해보자.
어떤 시스템 서비스가 설치될 때 VENDOR PRESET에 의해 자동 실행될지 아닐지 최초 결정하게 된다. 이러한 서비스 프로그램을 설치 후 자동실행을 제어할 때 사용하는 명령어이다.

 

4) 시스템 시간 설정

시간 설정이란, 절대적인 시간(timestamp) 및 표시되는 형태(timezone) 설정을 말한다.
먼저 timezone 을 설정하고, 그 다음 timestamp 를 설정할 것이다.

Timezone 설정하기

이것을 하지 않으면 클라우드 서버 사업자가 미리 지정해 둔 지역의 시간을 불러올 것이다. (한국은 Seoul, 일본은 Tokyo, 그외에는 GMT.)

물론 초기 설치할 때 Asia/Seoul 을 설정했다면 이 작업을 할 필요는 없다. 하지만 또 설정 하더라도 문제가 생기지는 않는다.

- 데비안 패키지 재설정 TimeZone Data 를 실행한다.

#dpkg-reconfigure tzdata

GUI 환경이 나올 텐데, 순서대로 Asia - Seoul 을 선택하면 된다.  a 와 s 키를 누르면 관련 위치로 이동한다.

 

dpkg-reconfigure 를 사용할 수 없는 환경이라면 아래의 명령을 실행하세요. (동작은 완전히 동일함)

# ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

 

현재 시간 확인

# date

 

4) 시스템 시간 자동 동기화 확인

시스템이 과부하되면 시스템 시간이 아주 조금씩 지연됩니다.
따라서 시간이 일정하게 유지되도록, 주기적으로 시간을 교정하는 프로그램을 실행하는 것이 좋습니다.

OS설치시 기본적으로 설정되고, 항상 잘 동작하기 때문에 확인하는 명령어만 살펴보고 가겠습니다.

# timedatectl
# timedatectl timesync-status

 

나중에 시간이 되면 RTC Clock, System Clock 에 대해 다루도록 하겠습니다.

 

5) 시스템 메모리 크기를 확인하고 가상 메모리 설정하기

리눅스에 swap 이라는 가상메모리 설정이 있습니다. 이것을 설정하면 실제 메모리 공간보다 더 많은 공간을 사용할 수 있습니다.
이것은 과거에 하드웨어의 가격이 너무 비싸서, 서버의 메모리 용량이 부족한 시절에 쓰던 방식입니다.

요즘은 메모리 가격의 하락과 고용량화가 되어서 가정용 데스크탑도 16GB씩 사용하는 시대가 되었습니다.
따라서 swap 을 전혀 사용하지 않는 세팅이 유행이었으나, 최근의 클라우드화, 가상화가 대중화되면서 다시 저용량 메모리 서버가 많이 사용되고 있습니다.

- 당신의 서버 메모리가 4GB 및 그 이상이면 1GB 를, 4GB 미만이면 2GB 를 설정하세요.

이것을 설정하면 서버의 메모리가 부족한 상황이 되면, 시스템의 CPU 부하량이 올라가고 느려지면서 서버 요청을 잘 처리하게 됩니다.
이 경우 서버 관리자는 서버의 문제를 쉽게 느낄 수 있게 되고, 추가적인 조치를 하도록 안내해 줍니다. (이 경우 RAM 추가하세요.)

 

SWAP 추가 스크립트를 사용해서 서버에 2GB 의 가상 메모리 설정하기

swap 추가 스크립트를 작성해 두었습니다. 다음의 명령어로 추가할 수 있습니다.

wget -q https://raw.githubusercontent.com/laelbe/linux-simple-scripts/main/_server_tools/add_swapfile -O /root/add_swapfile
bash /root/add_swapfile 2

파일 살펴보기 : https://github.com/laelbe/linux-simple-scripts/blob/main/_server_tools/add_swapfile

 

6) 적절한 패키지 저장소를 선택하기 (set package mirror)

대부분의 경우에는 이 작업을 할 필요가 없습니다. 다만, apt 관련한 설치 명령 실행시 다운로드 속도가 참을 수 없도록 느릴 경우, 이 설정을 해주세요.

 

# apt update

 

 

7) APACHE2 설치

TODO : APACHE with modPHP 와  NGINX, PHP-FPM 설정을 글 하나에 적을 수는 없을까? 독자가 읽기에 헷갈릴 소지가 있을까?

 

8) PHP 설치

 

9) MYSQL 설치

 

 

 

 

틈틈이 작성중 : 2022-01-31 내에 완성하겠습니다.

3 Comments

  1. 드디어 20.04 LTS 도 올라오는 군요 감사합니다! 화이팅

  2. 20.04 글이 없는지 찾아보고 있었는데 올라오고 있네요 ;-; 언제나 도움받고 있습니다, 감사합니다!

Leave a Comment

작성하신 댓글은 관리자의 수동 승인 후 게시됩니다.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
*
*