LAMP 에 대한 자습서 AWS Cloud9 - AWS Cloud9

AWS Cloud9 는 더 이상 신규 고객이 사용할 수 없습니다. AWS Cloud9 의 기존 고객은 정상적으로 서비스를 계속 이용할 수 있습니다. 자세히 알아보기

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

LAMP 에 대한 자습서 AWS Cloud9

이 자습서를 사용하면 LAMP (Linux, Apache HTTP 서버,MySQL, 및 PHP)를 AWS Cloud9 사용합니다.

이 자습서를 따르고 이 샘플을 생성하면 에 요금이 부과될 수 있습니다 AWS 계정. 여기에는 Amazon Elastic Compute Cloud(Amazon ) AWS 서비스 와 같은 에 대해 발생할 수 있는 요금이 포함됩니다EC2. 자세한 내용은 Amazon EC2 요금 섹션을 참조하세요.

사전 조건

이 샘플을 사용하기 전에 설정이 다음 요구 사항을 충족하는지 확인하세요.

  • 기존 AWS Cloud9 EC2 개발 환경이 있어야 합니다. 이 샘플에서는 Amazon Linux 또는 를 실행하는 Amazon EC2 인스턴스에 연결된 EC2 환경이 이미 있다고 가정합니다.Ubuntu 서버. 다른 환경 또는 운영 시스템이라면 이 샘플 지침을 관련 도구를 설치하는 데에 적용해야 합니다. 자세한 내용은 에서 환경 생성 AWS Cloud9 단원을 참조하십시오.

  • 기존 환경의 AWS Cloud9 IDE가 이미 열려 있습니다. 환경을 열면 는 웹 브라우저에서 해당 환경에 IDE 대한 를 AWS Cloud9 엽니다. 자세한 내용은 AWS Cloud9에서 환경 열기 단원을 참조하십시오.

1단계: 도구 설치

이 단계에서는 다음 도구를 설치합니다.

  • Apache HTTP 서버, 웹 서버 호스트.

  • PHP웹 개발에 특히 적합한 스크립팅 언어인 를 에 포함할 수 있습니다HTML.

  • MySQL - 데이터베이스 관리 시스템.

그런 다음 Apache HTTP 서버 및 MySQL.

  1. 최신 보안 업데이트와 버그 수정이 인스턴스에 설치되어 있는지 확인합니다. 이렇게 하려면 의 터미널 세션에서 AWS Cloud9 IDE yum update (Amazon Linux) 또는 apt update (Ubuntu 서버) 명령. (터미널 세션을 새로 시작하려면 메뉴 모음에서 Window(창), New Terminal(새 터미널)을 선택합니다.)

    Amazon Linux의 경우:

    sudo yum -y update

    에 대해 Ubuntu 서버:

    sudo apt -y update
  2. 확인 Apache HTTP 서버가 이미 설치되어 있습니다. 이렇게 하려면 httpd -v (Amazon Linux용) 또는 apache2 -v (용 Ubuntu 서버) 명령.

    성공하면 출력에 Apache HTTP 서버 버전 번호.

    오류가 표시되면 를 설치합니다.Apache HTTP install 명령을 실행하여 서버를 만듭니다.

    Amazon Linux의 경우:

    sudo yum install -y httpd24

    에 대해 Ubuntu 서버:

    sudo apt install -y apache2
  3. 확인 PHP 는 php -v 명령을 실행하여 이미 설치되어 있습니다.

    성공하면 출력에 PHP 버전 번호가 포함됩니다.

    오류가 표시되면 install 명령을 실행PHP하여 를 설치합니다.

    Amazon Linux의 경우:

    sudo yum install -y php56

    에 대해 Ubuntu 서버:

    sudo apt install -y php libapache2-mod-php php-xml
  4. 확인 MySQL 는 mysql --version 명령을 실행하여 이미 설치되어 있습니다.

    성공하면 출력에 MySQL 버전 번호.

    오류가 표시되면 를 설치합니다.MySQL install 명령을 실행합니다.

    Amazon Linux의 경우:

    sudo yum install -y mysql-server

    에 대해 Ubuntu 서버:

    sudo apt install -y mysql-server
  5. 설치 후 Apache HTTP 서버,PHP, 및 MySQL, 시작 Apache HTTP 다음 명령을 실행하여 서버가 시작되었는지 확인합니다.

    Amazon Linux의 경우(이 명령을 두 번 실행해야 할 수 있음):

    sudo service httpd start && sudo service httpd status

    에 대해 Ubuntu 서버(명령 프롬프트로 돌아가려면 를 누름q):

    sudo service apache2 start && sudo service apache2 status
  6. 시작 MySQL다음 명령을 실행하여 시작되었는지 확인합니다.

    Amazon Linux의 경우:

    sudo service mysqld start && sudo service mysqld status

    에 대해 Ubuntu 서버(명령 프롬프트로 돌아가려면 를 누름q):

    sudo service mysql start && sudo service mysql status

2단계: 설정 MySQL

이 단계에서는 MySQL 팔로우하려면 MySQL 보안 모범 사례. 이러한 보안 모범 사례에는 루트 계정의 암호 설정과 로컬 호스트 외부에서 액세스할 수 있는 루트 계정 제거가 포함됩니다. 염두에 두어야 할 다른 모범 사례로는 익명 사용자 제거, 테스트 데이터베이스 제거, 누구든지 이름이 test_로 시작하는 데이터베이스에 액세스할 수 있는 권한 제거 등이 있습니다.

그런 다음 의 시작 및 종료를 연습하여 이 단계를 완료합니다.MySQL 명령줄 클라이언트.

  1. 구현 MySQL 에 대한 보안 모범 사례 MySQL 의 터미널 세션에서 다음 명령을 실행하여 를 설치합니다 AWS Cloud9 IDE.

    sudo mysql_secure_installation
  2. 메시지가 표시되면 지정된 대로 다음 질문에 답합니다.

    Amazon Linux의 경우:

    1. 루트의 현재 암호 입력(입력하지 않으려면 Enter) - Enter 키를 누릅니다(암호가 없는 경우).

    2. 루트 암호 설정 - Y를 입력한 후 Enter 키를 누릅니다.

    3. 새 암호 - 암호를 입력한 후 Enter 키를 누릅니다.

    4. 새 암호 다시 입력 - 암호를 다시 입력한 후 Enter 키를 누릅니다. (나중에 사용할 수 있도록 암호를 안전한 위치에 저장해야 합니다.)

    5. 익명 사용자 제거 - Y를 입력한 후 Enter 키를 누릅니다.

    6. 원격으로 루트 로그인 허용 안 함 - Y를 입력한 후 Enter 키를 누릅니다.

    7. 테스트 데이터베이스를 제거하고 액세스 - Y를 입력한 후 Enter 키를 누릅니다.

    8. 지금 권한 테이블 다시 로드 - Y를 입력한 후 Enter 키를 누릅니다.

    에 대해 Ubuntu 서버:

    1. VALIDATE PASSWORD 플러그인을 설정하시겠습니까 - 를 입력한 y다음 를 누릅니다Enter.

    2. 세 가지 수준의 암호 확인 정책이 있습니다 - 0, 1 또는 2를 입력한 후 Enter 키를 누릅니다.

    3. 새 암호 - 암호를 입력한 후 Enter 키를 누릅니다.

    4. 새 암호 다시 입력 - 암호를 다시 입력한 후 Enter 키를 누릅니다. 나중에 사용할 수 있도록 암호를 안전한 위치에 저장해야 합니다.

    5. 제공된 암호를 계속 사용하시겠습니까 - y를 입력한 후 Enter 키를 누릅니다.

    6. 익명 사용자 제거 - y를 입력한 후 Enter 키를 누릅니다.

    7. 원격으로 루트 로그인 허용 안 함 - y를 입력한 후 Enter 키를 누릅니다.

    8. 테스트 데이터베이스를 제거하고 액세스 - y를 입력한 후 Enter 키를 누릅니다.

    9. 지금 권한 테이블 다시 로드 - y를 입력한 후 Enter 키를 누릅니다.

  3. 와 직접 상호 작용하려면 MySQL, 시작 MySQL 다음 명령을 실행하여 루트 사용자로 명령줄 클라이언트를 지정합니다. 메시지가 표시되면 앞서 설정한 루트 사용자의 암호를 입력한 후 Enter를 누릅니다. 에 있는 mysql> 동안 프롬프트가 로 변경됩니다.MySQL 명령줄 클라이언트.

    sudo mysql -uroot -p
  4. 를 종료하려면 MySQL 명령줄 클라이언트에서 다음 명령을 실행합니다. 프롬프트가 $로 다시 바뀝니다.

    exit;

3단계: 웹 사이트 설정

이 단계에서는 에 대한 기본 웹 사이트 루트를 설정합니다.Apache HTTP 권장 소유자 및 액세스 권한이 있는 서버입니다. 그런 다음 PHP기본 웹 사이트 루트 내의 기반 웹 페이지입니다.

그런 다음 이 EC2 환경과 연결된 Amazon Virtual Private Cloud(Amazon ACL)에서 Amazon EC2 및 네트워크 액세스 제어 목록(네트워크 VPC)에 보안 그룹을 설정하여 수신 웹 트래픽이 해당 웹 페이지를 볼 수 있도록 합니다. 각 EC2 환경은 Amazon의 보안 그룹EC2과 Amazon ACL의 네트워크 모두에 연결되어야 합니다VPC. 그러나 ACL의 기본 네트워크가 환경에 대한 모든 수신 및 발신 트래픽을 AWS 계정 허용하더라도 기본 보안 그룹은 포트 22SSH를 통해 들어오는 트래픽만 허용합니다. 자세한 내용은 VPC AWS Cloud9 개발 환경 설정 단원을 참조하십시오.

그런 다음 외부에서 웹 페이지를 성공적으로 보고 이 단계를 완료합니다 AWS Cloud9 IDE.

  1. 에 대한 기본 웹 사이트 루트 설정 Apache HTTP 권장 소유자 및 액세스 권한이 있는 서버(/var/www/html). 이렇게 하려면 의 터미널 세션에서 다음 6개의 명령을 한 번에 하나씩 다음 순서로 실행합니다 AWS Cloud9 IDE. 각 명령이 수행하는 작업을 이해하려면 각 명령 뒤의 # 문자 뒤의 정보를 읽습니다.

    Amazon Linux의 경우:

    sudo groupadd web-content # Create a group named web-content. sudo usermod -G web-content -a ec2-user # Add the user ec2-user (your default user for this environment) to the group web-content. sudo usermod -G web-content -a apache # Add the user apache (Apache HTTP Server) to the group web-content. sudo chown -R ec2-user:web-content /var/www/html # Change the owner of /var/www/html and its files to user ec2-user and group web-content. sudo find /var/www/html -type f -exec chmod u=rw,g=rx,o=rx {} \; # Change all file permissions within /var/www/html to user read/write, group read-only, and others read/execute. sudo find /var/www/html -type d -exec chmod u=rwx,g=rx,o=rx {} \; # Change /var/www/html directory permissions to user read/write/execute, group read/execute, and others read/execute.

    에 대해 Ubuntu 서버:

    sudo groupadd web-content # Create a group named web-content. sudo usermod -G web-content -a ubuntu # Add the user ubuntu (your default user for this environment) to the group web-content. sudo usermod -G web-content -a www-data # Add the user www-data (Apache HTTP Server) to the group web-content. sudo chown -R ubuntu:web-content /var/www/html # Change the owner of /var/www/html and its files to user ubuntu and group web-content. sudo find /var/www/html -type f -exec chmod u=rw,g=rx,o=rx {} \; # Change all file permissions within /var/www/html to user read/write, group read-only, and others read/execute. sudo find /var/www/html -type d -exec chmod u=rwx,g=rx,o=rx {} \; # Change /var/www/html directory permissions to user read/write/execute, group read/execute, and others read/execute.
  2. 생성 PHPindex.php 의 기본 웹 사이트 루트 폴더에 이름이 지정된 기반 웹 페이지 Apache HTTP 다음 명령을 실행/var/www/html하여 서버()

    Amazon Linux의 경우:

    sudo touch /var/www/html/index.php && sudo chown -R ec2-user:web-content /var/www/html/index.php && sudo chmod u=rw,g=rx,o=rx /var/www/html/index.php && sudo printf '%s\n%s\n%s' '<?php' ' phpinfo();' '?>' >> /var/www/html/index.php

    Amazon Linux에 대한 이전 명령은 파일 소유자를 로 변경하고ec2-user, 파일 그룹을 로 변경하고web-content, 그룹 및 기타에 read/write for the user, and read/execute 대한 파일 권한을 로 변경합니다.

    에 대해 Ubuntu 서버:

    sudo touch /var/www/html/index.php && sudo chown -R ubuntu:web-content /var/www/html/index.php && sudo chmod u=rw,g=rx,o=rx /var/www/html/index.php && sudo printf '%s\n%s\n%s' '<?php' ' phpinfo();' '?>' >> /var/www/html/index.php

    에 대한 이전 명령 Ubuntu 또한 서버는 파일 소유자를 로 변경하고ubuntu, 파일 그룹을 로 변경하고web-content, 그룹 및 기타에 read/write for the user, and read/execute 대한 파일 권한을 로 변경합니다.

    성공하면 앞의 명령이 다음 내용이 포함된 index.php 파일을 만듭니다.

    <?php phpinfo(); ?>
  3. Amazon 및 이 EC2 환경VPC과 EC2 연결된 보안 그룹 AmazonACL에서 네트워크를 설정하여 포트 80을 통해 들어오는 웹 트래픽을 활성화하여 새 웹 페이지를 볼 수 있습니다. 이를 수행하려면 다음과 같은 여덟 가지 명령을 다음 순서로 한 번에 하나씩 실행합니다. 각 명령이 수행하는 작업을 이해하려면 각 명령의 # 문자 뒤의 정보를 읽습니다.

    중요

    다음 명령을 실행하면 EC2 환경의 보안 그룹 및 네트워크와 연결된 모든 환경 및 Amazon EC2 인스턴스에 ACL 대해 포트 80을 통해 들어오는 웹 트래픽이 활성화됩니다. 이로 인해 이 이외의 EC2 환경 및 Amazon EC2 인스턴스에 대해 포트 80을 통해 들어오는 웹 트래픽이 예기치 않게 활성화될 수 있습니다.

    참고

    다음 두 번째부터 네 번째 명령은 보안 그룹이 포트 80을 통한 수신 웹 트래픽을 허용할 수 있게 합니다. 포트 22를 통한 수신 SSH 트래픽만 허용하는 기본 보안 그룹이 있는 경우 첫 번째 명령을 실행한 다음 두 번째부터 네 번째 명령까지 실행해야 합니다. 그러나 사용자 지정 보안 그룹이 이미 포트 80을 통한 수신 웹 트래픽을 허용하는 경우, 그러한 명령 실행을 건너뛸 수 있습니다.

    다음 다섯 번째부터 여덟 번째 명령은 네트워크가 포트 80ACL을 통해 들어오는 웹 트래픽을 허용할 수 있도록 합니다. 모든 포트에서 모든 수신 트래픽을 ACL이미 허용하는 기본 네트워크 가 있는 경우 해당 명령 실행을 안전하게 건너뛸 수 있습니다. 그러나 포트 80을 통한 수신 웹 트래픽을 허용하지 ACL 않는 사용자 지정 네트워크가 있다고 가정해 보겠습니다. 그런 다음, 첫 번째 명령을 실행한 후 다섯 번째 명령부터 여덟 번째 명령까지 실행합니다.

    MY_INSTANCE_ID=$(curl http://169.254.169.254/latest/meta-data/instance-id) # Get the ID of the instance for the environment, and store it temporarily. MY_SECURITY_GROUP_ID=$(aws ec2 describe-instances --instance-id $MY_INSTANCE_ID --query 'Reservations[].Instances[0].SecurityGroups[0].GroupId' --output text) # Get the ID of the security group associated with the instance, and store it temporarily. aws ec2 authorize-security-group-ingress --group-id $MY_SECURITY_GROUP_ID --protocol tcp --cidr 0.0.0.0/0 --port 80 # Add an inbound rule to the security group to allow all incoming IPv4-based traffic over port 80. aws ec2 authorize-security-group-ingress --group-id $MY_SECURITY_GROUP_ID --ip-permissions IpProtocol=tcp,Ipv6Ranges='[{CidrIpv6=::/0}]',FromPort=80,ToPort=80 # Add an inbound rule to the security group to allow all incoming IPv6-based traffic over port 80. MY_SUBNET_ID=$(aws ec2 describe-instances --instance-id $MY_INSTANCE_ID --query 'Reservations[].Instances[0].SubnetId' --output text) # Get the ID of the subnet associated with the instance, and store it temporarily. MY_NETWORK_ACL_ID=$(aws ec2 describe-network-acls --filters Name=association.subnet-id,Values=$MY_SUBNET_ID --query 'NetworkAcls[].Associations[0].NetworkAclId' --output text) # Get the ID of the network ACL associated with the subnet, and store it temporarily. aws ec2 create-network-acl-entry --network-acl-id $MY_NETWORK_ACL_ID --ingress --protocol tcp --rule-action allow --rule-number 10000 --cidr-block 0.0.0.0/0 --port-range From=80,To=80 # Add an inbound rule to the network ACL to allow all IPv4-based traffic over port 80. Advanced users: change this suggested rule number as desired. aws ec2 create-network-acl-entry --network-acl-id $MY_NETWORK_ACL_ID --ingress --protocol tcp --rule-action allow --rule-number 10100 --ipv6-cidr-block ::/0 --port-range From=80,To=80 # Add an inbound rule to the network ACL to allow all IPv6-based traffic over port 80. Advanced users: change this suggested rule number as desired.
  4. 웹 서버 루트 내의 index.php 파일로 URL 를 가져옵니다. 이렇게 하려면 다음 명령을 실행하고 새 웹 브라우저 탭 또는 와 별도로 다른 웹 브라우저를 AWS Cloud9 IDE 사용하여 URL 표시되는 로 이동합니다. 성공하면 웹 페이지에 에 대한 정보가 표시됩니다.Apache HTTP 서버,MySQL, PHP및 기타 관련 설정.

    MY_PUBLIC_IP=$(curl http://169.254.169.254/latest/meta-data/public-ipv4) && echo http://$MY_PUBLIC_IP/index.php # Get the URL to the index.php file within the web server root.

4단계: 정리

이 환경을 계속 사용하고 싶지만 포트 80을 통해 들어오는 웹 트래픽을 비활성화하려는 상황을 가정해 보겠습니다. 그런 다음 다음 8개의 명령을 한 번에 하나씩 다음 순서로 실행하여 환경과 ACL 연결된 보안 그룹 및 네트워크에서 이전에 설정한 해당 수신 트래픽 규칙을 삭제합니다. 각 명령이 수행하는 작업을 이해하려면 각 명령의 # 문자 뒤의 정보를 읽습니다.

중요

다음 명령을 실행하면 이 EC2 환경의 보안 그룹 및 네트워크와 연결된 모든 환경 및 Amazon EC2 인스턴스에 ACL 대해 포트 80을 통해 들어오는 웹 트래픽이 비활성화됩니다. 이로 인해 이 이외의 EC2 환경 및 Amazon EC2 인스턴스에 대해 포트 80을 통해 들어오는 웹 트래픽이 예기치 않게 비활성화될 수 있습니다.

참고

다음 다섯 번째부터 여덟 번째 명령은 기존 규칙을 제거하여 네트워크ACL가 포트 80을 통해 들어오는 웹 트래픽을 허용하는 것을 차단합니다. 모든 포트에서 모든 수신 트래픽을 ACL이미 허용하는 기본 네트워크 가 있는 경우 해당 명령 실행을 건너뛸 수 있습니다. 그러나 포트 80을 통해 들어오는 웹 트래픽을 허용하는 기존 규칙ACL이 있는 사용자 지정 네트워크가 있고 해당 규칙을 삭제하려는 경우 그런 다음, 첫 번째 명령을 실행한 후 다섯 번째 명령부터 여덟 번째 명령까지 실행해야 합니다.

MY_INSTANCE_ID=$(curl http://169.254.169.254/latest/meta-data/instance-id) # Get the ID of the instance for the environment, and store it temporarily. MY_SECURITY_GROUP_ID=$(aws ec2 describe-instances --instance-id $MY_INSTANCE_ID --query 'Reservations[].Instances[0].SecurityGroups[0].GroupId' --output text) # Get the ID of the security group associated with the instance, and store it temporarily. aws ec2 revoke-security-group-ingress --group-id $MY_SECURITY_GROUP_ID --protocol tcp --cidr 0.0.0.0/0 --port 80 # Delete the existing inbound rule from the security group to block all incoming IPv4-based traffic over port 80. aws ec2 revoke-security-group-ingress --group-id $MY_SECURITY_GROUP_ID --ip-permissions IpProtocol=tcp,Ipv6Ranges='[{CidrIpv6=::/0}]',FromPort=80,ToPort=80 # Delete the existing inbound rule from the security group to block all incoming IPv6-based traffic over port 80. MY_SUBNET_ID=$(aws ec2 describe-instances --instance-id $MY_INSTANCE_ID --query 'Reservations[].Instances[0].SubnetId' --output text) # Get the ID of the subnet associated with the instance, and store it temporarily. MY_NETWORK_ACL_ID=$(aws ec2 describe-network-acls --filters Name=association.subnet-id,Values=$MY_SUBNET_ID --query 'NetworkAcls[].Associations[0].NetworkAclId' --output text) # Get the ID of the network ACL associated with the subnet, and store it temporarily. aws ec2 delete-network-acl-entry --network-acl-id $MY_NETWORK_ACL_ID --ingress --rule-number 10000 # Delete the existing inbound rule from the network ACL to block all IPv4-based traffic over port 80. Advanced users: if you originally created this rule with a different number, change this suggested rule number to match. aws ec2 delete-network-acl-entry --network-acl-id $MY_NETWORK_ACL_ID --ingress --rule-number 10100 # Delete the existing inbound rule from the network ACL to block all IPv6-based traffic over port 80. Advanced users: if you originally created this rule with a different number, change this suggested rule number to match.

이 환경의 사용을 완료하면 AWS 계정에 계속 요금이 부과되지 않도록 환경을 삭제하세요. 지침은 AWS Cloud9에서 환경 삭제 단원을 참조하세요.