Odroid-C1을 사용해 보았습니다

ODROID-C1, 하드커널에서 새로 나온 35불짜리 싱글 보드 컴퓨터(SBC)입니다.

Minimal Debian Wheezy 이미지를 설치하고 samba, transmission을 설치해 보았습니다.

네트워크 인수는 유명한 SBC 설정을 사용해서 살짝 손 본 상태입니다. 네트워크 복사 성능은 대충 아래와 같네요.

enter image description here

보다시피 USB 2.0 한계까지 나옵니다.

enter image description here

멀티 코어도 대충 잘 작동하는 것 같습니다.

enter image description here

transmission도 잘 돌아갑니다.

enter image description here

세 개를 동시에 받고 있을 때 속도인데요. 100MB/s 라인 한계까지 나옵니다. 아쉬운 것은 transmission이 스레드 처리가 잘 안되는 것 같습니다. x86은 안 그런 것 같은데……

enter image description here

이 상황에서 다운 받은 파일을 오드로이드에서 PC로 복사해봤습니다. 멀티 코어가 잘 작동하네요.

enter image description here

라즈베리파이와 비교할 생각이었는데 성능 자체는 비교가 불가능할 정도로 차이가 납니다. 기본 제공되는 lubuntu의 Kodi로 1080p 60프레임 몇 개 돌려봤는데 스킵(빨리 감기) 성능이 비교할 수 없이 좋습니다. 다만 현재 제공되는 lubuntu의 네트워크 성능이 구려서 네트워크로 연결하면 없던 지연이 생기더군요. 그러나 기본 성능 자체가 좋으니 리모콘 지원하는 안정화된 OpenElec나 Kodibuntu가 나온다면 10만원 근처의 재생기들은 그냥 다 사망일 것 같습니다. 1080p 시청하면서 밀림 없이 토렌트 돌릴 수 있는 싱글 보드 컴퓨터가 5만원도 안 되니 세상 참 좋아졌네요 ;-)

아, 하드커널에서 판매하는 전원 사용하면 유전원 허브 따위 없어도 2.5인치 하드 하나 정도는 그냥 돌립니다. 라즈베리파이하고 비교하면 이게 특히 좋네요.

한 줄로 정리하면, 간단한 HTPC로는 끝판왕 소리 들을 것 같네요. transmission 돌리실 예정이라면 지금 질러도 후회 없습니다 ;-)

Written with StackEdit.

Windows 8 시작프로그램 폴더

Windows 8에서 프로그램을 등록해 자동으로 시작되게 하는 시작프로그램 폴더를 찾는 가장 간단한 방법은 다음과 같다.

  1. Win+R을 눌러 실행 창을 연다.
  2. 실행 창의 열기 입력란에 shell:startup을 입력한 후 확인을 클릭한다.
  3. 시작프로그램 폴더가 열리면 시작프로그램으로 등록할 실행 파일이나 바로 가기를 끌어다 놓으면 된다.

Windows 8이 되면서 예전에 시작 단추로 처리하던 일들이 많이 어려워졌다. 장점이 많은 Windows 8이지만 시작 단추로 시작하는 인터페이스를 버린 것은 Windows답지 않은 정말 바보 같은 결정이다. 그 동안 Windows만 쓴 처남에게 Windows 8을 종료해보라고 했더니 정말 당황하더라.

업데이트되면서 슬그머니 메트로 시작 화면에 종료 단추를 꺼내놨지만 Windows 8을 처음 보고 그 종료 방법을 접했을 때 느낌은 ‘우리가 만들면 니들은 쓴다’라는 마이크로소프트의 근거 없는 자신감.

RamNode VPS – DNS Hosting

RamNode VPS 서비스에는 DNS 관리 기능이 무료로 제공됩니다. RamNode 홈 페이지에서 로그인하고 Extra 링크를 클릭하면 아래와 같은 화면이 나타나는데요. cPanel DNS Hosting을 Order Now하시면 됩니다 ^^;
Extra

그러면 메일로 cPanel DNS Hosting에 접속하는 정보가 날라옵니다.
ramnode_initial

cPanel Url에서 로그인하시면 되구요. 가지고 계신 도메인의 정보를 위 메일의 아래쪽에 있는 RamNode Nameserver로 변경하면 다양한 도메인 관리 기능을 이용할 수 있게 됩니다. 네임서버 변경에는 시간이 걸린다는 것 유의하시구요. 하루 이상 걸리는 경우도 있습니다.

cPanel DNS Hosting에 접속하면 아래와 같은 화면이 나타나는데요. 우선 암호부터 변경하시구요. Advanced DNS Zone Editor에서 도메인과 여러분의 ddns 주소를 연결할 수 있습니다.
ramnode_initial

Advanced DNS Zone Editor를 선택하면 아래와 같은 화면이 나타납니다.
ramnode_initial

가지고 계신 도메인에 ddns를 연결하는 방법은 간단합니다. Add a Record에서 TYPECNAME으로 선택하고 ddns 주소를 넣어주시면 됩니다. 위 예에서 novakim.asuscomm.com이 제 공유기가 제공하는 ddns입니다. 공유기에 ddns 기능이 없다면 noip.com 등과 같은 서비스 이용하시면 되구요. DNS를 직접 관리할 수 있으니 이리저리 편리하게 이용할 수 있습니다. ^^

Pogoplug – wordpress

Pogoplug에서 nginx의 캐시 기능을 이용해 워드프레스를 실행하는 방법을 안내하는 글이지만, 데비안 위지 기반의 다른 기기에도 동일하게 적용됩니다. 과정을 따라하기 전에 백업은 필수입니다.

설명에 사용된 포고플러그는 데비안 위지가 설치되어 있습니다. 데비안 설치에 대해서는 순정 포고 E02 데비안(wheezy) 설치, B01 포고플러그에 데비안 최신판인 Wheezy을 올려봅시다, 시리즈4 데비안을 한 번에 설치해봅시다. (순정 복구방법 포함)를 참조하세요.

먼저 시스템 업데이트부터하고 시작합니다.

apt-get -y update && apt-get -y dist-upgrade

유틸리티 설치

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

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://ftp.uk.debian.org/debian wheezy-backports main
deb-src http://ftp.uk.debian.org/debian wheezy-backports main

저장소를 변경했으니 업데이트합니다.

apt-get update

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

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

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

apt-get -t wheezy-backports build-dep nginx

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

cd ~
mkdir custom-nginx
cd custom-nginx

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

apt-get -t wheezy-backports source nginx

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

root@pi:~/custom-nginx# ls -la
total 14708
drwxr-xr-x  3 root root   4096 Oct 30 14:05 .
drwx------  3 root root   4096 Oct 30 14:05 ..
drwxr-xr-x 10 root root   4096 Oct 30 14:05 nginx-1.6.2
-rw-r--r--  1 root root 926638 Oct 13 19:05 nginx_1.6.2-2~bpo70+1.debian.tar.gz
-rw-r--r--  1 root root   2780 Oct 13 19:05 nginx_1.6.2-2~bpo70+1.dsc
-rw-r--r--  1 root root 804164 Sep 17 17:34 nginx_1.6.2.orig.tar.gz

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

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

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

nginx (1.6.2~bpo70+1) wheezy-backports; urgency=medium

아래와 같이 바꿨습니다.

nginx (1.6.2~bpo70+1-nova) wheezy-backports; urgency=medium

이제 빌드를 할 차례인데요. Pogoplug E02에서 40분 정도 걸립니다.

cd ~/custom-nginx/nginx-1.6.2
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 Oct 30 15:32 .
drwx------  3 root root    4096 Oct 30 14:27 ..
drwxr-xr-x 10 root root    4096 Oct 30 14:05 nginx-1.6.2
-rw-r--r--  1 root root  926638 Oct 13 19:05 nginx_1.6.2-2~bpo70+1.debian.tar.gz
-rw-r--r--  1 root root    2780 Oct 13 19:05 nginx_1.6.2-2~bpo70+1.dsc
-rw-r--r--  1 root root   71326 Oct 30 15:32 nginx_1.6.2-2~bpo70+1-nova_all.deb
-rw-r--r--  1 root root    3912 Oct 30 15:32 nginx_1.6.2-2~bpo70+1-nova_armel.changes
-rw-r--r--  1 root root  804164 Sep 17 17:34 nginx_1.6.2.orig.tar.gz
-rw-r--r--  1 root root   85720 Oct 30 15:32 nginx-common_1.6.2-2~bpo70+1-nova_all.deb
-rw-r--r--  1 root root   84234 Oct 30 15:32 nginx-doc_1.6.2-2~bpo70+1-nova_all.deb
-rw-r--r--  1 root root  653494 Oct 30 15:32 nginx-extras_1.6.2-2~bpo70+1-nova_armel.deb
-rw-r--r--  1 root root 4893562 Oct 30 15:32 nginx-extras-dbg_1.6.2-2~bpo70+1-nova_armel.deb
-rw-r--r--  1 root root  458784 Oct 30 15:32 nginx-full_1.6.2-2~bpo70+1-nova_armel.deb
-rw-r--r--  1 root root 3104154 Oct 30 15:32 nginx-full-dbg_1.6.2-2~bpo70+1-nova_armel.deb
-rw-r--r--  1 root root  351068 Oct 30 15:32 nginx-light_1.6.2-2~bpo70+1-nova_armel.deb
-rw-r--r--  1 root root 2127550 Oct 30 15:32 nginx-light-dbg_1.6.2-2~bpo70+1-nova_armel.deb

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

 dpkg -i nginx-extras_1.6.2-2~bpo70+1-nova_armel.deb nginx-common_1.6.2-2~bpo70+1-nova_all.deb nginx_1.6.2-2~bpo70+1-nova_all.deb

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

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

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 옵션과 관련이 있을 것 같은데 시간 나면 설명서 좀 제대로 읽어보자.

참고 자료

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 옵션과 관련이 있을 것 같은데 시간 나면 설명서 좀 제대로 읽어보자.

참고 자료

포고플러그에 데비안 깔다

고민하다 결국 포고플러그에도 데비안 위지를 깔았다.

데비안을 잘 몰라서 그렇겠지만, pacman 쓰다가 apt 시스템을 쓰면 부족하고 어지럽다. 그 부족함과 어지러움이 데비안의 강점을 만드는 동력의 결과라는 것을 이해할 때 쯤이면 구루 소리를 듣겠지라는 느낌이랄까(뭔 소리야 이게)? 어쨌든 이제 사용하는 모든 리눅스가 데비안 기반이 되었으니 정리할 때 좀 편하겠다.

samba 설정은 아치 것을 그냥 복사해다 옮겼는데 잘 적용된다. 당연한가?

와 성능 좋구나

아무리 싸도 워드프레스 따위 그냥 돌아가는구나.  mysql이 잡아먹는 메모리가 문제네. fastcgi 캐시를 적용할까 싶었는데 걍 쓸까 싶기도 하고.