우분투에 설치형 클라우드 NextCloud 설치와 nginx 연동

의존 패키지 설치

아래와 같은 의존 패키지를 설치해야한다. 몇몇 빠진 게 있을 수도 있으나 nextcloud 사이트를 로딩하게 되면 오류 메시지로 필요한 패키지를 알려주기도 한다.

$ sudo apt-get -y install php-cli php-json php-curl php-imap php-gd php-mysql php-xml php-zip php-intl php-mcrypt php-imagick php-mbstring
$ sudo apt-get install -y php-fpm

nextcloud 다운로드

https://download.nextcloud.com/server/releases 사이트에서 최신 버전을 확인 후 다음과 같이 다운로드 한다.

$ cd /var/www/
$ sudo wget https://download.nextcloud.com/server/releases/nextcloud-12.0.4.tar.bz2
$ sudo tar xvjf nextcloud-12.0.4.tar.bz2

MySQL 설정

아래와 같이 데이터베이스 생성과 계정 생성 작업을 한다. 이미 사용중인 계정이 있는 경우 데이터베이스 권한 설정만 해주면 된다.

CREATE DATABASE nextcloud;
CREATE USER "nextcloud"@"localhost";
SET password FOR "nextcloud"@"localhost" = password('[PASSWORD]');
GRANT ALL PRIVILEGES ON nextcloud.* TO "nextcloud"@"localhost" IDENTIFIED BY "[PASSWORD]";
FLUSH PRIVILEGES;

nginx 설정

/etc/nginx/site-available/nginx.conf 파일을 생성 후 아래 내용을 입력한다.

upstream php-handler {
    server unix:/var/run/nextcloud.sock;
}
server {
    listen 80;
    listen [::]:80;
    server_name [cloud.uzuki.live];

    root /var/www/nextcloud/;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;
    add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains;';
    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }
    location = /.well-known/carddav {
        return 301 $scheme://$host/remote.php/dav;
    }
    location = /.well-known/caldav {
        return 301 $scheme://$host/remote.php/dav;
    }
    client_max_body_size 512M;
    fastcgi_buffers 64 4K;
    gzip on;
    gzip_vary on;
    gzip_comp_level 4;
    gzip_min_length 256;
    gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
    gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
    location / {
        rewrite ^ /index.php$uri;
    }
    location ~ ^/.well-known/acme-challenge/* {
        allow all;
    }
    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ {
        deny all;
    }
    location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
        deny all;
    }
    location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+)\.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 modHeadersAvailable true;
        fastcgi_param front_controller_active true;
        fastcgi_pass php-handler;
        fastcgi_intercept_errors on;
        fastcgi_request_buffering off;
    }
    location ~ ^/(?:updater|ocs-provider)(?:$|/) {
        try_files $uri/ =404;
        index index.php;
    }
    location ~* \.(?:css|js|woff|svg|gif)$ {
        try_files $uri /index.php$uri$is_args$args;
        add_header Cache-Control "public, max-age=7200";
        add_header X-Content-Type-Options nosniff;
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Robots-Tag none;
        add_header X-Download-Options noopen;
        add_header X-Permitted-Cross-Domain-Policies none;
        access_log off;
    }
    location ~* \.(?:png|html|ttf|ico|jpg|jpeg)$ {
        try_files $uri /index.php$uri$is_args$args;
        access_log off;
    }
}

위 내용 중 client_max_body_size 512M; 라는 부분이 있는데 대용량 파일 업로드를 위해서는 이 부분이 수정되어야 한다. 0으로 설정하는 경우 무제한 크기이다.

mount bind로 데이터 저장 위치 변경

nextcloud 계정의 data 디렉토리를 기존 서버에 있는 데이터들도 포함하여 사용 가능하도록 하고 싶었다. 예전엔 symbolic link를 사용하여 가능했던 것 같은데 버전 업 되면서 문제가 있어서 인지 해당 기능이 삭제 되었다. 다른 방법은 없나 찾아 보던 중 bind 기능으로 디렉토리를 nextcloud data 디렉토리에 연결하여 사용 가능함을 알았다.

$ sudo su   # root 계정으로 전환
$ cd /var/www/nextcloud/data/[nextcloud 계정명]

위 디렉토리로 이동하면 files 디렉토리가 있다. 해당 디렉토리가 nextcloud 계정의 data 저장용 디렉토리다. seafile의 경우 encryption을 기본으로 사용하여 이렇게 디렉토리를 바로 볼 수가 없다.

files 하위 디렉토리에 별도의 디렉토리를 생성해서 거기에 bind를 할 수도 있고 바로 files 디렉토리를 특정 디렉토리에 bind 하는 것도 가능하다.

$ sudo mount --bind /media/data_2t/  /var/www/nextcloud/data/[계정명]/files

부팅 시 위 설정이 똑같이 적용 되도록 하려면 fstab에 다음과 같이 추가한다.

/etc/fstab

/media/data_2t/ /var/www/nextcloud/data/[계정명]/files none bind 0        0

scan 파일

새로 바인딩 된 디렉토리의 데이터들은 nextcloud 데이터베이스에 등록되어 있지 않다. 따라서 아래와 같이 scan 명령으로 파일 목록을 생성해야 한다.

$ cd /var/www/nextcloud
$ sudo -u www-data php occ files:scan --all

대용량 업로드

대용량 파일 업로드를 위해서는 php 설정, nginx 설정, nextcloud 설정 세 가지가 필요하다. nginx 설정의 경우 앞서 설명하였으므로 php와 nextcloud만 다루겠다. php 설정의 경우 nextcloud 설정 창에서 하는 설정만 하면 필요 없을 수도 있다.

php 설정

php.ini 파일을 열면 아래 설정 내용들이 있다. 해당 값들을 찾아서 원하는 설정으로 변경하여 주면 된다.

/etc/php/7.0/fpm/php.ini

upload_max_filesize = 20G
post_max_size = 20G
max_input_time = 3600
max_execution_time = 3600

nextcloud 설정

아래와 같이 nextcloud 관리자 계정의 설정 페이지에서 파일 처리 크기를 설정 할 수 있다. 해당 설정을 변경하면 nextcloud 디렉토리에 있는 .user.ini 과 .htaccess 파일을 자동으로 변경해주는 것 같다.

서비스 재시작

$ systemctl restart nginx.service 
$ systemctl restart php-fpm.service

참고

Leave a Reply