Raspberrypi owncloud

From 탱이의 잡동사니
Jump to navigation Jump to search

overview

라즈베리파이와 owncloud로 클라우드 환경 구축하기.

owncloud

간편한 설치 과정, Sqlite/Mysql/Postgresql 등을 지원한다.

심지어는 Android/Apple 용 Application 까지 있어서 스마트 기기에서도 사용이 가능하다.

Performance

당연한 이야기겠지만, 일단 대용량 클라우드 시스템으로 Raspberry pi는 적합하지 않다.

하지만 어떻게든 Raspberry pi 를 사용할 수 밖에 없다면, 용량을 줄이는 수 밖에 없다. 이는 owncloud 의 문제가 아닌, Raspberry pi 의 성능의 문제이다.

Raspberrypi 3 에서 클라우드 디렉토리에 4.1GB, 4,578 개의 파일이 있었는데, 꽤 쓸만했다. :)

최초 파일 동기화시에는 시간이 많이 걸린다. 하지만 한번 파일을 동기화하고 나면 굉장히 빠르다.

사용기

라즈베리 파이에 owncloud 를 설치하고 간단하게 나마 사용을 해봤다. 파일의 크기가 크고 갯수가 작은 환경이라면 꽤 괜찮은 선택같다. 하지만, github 혹은 프로그램 소스를 공유 디렉토리에 넣고 사용을 하는 환경(즉, 파일의 크기는 작으나 파일의 갯수가 많은 경우)에서는 굉장히 느린 퍼포먼스를 보여주었다.

테스트로 약 15,000 개의 파일을 공유 디렉토리에 넣고 사용을 해 보았는데 최초 파일 동기화하는 과정에서 그만 포기해버리고 말았다. 너무 오랜 시간이 걸렸다.-예상시간 약 20시간 이상

사용 후기

가이드의 내용을 그대로 따라해봤다. 하지만 다음의 문제점들이 나타났다.

  • 문제점
파일 동기화(업로드/다운로드)시 한번에 파일 하나씩만을 로컬/서버와 대조한다.
파일 업로드/다운로드 속도는 매우 빠르다. 그러나 하나의 파일에서 다음 파일로 넘어가는데 시간이 오래 걸린다.(약 10초?)
많은 수의 파일들을 동기화 시킬경우(ex, Apache 소스파일) 엄청난 시간이 소요됐다.
한번씩 동기화 Timeout 오류가 나타난다.
Raspberrypi CPU 점유율을 확인해보면 30 % 정도의 사용율을 나타낸다.
가이드에서는 외장형 하드 디스크 사용시 파일 시스템을 NTFS 로 사용하는 것을 전제로 한다. 하지만 실제 사용시, 한번씩 파일시스템이 깨지는 문제가 나타났다.
한번씩 외장 하드디스크에 전원이 정상적으로 공급이 안되거나 갑자기 전원이 꺼지거나 했을 경우, 파일시스템이 망가지는 현상이 자주 발생했다.

따라서 다음의 개선 부분이 예상된다.

  • 외장형 하드디스크 I/O 병목현상
입출력 관련 병목 현상이 의심된다.
-> 병목현상 확인을 위해 외장형 하드디스크가 아닌, SD Card를 저장소로 사용해보자.
  • PHP5 최적화
파일 업로드 다운로드시 FTP 를 사용하는 것이 아닌, PHP5 모듈을 사용한다. 때문에 업로드/다운로드시 한번에 하나의 파일만을 검사하는 것 같다.
관련 모듈 설정 부분을 찾아서 최적화를 해보자.

비교 테스트

개인용 랩탑에 owncloud 를 설치하고 테스트를 해보았다.

owncloud-apache2-mysql 환경이었고, 사용한 스토리지는 Raspberrypi 에서 사용한 외장하드를 사용했다. 즉 하드웨어 I/O 병목은 같았을 것이라 생각된다.

총 용량 30G, 30,000 개 파일들을 동기화하는데 약 30분 정도가 걸렸다. 비교할 수 없는 속도였다.

Installation

대부분의 설치 내용 및 설정은 이곳<ref>http://www.techjawab.com/2014/08/how-to-setup-owncloud-7-on-raspberry-pi.html</ref> 을 참조 했다.

그러나, 이번에 라즈베리 파이와 외장 하드디스크를 이용하여 대용량 클라우드 시스템을 만들면서 한가지 오류사항이 있었다. 바로 Sqlite 때문이었다. owncloud 는 내부적으로 파일 동기를 위해서 Database 를 사용한다. Database 는 여러 종류를 지원하는데, 원본 링크에서는 Sqlite를 사용했었다.

아무튼 무슨 이유에선지 owncloud 가 굉장히 느리게 동작했었다. 원인을 찾아보니 Sqlite Database Lock 때문이었다. 본디, Sqlite 는 Database input/output 시 Database Lock 이 걸린다. 하지만 이 시간이 굉장히 짧기 때문에 그렇게 문제가 될거라고는 생각하지 않았는데, 이번에 테스트를 해보니 정말 오랫동안 시간이 걸렸다. 아마도 Database Lock 실패 이후 다시 재시도 하기까지 엄청 오랜 시간이 걸리거나 Lock 해제가 정상적으로 되지 않거나, 외장 하드디스크 Read/Write 에 문제가 있었던 것으로 생각된다.

하지만 외장 하드디스크는 Read/Write 테스트 결과 정상이었다. 따라서 문제는 owncloud-SQLite 에 있는 것으로 분석되어 owncloud 와 Mysql 을 연동하도록 했다. 만약 다른 Database 연동을 원한다면 owncloud 설치전 해당 데이터베이스와 php-데이터베이스 모듈을 미리 설치하고 진행하면 된다.

install basic packages

다음의 패키지를 설치하도록 하자.(mysql/sqlite 포함되어 있음)

$ sudo apt-get install nginx openssl ssl-cert php5-cli php5-sqlite php5-gd php5-common php5-cgi sqlite3 php-pear php-apc curl libapr1 libtool curl libcurl4 openssl-dev php-xml-parser php5 php5-dev php5-gd php5-fpm memcached php5-memcache varnish mysql-server php5-mysql

purge php5-curl

가이드에서는 php5-curl 모듈을 확실하게 지우도록 권하고 있다. 왜 인지는 모르겠다. 그래도 일단 지워주자.

$ sudo apt-get --purge remove php5-curl

SSL certification

owncloud 접속시 ssl 연결이 필요하다. 2년짜리 Self-sign 인증서를 생성하도록 하자.

$ sudo openssl req $@ -new -x509 -days 730 -nodes -out /etc/nginx/cert.pem -keyout /etc/nginx/cert.key
$ sudo chmod 600 /etc/nginx/cert.pem
$ sudo chmod 600 /etc/nginx/cert.key

configure nginx

nginx 설정이 필요하다. nginx 는 아파치와 같은 웹서버의 하나이며, 가볍고 빠른것이 특징이다.

$ sudo nano /etc/nginx/sites-available/default

상세 수정 화면이다. 아래쪽 내용에서 server_name 부분만 자신의 IP 주소에 맞게 바꿔주면 된다. <source lang=bash> upstream php-handler { server 127.0.0.1:9000; #server unix:/var/run/php5-fpm.sock; }

server { listen 80; server_name 192.168.0.115; return 301 https://$server_name$request_uri; # enforce https }

server { listen 443 ssl; server_name 192.168.0.115;

ssl_certificate /etc/nginx/cert.pem; ssl_certificate_key /etc/nginx/cert.key;

# Path to the root of your installation root /var/www/owncloud;

client_max_body_size 1000M; # set max upload size fastcgi_buffers 64 4K;

rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect; rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect; rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;

index index.php; error_page 403 /core/templates/403.php; error_page 404 /core/templates/404.php;

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

location ~ ^/(?:\.htaccess|data|config|db_structure\.xml|README) { deny all; }

location / { # The following 2 rules are only needed with webfinger rewrite ^/.well-known/host-meta /public.php?service=host-meta last; rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;

rewrite ^/.well-known/carddav /remote.php/carddav/ redirect; rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;

rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;

try_files $uri $uri/ index.php; }

location ~ \.php(?:$|/) { fastcgi_split_path_info ^(.+\.php)(/.+)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param HTTPS on; fastcgi_pass php-handler; }

# Optional: set long EXPIRES header on static assets location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ { expires 30d; # Optional: Don't log access to assets access_log off; }

}

</source>

references

<references />