Nginx で動かす OwnCloud はソースからの方が良いのかも

本記事は最終更新日より 1 年以上経過しております。
スポンサーリンク

 OwnCloud はオフィシャルのリポジトリを取り込めば yum で簡単インストールを行えるから非常にお手軽だった。
 しかし、Web Server に Apache を想定した物であるため owncloud.noarch の依存パッケージとして owncloud-config-apache.noarch を要求してくる。更に、owncloud-config-apache.noarch は httpd.x86_64 を要求する。
 Nginx + Apache で ReverseProxy を用いている場合には問題無さそうだけど、Nginx 単体で使用する場合にはちょっとイヤなので OwnCloud をソースからのインストールに切り替えた。

最初に

 今後、OwnCloud をソースから新規インストールする時の為に yum で依存するパッケージの中から必要な PHP のライブラリとコマンドを調査しておく事にした。今は OwnCloud オフィシャルのリポジトリを有効にしている状態だから yum deplist で直ぐに調べられる。
 owncloud と owncloud-server の 2 つのパッケージから調べる事が出来る。

curl
php >= 5.4.0
php-gd
php-json
php-ldap
php-mbstring
php-pdo
php-posix
php-process
php-xml
php-zip
policycoreutils-python
sqlite

 OwnCloud をソースから新規インストールするなら、先にこれらパッケージを導入しておこう。導入する PHP は 7 でも問題無い。

OwnCloud のパッケージを削除

 既に入っているパッケージをさくっと削除する。config.php は削除されること無く残るので、敢えて待避せずとも良いけど心配な人はバックアップを。

# yum erase owncloud*
読み込んだプラグイン:fastestmirror
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ owncloud.noarch 0:8.2.2-1.1 を 削除
---> パッケージ owncloud-config-apache.noarch 0:8.2.2-1.1 を 削除
---> パッケージ owncloud-server.noarch 0:8.2.2-1.1 を 削除
--> 依存性解決を終了しました。

依存性を解決しました

======================================================================================================================================
 Package                                   アーキテクチャー          バージョン                   リポジトリー                   容量
======================================================================================================================================
削除中:
 owncloud                                  noarch                    8.2.2-1.1                    @ce_stable                     33 k
 owncloud-config-apache                    noarch                    8.2.2-1.1                    @ce_stable                    669
 owncloud-server                           noarch                    8.2.2-1.1                    @ce_stable                     77 M

トランザクションの要約
======================================================================================================================================
削除  3 パッケージ

インストール容量: 77 M
上記の処理を行います。よろしいでしょうか? [y/N]y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  削除中                  : owncloud-8.2.2-1.1.noarch                                                                             1/3
An ownCloud installation consists of multiple packages.
You just uninstalled owncloud . Please also check these:
owncloud-server-8.2.2-1.1.noarch
owncloud-config-apache-8.2.2-1.1.noarch
  削除中                  : owncloud-config-apache-8.2.2-1.1.noarch                                                               2/3
警告: /etc/httpd/conf.d/owncloud.conf は /etc/httpd/conf.d/owncloud.conf.rpmsave として保存されました。
  削除中                  : owncloud-server-8.2.2-1.1.noarch                                                                      3/3
  検証中                  : owncloud-8.2.2-1.1.noarch                                                                             1/3
  検証中                  : owncloud-config-apache-8.2.2-1.1.noarch                                                               2/3
  検証中                  : owncloud-server-8.2.2-1.1.noarch                                                                      3/3

削除しました:
  owncloud.noarch 0:8.2.2-1.1          owncloud-config-apache.noarch 0:8.2.2-1.1          owncloud-server.noarch 0:8.2.2-1.1

完了しました!

OwnCloud のソースをダウンロード

 OwnCloud オフィシャルサイトよりソースをダウンロードし、適当に展開したら OwnCloud を設置していたドキュメントルートに設置する。

# wget https://download.owncloud.org/community/owncloud-8.2.2.tar.bz2
# tar xjvf ./owncloud-8.2.2.tar.bz2
# shopt -s dotglob
# cp -irp ./owncloud /var/www/html/owncloud
# chown -R nginx. /var/www/html/owncloud

 shopt -s dotglob は .htaccess や .user.ini も cp -rp でコピーする為に用いた。もっとも Nginx だから .htaccess は不要だが念のため。あと、.user.ini が残っており、上書き確認がでたらこれは拒否しておく。

Nginx の OwnCloud 用ホストの設定

 既に OwnCloud を Nginx で動作させていた場合にはそのままで動作する。
 新規インストールの場合は次の様に設定しておく。細かい所は各自ポリシーに合わせる。
 うちでは Let’s Encrypt のサーバー証明書を用いて HTTP/2 に対応させているので、そのままであることに注意。あと SSL 周りの設定も WinXP や Android 2.x 系を非サポートにしている。

upstream php-handler {
    server 127.0.0.1:9000;
}

server {
    listen 80;
    server_name cloud.example.com;
    root /var/www/html/owncloud;
    index index.html;

    location / {
        return 301 https://$server_name$request_uri;
    }
}

server {
    listen       443 ssl http2;
    server_name  cloud.example.com;
    root         /var/www/html/owncloud;
    index        index.php;

    charset utf-8;
    resolver localhost;

# Logging. =====
    access_log  /var/log/nginx/cloud.example.com/access_log main;
    error_log   /var/log/nginx/cloud.example.com/error_log warn;

# HTTPS Setting by mozilla generator. =====
    ssl on;
    ssl_certificate /etc/letsencrypt/live/cloud.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/cloud.example.com/privkey.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;
    # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
    ssl_dhparam /etc/nginx/dhparam.pem;

    # modern configuration. tweak to your needs.
    ssl_protocols TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK';
    ssl_prefer_server_ciphers on;

    # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
    add_header Strict-Transport-Security max-age=15768000;

    # OCSP Stapling ---
    # fetch OCSP records from URL in ssl_certificate and cache them
    ssl_stapling on;
    ssl_stapling_verify on;

    ## verify chain of trust of OCSP response using Root CA and Intermediate certs
    ssl_trusted_certificate /etc/letsencrypt/live/cloud.example.com/fullchain.pem;

# ========== OwnCloud
    client_max_body_size 10G; # set max upload size
    gzip off;

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

    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 = /data/htaccesstest.txt {
        allow all;
        log_not_found off;
        access_log off;

}
    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_buffers 8 16k;
        fastcgi_buffer_size 32k;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param HTTPS on;
        fastcgi_pass  php-handler;
        fastcgi_intercept_errors on;
    }

    # Adding the cache control header for js and css files
    # Make sure it is BELOW the location ~ \.php(?:$|/) { block
    location ~* \.(?:css|js)$ {
        add_header Cache-Control "public, max-age=7200";
        # Add headers to serve security related headers
        add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
        add_header X-Content-Type-Options nosniff;
        add_header X-Frame-Options "SAMEORIGIN";
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Robots-Tag none;
        # Optional: Don't log access to assets
        access_log off;
    }

    # Optional: Don't log access to other assets
    location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|swf)$ {
        access_log off;
    }
}

OwnCloud の Upgrade 処理

 念のため実行しておくと良い。

# chmod 700 /var/www/html/owncloud/occ
# sudo -u nginx /var/www/html/owncloud/occ upgrade

 occ はコマンドラインから OwnCloud の処理を行えるスクリプトなので覚えておくと楽出来る事が多い。
 config.php に書き込むことが出来るユーザーで実行する必要がある為、sudo で nginx ユーザーから実行させている。

おわりに

 ソースからインストールしても、管理画面から OwnCloud のアップデートチェックが行えるので、パッケージ管理せずとも同様にアップデートを行っていけそうだ。

スポンサーリンク