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년 이상 구축 방법을 작성/유지보수 하고 있으며, 그동안 많은 분들이 참고해주셨고, 별 문제가 없었습니다.
일반 사업체 및 실무 서비스에서 사용할 수 있는 안정적인 구축 방법을 설명 하겠습니다.


Ubuntu 20.04 LTS 의 Standard Support 가 2025년 5월에 끝납니다.
2025년 6월 부터는 기본 APT 저장소에 패키지 업데이트가 등록되지 않습니다. 따라서

  • Ubuntu 24.04 LTS 로 개편하거나
  • Ubuntu Pro를 구독하거나

결정하셔야 합니다.
PHP 7.4(20.04)와 PHP 8.3(24.04)의 차이가 크기 때문에, PHP버전 업데이트 테스트에서, 당신의 소프트웨어가 2개 이상의 문제가 발견될 경우 OS를 변경하지 않고, Pro 구독하는 것도 괜찮은 선택입니다.


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

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


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(BaseOS)에 대한 10년간의 업데이트를 지원합니다.
다만, 기본 제공되는 앱스토어인 APT 저장소5년은 기본 지원하고, 나머지 5년은 Ubuntu Pro 라는 구독에 가입해야 소프트웨어 업데이트를 사용할 수 있습니다.
구독하지 않으면, APT 저장소의 5년 유지보수의 마지막 버전으로 설치됩니다. (OS 수명이 다할 때까지 그 버전으로 사용가능)
Ubuntu Pro 구독은, 개인은 5개 서버까지 무료이고, 기업은 유료이다.

여러 구매 옵션이 있는데, 예를 들어 AWS의 경우, 서버당 월 5000원 정도의 추가요금으로 Ubuntu Pro를 이용 할 수 있다. (Savings Plan 으로 추가할인 가능)

 

물론 APT를 사용하지 않는 프로젝트(직접 소스 컴파일해서 설치하거나 docker 컨테이너를 구동하는 프로젝트)에서는 BaseOS 유지보수 기간만 고려하면 됩니다.

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


운영체제 및 어플리케이션 소프트웨어 유지보수 전략은 위와 같고, 이제 본격적으로 NPM (Nginx / PHP / MySQL)을 구축해 보도록 합시다.


서버가 아직 준비되지 않았다면?

서버가 아직 준비되지 않은 경우 VULTR 라는 클라우드 업체를 추천합니다.
싸고 빠르고, 있을 것 다 있습니다.

VULTR : https://www.vultr.com/

참고로 제 블로그는 아래 그림과 같이 월 10달러(약 15000원) 짜리 서버에서 구동되고 있습니다.

자동 백업 (Automatic Backups) 또한 매우 권장됩니다. Enable 해주세요.

 


서버에 접속해주세요.

Mac의 경우 터미널, Windows의 경우 Powershell, 또는 기타 다른 도구나, 클라우드 업체에서 제공하는 Web Console / System manger session manger 등으로 접속할 수도 있습니다.

 

이 글의 모든 단계는 root 권한으로 진행합니다. root 사용자가 아니라면 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
# echo $LANG

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

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

 

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


3) 시스템 정보 확인

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

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

# 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 부분을 보면 된다.
Mem 은 실제 메모리, Swap 은 가상 메모리(디스크파일 기반의 메모리 확장).

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

# 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 를 확인해 두도록 하자. 디스크가 가득 차면 실행 중인 어플리케이션에 심각한 문제를 줄 수 있다.

Filesystem 이 tmpfs 는 메모리(RAM) 공간을 파일시스템으로 사용하는 것이고, efivarfs 는 메인보드 펌웨어(NVRAM) 공간을 사용하는 것이다.
/dev/ 부분만 살펴볼 것.

 

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

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

 

최종 부팅 시간 확인 (아직 timezone 세팅 전이라, GMT 시간으로 표시될 수 있음)

# who -b

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

# w

시스템 서비스 확인

# systemctl list-unit-files

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

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

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

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

 

네트워크 확인

# ip link show

랜카드가 몇개인지, 활성화(state UP)인지 알 수 있다. lo 랜카드는 loopback 특수목적 랜카드 이다.

# ip address show

실제 네트워크 설정을 알 수 있다.
네트워크 설정 확인

# cat /etc/netplan/50-cloud-init.yaml

 

 

위의 명령어들은 나중에 큰 도움이 될 것이다.


4) 운영체제 보안 설정 강화

제가 추천하는 보안 설정 입니다.

설정하지 않아도 이용에 문제는 없지만, 설정한다고 해서 손해보지는 않습니다.

# wget https://raw.githubusercontent.com/laelbe/linux-simple-scripts/refs/heads/main/_server_tools/ubuntu.2404.simplesecurity.sh -O /root/ubuntu.2404.simplesecurity.sh
# bash /root/ubuntu.2404.simplesecurity.sh

 

chmod: cannot access 오류 메세지가 표시될 수도 있는데, 무시해주세요. 위와 같이 표시되면 정상입니다.

 


5) 시스템 시간 설정하기 - TimeZone

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

TimeZone 설정하기

이것을 하지 않으면 서버에서 구동하는 많은 프로그램들의 표기 기준 시간이 GMT가 됩니다. (한국과 9시간 차이나는 영국기준시간으로 설정됨)

 

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

#dpkg-reconfigure tzdata

GUI 환경이 나올 텐데, 순서대로 Asia - Seoul 을 선택하면 된다.  a 엔터 s 엔터를 누르면 관련 위치로 이동한다. (또는 키보드 화살표로 탐색)
잘못 선택했을 경우, 위의 명령어를 다시 실행하면 된다.

 

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

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

 

현재 시간 확인

# date

 

6) 시스템 시간 설정하기 - 네트워크 동기화

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

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

# timedatectl
# timedatectl timesync-status

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

네트워크 망 분리 등의 이슈를 처리하기 위해서 NTP를 차단할 경우, 시간오류가 발생할 수 있으니, 이런 경우에는 적절히 대책을 마련하시기 바랍니다.

관련 설정 확인

# 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 로 동작하도록 커스텀 된 Ubuntu이미지를 배포하고 있으니, 다음의 명령어를 사용하여 확인해 봅시다.
(AWS Ubuntu 의 경우, 22.04 이후 버전부터 chrony 로 변경됨. quickstart 말고, market place 에 있는 ubuntu는 다를 수 있음)

# chronyc sourcestats -v

 

참고로 NTP 서버에 접속하기 위해서는 방화벽에서 [Outbound UDP 123] 포트를 열어주어야 합니다.
(단, AWS Ubuntu 24.04 (quickstart/ubuntu-24.04)일 경우에는 NTP가 169.254.169.123 로 설정되어 있고, 이 경우에는 아웃바운드 허용설정 없어도 됨)

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

 

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

리눅스에 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파일제거)
1. /etc/fstab 내용을 보고 swap 파일 확인 및 관련줄 삭제 (fstab 파일은 부팅할 때 한번 읽혀짐)
2. swapoff swapfile_path
3. rm swapfile_path

저의 경우되도록 swap을 설정하는 편이며, 주로 disk full 같은 critical한 상황에서 swap을 빠르게 지워서 긴급조치를 취하는 용도로 사용합니다.

 

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

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

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

애플 앱스토어, 구글 플레이스토어 같은 것이라 생각하시면 됩니다. Ubuntu 의 APT 스토어!
이 우분투 스토어(Ubuntu repository)는 우분투 개발팀에 의해서 운영되며, 10년간의 OS 업데이트와, 5년간의 소프트웨어 업데이트를 지원합니다.
즉, Ubuntu 24.04 의 공식APT는 2029년 5월까지 무료로 지원됩니다. 그 이후 2029/05 ~ 2034/04 까지는 APT는 유지는 되지만 2029/05 까지의 업데이트로만 남아 있습니다. (특별한 경우 외엔 업데이트 안됨)
2029/05 부터는 프로 구독(Pro subscription)을 해야 합니다.

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

# apt update

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

# apt upgrade

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

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

# apt autoremove

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

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

 

재부팅

# reboot

소프트웨어가 변경되었을 경우에는 어쩌면 재부팅 한번 해두는게 좋을 수 있습니다.

 

재부팅 후 다시 접속해주세요.

 


방화벽 확인하기

이 글을 쓰고 있는 2025년 기준, 네트워크 방화벽을 지원하지 않는 클라우드 업체가 없기 때문에, OS방화벽 대신, 클라우드 방화벽(firewall 또는 security group이라고 부름)을 사용하는 것을 권장합니다.

그런데, 일부 클라우드 업체들이 OS의 방화벽을 미리 설정해두는 경우가 있어서 설명을 하도록 하겠습니다.
(Official Ubuntu OS에는 기본적으로 방화벽이 설정되어 있지 않음.)

 

iptables 방화벽

모든 리눅스는 iptables 방화벽을 사용합니다.

그런데 iptables 관련 명령어가 너무 어려워서, 쉽게 사용하기 위한 ufw (Uncomplicated Firewall) 라는 관리툴이 개발되었습니다.

https://ko.wikipedia.org/wiki/UFW

대충 이렇게 동작합니다. ufw 도 결국에 내부적으로 iptables 을 사용해 동작합니다.

“iptables 는 사용하지 말아야할 레거시 명령어이며, ufw는 새로운 세대의 멋진 명령어이다!” 라고 접근하시면 안되고, 동작을 이해하고 상황에 맞는 명령어를 쓰시면 됩니다.

1) iptables, ufw 둘 다 사용하지 않는 것을 추천함
2) 그래도 널리 쓸 수 있는 iptables 를 추천
3) ufw 기본세팅이 되어있다면 ufw 를 추천

 

현재 방화벽 상태 확인

# iptables -nL

 

< AWS Ubuntu : Ubuntu 공식 설치 초기 상태 그대임 >

 

< VULTR Ubuntu : 무언가 설정이 되어있고, ufw 라는 단어가 보인다 >

 

ufw 상태 확인 (반드시 위와 같이 ufw 관련 화면이 보였을 경우에만 진행한다)
AWS나, Linode, DigitalOcean 같은 업체에서는 ufw 를 설정해두지 않았으니, 이 경우, 이 단계를 건너뛰도록 하자.

# ufw status
# ufw allow 80
# ufw allow 443

반대 명령어는

# ufw delete allow 80

 

웹서버는 22, 80 443 포트만 허용되어 있으면 된다.
추가설정은 정신 건강에 해로우니 하지 말 것.

 

그런데 위 처럼 클라우드 방화벽을 쓸 수 있는 환경에서는 굳이 ufw를 사용하지 않는 것을 추천합니다.

ufw 비활성화

# ufw disable

서버 OS 에서의 방화벽을 사용하지 않기 때문에, 반드시 클라우드 방화벽을 설정하세요!!

SSH 는 TCP 22 이며 반드시 내 IP 만 허용해야 합니다.
HTTP는 TCP 80 입니다. HTTPS 는 TCP 443 입니다.


 

7) Nginx 설치

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

또한 nginx 저장소에서 Ubuntu 의 OS LifeCycle 보다 더 오래 지원을 해주기 때문에, 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

/usr/share/keyrings/nginx-archive-keyring.gpg 파일과 /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를 연결할 것이기 때문에, PHP 에서 필요한 3가지 변수를 추가로 선언해 주어야 한다.

선언하지 않으면 짧은주소를 사용하는 PHP소프트웨어가 동작하지 않을 수 있다.

# 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[[:space:]]\+nginx/user www-data/' /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

 

설정 마무리를 기념하며 nginx 재시작

# service nginx restart

 

nginx 설치가 끝났습니다.

설치된 nginx 버전 확인

# nginx -v

 

nginx 접속 확인하기

# curl http://localhost

 

웹브라우저에서 서버의 아이피를 입력해서 접속해 보기
방화벽에서 TCP 80 포트가 Open 되어 있어야 합니다.

웹 브라우저에 내 서버의 IP 입력

 


8) PHP 설치

PHP 소프트웨어는 매우 오랜 역사를 가지고 있고, 검증되어서 취약점의 거의 없습니다. 혹시나 알려지지 않은 취약점이 발생하더라도 Ubuntu Security Team 에 의해 Zero-day patch 가 이루어지니 안심하시고 사용하시면 됩니다.

언어 자체는 안전하나, 소프트웨어나 사람이 취약할 수 있습니다.

Ubuntu 개발팀에서는 NodeJS, JAVA, Go 등은 Application(universe) 으로 취급하고 관리하고 있습니다.
반면, PHP 는 Infra(main) 로 취급하여 관리하고 있습니다. 그만큼 더 신경 쓰고 있고, 비용 절약에도 도움이 됩니다.
자세한 글은 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

 

PHP 설치는 다 끝났으니, 추가적인 설정 작업을 진행해보자.

 

PHP Default timezone 설정하기.

이 값을 설정하지 않았고, 별도로 코드에서 date_default_timezone_set을 정의하지 않았을 경우, UTC timezone 을 사용합니다.
매우 권장하는 작업이니, default timezone을 설정해주세요.

동일한 작업2개의 파일에 적용해 주어야 합니다.

vi 명령어 사용 방법은, 이 글의 최상단에 적어 두었으니 모르시면 참고해 주세요.
vi 명령어가 익숙하지 않다면, filezilla(https://filezilla-project.org/download.php) 같은 sftp 프로그램을 사용해서, 다운받아서 수정하고 업로드 하는 작업을 하시면 됩니다.

# vi /etc/php/8.3/fpm/php.ini
# vi /etc/php/8.3/cli/php.ini

2개의 파일에 동일한 작업을 진행해 주어야 합니다. 하나는 fpm 웹 프로그램에서, 다른 하나는 서버내 콘솔 명령어에서 사용됩니다.

또는, vi 에디터 작업이 번거롭기 때문에, 다음의 치환(replace)명령어를 사용해서 자동으로 적용할 수도 있습니다. (권장)

# sed -i 's/;date.timezone =/date.timezone = Asia\/Seoul/g' /etc/php/8.3/fpm/php.ini
# sed -i 's/;date.timezone =/date.timezone = Asia\/Seoul/g' /etc/php/8.3/cli/php.ini
설정 검사
# cat /etc/php/8.3/fpm/php.ini | grep timezone
# cat /etc/php/8.3/cli/php.ini | grep timezone

 

이렇게 변경.

설정 적용을 위하여 php-fpm 재시작.

# service php8.3-fpm restart

php 설치가 끝났습니다.

 

간단한 PHP 실행 (현재 시간을 출력하기)

# php -r "echo date('Y-m-d H:i:s');"

 


작업의 분기점 (DB 직접설치운영 vs DB 호스팅 이용)

관리형 데이터베이스(managed database) 라는 서비스가 있습니다.

데이터베이스의 기본 관리 조건

- 정기적인 소프트웨어 업데이트
- 백업
- 문제가 생겼을 경우, 백업을 사용한 복원
- 원할 때, 손쉽게 성능 업그레이드가 가능

 

백업과 복원에 대해서 고려해 보세요. 얼마나 자주 백업을 할 것인지, 얼마나 빠르게 복구할 수 있는지 전략을 세워두세요.

DB 호스팅을 이용하기로 결정했다면, 아래의 MySQL 설치 단계는 건너 뛰어도 됩니다.


10) MySQL 설치

여기에서는 직접 MYSQL DB서버를 구축하는 방법에 대해 설명하도록 하겠습니다.
DB 서버는 웹서버와 같은 서버를 사용할 경우도 있고, 웹서버(nginx, php)와 다른 서버를 사용하는 경우도 있습니다.

당신이 초보라면, 한 개의 서버에서 운영하다가 나중에 분리(즉, 새로 구축 후 데이터 이전)하는 것을 권장합니다.
또는 비용의 여유가 있다면, 처음부터 DB서버를 분리하여 운영해보세요.

 

설치 소스정보 확인

# apt info mysql-server

 

MySQL 명령어 클라이언트 프로그램 설치 - DB호스팅을 사용하더라도 이 프로그램은 설치해주세요.

# apt install mysql-client

위의 패키지를 설치하면 console 환경에서 mysql 명령어를 사용할 수 있게 된다.

 

MySQL 서버 설치

# apt install mysql-server

설치된 버전 확인

# mysqladmin version

 

 

MySQL 8.0.41 버전이 설치되었습니다. (여러분의 버전은 이것보다 같거나, 더 높을 것입니다.)

 

기본 설정으로 MySQL 의 root 사용자는 auth_socket 인증을 사용하도록 설정되어 있으며, 따라서 리눅스 root 사용자는 비밀번호 입력없이 MySQL root 사용자로 로그인 할 수 있다.
추가적으로, auth_socket 이 설정된 사용자비밀번호 설정이 되지 않는다. (정확히 말하자면 비밀번호 설정은 되는데 그 값을 저장하지 않는다. 즉, 절대로 비밀번호 로그인 불가능)
다시 말해서, 기본적으로 root 사용자로 비밀번호 로그인을 할 수 없다는 것이다. (auth_socket 인증을 사용하도록 설정되어 있으므로)

이해를 돕기위한 화면입니다. 참고만 하세요.

< MySQL 8.0 사용자 정보 기본값 (ubuntu 배포판 기준) >

굳이 기본 설정을 건드리지는 않겠다.


 

MySQL 8.0 부터 바뀐 서버 기본값 살펴보기 : https://dev.mysql.com/blog-archive/new-defaults-in-mysql-8-0/
MySQL 8.0 부터 기본 설정값이 적절하게 바뀌어 있으므로, 추가적인 설정을 하지 않고 바로 사용하면 됩니다.

추가적으로 변경을 원하는 값이 있다면, 다음의 명령어를 사용하여 값을 변경할 수 있다.

# vi /etc/mysql/mysql.conf.d/mysqld.cnf

 

MySQL Server 설치가 끝났습니다.

서버의 데이터베이스 목록 확인하기

# mysql
 show databases;
exit;

 

MySQL Server 설치가 끝났습니다.

기본 값이 잘 설정되어 있기 때문에, 추가적인 변경은 하지 않습니다.


사이트 생성하기

nginx 를 통해서 사이트를 생성하고, 이 사이트에서 php 를 사용할 수 있게 하겠습니다.

 

환경설정 편집기

https://webmaster.cafe/tools/nginx-conf-generator-2404/

 

작성중입니다.

 


 

웹UI를 사용하여 서버에 로그인

# cat /etc/mysql/debian.cnf

이 명령어를 사용해서 서버의 기본 최고관리자의 비밀번호를 확인한다.

 

 

조금전에 설치한 phpmyadmin 을 통해서 DB서버에 로그인 해 보도록 하자.

 

MySQL 사용자 계정 생성

빨간 부분만 입력하세요.

 

참고 : MySQL 사용자 계정 삭제하는 방법


이제 리눅스의 세계로~

작성중

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

 

2 Comments

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

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

Irochi에 답글 남기기 응답 취소

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

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