[linux] LAMP 설치하기 - Ubuntu, Apache, MySQL, PHP 설치 한번에 끝내기

우분투 서버 설치

LTS 버전과 일반버전의 차이


우분투 서버의 LTS(Long Term Support) 버전과 일반 버전 간의 주요 차이점은 다음과 같습니다:

LTS(Long Term Support) 버전

장기 지원을 받는 버전입니다. 최대 5년에서 10년까지의 긴 지원 주기를 제공하며, 안정성과 신뢰성이 중요한 서버 환경에 적합합니다. 주로 2년 간격으로 새로운 LTS 버전이 출시되며, 기존 버전의 업데이트는 보안 패치와 중요한 버그 수정만이 이루어집니다.

릴리즈될 때의 상대적으로 안정화된 소프트웨어 버전을 사용하기 때문에 안정적이고 신뢰성을 필요로 하는 비즈니스 및 서버 환경에서 사용하는 것을 추천합니다.

LTS 버전은 5년의 주요 기능 업데이트와 보안 업데이트를 제공하며, 여기에 추가로 5년의 보안 업데이트를 제공합니다. 안드로이드 운영체제를 사용하는 스마트폰 제조사가 3년의 소프트웨어/보안 업데이트에 + 1년의 보안 업데이트를 제공하는 것과 같은 방식입니다.

가장 최신 LTS 릴리즈는 2022년에 출시한 22.04 버전이며, LTS 버전은 끝에 04 버전 표시를 해서 구분을 합니다. 새로운 LTS 버전 릴리즈는 2024년에 출시되며 24.04가 될 예정입니다.

22.04 버전은 2027년까지 소프트웨어/보안 업데이트가 제공되며, 추가로 2032년까지 보안 업데이트가 제공됩니다.

일반버전

짧은 지원 주기를 가지고 있으며, 주로 9개월에서 1년 사이의 지원 기간을 갖습니다. 최신 기능과 업데이트를 빠르게 짧은 주기로 제공하며, 주로 6개월 간격으로 새로운 버전이 출시됩니다.

최신의 소프트웨어 패키지와 라이브러리를 제공하기 때문에 일부 불안정한 변경 사항이 포함될 수 있습니다.

릴리즈 서버, 또는 운영중인 서버와 업무용 환경에서는 LTS 버전을 사용합니다. 또는 서비스 중인 실제 서버 환경과 같은 환경에서 테스트 및 개발을 할 때도 운영 서버 환경과 같은 버전의 LTS 버전 사용을 권장합니다.

우분투 서버 설치


우분투 서버를 설치하는 방법은 다음과 같습니다. 여기서는 웹서비스 운영을 위한 LTS 버전을 다운로드 받아 설치합니다. 데스크탑 버전에는 GUI 환경에서 사용하는데 필요한 여러가지 추가 디렉토리들이 생성되며, 추가의 앱들도 함께 설치할 수 있습니다.

다운로드 페이지에서 우분투 LTS 버전을 다운로드 합니다.

Get Ubuntu Server | Download | Ubuntu
Get Ubuntu Server one of three ways; by using Multipass on your desktop, using MAAS to provision machines in your data centre or installing it directly on a server.

USB 드라이브에 우분투 서버 이미지를 구워서 부팅 가능한 USB 드라이브로 만들어야 합니다. 다운로드한 우분투 이미지를 USB 드라이브에 그냥 복사하면 USB 드라이브로 시스템을 부팅해서 설치 과정을 진행할 수 없습니다.

부팅 가능한 USB 드라이브를 생성하려면 Rufus 또는 balenaEtcher와 같은 도구를 사용해 USB 드라이브에 부팅 가능한 우분투 서버 이미지를 작성해야 합니다.

Rufus는 프로그램 설치 없이 다운로드 후 바로 사용할 수 있습니다. Rufus는 한글 웹사이트를 지원하며, 사용 방법 또한 한글로 자세하게 안내되어 있습니다.

Rufus - 간편하게 부팅 가능한 USB 드라이브 만들기
Rufus: Create bootable USB drives the easy way

Rufus를 실행한 후 USB 드라이브에 다운로드 한 우분투 서버 OS 이미지를 선택해서 USB 드라이브를 부팅 가능한 드라이브로 생성합니다. USB 드라이브를 부팅 디스크로 만들면 USB 드라이브를 포맷해서 초기화하므로 삭제되면 안되는 내용이 있는지 미리 확인해야 합니다.

Rufus 우분투 부팅 USB 드라이브 생성
우분투 부팅 이미지를 구성할 영구 파티션 크기를 설정해야 합니다.

우분투를 설치할 시스템에 USB 드라이브를 연결하고 부팅합니다. 부팅 후, 설치 옵션을 선택하여 우분투 서버를 설치할 수 있습니다.

일부 시스템에서는 시스템 BIOS 설정에서 USB 드라이브로 부팅이 가능하도록 옵션을 변경해야 USB 드라이브로 부팅할 수 있습니다. BIOS 설정으로 들어가서 부팅 디스크를 USB 드라이브, 또는 Removable Device로 선택해서 USB 드라이브로 부팅 가능하도록 변경합니다.
USB 부팅 바이오스 설정

우분투 OS 설치 과정은 다음과 같습니다.

  1. 언어 및 키보드 레이아웃 선택: 언어, 키보드 레이아웃 및 기본 설정을 선택합니다.
  2. 디스크 파티션 구성: 디스크 파티션을 구성하고 설치할 디스크를 선택합니다. USB 드라이브를 부팅 파티션으로 그대로 사용할 경우, 기본 설정을 사용하면 됩니다.
  3. 사용자 계정 및 비밀번호 설정: 루트 비밀번호와 사용자 계정을 설정합니다.
  4. 설치 진행 및 완료: 설정을 확인하고 설치를 진행합니다. 설치가 완료되면 시스템을 다시 부팅합니다.
  5. 시스템 업데이트: 재부팅 후 로그인을 해서 시스템을 최신 상태로 업데이트합니다.
sudo apt update
sudo apt upgrade

우분투 서버가 설치되었으므로 아파치, MySQL, PHP를 차례로 설치하면 됩니다.

설치 경험이 이미 있으면 패키지 매니저인 apt로 아파치, MySQL, PHP를 한번에 설치할 수도 있습니다.

sudo apt install apache2 certbot ufw mysql-server php

아파치 웹서버 설치와 설정

아파치 설치

아파치 웹 서버를 우분투 서버에 설치하는 방법을 요약하면 다음과 같습니다:

  1. 패키지 업데이트
sudo apt update
  1. 아파치 웹 서버 설치
sudo apt install apache2
  1. 아파치 서비스 시작
sudo systemctl start apache2
  1. 우분투 부팅 시 자동으로 시작하도록 설정
sudo systemctl enable apache2
  1. 아파치 데몬 실행 상태 확인
sudo systemctl status apache2
데몬으로 실행중인 아파치 웹서버 상태

아파치 방화벽 설정

UFW를 사용하는 것을 기준으로 설명합니다. UFW에서 웹 서비스 포트(기본적으로 80번과 443번)를 열어주어야 외부에서 아파치 웹 서버가 서비스하는 웹 페이지로 접근 가능해집니다. 80포트와 443 포트를 개방하는 커맨드는 다음과 같습니다.

sudo ufw allow 80
sudo ufw allow 443

조금 더 간편하고 관리가 쉬운 다른 방법을 소개합니다.

아파치 웹서버가 설치되면서 UFW에 트리거가 등록되고 UFW가 아파치 웹 서버가 설치된 것을 인식하기 때문에 UFW에서 사용 가능한 앱 이름을 확인하면 아파치가 등록되어 있는 것을 확인할 수 있습니다.

ubuntu@ubuntu:~$ sudo ufw app list
Available applications:
  Apache
  Apache Full
  Apache Secure
  OpenSSH

아파치 웹 서버를 앱 이름으로 UFW에서 관리할 수 있는 방식은 세 가지입니다.

  • Apache: 80 포트
  • Apache Full: 80 + 443 포트
  • Apache Secure: 443 포트

80 + 443 포트를 개방하려면 다음 커맨드를 사용합니다.

ubuntu@ubuntu:~$ sudo ufw allow "Apache Full"
Rules updated
Rules updated (v6)
ubuntu@ubuntu:~$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
Apache Full                ALLOW       Anywhere
Apache Full (v6)           ALLOW       Anywhere (v6)

설정 후 UFW 상태를 확인하면 "Apache Full" 이름으로 허용된 것을 확인할 수 있습니다. UFW를 재로딩해서 규칙이 적용되도록 합니다.

sudo ufw reload

이제 웹 브라우저에서 서버 IP로 연걸(http://IP주소)해서 아파치 기본 웹 페이지인 "It works!"가 표시되는지 확인합니다.

아파치 It works! 기본 웹페이지

아파치 웹 서버의 웹 루트 디렉토리

아파치의 기본 웹 사이트 디렉토리는 /var/www/html에 위치합니다. 앞서 "It works!" 페이지는 이 디렉토리 안의 기본 웹 페이지인 index.html이 표시된 것입니다. 이 디렉토리에 웹 페이지 파일을 추가하면 해당 파일이 웹에서 접근 가능해집니다.

이제 아파치 웹 서버가 설치되었으며, 서비스가 실행 중입니다. 필요에 따라 도메인 연결 및 가상 호스트 설정 등의 추가 구성을 하면 됩니다.

아파치 환경설정

아파치 웹 서버의 환경 설정은 apache2.conf, httpd.conf, .htaccess 및 가상 호스트 설정 파일 등을 통해 이루어집니다. 다음은 간단한 우분투 아파치 웹 서버 환경 설정 방법입니다.

apache2.conf 파일 수정:

아파치 설정 파일인 apache2.conf를 텍스트 편집기로 열어 수정해서 아파치서버 설정을 수정합니다. 이 파일은 /etc/apache2/ 디렉토리에 있습니다. 센토스 계열은 httpd.conf 파일을 아파치 수정파일로 사용하며, /etc/httpd/ 디렉토리에 위치합니다.

sudo vi /etc/apache2/apache2.conf

가상 호스트(Virtual Host) 설정:

단일 웹 사이트를 호스팅 할 때는 필요 없는 과정입니다. 여러 도메인이나 서브도메인을 호스팅하려면 가상 호스트 설정을 사용해서 여러 개의 웹 사이트를 호스팅 할 수 있습니다.
가상 호스트 설정 파일은 /etc/apache2/sites-available/ 디렉토리에 위치합니다. 새로운 가상 호스트를 설정하려면 텍스트 편집기를 사용해서 /etc/apache2/sites-available/ 디렉토리 안에 호스팅 할 도메인 이름으로 "도메인.conf" 설정 파일을 다음처럼 새로 만듭니다.

sudo vi /etc/apache2/sites-available/mydomain.com.conf

설정을 추가 후에는 다음 명령어로 가상 호스트를 활성화하고 아파치를 재시작합니다:

sudo a2ensite example.com.conf
sudo systemctl restart apache2

모듈 활성화 및 비활성화:

필요에 따라 아파치 모듈을 활성화 또는 비활성화할 수 있습니다.
모듈 활성화: sudo a2enmod [모듈명]
모듈 비활성화: sudo a2dismod [모듈명]
변경 활성화/비활성화 후에는 아파치를 다시 시작해야 적용됩니다.

PHP 모듈 연동:

  1. 뒤에서 PHP 설치를 하게 되므로 PHP 모듈을 미리 연동해야 합니다. libapache2-mod-php 패키지를 설치하고 아파치를 다시 시작합니다.
sudo apt install libapache2-mod-php
sudo systemctl restart apache2

모듈 연동 후 PHP를 설치하고 아파치 웹서버를 통해 .php 확장자를 가진 파일이 실행되는지 확인하면 됩니다.

.htaccess 접근 정책 설정:

웹 디렉토리마다 특별한 접근 설정을 적용하려면 .htaccess 파일을 사용해 접근 정책을 설정할 수 있습니다. .htaccess 파일을 사용한 접근 설정을 허용하려면 apache2.conf 파일, 또는 site-elabled 파일에 다음처럼 AllowOverride All 속성을 웹 루트 디렉토리 적용하는 태그를 추가해야 합니다.

<Directory /var/www/html>
    AllowOverride All
</Directory>

특정 디렉토리에서 PHP 파일과 웹 이미지 3종(jpg, png, gir)만 접근 허용하려면 다음처럼 .htaccess 파일을 작성해 해당 디렉토리에 저장하면 됩니다.

Order Allow,Deny 
Deny from all 

<FilesMatch "\.(jpg|gif|png|php)$">
Order Deny,Allow
   Allow from all
</FilesMatch>

.htaccess 파일 생성/변경 후 아파치를 다시 시작합니다.

sudo systemctl restart apache2

SSL 인증서 설치

아파치 웹 서버에 SSL 인증서를 설치하려면 다음 단계로 설치합니다. 여기에서는 Let's Encrypt를 사용해서 무료 SSL 인증서를 발급하고 설치하는 방법을 안내합니다.

Certbot 설치:

Let's Encrypt 인증서를 쉽게 발급받기 위해 Certbot을 설치합니다.

sudo apt update
sudo apt install certbot

SSL 모듈 활성화:

아파치에서 SSL을 사용하도록 해주는 ssl 모듈을 활성화합니다.

sudo a2enmod ssl
sudo systemctl restart apache2

Certbot을 사용하여 SSL 인증서 발급 및 설치:

다음 명령어를 사용해서 Certbot을 실행하고 SSL 인증서를 발급받은 후, 자동 연장까지 할 수 있습니다.

sudo certbot --apache

Certbot이 실행되면서 도메인 입력 등 Certbot 질의 사항에 대해 답변을 입력하면 인증서가 발급됩니다.

인증서 자동 갱신:

Let's Encrypt 인증서는 90일 동안만 유효하므로 주기적으로 갱신해야 합니다. 갱신을 자동화하려면 cron 작업을 사용해 인증서를 갱신할 수 있습니다. Certbot이 갱신할 때마다 아파치가 재시작되도록 스크립트를 작성할 수 있습니다.

텍스트 편집기를 사용해 매일 한번씩 실행하는 크론잡을 스크립트 파일을 생성합니다.

sudo vi /etc/cron.daily/certbot-renew


그리고 다음과 같은 스크립트 내용을 스크립트 파일에 추가합니다. 첫줄은 bash 셸을 사용해 실행한다는 뜻입니다. bash 셸로 Certbot 인증서 갱신을 한 후 아파치 웹 서버를 재실행 합니다.

#!/bin/bash
certbot renew
/etc/init.d/apache2 restart

파일을 저장한 후 파일이 실행 가능하도록 다음처럼 권한을 변경해야 합니다.

sudo chmod +x /etc/cron.daily/certbot-renew

완료된 크론잡 스크립트 파일이 잘 실행되는지 시험삼아 실행해봅니다.

sudo /etc/cron.daily/certbot-renew

이제 아파치 웹 서버에 SSL 인증서가 설치되었고, 인증서의 갱신도 자동화되었습니다. 아파치 웹 서버를 다시 시작하여 변경사항을 적용합니다.

sudo systemctl restart apache2

MySQL 설치

설치

MySQL을 우분투 서버에 설치하는 순서는 다음과 같습니다:

패키지 업데이트:

sudo apt update

MySQL 서버 설치:

sudo apt install mysql-server

MySQL 보안 설정:

MySQL 설치 완료 후 기본적인 보안 설정을 해야 합니다. 다음 명령어를 실행하여 MySQL 기본 보안 설정을 실행할 수 있습니다. test 데이터 베이스 삭제, 익명 사용자 삭제, 루트 계정 원격 접속 제한 등의 보안 설정을 할 수 있습니다.

sudo mysql_secure_installation

MySQL 설치 직후에는 root 계정 패스워드가 설정되어 있지 않기 때문에 root 계정 패스워드 변경 여부 및 패스워드 변경 프롬프트가 표시되지 않습니다.

root 패스워드 설정:

다음 순서로 커맨드를 입력해서 MySQL의 root 계정 패스워드를 변경할 수 있습니다.

먼저 MySQL 커맨드 콘솔로 들어가야 합니다.

sudo mysql -u root mysql

사용 데이터베이스를 mysql로 변경 후, 다음 쿼리문으로 root@localhost 계정의 패스워드를 새로 설정합니다.

mysql> alter user 'root'@'localhost' identified by '새패스워드';

MySQL 5.7 미만에서는 다음 쿼리문을 실행해야 합니다.

mysql> set password for 'root'@'localhost' = PASSWORD('새패스워드');

MySQL 콘솔은 "exit" 커맨드로 빠져나갈 수 있습니다.

mysql> exit

MySQL 서비스 관리:

    • MySQL 서비스 시작:
      sudo systemctl start mysql
    • 부팅 시 자동으로 시작하도록 설정:
      sudo systemctl enable mysql

MySQL이 우분투 서버에 설치되었습니다. MySQL 클라이언트를 설치하여 데이터베이스를 관리하거나, 추가적인 설정을 할 수 있습니다.

MySQL 방화벽 설정

MySQL을 사용하는 경우, UFW(Uncomplicated Firewall)를 통해 방화벽을 설정하여 보안을 강화할 수 있습니다.

MySQL이 기본적으로 3306번 포트를 사용합니다. 3306 포트를 UFW에 허용 규칙으로 추가하면 원격에서 MySQL에 접속할 수 있습니다.

sudo ufw allow 3306
sudo ufw reload

설정 후 DB에 특별히 접근할 필요가 없는 서비스를 운영할 경우 MySQL 원격 접속 포트인 3306 포트는 보안상 방화벽에서 허용하지 않는 것이 좋습니다.

PHP 설치

설치

우분투 서버에 PHP를 설치하는 방법은 다음과 같습니다:

패키지 업데이트:

sudo apt update

PHP 설치:

sudo apt install php

MySQL을 사용할 경우, MySQL 모듈을 추가로 설치해야 합니다.

sudo apt install php-mysql

다른 모듈이 필요한 경우 필요한 모듈을 추가로 설치합니다.

PHP 버전 확인:

ubuntu@ubuntu:~$ php -v
PHP 8.1.2-1ubuntu2.14 (cli) (built: Aug 18 2023 11:41:11) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.2, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.2-1ubuntu2.14, Copyright (c), by Zend Technologies

아파치 웹 서버와 연동:

아파치 웹 서버와 PHP를 연동하여 PHP 파일이 실행될 수 있도록 하려면 아파치 모듈을 추가로 설치한 후 아파치 웹서버를 재시작해야 합니다.

sudo apt install libapache2-mod-php
sudo service apache2 restart

아파치 웹서버가 아닌 Nginx를 사용하면 다음 커맨드를 실행해야 합니다.

sudo apt install php-fpm
sudo service nginx restart

PHP 정보 확인 (선택 사항):

모듈 설치까지 완료되었으면 아파치 정보와 모듈 정보를 출력해 확인합니다. 출력 내용이 많습니다.

ubuntu@ubuntu:~$ php -i | less
phpinfo()
PHP Version => 8.1.2-1ubuntu2.14

System => Linux ubuntu 5.15.0-1046-raspi #49-Ubuntu SMP PREEMPT Thu Jan 18 12:45:41 UTC 2024 aarch64
Build Date => Aug 18 2023 11:41:11
Build System => Linux
Server API => Command Line Interface
Virtual Directory Support => disabled
Configuration File (php.ini) Path => /etc/php/8.1/cli
Loaded Configuration File => /etc/php/8.1/cli/php.ini
Scan this dir for additional .ini files => /etc/php/8.1/cli/conf.d
Additional .ini files parsed => /etc/php/8.1/cli/conf.d/10-mysqlnd.ini,
/etc/php/8.1/cli/conf.d/10-opcache.ini,
/etc/php/8.1/cli/conf.d/10-pdo.ini,
/etc/php/8.1/cli/conf.d/20-calendar.ini,
/etc/php/8.1/cli/conf.d/20-ctype.ini,
/etc/php/8.1/cli/conf.d/20-exif.ini,

PHP와 모듈을 한번에 설치하려면 다음 apt 커맨드로 설치할 수도 있습니다.

sudo apt install php libapache2-mod-php php-mysql

PHP 환경설정

PHP 환경 구성은 php.ini 파일을 수정해 필요한 설정을 변경하게 됩니다. 설정 항목이 상당히 많고 운영 환경에 따라 설정 값이 달라지기 때문에 주요 설정 항목들의 일반적인 PHP 환경 설정 예를 보여줍니다.

php.ini 파일 위치는 시스템에 따라 다를 수 있지만, 일반적으로 /etc/php/PHP버전/apache2/php.ini 또는 /etc/php/PHP버전/cli/php.ini 경로에 위치합니다.

에러 표시 활성화 및 로깅 설정:

에러를 확인하기 위해 에러 표시를 활성화하고 에러 로그를 설정합니다. 로그 파일 경로는 파일이 저장되는 다른 경로로 변경 가능합니다.

display_errors = On
log_errors = On
error_log = /var/log/php/php_errors.log

서버 시간대 설정:

서버의 시간대를 사용하려는 로케일로 설정합니다.

date.timezone = "Asia/Seoul"

업로드 파일 크기 제한:

업로드하는 파일의 최대 크기를 제한할 수 있습니다. post_max_size는 폼으로 전송하는 데이터의 최대 크기를 말합니다.

upload_max_filesize = 50M
post_max_size = 50M

세션 설정:

세션 관련 설정을 변경할 수 있습니다. /var/lib/php/sessions 경로는 세션 파일이 저장되는 경로입니다.

session.save_handler = files
session.save_path = "/var/lib/php/sessions"

메모리 제한 설정:

PHP가 사용할 수 있는 최대 메모리 양을 제한합니다.

memory_limit = 512M

OPcache 활성화:

성능 향상을 위해 OPcache를 활성화하고 환경값을 설정할 수 있습니다. 성능 최적화는 실제 서비스를 운영하면서 값을 조정하면 되므로 꼭 초기에 조정할 필요는 없습니다.

zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=2