들어가며

최근 신경컴퓨터를 수강하면서 뉴럴 네트워크를 짜고 있다. 첫 어싸인은 매트랩으로 짰는데, 그래프 출력 기능은 좋지만 문법도 익숙하지 않고 구조화가 어려워서 다음 어싸인은 Numpy로 짜려고 마음먹었다. 사실 마음을 먹었다기보다는 영업을 당했다.

학과 서버 Python2에는 Numpy가 설치되어 있었지만, Python3에는 설치되어 있지 않아서 설치하는 김에 Numpy의 기본 라이브러리보다 성능이 좋다고 알려진 OpenBLAS와 링크해 설치하기로 했다. 설치하는 과정은 여기를 참고했다.

OpenBLAS 빌드

$ git clone https://github.com/xianyi/OpenBLAS.git
$ cd OpenBLAS
$ make NO_AFFINITY=1 FC=gfortran
$ mkdir -p ~/lib/openblas
$ make PREFIX=/home/qwaz/lib/openblas install

make에 여러 옵션이 있는데 USE_THREAD=1 같은 중요한 설정은 기본값으로 되어 있기 때문에 make를 바로 해도 큰 문제는 생기지 않는다. NO_AFFINITY=1 설정을 해 주면 여러 명이 사용하는 서버에서 돌릴 때 성능 향상을 기대할 수 있고, FC는 포트란 컴파일러를 명시적으로 설정해 주는 부분인데 아래에서 동일한 컴파일러를 설정해 주어야 하기 때문에 이 두 개의 옵션을 넣어 컴파일했다. numpy의 경우는 상관 없지만, OpenMP를 사용하는 프로그램과 OpenBLAS를 같이 사용할 예정이라면 USE_OPENMP=1 옵션도 주어야 한다. 내가 돌릴 서버는 Xeon 6개가 달려 있고 하이퍼쓰레딩으로 코어가 12개인 것처럼 인식되는데, 자동으로 최대 쓰레드 수치를 12로 잡은 것을 확인할 수 있었다.

VirtualEnv 설정

$ cd ~
$ virtualenv --python=python3.4 venv
$ source venv/bin/activate
$ mkdir venv/download
$ pip install -d venv/download numpy
$ mkdir venv/build
$ cd venv/build
$ tar xzf ../download/numpy-1.11.0.tar.gz
$ cd numpy-1.11.0
$ cp site.cfg.example site.cfg

이제 site.cfg를 수정하자. openblas로 시작하는 다음 부분의 주석 처리를 해제하고 경로를 수정한다.

[openblas]
libraries = openblas
library_dirs = /home/qwaz/lib/openblas/lib
include_dirs = /home/qwaz/lib/openblas/include
runtime_library_dirs = /home/qwaz/lib/openblas/lib

Numpy 설치하기

$ unset CPPFLAGS
$ unset LDFLAGS
$ python setup.py build --fcompiler=gfortran
$ python setup.py install

make에서 사용된 포트란 컴파일러와 동일한 컴파일러를 명시해 주어야 하는데, 서버에는 g77은 없고 gfortran만 설치되어 있어서 이거려니 섶어서 gfortran으로 설정했다. unset은 명시하지 않은 다른 설정이 끼어드는 것을 막기 위함이라고 한다.

확인

보통 nginx나 uwsgi 등에 www-data uid와 gid를 준다. 프로젝트를 만들고 www-data에게 읽기 권한을 주어야 하는데, 나는 다음과 같이 관리하고 있다.

  1. sudo chown <username>:www-data <directory> -R – 디렉터리 내부의 파일 및 폴더 gid를 모두 www-data로 설정
  2. sudo find <directory> -type d -exec chmod 2770 {} \; – 디렉터리들의 접근 제한을 2770으로 설정. 앞에 붙은 2는 gid 상속을 의미한다.

네이버에서 탈출해 Cafe24 워드프레스 블로그에 정착한지도 꽤 됐는데, Cafe24 웹호스팅 하드 용량을 다 써서 이 기회에 ConoHa 서버로 블로그를 이전하기로 했습니다. 혹시 모를 다음 기회를 위해 써 두는 매뉴얼로 MariaDB 및 PHP 등의 설치 과정과 워드프레스 옵션을 수정하는 방법을 설명하고 있습니다.

블로그 백업

Cafe24 – 계정관리 – 백업받기/올리기에서 DB 및 데이터 파일을 백업합니다. 백업 파일은 하드 용량 제한에 들어가지 않아서 하드가 가득 차서 이민 오는 불쌍한 사람들도 이용할 수 있습니다! 파일 생성이 완료되면 로컬 머신에 다운로드 받아 놓습니다.

MariaDB 설치

워드프레스는 원래 MySQL만 지원하지만 저는 상위호환인 MariaDB를 설치할 것입니다. MariaDB 리포지토리 링크를 따라해 설치합시다. 설치 후에는 sudo /etc/init.d/mysql start로 실행하고, mysql -u root -p로 커맨드라인 툴을 실행할 수 있습니다.

Collation 설정

/etc/mysql/conf.d/mariadb.cnf에 있는 라인들의 주석을 해제해서 utf8을 활성화합시다.

DB 만들기

mysql 커맨드라인에서 CREATE DATABASE wp_blog;로 DB를 생성하고, use wp_blog;로 DB를 설정합니다.

User 만들기

mysql 커맨드라인에서 CREATE USER wp_blog@localhost IDENTIFIED BY 'password';로 유저를 생성하고 패스워드를 설정합니다. 랜덤 문자열을 사용하고 어딘가에 적어둡시다.

Grant

이제 아까 만들었던 DB의 권한을 유저에게 양도합시다. GRANT ALL ON wp_blog.* TO wp_blog@localhost;

제대로 설정되었는지는 SHOW GRANTS FOR wp_blog@localhost;로 확인할 수 있습니다.

PHP 설치

Digital Ocean의 튜토리얼을 취사선택해서 따라합시다. MySQL 부분은 이미 설치했으니 넘기고 nginx 및 PHP 설정  부분을 따라하면 됩니다. MariaDB를 사용하고 있으니 php5-mysql 대신 php5-mysqlnd를 설치해야 워드프레스와 호환성이 좋습니다.

sudo apt-get install php5-mysqlnd php5-fpm
sudo nano /etc/php5/fpm/php.ini # set cgi.fix_pathinfo=0
sudo service php5-fpm restart

nginx 설정

위에서 소개한 Digital Ocean의 튜토리얼은 PHP를 글로벌 설정으로 사용합니다. 하지만 PHP 같은 사회악을 글로벌에서 사용할 수는 없죠. nginx 튜토리얼을 봅시다. /etc/nginx/sites-available에 nginx 설정 파일을 만들고, sites-enabled 디렉토리에서 sudo ln -s /etc/nginx/sites-available/blog로 심볼릭 링크를 생성해 적용합니다. 저는 다음과 같이 파일을 작성했습니다.

# configuration of the server
server {
        # the port your site will be served on
        listen 80;

        # the domain name it will serve for
        server_name     blog.qwaz.io;
        charset         utf-8;

        root /home/qwaz/blog/www;
        index index.php;

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

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

        access_log      /home/qwaz/blog/log/access.log;
        error_log       /home/qwaz/blog/log/error.log;

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

        location ~ \.php$ {
                include fastcgi_params;
                fastcgi_intercept_errors on;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
        }

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

설정이 완료되었으면 sudo service nginx restart로 설정을 적용합니다.

백업 받아오기

블로그 파일을 잘 백업 받았다면 sql 파일 하나와 tar.gz 파일 하나가 있을 겁니다. tar.gz부터 블로그를 관리할 디렉토리에 올려서 압축을 풉니다. 저는 홈 디렉토리 아래 blog 폴더가 있고, 그 안에 log, backup 등의 기타 파일들을 놓은  뒤 www 폴더를 루트로 설정했습니다. tar.gz는 압축만 해제하면 되니 간단합니다.

이제 mysql 커맨드라인에서 위에서 생성한 DB를 선택하고 source backup.sql를 실행하면 DB 백업이 완료됩니다.

wp-config.php 수정

거의 다 완료되었습니다! wp-config.php를 열어 DB 네임, 유저명, 패스워드, 호스트 등을 새로 이사 온 서버에 맞게 수정해 줍니다. 혹시 플러그인 업데이트 시 FTP 권한을 요구하는 등의 경우에는 FS_METHOD 등도 추가로 수정해 줍시다. 더 자세한 정보는 워드프레스 문서에서 확인하실 수 있습니다.

워드프레스 옵션 수정

이제 정말 마지막입니다. 일부 옵션은 DB에서 직접 수정해 주어야 합니다. 혹시 이사 오기 전후 사이트 도메인이 변경된 경우, wp_options 테이블에서 siteurl과 home 컬럼의 값을 바꿔줍시다.

테스트

설정한 도메인을 입력해 제대로 실행되는지 테스트합시다. 이사 끝!

문제 해결

1. 퍼미션

퍼미션을 제대로 걸지 않으면 워드프레스 블로그가 동작하더라도 플러그인 업데이트나 미디어 업로드가 동작하지 않을 수 있습니다. 저는 qwaz:www-data로 퍼미션을 걸고 폴더에는 2770, 파일은 660으로 관리하고 있습니다.

2. 최대 업로드 사이즈

미디어 파일 크기가 큰 경우 업로드에 실패할 수 있습니다. 여기를 참고해 해결합시다.

원래는 따로 글을 써서 정리할까 했는데 GitHub wiki에 워낙 잘 정리되어 있어서 링크로만 소개하고자 한다.

  1. Generating SSH keys
  2. Changing a remote’s URL

SSH 키 세팅하고 나서 remote URL을 https로 시작하는 주소가 아니라 git으로 시작하는 주소로 설정해 주면 된다. 매 번 ID와 패스워드를 입력할 필요가 없기 때문에 편리하게 사용하고 있다.