Ubuntu 24.04 LTS 에서 웹서버(NGINX + PHP-FPM + MySQL) 구성하기

HYEONG HWAN, MUN/ 7월 7, 2024/ 미분류/ 2 comments

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

이 글을 통해 Ubuntu 24.04 LTS 운영체제에서 NPM(Nginx+PHP+MySQL) 웹서버를 구축하는 방법에 대해 설명하도록 하겠습니다.
저는 Ubuntu 9.04 버전부터 15년 이상 구축 방법을 작성/유지보수 하고 있으며, 그동안 많은 분들이 참고해주셨고, 별 문제가 없었습니다.
일반 사업체 및 실무 서비스에서 사용할 수 있는 안정적인 구축 방법을 설명 하겠습니다.


* 리눅스 명령어 환경으로 접속하는 방법을 모른다면 이 글로 이동하세요.
리눅스 명령어 환경으로 원격 접속하는 방법 : 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) 버전을 동일하게 구성하는 것이 좋습니다. 관리 이슈가 발생할 확률이 크게 줄어듭니다.

Ubuntu 개발사에서는 운영체제OS에 대한 10년간의 업데이트를 지원합니다.
다만, 기본 제공되는 앱스토어인 APT 저장소5년은 기본 지원하고, 나머지 5년은 Ubuntu Pro 라는 구독에 가입해야 사용할 수 있습니다.
구독하지 않으면, APT 저장소의 5년 유지보수의 마지막 버전으로 설치됩니다.(OS 수명이 다할 때까지 유지됨)
Ubuntu Pro 구독은, 개인은 5개 서버까지 무료이고, 기업은 서버당 월 25000원의 유료 입니다.

물론 APT를 사용하지 않는 프로젝트(소스설치나 docker 같은 프로젝트)에서는 OS 유지보수 기간만 고려하면 됩니다.

Ubuntu Pro 구독에 대한 자세한 설명은 여기에 : https://blog.lael.be/post/11772


 

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

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

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

일반적으로, Linux OS 설치 후 사용하는 최초의 계정root 이거나, root 명령어를 사용할 수 있는 sudo 사용자 입니다.

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

# id

 

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

 

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

# whoami

위 명령어 (whoami) 의 결과가 root 가 아니라면 아래의 명령어를 실행

# sudo su -l root

su 명령어는 다른 계정으로 로그인하는 명령어이다. sudo 를 앞에 붙이면 root 권한으로 실행되며, root 는 다른 계정 로그인시 비밀번호를 묻지 않기 때문에, 바로 로그인이 됩니다.

 

root 쉘 색상 변경

cp /etc/skel/.bashrc /root/.bashrc

이 명령어 실행 후에, 서버에 다시 접속해 주세요.

조금 더 서버 사용이 쉬워집니다.

 

2) 쉘 기본 언어값 변경 (국내 일부 클라우드업체 및 직접 운영체제를 설치를 한 경우)

대부분의 경우, 영어로 설치되기 때문에, 영어인 경우에는 이 단계(2번)을 건너 뛰어도 됩니다.

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

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

# qwerty

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

qwerty: command not found

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

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

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

 

이런 작업을 하지 않도록, 서버 OS는 한국어로 설치하지 않기를 권장함.

 

3) 시스템 정보 확인

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

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

# lsb_release -a

참고로 우분투 24.04 버전의 코드네임인 Noble Numbat호주에 서식하는 다람쥐 같이 생긴 동물입니다.

CPU 모델 확인

일부 가상 서버의 경우 model name 을 숨기는 경우도 있다.

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

CPU 코어수 확인

# cat /proc/cpuinfo | grep "processor" | wc -l

시스템 메모리 정보 확인

# free -m

Mem 항목의 total 부분을 보면 된다.
사용 중인 메모리는 used, 사용 가능한 메모리는 available.

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

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

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

디스크 파티션 확인

# lsblk

아래쪽의 Typedisk, part 인 것의 항목을 확인해보자. 디바이스 이름이 sda인지, vda인지, nvme0n1인지 알아만 두자.

디스크 파티션 확인 (fdisk)

# fdisk -l

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

디스크 여유 공간 확인

# df -h

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

 

서버 가동 중에도 디스크의 용량을 늘릴 수 있습니다.

https://blog.lael.be/post/7735 글로 이동해서 빠르게 눈으로만 쓱 한번 보세요.

 

최종 부팅 시간 확인

# who -b

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

# w

시스템 서비스 확인

# systemctl list-unit-files

STATE 항목을 보세요.
b (back), spacebar (next), q (quit) 를 사용해 탐색합니다.
키보드 arrow 버튼으로도 탐색 가능.

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

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

운영체제가 부팅될 때 시스템 서비스로서 실행되는 프로그램의 목록을 확인해보자.

 

네트워크 확인

 

 

4-1) 시스템 시간 설정 - TimeZone 설정하기

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

TimeZone 설정하기

이것을 하지 않으면 클라우드 서버 사업자가 미리 지정해 둔 지역의 Timezone 으로 구성되어 있을 것이다. (주로, GMT)
서버에서 구동하는 많은 프로그램들의 표기 기준 시간이 된다.

2024-04-27T12:30:50+09:00 같이 절대시간으로 표기하는 프로그램도 있지만 대부분의 프로그램은 TimeZone 값을 제외한 2024-04-27 12:30:50 으로 표기한다.

OS TimeZone : 소프트웨어 프로그램에서 별도로 TimeZone을 설정하지 않았을 때 기준으로 삼는 TimeZone.

 

- 데비안 패키지 재설정 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) 시스템 시간 설정 - clock 설정하기

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

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

# timedatectl
# timedatectl timesync-status

아마도 NTP service : active, 그리고 Server169.254.169.123 (AWS의 경우) 또는 ntp.ubuntu.com (공식 이미지 직접 설치 및 대부분의 경우) , time.constant.com (일부 클라우드) 일 것입니다.
네트워크 시간 동기화는 32second ~ 34min 8second 주기로 이루어질 것입니다.

관련 설정 확인

# cat /etc/systemd/timesyncd.conf

 

로그 확인

# service systemd-timesyncd status

[OutBound UDP 123] 포트를 사용합니다.

 

* timedatectl timesync-status 입력시 오류가 발생할 경우

Failed to query server: The name org.freedesktop.timesync1 was not provided by any .service files

 

일부 클라우드에서 커스텀한 Ubuntu 의 경우 시간 동기화 프로그램을 systemd-timesyncd 대신 chrony 로 동작하게 바꾸어 두었습니다.
Ubuntu 공식 이미지는 여전히 systemd-timesyncd 를 사용하고 있지만, AWS 에서는 chrony 로 동작하도록 커스텀된 이미지를 배포하고 있으니, 다음의 명령어를 사용하여 확인해 봅시다.
(AWS Ubuntu 의 경우, 22.04 이후 버전부터 chrony 로 변경됨)

# chronyc sourcestats -v

 

참고로 NTP 서버에 접속하기 위해서는 [Outbound UDP 123] 포트를 열어주어야 합니다.
(169.254.169.123 아이피가 NTP목록에 있다면, 따로 NTP 를 위한 방화벽 포트를 열어주지 않아도 됩니다.)

* 사용가능한 안정적인 NTP 서비스 (2024년 현재) (NTP Server List)
- ntp.ubuntu.com
- time.aws.com
- 1.time.constant.com
- 2.time.constant.com
- 3.time.constant.com

 

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

RAM 4GB 가 넘는 서버는 안하셔도 됩니다.

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

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

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

한 때, 서버 메모리 용량이 상향 평준화 되면서, 서버 구축시 SWAP 을 설정하지 않는게 트랜드였던 시기가 있었습니다.
클라우드의 시대가 도래하면서, 다시 메모리 512MB, 1G 서버가 많이 쓰이기 시작하기 때문에, 요즘엔 SWAP을 설정하는 것이 일반적 트랜드입니다.

 

메모리 사용량 확인 (이미 SWAP이 설정되어 있는지 확인)

# free -m

하단의 Swap 이 이미 설정되어 있을 경우, 이 단계를 건너 뛰세요. 아마도 이미 적절한 용량으로 설정되어 있을 것입니다.

 

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

1 대신 원하는 숫자로 변경해도 되지만 변경하지 않는걸 추천합니다.

# wget -q https://raw.githubusercontent.com/laelbe/linux-simple-scripts/main/_server_tools/add_swapfile -O /root/add_swapfile
# bash /root/add_swapfile 1
# 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 라는 우분투에 내장된 프로그램을 이용해서 프로그램을 쉽게 설치/제거 할 수 있습니다.

애플 앱스토어, 구글 플레이스토어 같은 것이라 생각하시면 됩니다. Ubuntu 의 APT 스토어!

이 우분투 스토어(Ubuntu repository)는 우분투 개발팀에 의해서 운영되며, 10년간의 OS 업데이트와, 5년간의 소프트웨어 업데이트를 지원합니다.
5년 이 후에, 소프트웨어 업데이트를 사용하시려면 Ubuntu Pro 라는 것을 구독하셔야 합니다. (5카피 무료)

 

패키지 목록 갱신 (스토어 항목 새로고침)

# apt update

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

# apt upgrade

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

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

# apt autoremove

아주 가끔씩 찌꺼기 파일이 생긴다. 지우지 않아도 기능상의 문제는 없다. 하지만 디스크 공간을 차지하고 있을 것이다.

위의 명령어를 개인서버라면 생각날 때마다, 회사 서버라면 월 1회 이상 실행해주세요.

 

7) Nginx 설치

Nginx 웹서버를 설치해 봅시다. nginx 는 버전이 빠르게 올라가기 때문에, 공식 저장소에서 설치하도록 하겠습니다.

Nginx 공식 저장소 추가

# curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
# gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list

 

저장소 패키지 목록 업데이트

# apt update

 

패키지 설치 정보 확인

# apt info nginx

 

nginx 설치

# apt install nginx

 

nginx 실행

# service nginx start

또는 OS를 재부팅 하면 nginx 가 자동으로 켜진다.

 

nginx 상태 확인

# service nginx status

 

[Nginx] - [PHP-FPM] 사용을 위해서 3줄을 추가해 주어야 한다. 추가하는 방법은 다음과 같다.

# cat /etc/nginx/fastcgi_params
# echo 'fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/fastcgi_params
# echo 'fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;' >> /etc/nginx/fastcgi_params
# echo 'fastcgi_param PATH_INFO $fastcgi_path_info;' >> /etc/nginx/fastcgi_params
# cat /etc/nginx/fastcgi_params

 

nginx 는 딱히 대단한 기능이 있는 프로그램이 아니라서 별다른 설정이 없습니다.

다만 몇가지 보안패치를 해줍시다.

 

보안패치

 

nginx 기본 환경설정 파일 확인

# cat /etc/nginx/nginx.conf

이 파일을 살짝 손볼 것입니다.

nginx 프로세스 사용자를 www-data 로 변경

# sed -i 's/user nginx/user www-data/g' /etc/nginx/nginx.conf

 

nginx 버전 정보 감추기

sed -i 's/#gzip\s*on;/gzip on;\n root \/usr\/share\/nginx\/html;\n server_tokens off;/g' /etc/nginx/nginx.conf

 

일부 보안 패치

chmod 700 /etc/nginx/
chmod 600 /etc/nginx/nginx.conf
chmod 600 /etc/nginx/conf.d/*
chmod 710 /var/log/nginx

chgrp www-data /var/log/nginx
chgrp www-data /usr/share/nginx/html
chmod 710 /usr/share/nginx/html

 


PHP 소프트웨어는 매우 오랜 역사를 가지고 있고, 검증되어서 취약점의 거의 없습니다. 혹시나 알려지지 않은 취약점이 발생하더라도 Ubuntu Security Team 에 의해 Zero-day patch 가 이루어지니 안심하시고 사용하시면 됩니다.
Ubuntu 개발팀에서는 NodeJS, JAVA, Go 등은 Application 으로 취급하고 관리하고 있습니다. 반면, PHP 는 Infra 로 취급하여 관리하고 있습니다. 그만큼 더 신경 쓰고 있고, 비용에도 절약됩니다.
자세한 글은 Ubuntu Pro - https://blog.lael.be/post/11772 - 글을 참고하세요.

 

# apt install php8.3-fpm

 

PHP-FPM 은 PHP 를 실행하는 어플리케이션 서버 입니다.

Nginx 프로그램이 php 파일의 위치를 PHP-FPM 에게 전달하면, PHP-FPM 이 실행하고 Nginx 프로그램에게 결과를 반환하는 원리입니다.

 

- 설치된 PHP 버전 확인

# php -v

 

글을 작성하는 현재 설치된 버전은 PHP 8.3.6 이며, 여러분의 버전은 이것보다 높을 것이다. (물론 주기적으로 업데이트 명령어인 apt update 및 apt upgrade 를 해주면 최신의 상태를 유지할 수 있다.)

 

기타 널리 사용되는 PHP모듈을 설치한다.

각 모듈의 설명은 생략한다. 대부분의 PHP 웹 소프트웨어가 필요로 하는 모듈들이다.

# apt install php8.3-mbstring php8.3-gd php8.3-curl php8.3-xml php8.3-bcmath php8.3-mysql php8.3-zip php8.3-gmp

 

- Composer 설치 (PHP 패키지 의존성 관리 프로그램)

#apt install composer

더 설치하고 싶은 PHP 모듈이 있다면 아래 명령어 입력 후 선택하여 설치하면 된다.

#apt-cache search php- | grep ^php8.3- | grep module

 


작성중

급하신 분들은 과거 작성된 https://blog.lael.be/post/8319  글을 참고해서 설정해주세요.  (거의 비슷함)

 

2 Comments

  1. 항상 도움이 됩니다. 처음 이 블로그를 봤을때는 이해도 못하고 따라하기만 했는데 지금은 없어도 알아서 할 정도까지 왔네요. 신기…

    1. Practice makes perfect!
      연습 계속 하다보면 어느새 전문가!

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>
*
*