웹사이트 검색

Ubuntu 18.04에 Linux, Nginx, MySQL, PHP(LEMP 스택)를 설치하는 방법


소개

LEMP 소프트웨어 스택은 동적 웹 페이지 및 웹 애플리케이션을 제공하는 데 사용할 수 있는 소프트웨어 그룹입니다. 이것은 Nginx("Engine-X\로 발음) 웹 서버가 있는 Linux 운영 체제를 설명하는 약어입니다. 백엔드 데이터는 MySQL 데이터베이스에 저장되고 동적 처리는 PHP에 의해 처리됩니다.

이 가이드는 Ubuntu 18.04 서버에 LEMP 스택을 설치하는 방법을 보여줍니다. Ubuntu 운영 체제는 첫 번째 요구 사항을 처리합니다. 나머지 구성 요소를 시작하고 실행하는 방법을 설명합니다.

전제 조건

이 자습서를 완료하기 전에 서버에 sudo 권한이 있는 루트가 아닌 일반 사용자 계정이 있어야 합니다. Ubuntu 18.04용 초기 서버 설정 가이드를 완료하여 이 계정을 설정하세요.

사용자를 사용할 수 있게 되면 이 가이드에 설명된 단계를 시작할 준비가 된 것입니다.

1단계 – Nginx 웹 서버 설치

사이트 방문자에게 웹 페이지를 표시하기 위해 현대적이고 효율적인 웹 서버인 Nginx를 사용할 것입니다.

이 절차에서 사용되는 모든 소프트웨어는 Ubuntu의 기본 패키지 리포지토리에서 가져옵니다. 즉, apt 패키지 관리 제품군을 사용하여 필요한 설치를 완료합니다.

이 세션에 대해 apt를 처음 사용하므로 서버의 패키지 색인을 업데이트하여 시작하십시오.

  1. sudo apt update

다음으로 서버를 설치합니다.

  1. sudo apt install nginx

Ubuntu 18.04에서 Nginx는 설치 시 실행을 시작하도록 구성됩니다.

ufw 방화벽이 실행 중인 경우 초기 설정 가이드에 설명된 대로 Nginx에 대한 연결을 허용해야 합니다. Nginx는 설치 시 ufw에 등록하므로 절차가 다소 간단합니다.

원하는 트래픽을 계속 허용하는 가장 제한적인 프로필을 활성화하는 것이 좋습니다. 이 가이드에서 서버에 대한 SSL을 구성하지 않았으므로 포트 80의 트래픽만 허용하면 됩니다.

다음을 입력하여 활성화합니다.

  1. sudo ufw allow 'Nginx HTTP'

상태를 확인하여 변경 사항을 확인할 수 있습니다.

  1. sudo ufw status

이 명령의 출력은 HTTP 트래픽이 허용됨을 보여줍니다.

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx HTTP ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx HTTP (v6) ALLOW Anywhere (v6)

새로운 방화벽 규칙이 추가되면 웹 브라우저에서 서버의 도메인 이름 또는 공용 IP 주소에 액세스하여 서버가 실행되고 있는지 테스트할 수 있습니다.

서버를 가리키는 도메인 이름이 없고 서버의 공용 IP 주소를 모르는 경우 다음 명령을 실행하여 찾을 수 있습니다.

  1. ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'

이렇게 하면 몇 개의 IP 주소가 출력됩니다. 웹 브라우저에서 각각을 시도할 수 있습니다.

또는 인터넷의 다른 위치에서 볼 때 액세스 가능한 IP 주소를 확인할 수 있습니다.

  1. curl -4 icanhazip.com

웹 브라우저에 받은 주소를 입력하면 Nginx의 기본 랜딩 페이지로 이동합니다.

http://server_domain_or_IP

\Welcome to nginx\라는 웹 페이지를 받았다면 Nginx를 성공적으로 설치한 것입니다.

2단계 – 사이트 데이터 관리를 위한 MySQL 설치

이제 웹 서버가 있으므로 사이트의 데이터를 저장하고 관리하기 위해 MySQL(데이터베이스 관리 시스템)을 설치해야 합니다.

다음 명령을 입력하여 MySQL을 설치합니다.

  1. sudo apt install mysql-server

이제 MySQL 데이터베이스 소프트웨어가 설치되었지만 구성이 아직 완료되지 않았습니다.

설치를 보호하기 위해 MySQL은 일부 안전하지 않은 기본값을 수정할 것인지 묻는 스크립트와 함께 제공됩니다. 다음을 입력하여 스크립트를 시작합니다.

  1. sudo mysql_secure_installation

이 스크립트는 VALIDATE PASSWORD PLUGIN을 구성할지 묻습니다.

경고: 이 기능을 활성화하는 것은 판단입니다. 활성화된 경우 지정된 기준과 일치하지 않는 암호는 MySQL에서 오류와 함께 거부됩니다. phpMyAdmin용 Ubuntu 패키지와 같이 MySQL 사용자 자격 증명을 자동으로 구성하는 소프트웨어와 함께 취약한 암호를 사용하는 경우 이로 인해 문제가 발생합니다. 유효성 검사를 비활성화한 상태로 두는 것이 안전하지만 데이터베이스 자격 증명에 대해 항상 강력하고 고유한 암호를 사용해야 합니다.

Y(예)로 대답하거나 활성화하지 않고 계속하려면 다른 것을 대답하십시오.

VALIDATE PASSWORD PLUGIN 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 plugin?

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

다음으로 루트 비밀번호를 제출하고 확인하라는 메시지가 표시됩니다.

Please set the password for root here.

New password:

Re-enter new password:

나머지 질문의 경우 각 프롬프트에서 Y를 누르고 ENTER 키를 눌러야 합니다. 이렇게 하면 일부 익명 사용자와 테스트 데이터베이스가 제거되고 원격 루트 로그인이 비활성화되며 이러한 새 규칙이 로드되어 MySQL이 변경 사항을 즉시 적용합니다.

MySQL 5.7(및 이후 버전)을 실행하는 Ubuntu 시스템에서 루트 MySQL 사용자는 기본적으로 비밀번호가 아닌 auth_socket 플러그인을 사용하여 인증하도록 설정됩니다. 이것은 많은 경우에 더 큰 보안과 유용성을 허용하지만 외부 프로그램(예: phpMyAdmin)이 사용자에 액세스하도록 허용해야 하는 경우 상황을 복잡하게 만들 수도 있습니다.

auth_socket 플러그인을 사용하여 MySQL에 액세스하는 경우 작업 흐름에 맞으면 3단계로 진행할 수 있습니다. 그러나 루트로 MySQL에 연결할 때 비밀번호를 사용하려면 비밀번호를 전환해야 합니다. auth_socket에서 mysql_native_password로의 인증 방법. 이렇게 하려면 터미널에서 MySQL 프롬프트를 엽니다.

  1. sudo mysql

다음으로 다음 명령을 사용하여 각 MySQL 사용자 계정이 사용하는 인증 방법을 확인합니다.

  1. SELECT user,authentication_string,plugin,host FROM mysql.user;
Output
+------------------+-------------------------------------------+-----------------------+-----------+ | user | authentication_string | plugin | host | +------------------+-------------------------------------------+-----------------------+-----------+ | root | | auth_socket | localhost | | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost | +------------------+-------------------------------------------+-----------------------+-----------+ 4 rows in set (0.00 sec)

이 예는 루트 사용자가 실제로 auth_socket 플러그인을 사용하여 인증하는 것을 보여줍니다. 암호로 인증하도록 루트 계정을 구성하려면 다음 ALTER USER 명령을 실행합니다. 암호를 원하는 강력한 암호로 변경해야 합니다.

  1. ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

그런 다음 FLUSH PRIVILEGES를 실행하여 권한 부여 테이블을 다시 로드하고 새 변경 사항을 적용하도록 서버에 지시합니다.

  1. FLUSH PRIVILEGES;

루트가 더 이상 auth_socket 플러그인을 사용하여 인증하지 않는지 확인하려면 각 사용자가 사용하는 인증 방법을 다시 확인하십시오.

  1. SELECT user,authentication_string,plugin,host FROM mysql.user;
Output
+------------------+-------------------------------------------+-----------------------+-----------+ | user | authentication_string | plugin | host | +------------------+-------------------------------------------+-----------------------+-----------+ | root | *3636DACC8616D997782ADD0839F92C1571D6D78F | mysql_native_password | localhost | | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost | +------------------+-------------------------------------------+-----------------------+-----------+ 4 rows in set (0.00 sec)

이 예제 출력은 이제 루트 MySQL 사용자가 암호를 사용하여 인증함을 보여줍니다. 자신의 서버에서 이를 확인하면 MySQL 셸을 종료할 수 있습니다.

  1. exit

참고: 비밀번호로 인증하도록 루트 MySQL 사용자를 구성한 후에는 이전에 사용된 sudo mysql 명령으로 더 이상 MySQL에 액세스할 수 없습니다. 대신 다음을 실행해야 합니다.

  1. mysql -u root -p

설정한 비밀번호를 입력하면 MySQL 프롬프트가 표시됩니다.

이제 데이터베이스 시스템이 설정되었으며 계속해서 PHP 설치를 진행할 수 있습니다.

3단계 - PHP 프로세서를 사용하도록 PHP 설치 및 Nginx 구성

이제 페이지를 제공하기 위해 Nginx가 설치되고 데이터를 저장하고 관리하기 위해 MySQL이 설치됩니다. 그러나 여전히 동적 콘텐츠를 생성할 수 있는 것은 없습니다. 여기에서 PHP가 작동합니다.

Nginx에는 다른 웹 서버와 같은 기본 PHP 처리 기능이 포함되어 있지 않으므로 "fastCGI 프로세스 관리자\를 나타내는 php-fpm을 설치해야 합니다. 그런 다음 Nginx에 PHP를 전달하도록 지시합니다. 처리를 위해 이 소프트웨어에 요청합니다.

참고: 클라우드 제공업체에 따라 php-fpm을 설치하기 전에 Ubuntu 커뮤니티에서 유지 관리하는 무료 오픈 소스 소프트웨어가 포함된 Ubuntu의 universe 리포지토리를 추가해야 할 수도 있습니다. > 패키지. 다음 명령을 입력하여 이 작업을 수행할 수 있습니다.

  1. sudo add-apt-repository universe

추가 도우미 패키지 php-mysql과 함께 php-fpm 모듈을 설치하면 PHP가 데이터베이스 백엔드와 통신할 수 있습니다. 설치는 필요한 PHP 코어 파일을 가져옵니다. 다음을 입력하여 이를 수행하십시오.

  1. sudo apt install php-fpm php-mysql

필요한 모든 LEMP 스택 구성 요소가 설치되어 있어도 동적 콘텐츠에 PHP 프로세서를 사용하도록 Nginx에 지시하려면 몇 가지 구성을 변경해야 합니다.

이는 서버 블록 수준에서 수행됩니다(서버 블록은 Apache의 가상 호스트와 유사함). 이렇게 하려면 /etc/nginx/sites-available/ 디렉터리 내에서 선호하는 텍스트 편집기를 사용하여 새 서버 블록 구성 파일을 만듭니다. 이 예에서는 nano를 사용하고 새 서버 블록 구성 파일은 your_domain이라고 하므로 자신의 정보로 바꿀 수 있습니다.

  1. sudo nano /etc/nginx/sites-available/your_domain

기본 구성 파일을 편집하는 대신 새 서버 블록 구성 파일을 생성하면 필요한 경우 기본 구성을 복원할 수 있습니다.

기본 서버 블록 구성 파일에서 가져와 약간 수정한 다음 콘텐츠를 새 서버 블록 구성 파일에 추가합니다.

server {
        listen 80;
        root /var/www/html;
        index index.php index.html index.htm index.nginx-debian.html;
        server_name your_domain;

        location / {
                try_files $uri $uri/ =404;
        }

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        }

        location ~ /\.ht {
                deny all;
        }
}

각 디렉티브와 위치 블록이 수행하는 작업은 다음과 같습니다.

  • listen — Nginx가 수신할 포트를 정의합니다. 이 경우 HTTP의 기본 포트인 포트 80에서 수신 대기합니다.
  • root — 웹사이트에서 제공하는 파일이 저장되는 문서 루트를 정의합니다.
  • index — 인덱스 파일이 사용 가능한 경우 요청 시 index.php 파일을 제공하도록 Nginx를 구성합니다.
  • server_name — 서버에 대한 특정 요청에 사용해야 하는 서버 블록을 정의합니다. 이 지시어는 서버의 도메인 이름 또는 공용 IP 주소를 가리킵니다.
  • location / — 첫 번째 위치 블록에는 URI 요청과 일치하는 파일이 있는지 확인하는 try_files 지시문이 포함되어 있습니다. Nginx가 적절한 파일을 찾을 수 없으면 404 오류를 반환합니다.
  • location ~ \\.php$ — 이 위치 블록은 Nginx가 fastcgi-php.conf 구성 파일과 php7을 가리키도록 하여 실제 PHP 처리를 처리합니다. .2-fpm.sock 파일, php-fpm과 연결된 소켓을 선언합니다.
  • location ~ /\\.ht — 마지막 위치 블록은 Nginx가 처리하지 않는 .htaccess 파일을 처리합니다. deny all 지시문을 추가하면 .htaccess 파일이 문서 루트로 들어가는 경우 방문자에게 제공되지 않습니다.

이 콘텐츠를 추가한 후 파일을 저장하고 닫습니다. nano를 사용하는 경우 CTRL + X를 누른 다음 YENTER를 눌러 이 작업을 수행할 수 있습니다. 새 서버 블록 구성 파일(/etc/nginx/sites-available/ 디렉터리에 있음)에서 /etc/nginx/sites-로의 심볼릭 링크를 생성하여 새 서버 블록을 활성화합니다. 활성화된/ 디렉토리:

  1. sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

그런 다음 /sites-enabled/ 디렉터리에서 기본 구성 파일의 연결을 해제합니다.

  1. sudo unlink /etc/nginx/sites-enabled/default

참고: 기본 구성을 복원해야 하는 경우 다음과 같은 명령을 사용하여 심볼릭 링크를 다시 생성하면 됩니다.

  1. sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/

구문 오류에 대해 새 구성 파일을 테스트합니다.

  1. sudo nginx -t

오류가 보고되면 계속하기 전에 돌아가서 파일을 다시 확인하십시오.

준비가 되면 Nginx를 다시 로드하여 필요한 변경을 수행합니다.

  1. sudo systemctl reload nginx

이로써 LEMP 스택의 설치 및 구성이 완료됩니다. 그러나 모든 구성 요소가 서로 통신할 수 있는지 확인하는 것이 좋습니다.

4단계 – 구성 테스트를 위한 PHP 파일 생성

이제 LEMP 스택이 완전히 설정되었습니다. 이를 테스트하여 Nginx가 .php 파일을 PHP 프로세서에 올바르게 전달할 수 있는지 확인할 수 있습니다.

이렇게 하려면 원하는 텍스트 편집기를 사용하여 문서 루트에 info.php라는 테스트 PHP 파일을 만듭니다.

  1. sudo nano /var/www/html/info.php

새 파일에 다음 줄을 입력합니다. 이것은 서버에 대한 정보를 반환하는 유효한 PHP 코드입니다.

<?php
phpinfo();

완료되면 파일을 저장하고 닫습니다.

이제 웹 브라우저에서 서버의 도메인 이름 또는 공용 IP 주소를 방문하고 /info.php를 입력하여 이 페이지를 방문할 수 있습니다.

http://your_server_domain_or_IP/info.php

브라우저는 서버에 대한 정보와 함께 PHP에 의해 생성된 다음과 같은 웹 페이지를 로드합니다.

페이지가 설명된 대로라면 Nginx로 PHP 처리를 성공적으로 설정한 것입니다.

Nginx가 페이지를 올바르게 렌더링하는지 확인한 후 생성한 파일을 제거하는 것이 가장 좋습니다. 권한이 없는 사용자가 침입을 시도하는 데 도움이 될 수 있는 구성에 대한 몇 가지 힌트를 실제로 제공할 수 있기 때문입니다. 나중에 필요할 때 이 파일을 언제든지 다시 생성할 수 있습니다.

지금은 파일을 제거합니다.

  1. sudo rm /var/www/html/info.php

이를 통해 Ubuntu 18.04 서버에 완전히 구성되고 작동하는 LEMP 스택이 있습니다.

결론

LEMP 스택은 서버에서 거의 모든 웹사이트 또는 애플리케이션을 설정하고 제공할 수 있는 강력한 플랫폼입니다.

여기에서 취할 수 있는 다음 단계가 많이 있습니다. 예를 들어 서버에 대한 연결이 안전한지 확인해야 합니다. 이를 위해 Let’s Encrypt로 Nginx 설치를 보호할 수 있습니다. 이 가이드를 따르면 서버에 대한 무료 TLS/SSL 인증서를 획득하여 HTTPS를 통해 콘텐츠를 제공할 수 있습니다.