IBM Cloud Docs
VPC에 있는 LAMP 스택의 PHP 웹 애플리케이션

VPC에 있는 LAMP 스택의 PHP 웹 애플리케이션

이 튜토리얼에서는 비용이 발생할 수 있습니다. Cost Estimator를 사용하여 예상 사용량을 기반으로 비용 추정값을 생성하십시오.

이 튜토리얼에서는 IBM Cloud 가상 사설 클라우드(VPC)인프라에서 Apache 웹 서버, MySQL 데이터 베이스, PHP 스크립팅을 사용하여 Ubuntu Linux 가상 서버를 만드는 방법을 안내합니다. 이 소프트웨어 조합(일반적으로 LAMP 스택 이라고 함)은 웹사이트와 웹 애플리케이션을 제공하는 데 자주 사용됩니다. IBM Cloud VPC를 사용하여 LAMP 스택을 빠르게 배치하며 원하는 경우 로깅 및 모니터링을 추가합니다. LAMP 서버를 실제로 체험하기 위해, 여러분은 무료 오픈 소스인 WordPress 콘텐츠 관리 시스템도 설치하고 구성해야 합니다.

목표

  • VPC에서 가상 서버 인스턴스(VSI)를 프로비저닝합니다.
  • 최신 Apache, MySQL 및 PHP 소프트웨어를 설치합니다.
  • WordPress를 설치하고 구성하여 웹 사이트 또는 블로그를 호스팅합니다.
  • 정전을 발견하고 성능 저하를 모니터하도록 로깅 및 모니터링을 구성합니다(선택사항).
  • VSI의 크기를 조정합니다(선택사항).

아키텍처 다이어그램 * 튜토리얼의
다이어그램

  1. 일반 사용자가 웹 브라우저를 사용하여 VPC에서 실행되는 LAMP 서버에 액세스합니다.
  2. VSI가 암호화된 Block Storage 볼륨의 데이터를 사용하도록 구성됩니다(선택사항).

시작하기 전에

이 튜토리얼에는 다음 항목이 필요합니다.

  • IBM Cloud 청구 가능 계정
  • IBM Cloud CLI
    • IBM Cloud VPC 플러그인(vpc-infrastructure)
  • terraform: 인프라를 코드로 사용하여 리소스를 프로비저닝함
  • jq: JSON 파일을 조회함
  • git: 소스 코드 저장소를 복제함

솔루션 튜토리얼 시작하기 가이드에서 운영 환경에 맞는 도구를 다운로드하고 설치하는 방법을 확인할 수 있습니다. 이러한 도구의 설치를 피하려면 Cloud Shell 사용할 수 있습니다.

서비스 작성

이 섹션에서는 IBM Cloud Shell 과 IBM Cloud 사용하여 VPC, 서브넷, 보안 그룹, 가상 서버 인스턴스(VSI)를 프로비저닝합니다. VSI는 클라우드 환경이 사용자의 인프라 요구사항에 완벽히 부합할 수 있도록, 일반적으로 수요가 가장 많은 경우를 처리하고 그 후에는 일시중단하거나 전원을 끌 수 있습니다.

Terraform 템플리트를 사용하여 이러한 리소스를 생성하려는 경우 https://github.com/IBM-Cloud/vpc-tutorials/tree/master/vpc-lamp에서 사용 가능한 템플리트를 사용하고 README.md의 지시사항을 따를 수 있습니다. 이 템플릿은 Schematics 에서도 사용할 수 있습니다.

  1. IBM Cloud 계정에 로그인한 상태에서 IBM Cloud Shell을 실행하십시오.
  2. 셸에서 자동으로 IBM Cloud 지역 중 하나에 로그인되며, 다음 명령을 실행하여 원하는 경우 다른 지역으로 전환할 수 있습니다
    ibmcloud target -r <region-name> -g <resource-group>
    

SSH 키 작성

  1. VPC에서 SSH 키는 비밀번호 대신 VSI에 대한 관리자 액세스에 사용됩니다. 다음 명령을 실행하여 SSH 키를 작성하고 프롬프트가 표시되면 기본값을 수락하십시오. SSH 키에 대한 자세한 정보는 문서 SSH 키를 참조하십시오.

    ssh-keygen -t rsa -b 4096
    

    위의 명령은 ~/.ssh 디렉토리 내에 두 개의 파일(id_rsaid_rsa.pub)을 생성합니다. Cloud Shell 세션은 수명이 짧으며, IBM Cloud Shell 내부에서 작성한 모든 파일은 향후 재사용을 위해 안전한 위치에 저장되어야 합니다. 화면 오른쪽 상단 섹션에 있는 Cloud Shell에 다운로드 및 업로드 파일 옵션이 있습니다.

    재사용할 기존 SSH 키가 있는 경우, 대신 이 키를 Cloud Shell 세션에 업로드할 수 있습니다.

  2. 계정에 SSH 키를 추가하십시오.

    SSHKEY_ID=$(ibmcloud is key-create sshkey-lamp-tutorial @$HOME/.ssh/id_rsa.pub --json | jq -r '.id')
    

VPC, 서브넷 및 보안 그룹 작성

  1. VPC를 작성하십시오. 자세한 정보는 콘솔 또는 CLI에서 VPC 작성에 대한 문서를 참조하십시오.

    VPC_ID=$(ibmcloud is vpc-create vpc-lamp-tutorial --json | jq -r '.id')
    
  2. VPC에 대한 서브넷을 작성하십시오.

    SUBNET_ID=$(ibmcloud is subnet-create subnet-lamp-1 $VPC_ID --zone $(ibmcloud target --output json | jq -r '.region.name')-1 --ipv4-address-count 256 --json | jq -r '.id')
    
  3. VPC에 대한 보안 그룹을 작성하십시오.

    SG_ID=$(ibmcloud is security-group-create sg-lamp-1 $VPC_ID --json | jq -r '.id')
    
  4. SSH 포트 22로 인바운드를 제한하는 규칙을 추가하십시오.

    ibmcloud is security-group-rule-add $SG_ID inbound tcp --port-min 22 --port-max 22 --json
    

    SSH 포트에 대한 액세스를 일부 주소로 제한할 수 있습니다. 위의 명령어에서 --remote 를 사용하면 이 서버에 액세스할 수 있는 사용자를 제한할 수 있습니다. 예를 들어, ibmcloud is security-group-rule-add $SG_ID inbound tcp --remote YOUR_IP_ADDRESS --port-min 22 --port-max 22 --json

  5. HTTP 포트 80으로 인바운드를 제한하는 규칙을 추가하십시오.

    ibmcloud is security-group-rule-add $SG_ID inbound tcp --port-min 80 --port-max 80 --json
    

    HTTP 포트에 대한 액세스를 일부 주소로 제한할 수도 있습니다. 위의 명령어에서 --remote 을 사용하여 이 서버에 액세스할 수 있는 사용자를 제한할 수 있습니다. 예를 들어, ibmcloud is security-group-rule-add $SG_ID inbound tcp --remote YOUR_IP_ADDRESS --port-min 80 --port-max 80 --json

  6. 모두에게 아웃바운드를 허용하는 규칙을 추가하십시오. 이는 소프트웨어 설치에 필요하며 나중에 사용 안함으로 설정하거나 제거할 수 있습니다.

    ibmcloud is security-group-rule-add $SG_ID outbound all --json
    

가상 서버 인스턴스 작성

  1. IBM Cloud는 Ubuntu 이미지를 주기적으로 최신 소프트웨어로 업데이트합니다. 다음 명령을 실행하여 최신 Ubuntu 20.x의 이미지 ID를 얻으십시오.
    IMAGE_ID=$(ibmcloud is images --json | jq -r '.[] | select (.name=="ibm-ubuntu-22-04-1-minimal-amd64-3") | .id')
    
  2. 가상 서버 인스턴스 작성
    NIC_ID=$(ibmcloud is instance-create vsi-lamp-1 $VPC_ID $(ibmcloud target --output json | jq -r '.region.name')-1 cx2-2x4 $SUBNET_ID --image-id $IMAGE_ID --key-ids $SSHKEY_ID --security-group-ids $SG_ID --json | jq -r '.primary_network_interface.id')
    
  3. 유동 IP를 예약하십시오.
    FLOATING_IP=$(ibmcloud is floating-ip-reserve fip-lamp-1 --nic-id $NIC_ID --json | jq -r '.address')
    
  4. SSH로 서버에 연결하십시오. SSH를 통해 새로 작성된 서버에 액세스하는 데 1분 정도 걸릴 수 있습니다.
    ssh root@$FLOATING_IP
    
    브라우저를 통해 가상 서버에 액세스하려면 유동 IP를 알아야 합니다. 이 유동 IP는 쉘 변수에서 이전에 캡처되었으므로, echo $FLOATING_IP 명령을 실행하여 유동 IP 주소를 확보하거나 ibmcloud is floating-ips --json을 실행하고 유동 IP를 작성하는 데 사용되는 이름(fip-lamp-1)을 검색하여 확보할 수 있습니다. 웹 콘솔에서 서버의 플로팅 IP 주소도 확인할 수 있습니다.

Apache, MySQL 및 PHP 설치

이 절에서는 Ubuntu 패키지 소스를 업데이트하고 Apache, MySQL 및 PHP를 최신 버전으로 설치하는 명령을 실행합니다.

처음으로 서버가 스핀업되면 이미 시스템 업데이트를 실행 중이고 사용자가 아래 명령을 실행하지 못하게 될 수 있으므로, ps aux | grep -i apt를 실행하여 시스템 업데이트 상태를 확인하고 자동화된 시스템 업데이트 태스크가 태스크를 완료하거나 강제 종료하기를 기다릴 수 있습니다.

  1. 업데이트 중에 대화식 모드를 사용 안함으로 설정
    export DEBIAN_FRONTEND=noninteractive
    
  2. 패키지 업데이트
    apt update
    
  3. Apache 설치
    apt install apache2 -y
    
  4. MySQL 설치
    apt install mysql-server -y
    
  5. PHP 설치
    apt install php libapache2-mod-php php-mysql php-common php-cli -y
    

설치 및 구성 확인

이 절에서는 Apache, MySQL 및 PHP가 최신 버전이며 Ubuntu 이미지에서 실행 중인지 확인합니다. 또한 MySQL에 대한 권장 보안 설정을 구현합니다.

  1. 브라우저에서 유동 IP 주소를 열어 Ubuntu를 확인하십시오. Ubuntu 시작 페이지가 표시됩니다.
    Ubuntu확인
    Ubuntu확인
  2. 다음 명령을 사용하여 설치된 Apache, MySQL 및 PHP 버전을 검토하십시오.
    apache2 -v
    
    mysql -V
    
    php -v
    
  3. mysql 를 엽니다.
    mysql
    
  4. yourPassword의 암호를 대체하는 다음 명령을 실행하십시오.
    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourPassword';
    
  5. mysql 프롬프트를 종료합니다.
    exit
    
  6. 다음 스크립트를 실행하여 MySQL 데이터베이스를 보안하십시오. 환경 설정에 가장 적합한 옵션을 선택하거나 ENTER키를 눌러 설정을 빠르게 진행하십시오.
    mysql_secure_installation
    
  7. 또한, 다음 명령을 사용하여 PHP 정보 페이지를 빠르게 만들 수 있습니다.
    echo "<?php phpinfo(); ?>" > /var/www/html/info.php
    
  8. 작성한 PHP 정보 페이지를 보십시오. 브라우저를 열고 http://{FloatingIPAddress}/info.php로 이동하십시오. VSI의 유동 IP 주소를 대체하십시오. 이는 다음 이미지와 유사합니다.

PHP 정보
PHP 정보

WordPress 설치 및 구성

애플리케이션을 설치하여 LAMP 스택을 실제로 사용해 보십시오. 다음 단계는 일반적으로 웹 사이트 및 블로그를 작성하는 데 사용되는 오픈 소스 WordPress 플랫폼을 설치합니다. 생산 설치에 대한 자세한 정보와 설정은 WordPress 참고하세요.

  1. 다음 명령을 실행하여 WordPress를 설치하십시오.
    apt install wordpress -y
    
  2. MySQL 및 PHP를 사용하도록 WordPress를 구성하십시오. 다음 명령을 실행하여 텍스트 편집기를 열고 /etc/wordpress/config-localhost.php 파일을 작성하십시오.
    sensible-editor /etc/wordpress/config-localhost.php
    
  3. yourPassword를 자신의 MySQL 데이터베이스 비밀번호로 대체하고 다른 값은 그대로 두어 다음 행을 파일에 복사하십시오. 파일을 저장한 후 종료하십시오.
    <?php
    define('DB_NAME', 'wordpress');
    define('DB_USER', 'wordpress');
    define('DB_PASSWORD', 'yourPassword');
    define('DB_HOST', 'localhost');
    define('WP_CONTENT_DIR', '/usr/share/wordpress/wp-content');
    ?>
    
  4. mysql 프롬프트를 열고 비밀번호를 제공하십시오.
    mysql -u root -p
    
  5. 다음 명령어를 실행할 때 데이터베이스 비밀번호를 yourPassword 바꾸고, 다른 값은 변경하지 마십시오.
    CREATE DATABASE wordpress;
    
    CREATE USER 'wordpress'@'localhost' IDENTIFIED BY 'yourPassword';
    
    GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER ON wordpress.* TO 'wordpress'@'localhost';
    
    FLUSH PRIVILEGES;
    
  6. mysql 프롬프트를 종료합니다.
    exit
    
  7. WordPress 설치를 웹 서버 문서 루트로 이동하십시오.
    ln -s /usr/share/wordpress /var/www/html/wordpress
    
    mv /etc/wordpress/config-localhost.php /etc/wordpress/config-default.php
    
  8. WordPress 설정을 완료하고 플랫폼에 공개하십시오. 브라우저를 열고 http://{FloatingIPAddress}/wordpress/wp-admin 로 이동합니다. 인스턴스의 유동 IP 주소를 대체하십시오. 이는 다음 이미지와 유사해야 합니다.
    WordPress 사이트 실행 중
    WordPress 사이트 실행 중

도메인 구성

LAMP 서버에 기존 도메인 이름을 사용하려면 VSI의 유동 IP 주소를 가리키도록 A 레코드를 업데이트하십시오.

서버 모니터링 및 로그 관리

서버 가용성과 최상의 사용자 경험을 보장하기 위해, 모든 프로덕션 서버에서는 모니터링을 사용으로 설정해야 합니다. VSI를 모니터하고 중앙 위치에서 분석을 위한 로그를 캡처하기 위해 몇 가지 옵션을 사용할 수 있습니다.

서버 모니터링

IBM Cloud Monitoring 서비스의 인스턴스를 설정한 후 VSI 인스턴스의 CPU, 볼륨, 메모리 및 네트워크 사용을 모니터할 수 있습니다. 모니터링 서비스를 구성하려는 경우 Linux 호스트 모니터링 문서에 설명된 단계를 따르십시오.

서버 로깅

IBM Cloud Logs 생성하여 IBM Cloud 시스템 및 애플리케이션 로그를 관리할 수 있습니다.

IBM Cloud Logs는 관리자, DevOps 팀 및 개발자 고급 기능을 제공하여 로그 데이터를 필터링하고 검색하고 추적하고 경보를 정의하며 사용자 정의 보기를 설계하여 애플리케이션 및 시스템 로그를 모니터합니다.

Linux 로깅 에이전트 관리하기 문서에 설명된 지침을 따릅니다

BYOK(Bring-Your-Own-Key) 암호화 데이터 볼륨 구성(선택사항)

VSI가 제공자가 관리하는 암호화된 부트 볼륨 100GB를 사용하여 작성되었지만, VSI를 삭제하는 경우 삭제하기 전에 보호하려는 모든 데이터를 이동해야 합니다. 또는 VSI가 삭제되어 새 VSI에 접속되는 경우에도 지속될 수 있는 데이터 볼륨을 작성해야 합니다. 자체 키를 사용하여 볼륨을 암호화할 수도 있습니다. 원하는 결과인 경우 아래에 설명된 단계를 따라 데이터 볼륨을 작성하고 VSI에 접속하십시오.

  1. 데이터 볼륨 구성 파일을 작성하십시오.

    VOLUME_ID=$(ibmcloud is volume-create volume-lamp-1 10iops-tier $(ibmcloud target --output json | jq -r '.region.name')-1 --capacity 100 --json | jq -r '.id')
    

    VPC에서 고객 관리 암호화 키를 사용할 수도 있습니다. 자신의 암호화 키를 저장하기 위해 다음 두 가지 서비스 중 하나를 사용할 수 있습니다. (1) FIPS 140-2 레벨 3 서비스 IBM Key Protect. 문서의 IBM Key Protect 서비스 프로비저닝 주제를 참조하십시오. (2) FIPS 140-2 레벨 4 서비스 IBM Cloud Hyper Protect Crypto Services. 문서의 IBM Cloud Hyper Protect Crypto Services 시작하기 주제를 참조하십시오. 볼륨을 작성할 때 사용할 암호화 키에 대해 CRN과 함께 --encryption-key 매개변수를 지정할 수 있습니다.

  2. 인스턴스 이름을 기준으로 모든 인스턴스 및 필터링을 나열하여 이전에 작성된 VSI의 ID를 캡처하십시오.

    VSI_ID=$(ibmcloud is instances --json | jq -r '.[] | select(.name == "vsi-lamp-1") | .id')
    
  3. 기존 VSI에 데이터 볼륨을 접속하십시오.

    ibmcloud is instance-volume-attachment-add attachment-data-1 $VSI_ID $VOLUME_ID --auto-delete false --json
    
  4. SSH를 사용하여 서버에 연결하십시오.

    ssh root@$FLOATING_IP
    
  5. VSI에 새로 작성된 데이터 볼륨을 구성하고 한 번에 하나씩 아래의 각 행을 실행하십시오.

    new_bsv=$(echo $(parted -l 2>&1) | awk 'NR==1{print $2}' | sed 's/:$//')
    parted $new_bsv mklabel gpt
    parted -a opt $new_bsv mkpart primary ext4 0% 100%
    new_part=${new_bsv}1
    mkfs.ext4 -L lamp-data ${new_part}
    mkdir /data
    mount ${new_part} /data
    echo "${new_part} /data ext4 defaults,relatime 0 0" | tee -a /etc/fstab
    mount -a
    

새 /data 파일 시스템을 사용하도록 Apache 구성

  1. Apache 서비스 중지
    service apache2 stop
    
  2. Apache 디렉토리를 /var에서 /data로 이동
    mv /var/www /data/
    
  3. 새 위치에 대한 링크 작성
    ln -s /data/www /var/www
    
  4. Apache 서비스 시작
    service apache2 start
    

새 /data 파일 시스템을 사용하도록 MySQL 구성

  1. MySQL 서비스 중지
    service mysql stop
    
  2. MySQL 디렉토리를 /var에서 /data로 이동
    mkdir /data/lib
    
    mv /var/lib/mysql /data/lib/
    
  3. 새 위치에 대한 링크 작성
    ln -s /data/lib/mysql /var/lib/mysql
    
  4. AppArmor에 새로운 위치의 별칭을 추가하십시오. 그렇지 않으면 AppArmor 액세스를 차단합니다.
    echo "alias /var/lib/mysql/ -> /data/lib/mysql/," >> /etc/apparmor.d/tunables/alias
    
  5. AppArmor 서비스 다시 시작
    systemctl restart apparmor
    
  6. MySQL 서비스 시작
    service mysql start
    
  7. 브라우저를 열고 http://{FloatingIPAddress}/wordpress 로 이동합니다. 인스턴스의 유동 IP 주소를 대체하십시오. 새 데이터 볼륨을 추가하기 전과 마찬가지로 WordPress 페이지에 액세스할 수 있어야 합니다.

VSI 크기 조정(선택사항)

VSI는 VPC에서 사용 가능한 가장 작은 프로파일 중 하나, 즉 2개의 vCPU 및 4GiB RAM을 사용하여 작성되었습니다. 사용 요구사항에 따라 사용 가능한 vCPU 및 RAM의 양을 늘리거나 줄일 수 있습니다(가상 서버 인스턴스 크기 조정 참조).

  1. 인스턴스 이름을 기준으로 모든 인스턴스 및 필터링을 나열하여 이전에 작성된 VSI의 ID를 캡처하십시오.

    VSI_ID=$(ibmcloud is instances --json | jq -r '.[] | select(.name == "vsi-lamp-1") | .id')
    
  2. 인스턴스를 중지하십시오.

    ibmcloud is instance-stop $VSI_ID
    
  3. 인스턴스의 크기를 조정하십시오.

    ibmcloud is instance-update $VSI_ID --profile cx2-4x8
    

    ibmcloud is instance-profiles 명령을 실행하여 대체 프로파일 목록을 가져올 수 있습니다. 그러나 가상 서버 인스턴스 크기 조정 주제의 현재/대상 프로파일을 기반으로 한 크기 조정에 대한 제한사항에 유의하십시오.

  4. 인스턴스를 시작하십시오.

    ibmcloud is instance-start $VSI_ID
    
  5. VSI가 적절한 호스트에 배치되고 시작될 때 몇 분 정도 기다려야 할 수 있습니다. 브라우저를 열고 http://{FloatingIPAddress}/wordpress 로 이동합니다. 인스턴스의 유동 IP 주소를 대체하십시오. 크기를 조정하기 전처럼 WordPress 페이지에 액세스할 수 있어야 합니다.

자원 제거

  1. VPC 콘솔에서 유동 IP를 클릭하고 VSI에 대한 IP 주소를 클릭한 후 조치 메뉴에서 해제를 선택하십시오. IP 주소를 해제할지 확인하십시오.
  2. 그런 다음 가상 서버 인스턴스로 전환하고 인스턴스를 삭제하십시오.
  3. VSI가 삭제되면 서브넷으로 전환하십시오. 서브넷을 삭제하십시오.
  4. 서브넷이 삭제된 후 VPC 탭으로 전환한 후 VPC를 삭제하십시오.
  5. 선택적 데이터 볼륨을 작성했지만 더 이상 필요하지 않은 경우 Block Storage 볼륨 탭으로 전환하고 볼륨을 삭제하십시오.

콘솔 사용 시 리소스 삭제 후 업데이트된 상태 정보를 보려면 브라우저를 새로 고쳐야 할 수 있습니다.

리소스에 따라 즉시 삭제되지 않고 보유될 수 있습니다(기본 7일 동안). 리소스를 영구적으로 삭제하여 재확보하거나 보유 기간 내에 리소스를 복원할 수 있습니다. 리소스 재확보 사용 방법은 이 문서를 참조하십시오.