System Administrator/OS Tech

[첫번째] Ubuntu 22.04 LTS 에서 웹서버(Apache + PHP + MySQL) 구성하기

투푸월드 2023. 7. 20. 23:30

이 글을 통해 Ubuntu 22.04 LTS 운영체제에서 APM 웹서버를 구축하는 방법에 대해 알아보도록 하겠습니다.

주의 : 이 글을 통해 설치되는 PHP 8.1 은 구문이 많이 엄격합니다! 당신의 소프트웨어가 PHP 8.1을 지원하는지 알 수 없다면, 18.04 버전이나 20.04 버전으로 구축하는것을 권장합니다.

LINK : 20.04 LTS 에서 Apache PHP MySQL 설치 방법

LINK : 18.04 LTS 에서 Apache PHP MySQL 설치 방법

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


* 리눅스 명령어 환경으로 접속하는 방법을 모른다면 이 글로 이동하세요.
리눅스 명령어 환경으로 원격 접속하는 방법 : 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 글로 이동하세요.


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

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

 


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


1) root 사용자 권한으로 전환

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

보통 서버 설치 후 사용하는 최초의 계정은 root 이거나, root 명령어를 사용할 수 있는 sudo 사용자 입니다.

- 자신의 계정이 sudo 명령어를 사용할 수 있는지 확인

# id

계정이 sudo 그룹에 속해 있으면 sudo 명령어를 사용할 수 있습니다.

 

- 관리자급 명령어(sudo)를 사용해서 root 계정으로 강제 로그인

# whoami
# sudo su

 

2) 쉘 기본 언어값 변경

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

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

# qwerty

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

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

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

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

 

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

Swap 부분도 확인해보세요.
클라우드 서버 업체에서 Disk의 10% 크기 Swap 을 설정해 둔 경우도 있었습니다.
Swap 메모리가 나쁜건 아닌데, 설정된 사실은 알고는 있어야 합니다.

 

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

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

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

디스크 파티션 확인

# lsblk

Type 이 disk, part 인 것의 항목을 확인해보자.
서버를 구동 중에도 AWS EBS, Linode, Hyper-v 등에서 disk resize(growpart) 가 가능하기 때문에 다음의 글을 읽어보는 것도 좋다.

https://blog.lael.be/post/7735

 

디스크 파티션 확인 (fdisk)

# fdisk -l

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

 

디스크 여유 공간 확인

# df -h

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

 

최종 부팅 시간 확인

# who -b

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

# w

시스템 서비스 확인

# systemctl list-unit-files

STATE 항목을 보세요.
b (back), spacebar (next), q (quit) 를 사용해 탐색합니다.

 

자동 실행 목록에 등록된 시스템 서비스 확인

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

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

 

4-1) 시스템 시간 설정 - 표시되는 형태 (Timezone)

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

Timezone 설정하기

이것을 하지 않으면 클라우드 서버 사업자가 미리 지정해 둔 지역의 Timezone 을 할 것이다. (주로, GMT)

 

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

#dpkg-reconfigure tzdata

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

 

 

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

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

 

현재 시간 확인

# date

 

4-2) 시스템 시간 설정 - 절대 시간 기준 값 (Timestamp)

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

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

# timedatectl
# timedatectl timesync-status

 

어느 서버와, 어느 주기로 시간 동기화 되고 있는지 한번은 봐두세요.

 

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

free -m 명령어를 통해서 메모리를 살펴 보았을 때, Swap 이 없을 경우(0일 경우)에만 실행하세요. 하지만 따라해도 크게 문제는 없지만, 작업의 이득이 없습니다.
Swap 커져봤자 서버가 빨라지지는 않습니다.

 

리눅스에 swap 이라는 가상메모리 설정이 있습니다. 이것을 설정하면 실제 메모리 공간보다 더 많은 공간을 사용할 수 있습니다.
이것은 과거에 기술적, 금액적 문제로 인해 서버의 메모리 용량이 부족하던 시절에 쓰던 방식입니다.

이것을 설정하면 서버의 메모리가 부족한 상황이 되면, swap을 사용하면서 서버 요청을 잘 처리하게 됩니다.
swap을 사용할 때 cpu를 조금 더 사용하게 되므로, 과도한 swap 을 사용하지 마시고 적절히 사용하세요.

무조건 2GB를 설정하고, 나중에 조정하는것을 추천합니다. 이 작업은 서버의 재부팅을 필요로 하지 않고 실시간으로 적용됩니다.

 

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
# free -m

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

 

swap 추가 후 제거를 원하면 소스코드를 보고, 적절히 작업하세요. (swapoff, fstab 제거, swap파일제거)

 

6) 현재 운영체제에 설치되어 있는 프로그램 최신버전 패치

기억하세요! 어떠한 운영체제를 설치하든 (윈도우 포함) 가장먼저 해야 할 일은 업데이트 입니다.

APT 목록 갱신
APT란 Advanced Packaging Tool 을 뜻합니다.
우리는 apt 라는 우분투에 내장된 프로그램을 이용해서 프로그램을 쉽게 설치/제거 할 수 있습니다.

 

패키지 목록 갱신.

#apt update

현재 운영체제에 설치되어있는 프로그램 최신버전 패치

#apt upgrade

설치 중 일부 프로그램 설정파일을 초기화 할것인지 물어볼 수도 있는데 기본값 Keep Local Version 을 선택한다. (미리 선택되어 있으므로 Enter 만 누르면 된다.)

설치, 제거, 업데이트 과정중에 생긴 찌꺼기 파일이 있으면 제거.

#apt autoremove

아주 가끔씩 찌꺼기 파일이 생긴다. 지우지 않아도 동작의 문제는 없다. 하지만 지우면 디스크 공간이 많이 확보된다.

 

재부팅

# reboot

처음 설치할 때, apt upgrade 후에, 한번은 반드시 재부팅을 해주세요.