본문 바로가기

블로그

GCP에 LEMP stack + WordPress 설치하기

(원글 작성: 2020.02.09) - 아래 내용은 해당 시점을 기준으로 작성된 글임에 유의

 

본 포스트에서는 GCP (Google Cloud Platform)의 f1-micro instance 위에 LEMP stack + WordPress를 설치하는 과정을 설명하려 한다.
사실 아래 사이트에 설명되어 있는 것들을 한글로 옮기고 도메인 연결한 내용을 추가한 것이기 때문에 잘 못 작성한 것 같은 부분이 있다면 바로 링크에서 확인하는 게 좋다.

 

404 Page not found | MARKONTECH 

(2024.01.21 - 글을 옮겨 작성하면서 위 링크의 원본 글 삭제된 것 확인함.)

 

전체 순서는 다음과 같다.

목차


    GCP에 VM 인스턴스 생성하기

    VM 인스턴스 생성

    가장 먼저 할 일은 GCP (Google Cloud Platform) VM (Virtual Machine) 인스턴스를 생성하는 것이다.
    아마 GCP 콘솔에 처음 접속하면 VM 인스턴스 생성 전에 프로젝트부터 등록해야 할 텐데, 특별히 주의해야 할 점은 없으니 찬찬히 읽어보면서 진행하면 된다.

     

    VM 인스턴스는 항상 무료 (always free) 사용이 가능한 f1-micro로 생성해야 한다.
    물론 구글에서 첫 1년에 한해 $300의 크레딧을 제공해 주긴 하지만 그걸 믿고 처음부터 굳이 필요 없는 고사양  VM 을 사용하다가 내년부터 결제하거나 다시 f1-micro로 이전하기보다는 처음에는 f1-micro를 이용하다가 나중에 확장이 필요하다고 느끼면 결제를 진행하는 게 맞는 것 같다.
    항상 무료로 사용이 가능한 f1-micro의 조건은 관련 문서에 자세히 설명되어 있으며 정리하자면 아래와 같다.
    (즉, 아래 조건을 만족하지 않는다면  f1-micro라도 요금이 청구된다)

     

    • 다음 미국 내 리전 중 한 곳에서 비선점형 f1-micro VM 인스턴스 1개/월:
      • 오리건: us-west1
      • 아이오와: us-central1
      • 사우스캐롤라이나: us-east1
    • HDD 30GB/월

     

    위와 같이 머신 유형은 f1-micro, 리전은 항상 무료 리전 중 하나로, 그리고 영역은 아무거나 골라서 선택한다.
    나는 아무래도 west가 조금 더 가까우니 레이턴시가 조금이라도 작지 않을까 하는 생각에 us-west1을 선택했다.
    아마 어디를 고르던지 큰 차이는 없을 것 같다.

     

     

    부팅 디스크는 항상 무료 범위 내인 20GB로 설정했고 이미지는 아무래도 익숙하고 문제가 생겼을 때 도움을 받기 쉬운 Ubuntu로 선택했다.
    워드프레스를 설치해서 웹으로 접속할 것이므로 HTTP/HTTPS 트래픽을 모두 허용해주자.
    HTTP/HTTPS 트래픽 허용은 추후에 변경이 가능하다.
    참고로 현재 이 블로그는 SSL 인증서를 설치하여 HTTPS 트래픽만 허용해 놓고 HTTP  접속은 HTTPS로 리다이렉션 설정해 놓은 상태이다.

     

     

    모든 설정을 마쳤을 때 위 이미지와 같이 "이번 달 f1-micro 인스턴스 사용량의 처음 ***시간이 무료입니다."라는 글자가 보여야 한다.
    만약 처음 생성하는 것이라면 744시간이 쓰여 있을 것이고, 이번 달에 이미 VM 인스턴스를 생성했거나 운용 중이라면 더 적은 시간이 보일 것이다.
    한 가지 주의할 점은 영역 전체의 사용량이 모두 합산되기 때문에 항상 무료 사양의 f1-micro 인스턴스라고 하더라도 두 개 이상을 사용하다가 744시간을 넘겨 버리면 요금이 청구될 수 있다.

     

    마지막으로 화면 아래의 만들기 버튼을 클릭하고 조금 기다리면 VM 인스턴스가 생성된다.
    이제 VM 인스턴스 메뉴의 SSH 버튼을 클릭해서 방금 생성한 VM 인스턴스에 SSH 접속을 할 수 있다.

     

     

    만약 PuTTY, Xshell과 같은 별도의 ssh 클라이언트를 이용해 접속하고 싶다면 관련 문서를 참고해 설정하면 된다.
    물론 GCP에 로그인하여 ssh key 전송을 기다리는 것보다 외부 ssh 클라이언트로 접속하는 것이 속도는 훨씬 빠르다.

     

    고정 IP 할당

    처음 VM 인스턴스를 만들었을 때에는 외부 IP 부분에 (임시)라는 표시가 있을 것이다.
    이는 인스턴스를 재시작하는 등의 상황에서 IP주소가 변동될 수 있음을 의미하므로 고정 외부 IP 주소를 예약해야 한다.
    관련 GCP 문서를 참고, VPC 네트워크 > 외부 IP 주소 메뉴에서 설정할 수 있다.

     

     


    LEMP stack + WordPress 설치하기

    LEMP stack은 웹 애플리케이션을 위한 소프트웨어 스택으로 Linux + Nginx + MySQL + PHP로 이루어져 있다.
    원래는 LAMP stack이라고 해서 Apache를 많이 사용했었는데 Apache를 더 가벼운 Nginx로 대체해서도 많이 사용한다고 한다.

     

    swapfile 생성

    f1-micro는 메모리가 0.6GB만 할당되어 있기 때문에 성능에 제약이 있을 수밖에 없다.
    물론 처음에는 큰 문제가 없을 수 있지만 추후에 워드프레스에 플러그인을 추가하고 포스트에 사진을 많이 첨부하는 등 웹사이트가 커지면 작은 크기의 메모리 때문에 성능이 영향을 받을 수 있다.
    이를 방지하기 위해 미리  swapfile을 생성해준다.

     

    sudo apt update && sudo apt upgrade
    sudo fallocate -l 1G /swapfile
    sudo chmod 600 /swapfile
    sudo mkswap /swapfile
    sudo swapon /swapfile

     

    위의 명령어들은 아래의 동작을 수행한다.

    • 1GB의 공간을 swapfile에 할당
    • swapfile의 권한을 적절하게 수정한 뒤 activate

    swapfile이 active되었는지는 다음의 명령어로 확인할 수 있다.

    sudo swapon --show

     

     

    마지막으로 fstab 을 수정해서 영구적으로 swapfile의 정보를 저장해줘야 한다.
    vim, nano 등의 편집기를 이용해 /etc/fstab 에 아래 line을 추가한다.

    /swapfile swap swap defaults 0 0

     

     

    MySQL 설치 및 database 설정

    아래 명령어를 통해 MySQL을 설치하고 워드프레스에서 사용할 DB를 설정한다.

    sudo apt install mysql-server
    sudo mysql -u root -p
    CREATE DATABASE wordpress;
    GRANT ALL ON wordpress.* TO 'wp_admin' IDENTIFIED BY 'wp_admin_password!';
    quit
    sudo mysql_secure_installation

     

    위의 명령어들은 아래의 동작을 수행한다.

    • mysql 설치 및 root 계정으로 로그인
    • wordpress DB 생성
    • ID : wp_admin, PW : wp_admin_password! 인 계정에 wordpress DB에 속하는 모든 테이블의 접근 권한 부여
    • mysql_secure_installation 명령어를 통해 보안 설정

    당연히 wp_admin  wp_admin_password! 는 본인이 원하는 값으로 변경해줘야 한다.

     

    (command 입력 결과 보기:)

     

    PHP 설치

    워드프레스는 PHP에 의해 구동된다. (맞는 표현인지 모르겠지만 나는 대충 이렇게 이해했다)
    아래 명령어를 통해 PHP 및 관련 패키지들을 설치한다.
    Ubuntu 18.04 LTS 라면 PHP 7.2 버전을 설치할 수 있다.

    sudo apt install php7.2-cli php7.2-fpm php7.2-mysql php7.2-json php7.2-opcache php7.2-mbstring php7.2-xml php7.2-gd php7.2-curl

     

    Nginx 설치 및 설정

    Nginx 웹 서버는 아래 명령어로 설치한다.

    sudo apt install nginx

     

    Nginx의 default 설정 파일은 /etc/nginx/sites-available/default이다.
    해당 파일을 수정하기 전에 미리 백업해놓자.

    sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.backup

     

    vim, nano 등의 편집기를 이용해 default 파일의 일부를 아래와 같이 수정한다.

     

     

    마지막으로 Nginx 서비스를 재시작해준다.

    sudo systemctl restart nginx

     

    WordPress 설치

    아래 명령어를 통해 WordPress를 다운로드받고 설치할 수 있다.

    cd /var/www/html/
    sudo wget https://wordpress.org/latest.tar.gz
    sudo tar -xvzf latest.tar.gz

     

    위 명령어는 다음과 같은 동작을 한다.

    • /var/www/html/ 디렉토리로 이동
    • wordpress 압축 파일을 다운받아서 /var/www/html/wordpress 디렉토리에 압축 해제

    WordPress가 동작할 수 있게 sample config 파일을 수정하고 파일 이름을 바꿔주자.

    sudo vim /var/www/html/wordpress/wp-config-sample.php
    sudo mv /var/www/html/wordpress/wp-config-sample.php /var/www/html/wordpress/wp-config.php

     

    수정할 내용은 다음과 같다.

    • DB_NAME : mySQL에서 설정한 DB 이름 (wordpress)
    • DB_USER : mySQL에서 설정한 DB user id (wp_admin)
    • DB_PASSWORD: DB_USER의 password (wp_admin_password!)
    • Authentication Unique Keys & Salts
      • https://api.wordpress.org/secret-key/1.1/salt/ 에 방문하여 출력되는 내용을 그대로 붙여넣기 한다.
      • 반드시 직접 방문해서 출력되는 내용을 입력해야 한다. 새로고침 할 때마다 다른 값들이 출력된다.

     

    (wp-config 파일 수정 예시:)

     

    마지막으로,  웹서버가 올바르게 동작할 수 있게 wordpress 디렉토리 및 하위 파일들의 권한을 수정해준다.

    sudo chown -R www-data:www-data /var/www/html/wordpress/

     

    이제 GCP의 VM 인스턴스 페이지에 나와 있는 외부 IP 주소로 접속하면 아래와 같은 WordPress 시작 페이지를 볼 수 있다!

     

     

    문제 해결

    더보기

    사이트에 연결할 수 없음 또는 404 Not Found 에러

     

    설치를 모두 진행했는데 위와 같이 사이트에 연결할 수 없음 또는 404 Not Found 에러 페이지가 출력될 수도 있다.

    다음 항목들을 점검해 볼 것.

    • 만약 https://ip_address로 접속되어 있다면 http 접속으로 변경
    • Nginx, WordPress 설정 중에 잘못 입력한 것이 없는지 확인
    • 만약 WordPress와 DB 연동 중 에러가 발생했다면 /var/www/html/wp-content/debug.log 를 참고할 수 있다

    DNS 설정하기

    위의 과정을 따라 만들어진 웹페이지는 주소창에 ip 주소를 입력해야 접속할 수 있다.
    이 블로그처럼 tyanjournal.com 같은 주소를 이용하기 위해서는 먼저 도메인을 구입해야 한다.
    국내/외에 도메인을 구매해 신규 등록할 수 있도록 해주는 업체는 많으니 적당히 큰 업체에서 원하는 도메인을 구입하자.

    (2024.01.21 - 이 글을 옮겨오는 현재, 위 도메인의 연장을 위한 결제 메일이 오고 있으 유지할 계획이 없다.)

     

    나는 GoDaddy에서 도메인을 구입하였는데 GoDaddy의 경우에는 도메인 설정에서 직접 ip 주소를 매핑해줄 수 있다.
    만약 해당 기능이 지원되지 않는다면 google DNS를 이용해 DNS 설정 및 네임 서버 연결을 진행할 수 있다.
    관련해서 간단하게 작성한 포스트 (라기보다는 기록) 가 있으니 참고.

     


     

    2020.07.19 추가

    Oracle Cloud

    Oracle cloud에서도 always-free 서버를 사용할 수 있고, 심지어 서울 region이라고 해서 조금 더 짧은 latency를 기대하며 ubuntu 20.04 및 php7.4를 이용한 것만 제외하고 위와 같은 과정을 반복했다. 그런데 중간에 이전에는 보지 못했던 문제들이 발생해 아래 정리한다.

    MySQL 유저 권한 주기 에러

    MySQL 버전 때문인지, 명령어들 동작이 살짝 달라진 것 같다. 그래서 1. database 생성, 2. user 생성, 3. 권한 부여 순으로 진행했는데, 권한을 부여할 때 에러가 발생했다.

     

    ERROR 1410 (42000): You are not allowed to create a user with GRANT

     

    다음 글을 참고해서 수정함: #

     

    MYSQL 유저 권한 주기 에러 ERROR 1410 (42000): You are not allowed to create a user with GRANT

    글을 시작하기에 앞서 댓글을 달아주신 분들의 의견중 root 계정에 모든 권한 허용시 DB 가 외부에 노출이 되면 위험하다는 의견이 있었습니다. 만약 해당 사항이 있으시다면 이점 참고하여 주시

    dzzienki.tistory.com

     

    nginx service 시작 에러

    nginx restart가 불가능하고, journalctl -xe | grep nginx 결과 nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) 와 같은 에러가 발생했다. 이미 80번 포트를 다른 프로세스가 사용중이라서 발생하는 에러인데, 내 경우에는 apache2가 문제였다. sudo /etc/init.d/apache2 stop 를 입력해 해결.

    사이트에 연결할 수 없음 또는 404 Not Found 에러

    nginx 설정, wordpress 설정 등을 모두 맞게 한 것 같은데도 사이트에 연결이 안되었다. curl localhost | head 를 입력해도 아무것도 출력되지 않는 걸 보니 연결 자체가 안되는 것 같은데... 찾아 보니까 iptable 수정이 필요하다는 것 같다 (참고: #). GCP에서 할 때에는 이 과정은 없었는데..? 잘 모르겠다.

    sudo iptables -I INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
    sudo iptables -I OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT

     

    https 설정할 때 까먹지 않고 443 port에도 해줘야겠다.

     

    덧. 역시나 까먹었다. 인증서 설정을 마쳤는데도 admin page처럼 https로 리디렉션 걸어놓은 페이지에 접속하려고 하거나 cloudflare에서 모든 http를 https로 리디렉션 옵션을 켜기만 하면 접속이 안되어서 4~5시간 이것 저것 삽질했다. ㅠㅠ

     

    끝.