Segmentation Faultぐ

Segmentation Fault

コアダンプの数だけ強くなれるよ。

ownCloud+nginx+さくらVPSでプライベートクラウド構築

前回、さくらVPS+nginx環境にSSL証明書を導入してHTTPSによる通信ができるようになりました。今回はownCloudを導入して自分専用のファイルサーバを構築していきます。

www.segmentation-fault.xyz

はじめに

ownCloudはファイル共有サーバー・ソフトウェアです。ownCloud社によりオープンソースの無償版と機能拡張+商用サポートがついた有償版(Enterprise版)が提供されています。

公式はこちら。 owncloud.org

また、ownCloudを開発していたメンバーによって作られたNextcloudというものも存在します。こちらはオープンソースのソフトウェアとして提供することに注力しているようです。 ownCloudとNextcloudの関係については下記が参考になります。

qiita.com

どちらも簡単に言うとDropbox風のファイル共有サーバーを自前で作れますよという機能になります。今回はownCloudの無償版を使います。

ownCloudの導入

概要

使用するVPSは既にWordpressを運用している状態ですので、今回はサブディレクトリにownCloudをインストールします。 具体的にはLinux(CentOS7)に下記ディレクトリ構成でインストールします。

/var/www/wordpress
/var/www/owncloud

それぞれ、
https://"サーバのドメイン"/で接続 ⇒ Wordpressにアクセス、
https://"サーバのドメイン"/owncloudで接続 ⇒ ownCloudにアクセス

という感じに住み分けます。


事前準備

まずは下記を用意します。

  1. Linuxサーバ(VPS等)
  2. 独自ドメイン
  3. SSL証明書

Linuxサーバには事前に必要なソフト(nginx, php, mysql(mariaDB))をインストールしておきます。 PHPのバージョンが5.6.0以上である必要があるので注意です。

$ sudo yum install epel-release
$ sudo yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
$ sudo yum install --enablerepo remi-php70 php php-fpm php-gmp php-mbstring php-mcrypt php-mysqlnd php-opc
ache php-pear-Net-Curl php-pecl-redis php-pecl-zip php-soap php-intl php-ldap php-gd

$ sudo yum install nginx
$ sudo yum install mysql

$ sudo systemctl enable nginx.service
$ sudo systemctl enable php-fpm.service
$ sudo systemctl enable mariadb.service

下記所有者をnginxに変更します。

$ sudo chown nginx:nginx /var/lib/php/ -R

念のため装置をリブートしておきましょう。

$ sudo reboot


ownCloudのダウンロード

こちらから必要なファイルをダウンロードしてきます。

https://owncloud.org/install/

f:id:segmentation-fault:20171007135910p:plain

f:id:segmentation-fault:20171007135914p:plain


ダウンロードが完了したら/var/wwwに展開して所有者をnginxに変更します。

# ファイルのダウンロード
$ wget https://download.owncloud.org/community/owncloud-10.0.3.tar.bz2

# /var/wwwに展開
$ sudo tar jxvf owncloud-10.0.3.tar.bz2 -C /var/www

# 所有者をnginxに変更します
$ sudo chown nginx:nginx /var/www/wordpress/owncloud/ -R


各種設定

ownCloudにアクセスするために下記の設定ファイルを編集していきます。

(1) /etc/php-fpm.d/www.conf
(2) /etc/nginx/conf.d/myserver.conf


(1) /etc/php-fpm.d/www.conf


ユーザとグループがapacheになっている場合はnginxに変更します。 また、nginxとphp-fpm間で通信する為のUNIXドメインのソケットを追記します。

$ sudo vim /etc/php-fpm.d/www.conf

#下記を記載する 
listen = /var/run/php-fpm/php-fpm.sock
listen.mode = 0666
user = nginx
group = nginx


(2) /etc/nginx/conf.d/myserver.conf


nginxの設置ファイルを編集します。 "location ^~ /owncloud { ... }"でくくられた部分でWordpressとownCloudを住み分けてます。


$ sudo vim /etc/nginx/conf.d/myserver.conf


# 下記を記載する
upstream php-handler {
    server unix:/var/run/php-fpm/php-fpm.sock;
}

server {
    listen       80;
    server_name  .<あなたのドメイン>;
    rewrite     ^ https://<あなたのドメイン>$request_uri?;
}

server {
    listen       443 ssl http2;
    #listen       [::]:443 ssl http2;
    server_name  <あなたのドメイン>;
    root         /var/www/wordpress/;

    ssl_certificate "<公開鍵のパス>";
    ssl_certificate_key "<秘密鍵のパス>";

    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  5m;

    ssl_protocols TLSv1.1 TLSv1.2;

    ssl_prefer_server_ciphers on;
    ssl_ciphers 'kEECDH+ECDSA+AES128 kEECDH+ECDSA+AES256 kEECDH+AES128 kEECDH+AES256 kEDH+AES128 kEDH+AES256 DES-CBC3-SHA +SHA !aNULL !eNULL !LOW !kECDH !DSS !MD5 !EXP !PSK !SRP !CAMELLIA !SEED';

    index index.php;

    location ~* /wp-config.php {
        deny all;
    }

    #location ~* /wp-login\.php|/wp-admin/((?!admin-ajax\.php).)*$ {
    #  auth_basic "Please enter your name and password";
    #  auth_basic_user_file  "/var/www/wordpress/.htpasswd";
    #}

    # For OwnCloud
    # Protecting sensitive files from the evil outside world
    location ~ ^/owncloud/(data|config|\.ht|db_structure.xml|README) {
        deny all;
    }

    location ^~ /owncloud {

        root /var/www/;

        # set max upload size
        client_max_body_size 10G;
        fastcgi_buffers 64 4K;

        # Disable gzip to avoid the removal of the ETag header
        gzip off;

        # Uncomment if your server is build with the ngx_pagespeed module
        # This module is currently not supported.
        #pagespeed off;

        index index.php;

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

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

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

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

        try_files $uri $uri/ /owncloud/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;
        }

    }

    location ~ \.php$ {
       fastcgi_split_path_info ^(.+\.php)(/.+)$;
       include  fastcgi_params;
       fastcgi_index index.php;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       fastcgi_param PATH_INFO $fastcgi_script_name;
       fastcgi_pass php-handler;
    }
}


編集が完了したらngint -tでコンフィグの確認をします。

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

ファイルの編集が終ったらnginx, php-fpmを再起動します。

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


データベースの作成

ownCloud用にデータベースを作成します。

$ sudo mysql -u root -p

MariaDB [(none)]>

# ユーザの作成
MariaDB [(none)]> create user 'abcdefg'@localhost IDENTIFIED BY 'sukeke1234';
Query OK, 0 rows affected (0.12 sec)

# データベースの作成
MariaDB [(none)]> create database owncloud;
Query OK, 1 row affected (0.00 sec)

# データベースに作成したユーザによる操作権限を付与
MariaDB [(none)]> GRANT ALL ON ownclound.* TO 'abcdefg'@'localhost' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)

# 念のため
MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> exit
Bye

$ 

これで事前準備は完了です。


接続確認

https://"サーバのドメイン"/owncloudで接続して下記画面が出ればOKです。

https://"サーバのドメイン"/の場合はWordpressが起動すること事も確認しましょう。

f:id:segmentation-fault:20171007150821p:plain

管理者アカウント(ownCloudへのログイン用のアカウント)とデータベースファイルを指定してセットアップを行います。 (管理者アカウントにadminを指定するとエラーになるので注意。)

f:id:segmentation-fault:20171007151003p:plain

セットアップ後に下記画面が表示されるので作成した管理者アカウントでログインします。

f:id:segmentation-fault:20171007151204p:plain

無事ログインまで出来れば完了です。

f:id:segmentation-fault:20171007151332p:plain


スマホからアクセス

ownCloud環境を構築できましたのでスマホアプリからアクセスしてみましょう。 私はAndroidユーザなのでAndroidアプリ(有料)を使います。

f:id:segmentation-fault:20171007153553j:plain

f:id:segmentation-fault:20171007153555j:plain


ファイルの参照、追加、削除が出来るか確認しましょう。



ハマったこと

作業の過程で色々なエラーで苦しめられました(^-^;)

PHPのバージョンが古い

現象:こんな画面が表示される。

f:id:segmentation-fault:20171007152225p:plain

対策:PHPのバージョンアップ

$ sudo yum install epel-release
$ sudo yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
$ sudo yum install --enablerepo remi-php70 php php-fpm php-gmp php-mbstring php-mcrypt php-mysqlnd php-opc
ache php-pear-Net-Curl php-pecl-redis php-pecl-zip php-soap php-intl php-ldap php-gd


/var/run/php-fpm/php-fpm.sockにアクセス不可

現象:こんな画面が表示される。

f:id:segmentation-fault:20171007152934p:plain

原因:/var/run/php-fpm/php-fpm.sockにアクセス権が足りない。

対策:www.confにソケットの権限を追記する。

$ sudo vim /etc/php-fpm.d/www.conf

#下記を記載する 
listen = /var/run/php-fpm/php-fpm.sock
listen.mode = 0666 # defaultだと 0660のためnginxがアクセスできない


データベースのユーザ名にハイフン"-"があるとAccess deniedになる。

現象:こんな画面が表示される。

f:id:segmentation-fault:20171007152329p:plain

対策:試しにデータベースのユーザ名を"-"無しにするとエラーが出なくなった。


セットアップ実行で404 Not Foundになる

現象:

公式のマニュアルでExample Configurationsにある例に従って設定してみるも、セットアップ画面までは行くが、セットアップ実行で404 Not Foundになってしまう。

対策:

原因は分からずじまいですが、nginxの設定ファイルに下記を記載したら動作した。

    location ^~ /owncloud {

        root /var/www/;

        # set max upload size
        client_max_body_size 10G;
        fastcgi_buffers 64 4K;

        # Disable gzip to avoid the removal of the ETag header
        gzip off;

        # Uncomment if your server is build with the ngx_pagespeed module
        # This module is currently not supported.
        #pagespeed off;

        index index.php;

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

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

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

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

        try_files $uri $uri/ /owncloud/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;
        }

    }

まとめ

セキュリティ的に見直すところもあるとは思いますが、ひとまずownCloudを使って自分だけのファイルサーバを作ることができました。 エラーには苦しめられましたが、それもまた良い勉強になったということで。