Ubuntu 18.04 Server / Nginx, PHP, MariaDB 설치하고 설정하기
Ubuntu 18.04에서 Nginx, PHP-FPM, MariaDB를 함께 사용하려면 각 패키지를 설치하고 Nginx의 PHP 요청을 PHP-FPM 소켓으로 전달한 다음 데이터베이스와 별도 계정을 설정합니다. 아래 예제는 기존 사이트를 바꾸지 않는 로컬 전용 실습이며, 웹 애플리케이션에 데이터베이스 root 계정을 사용하지 않습니다.
실습 범위와 준비
Ubuntu 18.04의 일반 보안 지원은 종료되었습니다. Ubuntu Pro의 확장 보안 유지보수(ESM) 적용 여부와 패키지별 지원 범위를 Ubuntu 보안 유지보수 일정에서 확인하고, 새 운영 환경은 지원되는 버전으로 구축하는 것이 좋습니다. 이 글은 기존 18.04 서버를 이해하기 위한 예제로 기본 저장소의 PHP 7.2를 사용합니다.
관리자 권한과 저장소 접근이 가능한 별도의 테스트 서버를 준비하세요. Nginx는 웹 요청을 받고, PHP-FPM(FastCGI Process Manager)은 PHP 코드를 실행하며, MariaDB는 데이터를 저장합니다. 예제는 127.0.0.1:8080에서만 수신하므로 서버 밖에서 바로 접속할 수 없습니다. 인터넷 공개에는 별도의 방화벽·도메인·TLS 인증서와 보안 검토가 필요합니다.
기존 서비스나 데이터가 있는 서버에서는 변경 전 백업과 복구 절차를 준비하세요. 아래 실습 경로·계정·데이터베이스 이름과 8080 포트가 이미 사용 중이면 그대로 진행하지 말고 별도의 테스트 환경을 사용합니다. 다음 명령으로 포트 사용 여부를 확인할 수 있습니다. 출력이 없으면 해당 포트의 TCP 수신 항목이 없는 것입니다.
sudo ss -lntp | grep ':8080 '
패키지 설치와 서비스 확인
패키지를 설치하면 Nginx 기본 사이트가 자동으로 시작되어 80번 포트에서 수신할 수 있습니다. 아래 실습 사이트를 로컬 8080번에 제한해도 기본 사이트의 접근까지 제한되지는 않으므로, 설치 전에 테스트 서버의 네트워크와 방화벽을 격리하고 기존 서비스에 미칠 영향을 확인하세요.
패키지 목록을 갱신한 뒤 Nginx, PHP 7.2 FPM과 MySQL 드라이버, MariaDB 서버, 확인용 curl을 설치합니다. 저장소나 지원 상태에 따라 패키지를 사용할 수 없다면 오류를 해결한 후 진행하세요.
sudo apt update
sudo apt install nginx php7.2-fpm php7.2-mysql mariadb-server curl
설치 후 다음 명령으로 서비스 상태와 PHP-FPM 소켓을 확인합니다. 서비스가 실행 중이 아니라면 원인을 확인하고 해당 서비스를 시작해야 합니다. 소켓 경로가 다르면 아래 Nginx 설정을 실제 경로에 맞춰야 합니다.
systemctl is-active nginx php7.2-fpm mariadb
ls -l /run/php/
세 서비스가 각각 active인지 확인합니다. php7.2-fpm.sock이 없다면 systemctl status php7.2-fpm과 서비스 로그에서 원인을 확인하세요. PHP 버전이 다를 때는 패키지와 소켓 경로를 함께 바꿔야 합니다.
Nginx와 PHP-FPM 연결
실습 디렉터리와 설정 파일을 새로 만듭니다. /var/www/lnmp-demo, /etc/nginx/sites-available/lnmp-demo, /etc/nginx/sites-enabled/lnmp-demo가 이미 존재하면 덮어쓰지 마세요. 아래 편집 명령은 빈 서버에서 경로가 없는 것을 확인한 뒤 실행합니다.
sudo mkdir /var/www/lnmp-demo
sudo nano /etc/nginx/sites-available/lnmp-demo
편집기에 아래 전체 서버 블록을 저장합니다. fastcgi_pass는 앞에서 확인한 PHP-FPM 소켓과 일치해야 합니다. snippets/fastcgi-php.conf는 Ubuntu Nginx 패키지의 설정 조각이며, 파일이 없으면 배포판의 FastCGI 설정을 확인하세요.
server {
listen 127.0.0.1:8080;
server_name localhost;
root /var/www/lnmp-demo;
index index.php;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
}
}
설정 파일을 활성화하고 검사합니다. nginx -t가 성공할 때만 다시 로드하세요. 실패하면 오류와 포트·소켓 경로를 확인하고 수정한 뒤 재검사합니다. 문제가 생겼을 때는 이 실습에서 만든 심볼릭 링크만 제거하고 다시 검사·로드하면 기존 사이트 설정을 유지할 수 있습니다.
sudo ln -s /etc/nginx/sites-available/lnmp-demo /etc/nginx/sites-enabled/lnmp-demo
sudo nginx -t
sudo systemctl reload nginx
Nginx의 FastCGI 연결은 Nginx 공식 안내에서도 확인할 수 있습니다.
PHP 실행 확인
아래 경로에 파일이 없는 것을 확인하고 새 파일을 만듭니다. 편집기에서 아래 코드를 저장하세요.
sudo nano /var/www/lnmp-demo/index.php
<?php
header('Content-Type: text/plain; charset=UTF-8');
echo "PHP is working\n";
echo 'SAPI: ' . PHP_SAPI . "\n";
같은 서버에서 다음 명령을 실행합니다. PHP is working과 SAPI: fpm-fcgi가 나오면 Nginx가 PHP-FPM을 통해 코드를 실행한 것입니다. PHP 코드가 그대로 표시되면 설정을 적용하지 않은 것이므로 테스트 파일을 공개하지 말고 FastCGI 설정을 다시 확인하세요.
curl http://127.0.0.1:8080/
502 오류라면 PHP-FPM 서비스와 소켓 경로·권한을, 404 오류라면 문서 디렉터리와 파일 경로를 확인합니다. 상세한 서버 설정을 노출하는 phpinfo() 페이지는 공개하지 마세요.
MariaDB 데이터베이스와 별도 계정
MariaDB는 설치 방식에 따라 관리자 인증이 다릅니다. 로컬 소켓 인증이 설정된 경우 다음 명령으로 관리 콘솔을 열 수 있습니다. 실패하면 기존 관리자 인증 방식을 확인하세요. MYSQL_HISTFILE=/dev/null은 이 클라이언트 세션의 명령 기록 파일을 남기지 않도록 지정합니다.
sudo env MYSQL_HISTFILE=/dev/null mysql
다음은 새 실습용 데이터베이스와 로컬 전용 계정을 만드는 SQL입니다. 동일한 이름이 이미 있으면 기존 항목을 수정하지 말고 다른 이름을 사용하세요. CHANGE_ME_STRONG_PASSWORD는 실행 전에 긴 고유 비밀번호로 바꾸고, SQL 문자열의 따옴표나 역슬래시가 포함될 때는 올바르게 이스케이프해야 합니다.
CREATE DATABASE lnmp_demo CHARACTER SET utf8mb4;
CREATE USER 'lnmp_demo'@'localhost' IDENTIFIED BY 'CHANGE_ME_STRONG_PASSWORD';
GRANT SELECT ON lnmp_demo.* TO 'lnmp_demo'@'localhost';
EXIT;
이 예제 계정은 해당 데이터베이스에 읽기 권한만 갖습니다. 실제 애플리케이션이 쓰기나 스키마 변경을 요구한다면 필요한 권한만 별도로 부여하세요. 관리자 계정의 인증 플러그인을 직접 수정하거나 웹 애플리케이션에 root 권한을 부여하지 않습니다. 계정과 인증에 대한 자세한 내용은 MariaDB CREATE USER 문서를 참고하세요.
새 계정이 로컬에서 연결되는지 확인합니다. 비밀번호는 명령행에 직접 쓰지 말고 프롬프트에서 입력하세요. 접속 후 SELECT DATABASE(), CURRENT_USER();를 실행하면 데이터베이스와 인증된 계정이 표시됩니다. EXIT;로 콘솔을 종료합니다.
mysql -u lnmp_demo -p lnmp_demo
PHP에서 데이터베이스 연결 확인
다음은 위에서 만든 계정을 사용하는 임시 확인 방법입니다. 자격 증명은 웹 문서 디렉터리 밖에 보관합니다. /etc/lnmp-demo가 이미 있으면 덮어쓰지 말고 별도 테스트 환경을 사용하세요. PHP-FPM이 www-data 그룹으로 실행되는 기본 설정을 전제로 합니다.
sudo install -d -m 750 -o root -g www-data /etc/lnmp-demo
sudo install -m 640 -o root -g www-data /dev/null /etc/lnmp-demo/db.php
sudo nano /etc/lnmp-demo/db.php
파일에 다음 내용을 넣고, 비밀번호를 데이터베이스 계정에 설정한 값으로 바꿉니다. PHP 문자열에 따옴표나 역슬래시가 있으면 올바르게 이스케이프하세요. 같은 www-data 권한으로 실행되는 다른 애플리케이션도 파일을 읽을 수 있으므로 공유 서버에서는 별도의 격리가 필요합니다.
<?php
return array(
'user' => 'lnmp_demo',
'password' => 'CHANGE_ME_STRONG_PASSWORD',
);
/var/www/lnmp-demo/db-check.php가 없음을 확인하고 다음 코드를 저장합니다. 오류 메시지나 비밀번호를 웹 응답에 노출하지 않도록 실패 여부만 표시합니다.
sudo nano /var/www/lnmp-demo/db-check.php
<?php
header('Content-Type: text/plain; charset=UTF-8');
ini_set('display_errors', '0');
$config = require '/etc/lnmp-demo/db.php';
try {
$db = new PDO('mysql:host=localhost;dbname=lnmp_demo;charset=utf8mb4',
$config['user'], $config['password'],
array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
echo "Database connection OK\n";
} catch (PDOException $e) {
http_response_code(500);
echo "Database connection failed\n";
}
curl -i http://127.0.0.1:8080/db-check.php
HTTP 200과 Database connection OK가 나오면 PHP에서 MariaDB 연결에 성공한 것입니다. 실패하면 PHP MySQL 확장, 서비스 상태, 소켓 인증과 계정·비밀번호를 확인하세요. 확인 후 임시 PHP 파일과 자격 증명 파일을 안전하게 제거하고, 더 이상 필요 없는 실습 계정과 데이터베이스도 실제 대상과 백업을 확인한 후 정리하세요.
운영 환경에 적용하기 전
실습 설정은 로컬 연결 확인용입니다. 실제 서비스를 공개하기 전에는 지원되는 OS·PHP 버전으로 이전하고, Nginx 서버 이름과 문서 루트, HTTPS 인증서, 방화벽과 클라우드 네트워크 규칙을 환경에 맞게 설정하세요. PHP 파일 업로드·실행 범위, FPM 사용자 분리, MariaDB의 네트워크 접근과 백업·복구도 검토해야 합니다.
MariaDB의 보안 설정 도구는 설치 버전에 따라 mysql_secure_installation 또는 mariadb-secure-installation으로 제공됩니다. 기존 서비스에 영향을 줄 수 있으므로 각 질문을 읽고 환경에 맞게 선택하세요. 자세한 항목은 MariaDB 보안 설정 도구 설명에서 확인할 수 있습니다.




