Raspberrypi – wordpress

RaspberryPi에서 WordPress를 운영하는 것이 가능한지 실험해보고 있습니다. 기본적인 방법은 항상 동일합니다. 인터넷에서 충분히 검색해 정보를 모은 다음, 최선이라고 생각되는 두 세 가지 방법을 시도해 그 중 가장 좋은 결과를 얻은 방법을 최종적으로 선택합니다.

설치 이미지

기본 Raspian은 매우 훌륭한 패키지임에 틀림 없지만 웹 서버로 본다면 쓸모 없는 기능이 너무 많습니다. 그래서 최소한의 패키지를 찾아봤습니다. 시도해 본 것을 아래에 정리했습니다.

  • Raspbian Wheezy armhf Raspberry Pi minimal image – 이미지 크기가 118M이고 1G SD 메모리에도 문제 없이 설치된다고 하니 정말 미니멀한 이미지입니다만, Raspbian과 완전히 호환되는지 확인이 안 되어서 설치만 해 보고 접었습니다.
  • hifi/raspbian-ua-netinst · GitHub – 라즈베리파이 재단의 NOOBS와 유사하게 SD 메모리에 복사해 넣고 부팅하면 온라인에서 필요한 패키지를 다운로드하여 설치하는 방식입니다. 패키지 자체를 raspbian에서 가져오기 때문에 100% 호환됩니다. 그래서 이 방식으로 기본 이미지를 얻었습니다.

설치

raspbian-ua-netinst 파일을 다운로드하여 압축을 푼 후 모든 파일을 포맷한 SD 메모리에 복사하고 부팅합니다. 패키지를 가져와 설치하는 과정이 시작되는데 10~20분 정도 걸립니다.

부팅한 후 아래 명령을 순서대로 실행합니다.

  • 암호 변경: passwd
  • 로케일 설정: dpkg-reconfigure locales
  • 표준 시간대 설정: dpkg-reconfigure tzdata
  • 최신 커널 및 펌웨어 패키지 설치:
    apt-get update && apt-get install linux-image-rpi-rpfv raspberrypi-bootloader-nokernel
  • 기존 kernel.img를 최신 커널로 교체: cp /vmlinuz /boot/kernel.img
  • 새로운 커널과 펌웨어를 사용하도록 다시 부팅: reboot
  • 메모리 관리 성능 향상: apt-get install raspi-copies-and-fills
  • 스왑 파일 생성:
    dd if=/dev/zero of=/swap bs=1M count=512 && mkswap /swap
    echo "/swap none swap sw 0 0" >> /etc/fstab

/boot/config.txt

최소 이미지 설치하고 아래와 같은 설정으로 오버클럭했습니다. 전원으로 iPhone 3GS 충전기를 사용하고 있는데 overvoltage만 설정하면 부팅이 안 되는 관계로 남들처럼 arm_freq를 1000으로 설정하지는 못했습니다 😉

arm_freq=900
arm_freq_min=400
core_freq=300
core_freq_min=100
sdram_freq=500
sdram_freq_min=300
temp_limit=60
gpu_mem=16
boot_delay=0
disable_splash=1
initial_turbo=60

확인 방법은 아래와 같습니다.

root@pi:~# cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
900000
root@pi:~# cat /sys/class/thermal/thermal_zone0/temp
50843

유틸리티 설치

본격적인 작업 전에 아래와 같은 유틸리티를 설치했습니다.

apt-get install nano screen htop

Nginx 설치

Apache가 아닌 Nginx를 설치해서 사용할 것인데요. Nginx + WordPress + fastcgi_cache with conditional purging 페이지에 나오는 형태로 Nginx fastcgi_cache 캐시를 워드프레스에서 적절히 관리할 수 있도록 해 주는 ngx_cache_purge 모듈을 이용하기 위해 Nginx를 컴파일해서 설치합니다.

기본적인 방법은 How To Add ngx_pagespeed Module to Nginx in Debian Wheezy | DigitalOcean 이 페이지를 참조했는데요. 라즈비안에는 백포트 리포지토리가 아직 없다고 하더군요(사실 무슨 말인지 잘 모릅니다). 그래서 기본 소스를 사용해서 컴파일했습니다.

/etc/apt/sources.list를 아래에서

deb http://mirrordirector.raspbian.org/raspbian wheezy main firmware
deb http://archive.raspberrypi.org/debian wheezy main

아래로 변경합니다.

deb http://archive.raspbian.org/raspbian wheezy main contrib non-free
deb-src http://archive.raspbian.org/raspbian wheezy main contrib non-free

저장소를 변경했으니 업데이트 과정을 반복합니다. 새로 설치되는 것은 없더군요.

apt-get update

빌드에 필수적인 패키지를 설치합니다.

apt-get install dpkg-dev build-essential zlib1g-dev libpcre3 libpcre3-dev unzip

nginx 빌드에 필요한 종속 항목을 설치합니다.

apt-get build-dep nginx

홈 디렉터리 아래에 작업할 디렉터리를 만듭니다.

cd ~
mkdir custom-nginx
cd custom-nginx

nginx 소스를 다운로드합니다.

apt-get source nginx

아래와 같이 폴더 하나와 파일 세 개가 생깁니다.

root@pi:~/custom-nginx# ls -la
total 14708
drwxr-xr-x  3 root root    4096 Apr 29 22:10 .
drwx------  4 root root    4096 Apr 29 23:53 ..
drwxr-xr-x 10 root root    4096 Apr 29 21:56 nginx-1.2.1
-rw-r--r--  1 root root 1360861 Nov 21 21:47 nginx_1.2.1-2.2+wheezy2.debian.tar.gz
-rw-r--r--  1 root root    2177 Nov 21 21:47 nginx_1.2.1-2.2+wheezy2.dsc
-rw-r--r--  1 root root  718161 Jun 27  2012 nginx_1.2.1.orig.tar.gz

필요한 기능들이 소스에 다 포함되어 있기 때문에 따로 rules 작업을 필요 없이 바로 changelog를 편집합니다.

nano ~/custom-nginx/nginx-1.2.1/debian/changelog

첫 줄을 아래와 같은 형태에서

nginx (1.2.1-2.2+wheezy2) stable-security; urgency=high

아래와 같이 바꿨습니다.

nginx (1.2.1-2.2+wheezy2-nova) stable-security; urgency=high

이제 빌드를 할 차례인데요. 느낌에 한 시간 정도 걸린 것 같습니다.

cd ~/custom-nginx/nginx-1.2.1
dpkg-buildpackage -b

빌드가 끝나면 아래와 같은 파일들이 생깁니다.

root@pi:~/custom-nginx# pwd
/root/custom-nginx
root@pi:~/custom-nginx# ls -la
total 14708
drwxr-xr-x  3 root root    4096 Apr 29 22:10 .
drwx------  4 root root    4096 Apr 29 23:53 ..
drwxr-xr-x 10 root root    4096 Apr 29 21:56 nginx-1.2.1
-rw-r--r--  1 root root 1360861 Nov 21 21:47 nginx_1.2.1-2.2+wheezy2.debian.tar.gz
-rw-r--r--  1 root root    2177 Nov 21 21:47 nginx_1.2.1-2.2+wheezy2.dsc
-rw-r--r--  1 root root   61186 Apr 29 21:56 nginx_1.2.1-2.2+wheezy2-nova_all.deb
-rw-r--r--  1 root root    5282 Apr 29 22:11 nginx_1.2.1-2.2+wheezy2-nova_armhf.changes
-rw-r--r--  1 root root  718161 Jun 27  2012 nginx_1.2.1.orig.tar.gz
-rw-r--r--  1 root root   73404 Apr 29 21:56 nginx-common_1.2.1-2.2+wheezy2-nova_all.deb
-rw-r--r--  1 root root   74572 Apr 29 21:56 nginx-doc_1.2.1-2.2+wheezy2-nova_all.deb
-rw-r--r--  1 root root  554900 Apr 29 22:07 nginx-extras_1.2.1-2.2+wheezy2-nova_armhf.deb
-rw-r--r--  1 root root 4099270 Apr 29 22:09 nginx-extras-dbg_1.2.1-2.2+wheezy2-nova_armhf.deb
-rw-r--r--  1 root root  399574 Apr 29 22:04 nginx-full_1.2.1-2.2+wheezy2-nova_armhf.deb
-rw-r--r--  1 root root 2746816 Apr 29 22:06 nginx-full-dbg_1.2.1-2.2+wheezy2-nova_armhf.deb
-rw-r--r--  1 root root  294476 Apr 29 22:06 nginx-light_1.2.1-2.2+wheezy2-nova_armhf.deb
-rw-r--r--  1 root root 1925994 Apr 29 22:07 nginx-light-dbg_1.2.1-2.2+wheezy2-nova_armhf.deb
-rw-r--r--  1 root root  328882 Apr 29 22:09 nginx-naxsi_1.2.1-2.2+wheezy2-nova_armhf.deb
-rw-r--r--  1 root root 2028280 Apr 29 22:10 nginx-naxsi-dbg_1.2.1-2.2+wheezy2-nova_armhf.deb
-rw-r--r--  1 root root  343388 Apr 29 21:56 nginx-naxsi-ui_1.2.1-2.2+wheezy2-nova_all.deb

필요한 기능은 naxsi 패키지에 포함되어 있어서 아래와 같이 설치했습니다.

dpkg -i nginx-naxsi_1.2.1-2.2+wheezy2-nova_armhf.deb nginx-common_1.2.1-2.2+wheezy2-nova_all.deb nginx_1.2.1-2.2+wheezy2-nova_all.deb

패키지별 차이는 Nginx – Debian Wiki를 참조하면 됩니다. 그러니까 패키지 파일(이 경우 naxsi) 하나와 종속 파일 두 개를 설치하면 됩니다. 이 두 종속 파일은 어떤 패키지를 설치하든 함께 설치해야 합니다.

위 설치 명령에서 오류가 발생하고 설치가 안 될 수 있는데요. 아래 명령을 실행하면 됩니다.

apt-get -f install

설치가 끝났으면 아래 명령으로 확인합니다.

nginx -V

이제 설정할 차례인데요. Install and configure Nginx, MySQL & PHP-FPM in Debian Wheezy/Jessie – The Worst Website – Stavrovski.Net 페이지를 엄청나게 참고했습니다!

기본으로 제공되는 설정을 보관합니다.

cp /etc/nginx/nginx.conf{,.orig}

아래 명령으로 /etc/nginx/nginx.conf 파일을 입력할 수 있는 상태로 만듭니다.

cat > /etc/nginx/nginx.conf

아래 내용을 붙여넣습니다.

user              www-data;
worker_processes  2;

error_log  /var/log/nginx/error_log;

events {
    worker_connections  1024;
    use epoll;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    # log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    # access_log  /var/log/nginx/access.log  main;

    sendfile        on;

    keepalive_timeout  30;
    server_tokens off;

    connection_pool_size 256;
    client_header_buffer_size 1k;
    large_client_header_buffers 4 2k;
    request_pool_size 4k;

    output_buffers 1 32k;
    postpone_output 1460;

    gzip on;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";
    gzip_http_version 1.1;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript text/x-js;

    include /etc/nginx/sites-enabled/*;
}

모두 입력한 다음 Ctrl+C를 눌러 종료하면 입력한 내용이 /etc/nginx/nginx.conf 파일로 만들어집니다.

중요한 것은 include /etc/nginx/sites-enabled/*; 부분인데요. /etc/nginx/sites-availiabe에 설정 파일을 만들고 ln 명령으로 /etc/nginx/sites-enabled/에 연결하는 방식으로 작업하도록 지정하는 것입니다.

기본으로 제공되는 default 가상 호스트를 삭제합니다.

rm -f /etc/nginx/sites-{enabled,available}/default

사이트 설정 시 정적인 파일 캐시 처리는 공통적으로 사용되는데요. 이 캐시 처리 설정을 미리 만듭니다. 이미 아시겠지만, cat > /etc/nginx/conf.d/caches.conf 줄 다음에 있는 내용을 입력하고 Ctrl+C를 눌러 파일을 만드는 방식입니다.

cat > /etc/nginx/conf.d/caches.conf

## caches
location ~* \.(jpg|jpeg|gif|css|png|js|ico|html)$ {
    access_log off;
    expires max;
}
location ~* \.(js)$ {
    access_log      off;
    log_not_found   off;
    expires         7d;
}
location ~* \.(woff|svg)$ {
    access_log      off;
    log_not_found   off;
    expires         30d;
}
location ~ /\.ht {
    deny  all;
}

Mysql

mysql 서버를 설치합니다.

apt-get install mysql-server

기본으로 제공되는 설정 파일을 보관합니다.

mv /etc/mysql/my.cnf /etc/mysql/my.cnf.orig

소형 시스템용으로 기본 제공되는 설정 파일(my-small.cnf)을 사용하도록 지정합니다.

cp /usr/share/doc/mysql-server-5.5/examples/my-small.cnf /etc/mysql/my.cnf

/etc/mysql/my.cnf 파일을 편집기로 열고 [mysqld] 섹션을 찾아 아래 한 줄을 추가합니다.

query_cache_size = 8M

전 아래와 같이 섹션 맨 아래에 추가했습니다.

[mysqld]
port        = 3306
socket      = /var/run/mysqld/mysqld.sock
skip-external-locking
key_buffer_size = 16K
max_allowed_packet = 1M
table_open_cache = 4
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 128K
query_cache_size = 8M

설정을 바꿨으니 mysql 서비스를 다시 시작합니다.

service mysql restart

설치 후 관리 스크립트를 실행합니다.

mysql_secure_installation

root 계정에 사용할 암호를 입력(두 번)한다는 것을 제외하면 나머지 선택 사항은 기본값을 그대로 적용하면 됩니다(Enter 키 누름).

Php

이제 php 관련 구성 요소를 설치합니다.

apt-get install php5-fpm php5-cli php5-mysql

설치가 끝나면 /etc/php5/fpm/php.ini 파일에서 아래 항목을 찾아 변경하거나 주석 표시를 지웁니다.

cgi.fix_pathinfo=0
date.timezone = Asia/Seoul
memory_limit = 64M
expose_php = Off

참고로 nano에서 문자열 검색은 Ctrl+W입니다.

/etc/php5/fpm/php-fpm.conf 파일에서 아래 항목을 찾아 변경하거나 주석 표시를 지웁니다.

emergency_restart_threshold = 10
emergency_restart_interval = 1m
process_control_timeout = 10

기본 제공되는 /etc/php5/fpm/pool.d/www.conf 파일을 보관합니다.

cp /etc/php5/fpm/pool.d/www.conf{,.orig}

/etc/php5/fpm/pool.d/www.conf 파일을 만듭니다.

cat > /etc/php5/fpm/pool.d/www.conf

[php-serve]
;listen = 127.0.0.1:9001
;listen = /var/run/php-fpm.socket
listen = /var/run/php5-fpm.sock
user = www-data
group = www-data

listen.owner = www-data 
listen.group = www-data 
listen.mode = 0660

request_slowlog_timeout = 5s
slowlog = /var/log/php5-fpm.log
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 10
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 400
listen.backlog = -1
pm.status_path = /status
request_terminate_timeout = 120s
rlimit_files = 131072
rlimit_core = unlimited
catch_workers_output = yes
php_value[session.save_handler] = files
;php_value[session.save_path] = /var/lib/php/session
php_admin_value[error_log] = /var/log/php5-fpm-error.log
php_admin_flag[log_errors] = on

특히 listen = /var/run/php5-fpm.sock 부분에 주목해야 하는데요. 이게 배포판마다 조금 다르더라구요. 다른 php 관련 설정을 참조할 때 주의하세요. 예를 들어 오래된 배포판을 다루는 문서에선 소켓 방식 대신 포트 방식인 listen = 127.0.0.1:9001을 사용하는 경우도 많습니다.

설정을 반영하기 위해 서비스를 다시 시작합니다.

service php5-fpm restart

php를 캐시 처리하여 속도를 개선하는 apc를 설치하고 서비스를 다시 시작합니다.

apt-get install php-apc
service php5-fpm restart

아래 명령에서 apc가 출력되면 정상적으로 설치된 것입니다.

php -m | grep -w apc

PhpMyadmin

이제 nginx, php, mysql을 모두 사용하는 응용 프로그램인 phpmyadmin을 설치합니다. nginx 사이트 설정은 라즈베리파이의 사설 IP 주소로 내부에서 접속하는 용도인 localhost와 도메인 주소를 사용하는 wp.tail9.com의 두 가지로 나뉘는데요. wp.tail9.com을 자신의 도메인 이름이나 ddns 이름으로 바꾸면 됩니다. localhost에는 phpmyadmin을 설정하고 wp.tail9.com에는 루트에 wordpress를 설치할 것입니다.

phpmyadmin을 설치합니다.

apt-get install phpmyadmin

설치 중에 웹 서버를 선택하는 과정이 있지만 nginx는 없으므로 아무 것도 선택하지 않고 OK를 선택하면 됩니다. 그 다음에 mysql root 계정의 암호와 phpmyadmin 암호를 묻는 과정이 있는데 전 모두 동일한 암호를 지정했습니다.

http://라즈베리파이주소/phpmyadmin 형태로 접속할 수 있도록 /etc/nginx/sites-available/localhost 파일을 아래와 같이 만듭니다.

cat > /etc/nginx/sites-available/localhost

server {
    listen 80;
    server_name 192.168.1.19;

    access_log /var/log/nginx/localhost-access;
    #access_log off;
    error_log /var/log/nginx/localhost-error error;

    client_max_body_size 5m;
    client_body_timeout 60;

    root /srv/private/;
    index  index.html index.php;

    # root directory
    location / {
        try_files $uri $uri/ @rewrites;
    }

    location @rewrites {
        rewrite ^ /index.php last;
    }

    ## caches
    include /etc/nginx/conf.d/caches.conf;

    ## php block
    location ~ \.php?$ {
        try_files $uri =404;
        include fastcgi_params;

        fastcgi_pass unix:/var/run/php5-fpm.sock;
        #fastcgi_pass 127.0.0.1:9001;

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_intercept_errors on;
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_hide_header X-Powered-By;
    }

    location /phpmyadmin {
        root /usr/share/;
        index index.php index.html index.htm;

    location ~ ^/phpmyadmin/(.+\.php)$ {
    try_files $uri =404;
    root /usr/share/;

        include fastcgi_params;

        fastcgi_pass unix:/var/run/php5-fpm.sock;
        #fastcgi_pass 127.0.0.1:9001;

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_intercept_errors on;
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_hide_header X-Powered-By;
        }

    location ~* ^/phpmyadmin/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ {
            root /usr/share/;
        }
    }

    location /phpMyAdmin {
        rewrite ^/* /phpmyadmin last;
    }
}

server_name 192.168.1.19; 부분의 192.168.1.19 부분만 라즈베리파이의 사설 IP 주소로 변경하면 됩니다. include /etc/nginx/conf.d/caches.conf; 부분이 Nginx 설치 단계에서 만든 캐시 처리 파일을 포함하도록 지정하는 것입니다.

마쳤으면 아래 명령으로 sites-enabled에 연결합니다.

cd /etc/nginx/sites-enabled
ln -s /etc/nginx/sites-available/localhost

nginx에 적용하기 전에 설정에 이상이 없는지 확인합니다.

nginx -t

아래와 같이 나와야 합니다.

root@pi:~# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

이상이 있다면 /etc/nginx/sites-available/localhost 파일을 수정해야 합니다. /etc/nginx/sites-available/localhost 파일은 단지 링크일 뿐입니다.

이상이 없다면 아래 명령으로 nginx를 다시 시작합니다.

service nginx restart

이제 http://라즈베리파이주소/phpmyadmin으로 접속하면 phpmyadmin이 열립니다. root 계정과 설치 과정에서 지정한 암호로 로그인하십시오.

로그인했으면 이후 WordPress 설치에 사용할 데이터베이스를 생성합니다.

  1. Phpmyadmin 상단 메뉴에서 Privileges > Add a new User를 선택합니다.
  2. Add a new User 창에서 아래 내용을 입력합니다.

Login Information
User name: 원하는 사용자 이름
Host: Local (localhost가 자동 선택됨)
Password: 원하는 암호
Re-type: 암호 다시 입력

Database for user
Create database with same name and grant all privileges 확인란 선택

Global privileges (Check All / Uncheck All)
Check All 선택

Mysql에서 생성

Phpmyadmin 설치하지 않고 mysql 클라이언트에서 작업하는 방법은 아래와 같습니다.

root@debian:/var/log# mysql -u root -p

mysql> CREATE DATABASE database-name;
Query OK, 1 row affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON database-name.* TO "user-name"@"127.0.0.1"
    -> IDENTIFIED BY "********";
Query OK, 0 rows affected (0.01 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

mysql> exit
Bye

WordPress 설치

준비가 다 되었으므로 이제 WordPress를 설치합니다.

WordPress › 한국어 사이트에서 한글판 워드프레스를 다운로드하여 설치합니다.

워드프레스를 설치할 폴더를 만듭니다.

mkdir -p /srv/public/ppwp.tail9.com

이후 절차에서 ppwp.tail9.com를 도메인 이름 또는 ddns 도메인 이름으로 바꾸면 됩니다.

저는 아래와 같이 작업했습니다.

cd /tmp/
wget http://ko.wordpress.org/wordpress-3.9-ko_KR.tar.gz
tar -zxvf wordpress-3.9-ko_KR.tar.gz
mv wordpress/* /srv/public/ppwp.tail9.com/
chown -R www-data:www-data /srv/public/ppwp.tail9.com
chmod -R 755 /srv/public/ppwp.tail9.com/wp-content

이제 새로 만드는 ppwp.tail9.com 사이트의 sites-available 설정을 만들어야 할 차례인데요. 설치한 후에 fastcgi cache를 사용하기 위해 또 바꿔야 하기 때문에 일단 localhost의 설정을 복사해 사용합니다.

cp /etc/nginx/sites-available/localhost /etc/nginx/sites-available/ppwp.tail9.com

/etc/nginx/sites-available/ppwp.tail9.com 파일에서 아래 부분을 바꿔줍니다.

  • server_name을 찾아 값을 localhost에서 ppwp.tail9.com으로 바꿉니다.
  • access_log를 찾아 값을 /var/log/nginx/ppwp.tail9.com-access로 바꿉니다.
  • error_log를 찾아 값을 /var/log/nginx/ppwp.tail9.com-error error로 바꿉니다.
  • root를 찾아 값을 /srv/public/ppwp.tail9.com/으로 바꿉니다.
  • 파일을 저장합니다.

이제 /etc/nginx/sites-available/ppwp.tail9.com 파일을 sites-enabled에 연결합니다.

cd /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/ppwp.tail9.com 

설정이 바뀌었으니 nginx를 다시 시작합니다.

service nginx restart

새로운 사이트를 추가하는 방식은 로컬 사이트인 경우 /srv/private/ 아래에 만들고, 도메인이 있는 공개 사이트는 /srv/public/ 아래에 도메인 이름으로 폴더를 만들어 설치하고 설정 파일은 sites-available에 만들고 sites-enabled에 연결하는 것입니다.

이제 WordPress › 한국어 아래쪽에 있는 설치 설명대로 wp-config-sample.php를 편집하고 이름을 wp-config.php로 바꿔줍니다. 필요한 정보는 위에서 phpmyadmin으로 사용자를 만들 때 지정한 정보입니다.

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', 'wpdata');

/** MySQL database username */
define('DB_USER', 'wpdata');

/** MySQL database password */
define('DB_PASSWORD', '****');

/** MySQL hostname */
define('DB_HOST', 'localhost');

이 네 부분을 바꿔주고 파일 이름을 wp-config.php 바꿔주면 설치할 준비가 끝났습니다. 이제 http://ppwp.tail9.com (여러분의 ddns 또는 도메인 이름) 페이지에 접속하면 설치가 시작됩니다.

vsftp

워드프레스를 업데이트하고 플러그인, 테마를 편리하게 설치하려면 ftp를 연결해야 합니다. 여기에서는 일단 ftp가 설치되어 연결되어 있다고 가정합니다.

ftp를 설정하고 wp-config.php에 아래 정보를 입력하면 워드프레스에서 ftp 정보를 매번 입력할 필요가 없습니다.

define('FTP_HOST', 'ftp.example.org');
define('FTP_USER', 'username');
define('FTP_PASS', 'password');

Secure FTP인 경우에는 아래 정보를 추가합니다.

define(‘FTP_SSL’, true);

워드프레스 설치 위치가 ftp 계정의 홈 폴더가 아닌 경우에는 아래 정보를 추가합니다.

define(‘FTP_BASE’,’…’);

Easy WordPress Updates: Store FTP Info in wp-config.php

Nginx Helper plugin

이제 nginx를 직접 컴파일하면서까지 사용하려고 했던 fastcgi cache를 관리하는 플러그인을 설치합니다.

  1. 워드프레스에 로그인하고 대시보드에서 플러그인 > 플러그인 추가하기를 선택합니다.
  2. 플러그인 검색에서 키워드로 Nginx를 입력합니다.
  3. 맨 위에 나타나는 Nginx 플러그인을 선택하여 설치하십시오.

아직 플러그인을 활성화하지는 마십시오. 이제 이 플러그인을 사용할 수 있도록 nginx 사이트 설정을 바꿀 차례입니다. 아래 내용을 편집기에 복사하고 wp.tail9.com을 사용하려는 사이트 주소로 바꾸신 후 cat 명령을 이용해 /etc/nginx/sites-available/your.domain.name 파일에 입력하십시오.

cat > /etc/nginx/sites-available/your.domain.name

fastcgi_cache_path /etc/nginx/cache levels=1:2 keys_zone=WORDPRESS:100m inactive=7d;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
server {
    listen 80;
    server_name ppwp.tail9.com;

    # access_log /var/log/nginx/ppwp.tail9.com-access;
    access_log off;
    # error_log /var/log/nginx/ppwp.tail9.com-error error;
    error_log off;

    client_max_body_size 5m;
    client_body_timeout 60;

    gzip off;

    root /srv/public/ppwp.tail9.com/;
    index  index.html index.php;

    set $skip_cache 0;

    # POST requests and urls with a query string should always go to PHP
    if ($request_method = POST) {
        set $skip_cache 1;
    }   
    if ($query_string != "") {
        set $skip_cache 1;
    }   

    # Don't cache uris containing the following segments
    if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
        set $skip_cache 1;
    }   

    # Don't use the cache for logged in users or recent commenters
    if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
        set $skip_cache 1;
    }

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

    location ~ .php$ {
        try_files $uri /index.php; 
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php5-fpm.sock;

        fastcgi_cache_bypass $skip_cache;
            fastcgi_no_cache $skip_cache;

        fastcgi_cache WORDPRESS;
        fastcgi_cache_valid  7d;
    }

    location ~ /purge(/.*) {
        fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1";
    }    

    location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
        access_log off;    log_not_found off; expires max;
    }

    location = /robots.txt { access_log off; log_not_found off; }
    location ~ /\. { deny  all; access_log off; log_not_found off; }
}

이제와 설명하는 것은 어떤 의미에서 좀 우습지만 지금까지 한 일은 모두 fastcgi 캐시를 적용하기 위한 것입니다. 워드프레스가 실행되는 과정을 간단하게 표현하면, 사용자가 페이지를 요청하면 nginx가 요청을 받아 관련된 PHP 스크립트를 fastcgi 서버로 보내 결과를 받아 다시 사용자에게 표시하는 것입니다. fastcgi 서버에서 실행되는 스크립트가 mysql에 쿼리도 하고 시스템에서 파일을 읽기도 하는 것이죠. fastcgi 캐시는 이 fastcgi에 요청하여 받은 결과를 캐시에 보관해 두었다가 사용자(브라우저)가 똑같은 fastcgi를 요청하면 php 스크립트를 실행하고 mysql을 쿼리하는 과정 없이 보관해 둔 캐시를 바로 반환하는 것입니다.

문제는 워드프레스 문서가 동적이라는 것입니다. 예를 들어 누군가 코멘트를 추가하여 페이지가 변경되었다면 캐시에 보관된 파일은 코멘트가 없는 버전이므로 이것을 삭제하고 새로운 파일을 캐시에 보관해야 합니다.

바로 이 처리를 하는 것이 fastcgi cache purge 모듈입니다. 이 모듈이 기본 패키지에 포함되어 있지 않기 때문에 컴파일을 한 것이고, 마지막에 워드프레스에서 설치한 플러그인이 바로 이 cache purge 모듈에 맞게 워드프레스 파일을 관리하는 플러그인인 것입니다. 이런 사항을 염두에 두고 위 설정의 중요 항목을 확인해 보십시오.

  • fastcgi_cache_path /etc/nginx/cache levels=1:2 keys_zone=WORDPRESS:100m inactive=7d;
    /etc/nginx/cache는 캐시 파일이 저장되는 위치입니다. 원하는 위치를 지정하시면 되지만 www-data 사용자가 쓸 수 있도록 chown 등으로 권한을 조정하는 것을 잊지 마십시오. chown www-data:www-data /etc/nginx/cache 명령과 chmod 755 /etc/nginx/cache 명령이면 됩니다.
    WORDPRESS는 키 영역의 이름입니다. 키는 캐시에 있는 각 페이지를 나타내는 해시 값입니다. 이 키가 보관되는 영역의 이름인 것이죠. 100m은 그 크기입니다. m은 MB를 의미합니다.
    inactive는 캐시에 보관된 파일이 지정된 기간 동안 다시 액세스되지 않으면 지운다는 의미입니다. m은 분, h는 시간, d는 일입니다. M이 월인 것 같은데 확인은 못했습니다.
  • fastcgi_cache_valid 7d;
    이건 실험으로 알아낸 것이라 제 추측인 조금 가미되어 있습니다. fastcgi 캐시에 파일을 보관하면서 파일의 유효 기간을 정하는 인수인 것 같습니다. inactive보다 이 설정이 우선하는 것 같다는 생각이구요. 대부분의 관련 설명을 보면 inactive는 10m으로 설정하고 fastcgi_cache_valid를 시간 단위로 설정하는 것 같습니다. 하지만 인터넷에 나와 있는 설정대로 했더니 캐시가 너무 빨리 지워져서 라즈베리파이가 힘들어하더군요. 일단 inactive와 fastcgi_cache_valid를 같은 기간이고 다소 긴 7일로 설정하고 실험하는 중입니다.

이제 워드프레스 관리 화면으로 돌아가 Nginx Helper 플러그인을 활성화하고 Settings를 클릭해 필요한 대로 설정합니다.

저는 Enable Cache Purge (requires external settings for nginx) 확인란을 선택하고 Enable Nginx Timestamp in HTML 확인란을 선택했습니다. Enable Nginx Timestamp in HTML 확인란을 선택하고 브라우저에서 소스 보기를 하면 소스 맨 아래에 언제 만들어진 캐시 파일인지 정보가 나옵니다.

전 아래와 같이 나오네요.

<!--Cached using Nginx-Helper on 2014-05-01 20:03:39. It took 31 queries executed in 6.867 seconds.-->
<!--Visit http://wordpress.org/extend/plugins/nginx-helper/faq/ for more details-->

잊지 말아야 할 것은 로그인한 상태에선 캐시가 작동하지 않는다는 것입니다.

길고 난삽한 글이 도움이 될지 모르겠네요. 저도 사실 세세한 설정을 모르고 구현 위주로 작업한거라 개선할 점이 많을 거라고 생각합니다. 오류가 있거나 정확성에 문제가 있다면 언제든지 지적해 주십시오. 그러면서 배우는 것을 아주 좋아합니다.

다들 좋은 하루되시구요~

글 주소

글 주소가 캐시 메커니즘에 영향을 주는 것 같다. http://domain.name/first/ 형태와 http://domain.name/first/second/ 형태는 정상적으로 캐싱되지만 http://domain.name/?p=n 형태는 예상대로 동작하지 않았다. zone 옵션과 관련이 있을 것 같은데 시간 나면 설명서 좀 제대로 읽어보자.

참고 자료

One thought on “Raspberrypi – wordpress”

Leave a Reply

Your email address will not be published. Required fields are marked *