블로그 – WordPress

This entry is part 37 of 48 in the series FreeNAS 서버 만들기

워드프레스는 세계에서 가장 유명한 CMS 중 하나입니다. 본래 목적은 블로그를 만드는 것이지만, 블로그 말고도 쇼핑몰이나 계시판 등을 만들기도 하더군요. 다양한 테마와 플러그인을 설치할수 있어서 다채로운 구성이 가능하고, 설치와 관리가 간단해 사용하기도 쉽습니다.

워드프레스를 설치하는 방법도 미디어위키를 설치하는 것과 크게 다르지 않습니다.

마운트 포인트

워드프레스는  파일 업로드를 허용합니다. 그런데 업로드 된 파일은 FEP 감옥이 위치한 System zpool 에 저장됩니다. 이미지 양이 적거나 외부 이미지 호스팅 서비스를 이용한다면 별 문제가 되지 않겠지만, 그렇지 않은 경우 SSD 에 미디어를 저장하는 것은 부담스러울 수 있습니다. 그러니 HDD 에 미디어가 저장될 수 있도록 마운트 포인트를 설정하겠습니다.

Dataset 만들기

Data/hosting/wordpress

워드프레스 미디어가 저장될 dataset 입니다. 압축을 해제하거나 lz4 로 설정하는 것이 좋습니다.

마운트

iocage exec FEP mkdir -p /usr/local/www/wordpress/wp-content/uploads/

파일이 업로드 될 디렉토리를 만들어주고

iocage stop FEP

감옥을 정지시킨 다음

/mnt/Data/hosting/wordpress/usr/local/www/wordpress/wp-content/uploads/

마운트 해 줍니다.

이제 워드프레스의 미디어 디렉토리는 hdd 에 위치합니다.

WordPress 설치

ioacage console FEP

감옥으로 로그인 해 주세요.

필요한 패키지 설치

20201005 수정
php72 에서 php74 로 버전 업그레이드 되면서 누락된 패키지가 상당히 많습니다. 이런 패키지를 재설치 해 주시기 바랍니다.

‘pkg 와 port – 레포 바꾸기’ 를 참고하여 레포를 최신으로 바꿔 주세요.

pkg install wordpress php74-bcmath php74-exif php74-filter php74-fileinfo php74-openssl php74-pecl-imagick-im7 php74-simplexml

워드프레스와 자주 사용되는 php 패키지를 설치하였습니다.

pkg install php74-dom php74-mbstring php74-openssl php74-filter php74-iconv php74-bcmath php74-exif php74-filter php74-fileinfo php74-openssl php74-pecl-imagick-im7 php74-simplexml php74-bcmath php74-curl php74-dom php74-exif php74-fileinfo php74-filter php74-ftp php74-gd php74-gettext php74-iconv php74-json php74-mbstring php74-mysqli php74-openssl php74-pecl-APCu php74-phar php74-session php74-simplexml php74-tokenizer php74-xml php74-xmlwriter php74-zip php74-zlib

위 패키지도 필요할 수 있습니다. php72 에서 php74 로 업그레이드 되면서 누락된 패키지가 좀 됩니다.

chown -R www:www /usr/local/www/wordpress/

권한 설정도 해 줍니다.

워드프레스와 리버스 프록시

워드프레스를 리버스 프록시에 연결할 때 한가지 문제가 있습니다. 워드프레스가 설치된 서버 (FEP) 는 http 프로토콜을 사용하고, 리버스 프록시에서 ssl (https) 를 사용하게 될 경우, 워드프레스가 정상적으로 동작하지 않는 문제가 발생합니다.

원인은 리다이렉션 문제인듯 합니다. 리버스 프록시는 https 주소로 시작되고 백엔드는 http 일 때, 리버스 프록시가 https 통신을 하고, 백엔드에 전달할때는 http 평문 전송을 하게 되는데, 이렇게 되면 wordpress 는 ‘이 통신은 http 통신이구나’ 하고 판단하고는 http로 리다이렉트시킵니다. 그럼 리버스 프록시가 https 로 리다이렉트시키고, 워드프레스가 다시 http 로 리다이렉트시킵니다. 결과적으로 접속이 불가능해집니다.

그리고 리다이렉트 문제 말고도 한가지 문제가 더 있는데, 각종 컨텐츠들이 로드가 정상적으로 안된다는 겁니다. css나 js 같은것들이 정상적으로 로딩이 되지 않아 페이지가 와장창 깨져 보일 수가 있습니다.

검색해보면 다양한 해결 방법이 나옵니다만, 가장 간단한건 백엔드 (FEP) 에 사설 인증서를 적용시켜서 리버스 프록시에 연결하는 겁니다.

FEP 에 https 연결을 하게 되면

FEMP <–https–> 리버스 프록시 <–https–> 유저

의 형태로 연결을 하게 되니 문제가 발생하지 않습니다.

이렇게 하였을때 부하가 높지 않을까 걱정하시는 분이 있을 것입니다. 저도 그랬구요.

그래서 확인해 본 결과 거의 없습니다. apache-jmeter 으로 한번에 수백명이 접속하는 부하 테스트를 해 보았는데, php가 먼저 맛이 가더군요. php 에서 부하가 무진장 생기지, ssl 을 처리하는 nginx 는 cpu 사용률이 5% 이내였습니다. 부하 문제는 딱히 걱정할 필요가 없을 듯 합니다.

도메인 레코드 등록과 사설 인증서 발급

인증서를 적용하려면 도매인이 필요합니다. 클라우드플레어에서 wp-backend-femp-001.example.com 의 A레코드가 FEP 감옥을 가르키도록 설정해 주세요.

그 후 ‘사설 인증서 발급하기‘ 를 참고하여 10년짜리 wp-backend-femp-001.example.com 의 인증서를 발급해 줍니다.

백엔드에 인증서 적용

iocage console FEP

감옥에 로그인 한 다음

발급한 인증서와 비밀키를 FEP 감옥에 넣어 주세요.

인증서는 /usr/local/etc/cert/wp-backend.crt

비밀키는 /usr/local/etc/cert/wp-backend.key

에 각각 저장하였다고 가정하겠습니다.

chown www:www /usr/local/etc/cert/wp-backend.*
chmod 400 /usr/local/etc/cert/wp-backend.*

권한 설정도 해 주세요.

서버 블록 작성

vi /usr/local/etc/nginx/conf.d/wordpress.conf

server {
    listen      443 ssl http2;
    server_name wp-backend-femp-001.example.com;

    ssl_certificate     /usr/local/etc/cert/wp-backend.crt;
    ssl_certificate_key /usr/local/etc/cert/wp-backend.key;

    root /usr/local/www/wordpress/;
    index index.php;

    access_log /var/log/nginx/wordpress/access.log;

    location = /favicon.ico {
        log_not_found off;
        access_log off;
        expires max;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location ~ /\. {
        deny all;
    }

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location /wp-content/uploads {
        location ~ \.php$ {
            deny all;
        }
    }

    location ~* /(?:uploads|files)/.*\.php$ {
        deny all;
    }

    include otherconfig/php.conf;

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        log_not_found off;
        access_log off;
        expires max;
    }
}

인증서만 집어넣어주고 ssl 통신을 한다는 것만 설정하면 됩니다. 보안을 위한 것이 아니라 오류를 막기 위한 것이라 복잡한 설정이 필요치 않습니다.

mkdir -p /var/log/nginx/wordpress/

로그가 저장될 디렉토리를 만들어준 후

nginx -t

구문을 테스트하고 문제가 없다면

service php-fpm restart && service nginx restart

재시작 해 줍니다.

데이터베이스 만들기

exit

감옥에 있다면 나와 준 다음

워드프레스는 다른 프로그램과 데이터베이스를 함께 사용할 수 있습니다. 그러니 만약 앞서 미디어위키를 설치하였다면 미디어위키의 데이터베이스를 사용해도 됩니다.

본 포스팅에서는 새로운 데이터베이스를 만들도록 하겠습니다.

iocage exec MariaDB mysql -u root -p

CREATE USER wordpressuser@'FEP감옥의IP' identified by 'superstrongpassword';
CREATE DATABASE wordpressdb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
grant all privileges on mediawikidb.* TO wordpressuser@'FEP감옥의IP';
FLUSH PRIVILEGES;
exit;

wordpressuser 유저가 superstrongpassword 라는 비밀번호로 FEP Jail 에서만 접근 가능하게 하고,

utf8mb4 문자셋을 가진 wordpressdb 를 만들었고,

wordpressuserwordpressdb의 모든 권한을 가지도록 하였습니다.

  • 유저명 : wordpressuser
  • 비밀번호 : superstrongpassword 
  • DB명 : wordpressdb

superstrongpassword 를 그대로 사용하지 말고, 자신만의 비밀번호를 만들어 주세요. 비밀번호는 가능하면 숫자와 영어 대소문자만을 사용해서 만들어 주세요.

리버스 프록시에 연결

iocage exec Nginx_WAF vi /usr/local/etc/nginx/conf.d/wordpress.conf

워드프레스 서버 블록을 만들어줍니다.

server {
    listen      443 ssl http2;
    server_name blog.example.com;

    include /usr/local/etc/nginx/options/*;

    allow 191.168.1.0/24;
    deny all;

    client_max_body_size 512M;

    location / {
        proxy_ssl_session_reuse on;
        proxy_ssl_protocols TLSv1.1;
        proxy_pass https://wp-backend-femp-001.example.com;
        include /usr/local/etc/nginx/otherconfig/proxy.conf;
   }
}

프록시 연결을 https://wp-backend-femp-001.example.com 로 하는 것을 볼 수 있습니다.

iocage exec Nginx_WAF nginx -t

구문을 테스트하고

iocage exec Nginx_WAF nginx -s reload

문제가 없다면 nginx 를 재시작해줍니다.

이제 https://blog.example.com 에서 워드프레스를 설치할 수 있습니다.

업데이트

워드프레스의 플러그인의 업데이트는 워드프레스에서 자체적으로 수행할 수 있지만, 워드프레스 코어는 패키지로 업데이트 해 주는게 좋습니다. 경험에서 나오는 건데, 그게 좀더 안정적이더라구요. 손은 더 가지만요.

pkg update && pkg upgrade -y

패키지를 업데이트 해 주고

chown -R www:www /usr/local/www/wordpress

권한을 준 다음

service php-fpm restart && service nginx restart

서비스를 재시작 해 줍니다.

마치면서

워드프레스 같은 자체 업데이터가 있는 프로그램들은 업데이트하기가 난감합니다. 자체 업데이터가 작동하지 않을 때도 있고, 패키지와 자체 업데이터 간의 충돌이 날 때도 있거든요. 되도록이면 자체 업데이터를 사용하기보다는 수동으로 업데이트 하는 것이 오류를 줄이고 문제 발생시 빠르게 대처할 수는 있으니 더 권장됩니다만, 좀더 귀찮죠.

가장 좋은 방법은 언제나 백업입니다. 감옥을 통째로 스냅샷 찍어 뒀다가, 뭔가 잘못되었다 싶으면 롤백하는게 정신건강에 가장 이롭습니다.

다음 포스팅은 Tiny Tiny RSS 라는 RSS 리더를 설치하는 것에 대해 다룹니다.

시리즈 네비게이션<< 개인 위키 – MediaWikiRSS 피더 – TTRSS >>

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다