우분투에 리눅스, Nginx, MySQL, PHP(LEMP 스택) 설치하는 방법
소개
LEMP 소프트웨어 스택은 PHP로 작성된 동적 웹 페이지와 웹 애플리케이션을 제공합니다. 이는 Linux 운영 체제와 Nginx(‘Engine-X’로 발음되는) 웹 서버를 설명하는 약어입니다. 백엔드 데이터는 MySQL 데이터베이스에 저장되며, 동적 처리는 PHP에 의해 처리됩니다.
이 가이드는 Ubuntu 서버에 LEMP 스택을 설치하는 방법을 보여줍니다. Ubuntu 운영 체제는 스택의 Linux 부분을 담당합니다. 나머지 구성 요소들을 설치하고 실행하는 방법도 설명하겠습니다.
참고: 이 튜토리얼은 주로 PHP 8.1이 설치된 Ubuntu 22.04 LTS를 대상으로 합니다. Ubuntu 24.04 LTS 사용자의 경우, 명령어 전반에서 PHP 버전을
php8.1-fpm에서php8.3-fpm로 조정하세요. 또한, Nginx 설정에서 PHP-FPM 소켓 경로도 반드시 업데이트해야 합니다 (예: Ubuntu 24.04에서는/run/php/php8.3-fpm.sock사용).
우분투에 리눅스, Nginx, MySQL, PHP(LEMP 스택) 설치하는 방법
- Nginx 웹 서버 설치
- MySQL 설치
- PHP 설치하기
- PHP 프로세서를 사용하도록 Nginx 구성하기
- Nginx로 PHP 테스트하기
- PHP에서 데이터베이스 연결 테스트
전제 조건
UFW 방화벽이 활성화된 Ubuntu에서 루트가 아닌 sudo 사용자를 사용하세요. 이를 구성하려면 Ubuntu용 초기 서버 설정 가이드를 따르세요.
1단계 – Nginx 웹 서버 설치
웹 페이지를 사이트 방문자에게 표시하기 위해 고성능 웹 서버인 Nginx를 사용할 것입니다. 이 소프트웨어를 얻기 위해 APT 패키지 관리자를 사용할 것입니다.
서버의 패키지 인덱스를 업데이트한 다음, Nginx를 설치하세요:
sudo apt update그 다음, Nginx를 설치하기 위해 apt install을 실행하세요:
sudo apt install nginx프롬프트가 나타나면 설치를 확인하기 위해 Y를 누르고 ENTER를 누르세요. 설치가 완료되면 Nginx 웹 서버가 활성화되어 Ubuntu 서버에서 실행됩니다.
Nginx가 실행 중인지 확인하세요:
sudo systemctl status nginxNginx가 활성화되어 있다는 출력이 표시되어야 합니다:
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since...우분투에서는 Nginx가 설치 시 자동으로 실행되도록 설정되어 있습니다.
HTTP 트래픽을 ufw 방화벽을 통해 허용합니다. Nginx는 설치 시 여러 UFW 애플리케이션 프로필을 등록합니다. 사용 가능한 프로필을 확인하세요:
sudo ufw app listAvailable applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH필요한 트래픽을 허용하는 가장 제한적인 프로필을 활성화합니다. SSL이 아직 구성되지 않았으므로 80 포트에서 HTTP 트래픽만 허용합니다:
다음 명령을 실행하여 이를 활성화하세요:
sudo ufw allow 'Nginx HTTP'
방화벽 변경 사항을 확인하십시오:
sudo ufw status이 출력은 이제 HTTP 트래픽이 허용된다는 것을 보여줍니다:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)Nginx 서버의 도메인 기능을 테스트하려면 선호하는 웹 브라우저를 사용하여 http://your_domain로 이동하세요.
서버를 가리키는 도메인 이름이 없고 서버의 공인 IP 주소를 모르는 경우, 다음 명령어 중 하나를 실행하여 확인할 수 있습니다:
ip addr showhostname -I이것은 몇 개의 IP 주소를 출력합니다. 웹 브라우저에서 차례대로 각각 시도해 볼 수 있습니다.
대안으로, 인터넷의 다른 위치에서 볼 때 어떤 IP 주소에 접근할 수 있는지 확인할 수 있습니다:
curl -4 icanhazip.com웹 브라우저에서 받은 주소를 입력하면 Nginx의 기본 시작 페이지로 이동합니다:
http://<server_domain_or_IP>이 페이지를 받았다면, 이는 Nginx를 성공적으로 설치하고 웹 서버에 대한 HTTP 트래픽을 활성화했음을 의미합니다.
2단계 — MySQL 설치
사이트 데이터를 저장하고 관리하기 위해 MySQL을 설치하세요. MySQL은 PHP 환경에서 표준 데이터베이스 관리 시스템입니다.
다시 한 번, apt를 사용하여 이 소프트웨어를 획득하고 설치하세요:
sudo apt install mysql-server프롬프트가 표시되면 Y를 눌러 설치를 확인한 다음 ENTER를 누르세요.
설치 후, 보안 스크립트를 실행하여 안전하지 않은 기본 설정을 제거하고 데이터베이스 접근을 제한하세요:
sudo mysql_secure_installation사용자에게 VALIDATE PASSWORD PLUGIN을(를) 구성할 것인지 묻는 질문이 표시됩니다.
참고: 이 기능을 활성화하는 것은 어느 정도 판단에 따라 결정됩니다. 활성화하면 지정된 기준과 일치하지 않는 비밀번호는 MySQL에서 오류와 함께 거부됩니다. 검증을 비활성화 상태로 두는 것은 안전하지만, 데이터베이스 자격 증명에는 항상 강력하고 고유한 비밀번호를 사용하는 것이 좋습니다.
예를 원하면 Y를 입력하고, 그렇지 않으면 활성화하지 않고 계속하려면 아무 글자나 입력하세요:
VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?
Press y|Y for Yes, any other key for No: 만약 '예'라고 답하면, 비밀번호 검증 수준을 선택하라는 요청을 받게 됩니다. 가장 높은 수준인 2를 입력하면 숫자, 대문자와 소문자, 특수 문자가 포함되지 않은 비밀번호를 설정하려고 할 때 오류가 발생한다는 점을 기억하세요:
There are three levels of password validation policy:
LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1사용자가 VALIDATE PASSWORD PLUGIN을 설정하기로 했는지 여부와 상관없이, 서버는 MySQL root 사용자에 대한 비밀번호를 선택하고 확인하도록 요청합니다. 이는 시스템 root와 혼동해서는 안 됩니다. 데이터베이스 root 사용자는 데이터베이스 시스템에 대한 모든 권한을 가진 관리자 사용자입니다. MySQL root 사용자의 기본 인증 방식은 비밀번호 사용을 요구하지 않더라도 비밀번호가 설정되어 있는 경우에도, 추가적인 보안 조치로서 여기에 강력한 비밀번호를 설정하는 것이 좋습니다. 이에 대해서는 잠시 후 자세히 설명하겠습니다.
암호 검증을 활성화한 경우, 입력한 루트 암호의 암호 강도가 표시되며 서버가 해당 암호로 계속 진행할지 묻습니다. 현재 암호에 만족하면 프롬프트에서 Y를 눌러 “예”를 선택하세요:
Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y나머지 질문에 대해서는 각 프롬프트에서 Y를 누르고 ENTER 키를 누르세요. 이렇게 하면 일부 익명 사용자와 테스트 데이터베이스가 제거되고, 원격 루트 로그인이 비활성화되며, MySQL이 여러분이 변경한 내용을 즉시 반영하도록 새로운 규칙이 적용됩니다.
완료되면 MySQL 콘솔에 로그인할 수 있는지 테스트하세요:
sudo mysql이 명령을 실행할 때 sudo를 사용함으로써 추론되는 대로, 이것은 MySQL 서버에 관리 데이터베이스 사용자 root로 연결됩니다. 다음과 같은 출력이 표시되어야 합니다:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.28-0ubuntu4 (Ubuntu)
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>MySQL 콘솔을 종료하려면 다음을 입력하세요:
exitUbuntu에 설치할 때, mysql_secure_installation 스크립트를 실행하여 비밀번호를 설정했더라도 root 사용자로 연결할 때 비밀번호를 제공할 필요가 없다는 점을 주목하세요. 이는 Ubuntu에서 기본적으로 MySQL 관리 사용자에 대한 인증 방법이 비밀번호를 사용하는 방법이 아닌 auth_socket이기 때문입니다. 처음에는 보안 우려가 있을 수 있지만, 이는 데이터베이스 서버를 더 안전하게 만듭니다. 왜냐하면 root MySQL 사용자로 로그인할 수 있는 유일한 사용자는 콘솔에서 sudo 권한으로 연결하거나 동일한 권한으로 실행 중인 애플리케이션을 통해 연결하는 시스템 사용자이기 때문입니다. 실질적으로, 이것은 PHP 애플리케이션에서 관리 데이터베이스 root 사용자로 연결할 수 없다는 것을 의미합니다.
보안을 강화하려면, 특히 서버에 여러 데이터베이스를 호스팅할 계획이 있다면, 각 데이터베이스마다 권한이 제한된 전용 사용자 계정을 설정하는 것이 가장 좋습니다.
참고: 일부 구버전 네이티브 MySQL PHP 라이브러리 mysqlnd는 생성된 MySQL 8 사용자에 대한 기본 인증 방식인 caching_sha2_authentication를 지원하지 않습니다. 이러한 이유로, MySQL 8에서 PHP 애플리케이션용 데이터베이스 사용자를 생성할 때 mysql_native_password를 사용하도록 구성되어 있는지 확인해야 할 수 있습니다. Step 6에서 그 방법을 시연하겠습니다.
이제 MySQL 서버가 설치되고 보안 설정이 완료되었습니다. 다음으로 LEMP 스택의 마지막 구성 요소인 PHP를 설치하겠습니다.
3단계 – PHP 설치
코드를 처리하고 동적 콘텐츠를 생성하려면 PHP를 설치하세요. Nginx는 PHP 처리를 위해 외부 프로그램이 필요합니다.
PHP-FPM(“fastCGI 프로세스 관리자”)는 추가 보안 기능과 함께 PHP 처리를 효율적으로 처리하여 PHP 기반 웹사이트의 성능을 향상시킵니다. Nginx에서 PHP 요청을 전달하려면 php-fpm을 설치하고, PHP와 MySQL 간의 통신을 가능하게 하려면 php-mysql을 설치하세요. 핵심 PHP 패키지는 종속성으로 자동 설치됩니다.
php8.1-fpm 및 php-mysql 패키지를 설치하려면 다음을 실행하세요:
sudo apt install php8.1-fpm php-mysql프롬프트가 표시되면 설치를 확인하기 위해 Y와 ENTER를 누르세요.
PHP-FPM이 실행 중인지 확인하세요:
sudo systemctl status php8.1-fpmPHP-FPM이 활성화되어 있음을 보여주는 출력을 확인해야 합니다:
● php8.1-fpm.service - The PHP 8.1 FastCGI Process Manager
Loaded: loaded
Active: active (running)PHP 버전도 확인할 수 있습니다:
php -vPHP 8.1.x (cli) (built: ...)
Copyright (c) The PHP Group
Zend Engine v4.1.x이 PHP 구성 요소를 사용하도록 Nginx를 설정하세요.
단계 4 — PHP 프로세서를 사용하도록 Nginx 구성하기
Nginx 서버 블록(Apache 가상 호스트와 유사)을 만들어 구성을 캡슐화하고 하나의 서버에서 여러 도메인을 호스팅하세요. 이 가이드에서는 예시 도메인 이름으로 your_domain을 사용합니다.
정보: Linux-Console.net에서 도메인 이름을 설정하는 방법에 대해 더 알고 싶다면, Linux-Console.net DNS 소개를 읽어보세요.
Ubuntu 22.04에서 Nginx는 /var/www/html에서 문서를 제공하는 하나의 기본 서버 블록을 활성화합니다. 여러 사이트를 운영하려면 /var/www 내에 your_domain용 디렉토리 구조를 생성하고, /var/www/html은 기본 폴백 디렉토리로 남겨두세요.
your_domain에 대한 루트 웹 디렉토리를 다음과 같이 생성합니다:
sudo mkdir /var/www/your_domain다음으로, 현재 시스템 사용자를 참조하는 $USER 환경 변수를 사용하여 디렉터리의 소유권을 할당합니다:
sudo chown -R $USER:$USER /var/www/your_domain그런 다음, 원하는 명령어 기반 편집기를 사용하여 Nginx의 sites-available 디렉터리에서 새 구성 파일을 엽니다. 여기서는 nano를 사용하겠습니다:
sudo nano /etc/nginx/sites-available/your_domain이렇게 하면 새 빈 파일이 생성됩니다. 다음의 최소한의 구성 내용을 삽입하세요:
server {
listen 80;
server_name your_domain www.your_domain;
root /var/www/your_domain;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}각 지시문과 위치 블록이 하는 일은 다음과 같습니다:
listen— Nginx가 어떤 포트에서 수신할지 정의합니다. 이 경우, HTTP의 기본 포트인80포트에서 수신합니다.root— 이 웹사이트에서 제공되는 파일이 저장되는 문서 루트를 정의합니다.index— Nginx가 이 웹사이트의 인덱스 파일 우선순위를 정의합니다. PHP 애플리케이션에서 유지 관리용 랜딩 페이지를 빠르게 설정할 수 있도록index.php파일보다index.html파일을 더 높은 우선순위로 나열하는 것이 일반적인 관행입니다. 이러한 설정은 애플리케이션 요구에 맞게 조정할 수 있습니다.server_name— 이 서버 블록이 응답할 도메인 이름 및/또는 IP 주소를 정의합니다. 이 지시문을 서버의 도메인 이름이나 공인 IP 주소로 지정하세요.location /— 첫 번째 location 블록에는try_files지시어가 포함되어 있으며, 이는 URL 요청과 일치하는 파일이나 디렉터리의 존재를 확인합니다. Nginx가 적절한 리소스를 찾을 수 없는 경우, 404 오류를 반환합니다.location ~ \.php$— 이 location 블록은 Nginx가fastcgi-php.conf구성 파일과php8.1-fpm.sock파일을 가리키도록 하여 실제 PHP 처리를 담당합니다. 이 파일은php8.1-fpm과 연결된 소켓을 선언합니다.location ~ /\.ht— 마지막 location 블록은 Nginx가 처리하지 않는.htaccess파일을 다룹니다.deny all지시어를 추가하면, 만약 어떤.htaccess파일이 문서 루트에 들어오더라도 방문자에게 서비스되지 않게 됩니다.
편집을 마쳤으면 파일을 저장하고 닫으세요. nano를 사용 중이라면 CTRL+X를 누른 후 Y와 ENTER를 눌러 확인하면 됩니다.
Nginx의 sites-enabled 디렉토리에서 구성 파일을 링크하여 구성을 활성화하세요:
sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/그런 다음, 기본 설정 파일의 연결을 /sites-enabled/ 디렉터리에서 해제하세요:
sudo unlink /etc/nginx/sites-enabled/default참고: 기본 설정을 복원해야 할 경우, 다음과 같이 심볼릭 링크를 다시 만들어 복원할 수 있습니다:
sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/이렇게 하면 Nginx가 다음 번에 다시 로드될 때 해당 구성을 사용하도록 지시하게 됩니다. 다음을 실행하여 구문의 오류가 있는지 구성 파일을 테스트할 수 있습니다:
sudo nginx -t오류가 보고되면 계속하기 전에 구성 파일로 돌아가 내용을 검토하세요.
준비가 되면 변경 사항을 적용하기 위해 Nginx를 다시 로드하세요:
sudo systemctl reload nginx새 웹사이트가 이제 활성화되었지만, 웹 루트 /var/www/your_domain 는 여전히 비어 있습니다. 해당 위치에 index.html 파일을 생성하여 새 서버 블록이 예상대로 작동하는지 테스트할 수 있습니다:
nano /var/www/your_domain/index.html이 파일에 다음 내용을 포함하세요:
<html>
<head>
<title>your_domain website</title>
</head>
<body>
<h1>Hello World!</h1>
<p>This is the landing page of <strong>your_domain</strong>.</p>
</body>
</html>이제 브라우저를 열고 서버 블록 구성 파일의 server_name 지시문에 나열된 서버의 도메인 이름이나 IP 주소에 접속하세요:
http://server_domain_or_IP다음과 같은 페이지를 받게 됩니다:
이 페이지를 받았다면, 이는 귀하의 Nginx 서버 블록이 정상적으로 작동하고 있음을 의미합니다.
이 파일을 임시 랜딩 페이지로 그대로 둘 수 있으며, 나중에 이를 대체할 index.php 파일을 설정할 때까지 사용할 수 있습니다.
경고: index.php 파일을 추가한 후에는 문서 루트에서 index.html 파일을 삭제하거나 이름을 변경해야 합니다. 두 파일이 모두 존재하면 Nginx가 기본적으로 index.html을 제공하며, PHP 페이지는 표시되지 않습니다. 이는 초보자들이 흔히 혼동하는 원인입니다.
이제 LEMP 스택이 완전히 구성되었습니다. 다음 단계에서는 PHP 스크립트를 작성하여 Nginx가 새로 구성한 웹사이트 내에서 .php 파일을 실제로 처리할 수 있는지 테스트할 것입니다.
5단계 – Nginx에서 PHP 테스트하기
이제 LEMP 스택이 완전히 설정되었습니다. Nginx가 .php 파일을 PHP 처리기로 올바르게 전달할 수 있는지 확인하려면 테스트해 보세요.
문서 루트에 테스트 PHP 파일을 만들어서 이 작업을 수행할 수 있습니다. 선호하는 텍스트 편집기에서 문서 루트에 info.php라는 새 파일을 열어보세요:
nano /var/www/your_domain/info.php다음 줄을 새 파일에 추가하세요. 이는 서버에 대한 정보를 반환하는 유효한 PHP 코드입니다:
<?php
phpinfo();작업을 마쳤으면 파일을 저장하고 닫으세요.
이제 Nginx 구성 파일에서 설정한 도메인 이름 또는 공인 IP 주소로 웹 브라우저를 통해 이 페이지에 접속한 다음, /info.php를 입력하면 접근할 수 있습니다.
http://server_domain_or_IP/info.php서버에 대한 자세한 정보가 포함된 웹 페이지를 받게 됩니다:
해당 페이지를 통해 PHP 서버에 대한 관련 정보를 확인한 후, 해당 파일에는 PHP 환경과 Ubuntu 서버에 대한 민감한 정보가 포함되어 있으므로 생성한 파일을 삭제하는 것이 가장 좋습니다. rm을 사용하여 해당 파일을 삭제할 수 있습니다:
sudo rm /var/www/your_domain/info.php나중에 필요하면 이 파일을 언제든지 다시 생성할 수 있습니다.
6단계 — PHP에서 데이터베이스 연결 테스트 (선택 사항)
PHP가 MySQL에 연결하고 데이터베이스 쿼리를 실행할 수 있는지 테스트하려면, 더미 데이터가 들어있는 테스트 테이블을 생성하고 PHP 스크립트에서 그 내용을 조회할 수 있습니다. 그 전에 테스트용 데이터베이스와 해당 데이터베이스에 접근할 수 있도록 적절히 설정된 새로운 MySQL 사용자를 먼저 만들어야 합니다.
참고: 일부 오래된 MySQL PHP 라이브러리 mysqlnd 버전은 MySQL 8의 기본 인증 방식인 caching_sha2_authentication을 지원하지 않습니다. 대신 mysql_native_password를 사용하도록 설정되어 있는지 확인해야 할 수 있습니다.
우리는 example_database라는 데이터베이스와 example_user라는 사용자를 생성할 것입니다. 하지만 이 이름들은 다른 값으로 바꿀 수 있습니다.
먼저, root 계정을 사용하여 MySQL 콘솔에 연결합니다:
sudo mysql새 데이터베이스를 만들려면 MySQL 콘솔에서 다음 명령을 실행하세요:
CREATE DATABASE example_database;이제 새 사용자를 생성하고 생성한 맞춤 데이터베이스에 대한 모든 권한을 부여할 수 있습니다.
다음 명령은 기본 인증 방법으로 mysql_native_password를 사용하여 example_user라는 새 사용자를 생성합니다. 이 사용자의 비밀번호를 password로 정의하고 있지만, 실제로는 안전한 비밀번호로 바꾸어 사용하는 것이 좋습니다.
CREATE USER 'example_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';이제 이 사용자에게 example_database 데이터베이스에 대한 권한을 부여해야 합니다:
GRANT ALL ON example_database.* TO 'example_user'@'%';이렇게 하면 example_user 사용자가 example_database 데이터베이스에 대한 모든 권한을 가지게 되면서, 이 사용자가 서버의 다른 데이터베이스를 생성하거나 수정하는 것은 방지됩니다.
다음 명령어를 사용하여 MySQL 셸을 종료하세요:
exit새 사용자가 적절한 권한을 가지고 있는지 테스트하려면 이번에는 사용자 지정 계정 자격 증명을 사용하여 MySQL 콘솔에 다시 로그인하면 됩니다. 이 명령에서 -p 플래그에 주목하세요. 이 플래그는 example_user 사용자를 생성할 때 사용한 비밀번호를 입력하라는 메시지를 표시합니다:
mysql -u example_user -pMySQL 콘솔에 로그인한 후, example_database 데이터베이스에 접근할 수 있는지 확인하세요:
SHOW DATABASES;이렇게 하면 다음과 같은 출력이 반환됩니다:
+--------------------+
| Database |
+--------------------+
| example_database |
| information_schema |
+--------------------+
2 rows in set (0.000 sec)다음으로, todo_list라는 테스트 테이블을 생성하겠습니다. MySQL 콘솔에서 다음 명령을 실행하세요:
CREATE TABLE example_database.todo_list (
item_id INT AUTO_INCREMENT,
content VARCHAR(255),
PRIMARY KEY(item_id)
);테스트 테이블에 몇 줄의 내용을 삽입하세요. 다음 명령을 몇 번 반복하여 서로 다른 값을 사용할 수도 있습니다:
INSERT INTO example_database.todo_list (content) VALUES ("My first important item");데이터가 테이블에 성공적으로 저장되었는지 확인하려면 다음을 실행하세요:
SELECT * FROM example_database.todo_list;출력은 다음과 같이 표시되어야 합니다:
+---------+--------------------------+
| item_id | content |
+---------+--------------------------+
| 1 | My first important item |
| 2 | My second important item |
| 3 | My third important item |
| 4 | and this one more thing |
+---------+--------------------------+
4 rows in set (0.000 sec)테스트 테이블에 유효한 데이터가 있는 것을 확인한 후, MySQL 콘솔을 종료할 수 있습니다:
exit이제 MySQL에 연결하고 콘텐츠를 쿼리할 PHP 스크립트를 만들 수 있습니다. 선호하는 편집기를 사용하여 맞춤 웹 루트 디렉터리에 새 PHP 파일을 만드세요. 여기서는 nano를 사용하겠습니다:
nano /var/www/your_domain/todo_list.php다음 PHP 스크립트는 MySQL 데이터베이스에 연결하고 todo_list 테이블의 내용을 조회하여 결과를 목록에 표시합니다. 데이터베이스 연결에 문제가 있을 경우 예외를 발생시킵니다.
todo_list.php 스크립트에 다음 내용을 추가하세요:
<?php
$user = "example_user";
$password = "password";
$database = "example_database";
$table = "todo_list";
try {
$db = new PDO("mysql:host=localhost;dbname=$database", $user, $password);
echo "<h2>TODO</h2><ol>";
foreach($db->query("SELECT content FROM $table") as $row) {
echo "<li>" . $row['content'] . "</li>";
}
echo "</ol>";
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
편집을 마쳤으면 파일을 저장하고 닫으세요.
이제 웹 브라우저에서 사이트에 설정된 도메인 이름이나 공인 IP 주소 뒤에 /todo_list.php를 붙여 이 페이지에 접속할 수 있습니다.
http://server_domain_or_IP/todo_list.php다음과 같은 페이지를 받게 되며, 테스트 테이블에 삽입한 내용이 표시됩니다:
즉, PHP 환경이 MySQL 서버에 연결하고 상호작용할 준비가 되었다는 의미입니다.
자주 묻는 질문
LEMP 스택은 무엇에 사용되나요?
LEMP 스택은 WordPress, Laravel, Magento, Drupal 및 맞춤형 PHP 프로젝트를 포함한 동적 PHP 기반 웹사이트와 애플리케이션을 호스팅합니다. 특히 효율적인 동시 연결 처리가 필요한 높은 트래픽 사이트에 적합합니다.
LEMP 스택과 LAMP 스택의 차이점은 무엇인가요?
LEMP는 Nginx를 사용합니다, 이는 이벤트 기반 아키텍처로 비동기적으로 연결을 처리하여 동시 사용자에게 효율적입니다. LAMP는 Apache를 사용합니다, 전통적으로 요청마다 스레드를 생성하지만(현대 Apache는 이벤트 기반 모드도 지원함) LEMP는 일반적으로 정적 콘텐츠와 고동시성 시나리오에서 더 나은 성능을 제공하며, LAMP는 .htaccess 설정이 더 쉽고 모듈 지원이 더 넓습니다.
LEMP용으로 어떤 우분투 버전을 사용해야 하나요?
Ubuntu 22.04 LTS는 이 가이드의 주요 대상이며, PHP 8.1, MySQL 8.0, Nginx를 장기 지원과 함께 제공합니다. Ubuntu 24.04 LTS(최신 릴리스)는 기본적으로 PHP 8.3을 포함하며, PHP-FPM 소켓 경로와 버전 번호를 적절히 조정하면 이 가이드와 함께 사용할 수 있습니다.
Ubuntu 24.04에서 LEMP 스택을 어떻게 설치하나요?
다음 핵심 단계를 따르세요:
- Nginx 설치:
sudo apt install nginx - MySQL 설치:
sudo apt install mysql-server - MySQL 보안 스크립트 실행:
sudo mysql_secure_installation - PHP-FPM 설치:
sudo apt install php-fpm php-mysql - PHP-FPM 통합으로 Nginx 서버 블록 구성
info.php와 데이터베이스 연결로 테스트
위의 1~6단계에서 전체 안내를 확인하세요.
Nginx와 MySQL을 사용할 때 어떤 버전의 PHP를 설치해야 하나요?
최상의 호환성을 위해 Ubuntu 버전의 기본 PHP를 사용하세요:
- Ubuntu 22.04: PHP 8.1 (
php8.1-fpm을 통해 설치됨) - Ubuntu 24.04: PHP 8.3 (이 버전의 경우 명령어를
php8.3-fpm으로 조정하세요)
두 버전 모두 Nginx와 MySQL 8.0에서 훌륭하게 작동하며, 최신 프레임워크를 지원하고 활발한 보안 업데이트를 받습니다.
Nginx에서 PHP 파일을 처리하도록 설정하려면 어떻게 해야 하나요?
PHP 요청을 Unix 소켓을 통해 PHP-FPM으로 라우팅하도록 Nginx 서버 구성에 location ~ \.php$ 블록을 추가하세요:
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}PHP 버전에 따라 소켓 경로를 조정하고, sudo nginx -t로 테스트한 후, sudo systemctl reload nginx로 다시 로드하세요.
PHP-FPM을 설치한 후 왜 '502 Bad Gateway' 오류가 발생하나요?
502 오류는 Nginx가 PHP-FPM과 통신할 수 없음을 나타냅니다. 일반적인 원인:
- PHP-FPM 실행 중 아님:
sudo systemctl status php8.1-fpm로 상태를 확인하고 필요하면 시작하세요 - 잘못된 소켓 경로:
/run/php/php8.1-fpm.sock가 존재하는지 확인하고 Nginx 설정과 일치하는지 확인하세요 - 권한 문제: Nginx 사용자(www-data)가 소켓에 접근할 수 있는지 확인하세요
- PHP-FPM 구성 오류:
/var/log/php8.1-fpm.log에서 로그를 확인하세요
해결 방법: 두 서비스를 모두 재시작합니다:
sudo systemctl restart php8.1-fpm nginxMySQL 설치 후 어떻게 보안을 강화하나요?
내장 보안 스크립트를 실행하세요:
sudo mysql_secure_installation다음 지시에 따라:
- 비밀번호 검증 플러그인 활성화
- 강력한 루트 비밀번호 설정
- 익명 사용자 제거
- 원격 루트 로그인 비활성화
- 테스트 데이터베이스 삭제
- 권한 새로고침
응용 프로그램 데이터베이스의 경우, 루트 계정을 사용하는 대신 제한된 권한을 가진 전용 사용자를 생성하세요.
하나의 LEMP 서버에서 여러 웹사이트를 운영할 수 있나요?
네, 각 도메인에 대해 별도의 Nginx 서버 블록을 만드세요:
- 디렉토리 생성:
sudo mkdir -p /var/www/second_domain - 서버 블록 생성:
sudo nano /etc/nginx/sites-available/second_domain - 고유한
server_name및root지시문으로 구성하세요 - 활성화:
sudo ln -s /etc/nginx/sites-available/second_domain /etc/nginx/sites-enabled/ - 테스트 후 다시 로드:
sudo nginx -t && sudo systemctl reload nginx
각 사이트는 개별 PHP 설정과 데이터베이스 사용자를 가질 수 있습니다.
PHP를 최신 버전으로 업그레이드하려면 어떻게 하나요?
우분투 패키지 업그레이드는 마이너 버전을 자동으로 처리합니다. 주요 버전 업그레이드의 경우:
Ondřej의 PHP PPA(신뢰할 수 있는 타사 저장소)를 추가하세요.
sudo add-apt-repository ppa:ondrej/php sudo apt update새 PHP-FPM 버전 설치:
sudo apt install php8.3-fpm php8.3-mysql -yNginx 설정의 소켓 경로를
/run/php/php8.3-fpm.sock로 업데이트하세요Nginx 테스트 및 재시작
선택적으로 이전 버전 제거:
sudo apt purge php8.1-fpm
운영 시스템을 업그레이드하기 전에 항상 스테이징 환경에서 테스트하세요.
일반적인 문제 해결
502 잘못된 게이트웨이 오류
가장 흔한 LEMP 스택 문제는 Nginx가 PHP-FPM과 통신할 수 없을 때 발생합니다:
PHP-FPM 상태 확인:
sudo systemctl status php8.1-fpm소켓 경로 확인:
ls -la /run/php/예상 출력에는 php8.1-fpm.sock 파일이 표시되어야 합니다.
일반적인 해결 방법:
- PHP-FPM 재시작:
sudo systemctl restart php8.1-fpm - Nginx 서버 블록 소켓 경로가 실제 PHP-FPM 소켓과 일치하는지 확인
- 파일 권한 확인:
sudo chown www-data:www-data /run/php/php8.1-fpm.sock
권한 거부 오류
웹 디렉토리 권한 수정:
sudo chown -R www-data:www-data /var/www/your_domain
sudo chmod -R 755 /var/www/your_domainMySQL 연결 문제
MySQL 루트 비밀번호 재설정:
sudo mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_password';
FLUSH PRIVILEGES;
EXIT;MySQL 서비스 확인:
sudo systemctl status mysqlPHP가 처리되지 않음
PHP 모듈 확인:
php -m | grep -E 'mysql|fpm'PHP-FPM 구성 확인:
sudo nginx -t
sudo php-fpm8.1 -t디버그 404 오류:
- Nginx
index지시어에index.php가 나열되어 있는지 확인하세요 - 파일 존재 여부 확인:
ls -la /var/www/your_domain/ - Nginx 오류 로그 확인:
sudo tail -f /var/log/nginx/error.log
결론
이 가이드에서는 Nginx를 웹 서버로, MySQL을 데이터베이스 시스템으로 사용하여 PHP 웹사이트와 애플리케이션을 방문자에게 제공하기 위한 유연한 기반을 구축했습니다. Apache 웹 서버를 사용해서도 동일하게 진행할 수 있으며, 우분투에서 Linux, Apache, MySQL, PHP(LAMP) 스택을 설치하는 방법에 대한 튜토리얼을 확인해보세요. 또한 무료로 신뢰할 수 있는 인증서를 제공하는 Let’s Encrypt를 사용하여 사이트를 안전하게 보호할 수도 있습니다. Apache용 Let’s Encrypt 가이드를 통해 이를 수행하는 방법을 배워보세요.
Linux-Console.net 커뮤니티와 함께 학습해 주셔서 감사합니다.



