らくがきちょう

なんとなく

Amazon Linux に ownCloud 10.7 をインストールする

以前に Amazon Linux に Nginx + ownCloud 10.0.3 をインストールするという記事を書きましたが、各ソフトウェアのバージョンが上がっていたので、現時点 (2018/04/09 時点) での Amazon Linux + ownCloud インストール手順をメモしておきます。

構築する環境

今回、構築する環境は最終的に以下のバージョンになりました。

尚、Amazon Linux はデフォルトで SELinux が無効化されている為、特に配慮する必要がありません。

# getenforce
Disabled

MariaDB のインストール

Mattermost のバックエンドになる MariaDB をインストールします。 まず、GPG-KEY をインストールします。

rpm --import https://yum.mariadb.org/RPM-GPG-KEY-MariaDB

/etc/yum.repos.d/mariadb.repo というファイルを以下の内容で新規作成します。

cat << EOF > /etc/yum.repos.d/mariadb.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.3.5/centos6-amd64/
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
EOF

インストールします。

yum -y install MariaDB-client MariaDB-server

データベースのデータ更新時のトランザクションの分離レベルを変更します。 デフォルトでは REPEATABLE-READ ですが、これを READ-COMMITED に変更します。

項目 デフォルト 説明
READ-UNCOMMITTED 他のトランザクションのコミットされていない変更が見える
READ-COMMITTED 他のトランザクションのコミットされた変更が見える
REPEATABLE-READ トランザクション開始時にコミットされていたデータのみ、見える
SERIALIZABLE すべての select でロックを行うことでトランザクションを直列化し競合が発生しないようにする

具体的には /etc/my.cnf.d/server.cnf[mysqld] セクションに transaction の定義を追加します。

[mysqld]
transaction-isolation=READ-COMMITTED

MariaDB (起動スクリプト名は mysql)を起動します。

/etc/init.d/mysql start

インストール直後の状態で自動起動設定になっていました。

# chkconfig --list | grep mysql
mysql           0:off  1:off  2:on   3:on   4:on   5:on   6:off

MariaDB の初期設定

mysql_secure_installation で初期設定を行い、不要なデータベースや anonymous ユーザを削除しておきます。

mysql_secure_installation

実行例は以下の通りです。

# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] n
 ... skipping.

By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

MariaDB 上にデータベースやユーザを作成します。

mysql -u root
CREATE DATABASE owncloud;
CREATE USER 'owncloud'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON owncloud.* TO 'owncloud'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
quit

PHP のインストール

ownCloud は PHP 7.2 をインストールするとエラーになってしまうのですが、Amazon Linuxリポジトリには現時点で PHP 7.1 までしかリリースされていない為、ここはそのまま PHP 7.1 をインストールします。

yum -y install \
  nginx \
  php71 \
  php71-fpm \
  php71-gd \
  php71-intl \
  php71-mbstring \
  php71-mysqlnd \
  php71-pdo \
  php71-pecl-apcu \
  php71-opcache

DB 接続時の維持設定

PHP から MariaDB へ接続する際、セッションを維持(パーシステンスの確保)を行うことで DB への接続が早くなるようにします。 /etc/php.d/30-mysqli.ini に以下を追加します。

cat << EOF >> /etc/php.d/30-mysqli.ini
mysqli.allow_local_infile=On
mysqli.allow_persistent=On
mysqli.cache_size=2000
mysqli.max_persistent=-1
mysqli.max_links=-1
mysqli.connect_timeout=60
mysqli.trace_mode=Off
EOF

PHP キャッシュの設定

OPcache と APCu を導入し、PHP のパフォーマンス改善を図ります。

OPcache の設定

OPcache の設定ファイルは以下にあるようです。 両者異なるファイルなのですが、初期状態では全く同じ内容でした。

  1. /etc/php.d/10-opcache.ini
  2. /etc/php-zts.d/10-opcache.ini

どちらを変更すべきか、すぐに判断出来なかったので両者を以下のように変更しました。

変更前(※ コメント除外版)

zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.blacklist_filename=/etc/php-7.0.d/opcache*.blacklist
opcache.huge_code_pages=1

変更後

zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.blacklist_filename=/etc/php-7.0.d/opcache*.blacklist
opcache.huge_code_pages=1
opcache.enable_cli=1
opcache.fast_shutdown=1
opcache.revalidate_freq=600

実行例

これらのファイルを修正するには、例えば以下のように実行します。 まず、/etc/php.d/10-opcache.ini を修正します。

cat << EOF > /etc/php.d/10-opcache.ini
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.blacklist_filename=/etc/php-7.0.d/opcache*.blacklist
opcache.huge_code_pages=1
opcache.enable_cli=1
opcache.fast_shutdown=1
opcache.revalidate_freq=600
EOF

続けて /etc/php-zts.d/10-opcache.ini も修正します。

cat << EOF > /etc/php-zts.d/10-opcache.ini
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.blacklist_filename=/etc/php-7.0.d/opcache*.blacklist
opcache.huge_code_pages=1
opcache.enable_cli=1
opcache.fast_shutdown=1
opcache.revalidate_freq=600
EOF

APCu の設定

APCu の設定ファイルは以下にあるようです。 両者異なるファイルなのですが、初期状態では全く同じ内容でした。

  1. /etc/php.d/40-apcu.ini
  2. /etc/php-zts.d/40-apcu.ini

変更前(※ コメント除外版)

extension = apcu.so
apc.enabled=1
apc.mmap_file_mask=/tmp/apc.XXXXXX

変更後

extension=apcu.so
apc.enabled=1
apc.mmap_file_mask=/tmp/apc.XXXXXX
apc.enable_cli=1
apc.shm_size=64M
apc.ttl=7200

実行例

これらのファイルを修正するには、例えば以下のように実行します。 まず、/etc/php.d/40-apcu.ini を修正します。

cat << EOF > /etc/php.d/40-apcu.ini
extension=apcu.so
apc.enabled=1
apc.mmap_file_mask=/tmp/apc.XXXXXX
apc.enable_cli=1
apc.shm_size=64M
apc.ttl=7200
EOF

続けて /etc/php-zts.d/40-apcu.ini も修正します。

cat << EOF > /etc/php-zts.d/40-apcu.ini
extension=apcu.so
apc.enabled=1
apc.mmap_file_mask=/tmp/apc.XXXXXX
apc.enable_cli=1
apc.shm_size=64M
apc.ttl=7200
EOF

Nginx の明示的なインストールは不要

PHP をインストールした際に Nginx もインストールされている為、別途、インストールする必要はありません。 インストール直後の状態だと Nginx は停止しています。

# service nginx status
nginx is stopped

自動起動設定もされていません。

# chkconfig --list | grep nginx
nginx           0:off   1:off   2:off   3:off   4:off   5:off   6:off

PHP の設定修正

PHP 関連では以下、2 つの設定ファイルを修正する必要があります。

  1. /etc/php.ini
  2. /etc/php-fpm.d/www.conf

どちらのファイルも コメントアウトには「#」(シャープ)が使えず、「;」(セミコロン)を使う必要がある 点に注意します。 誤って「#」使ってしまうとコメントと見做されず、エラーになってしまいます。

/etc/php.ini の修正

/etc/php.ini は以下の項目を修正します。

Item Default Value New Value
max_execution_time 30 3600
max_input_time 60 3600
memory_limit 128M -1
post_max_size 8M 10G
upload_max_filesize 2M 10G
date.timezone (未設定) Asia/Tokyo

修正例は以下の通りです。

sed -i -e "s/^max_execution_time = 30/max_execution_time = 3600/g" /etc/php.ini
sed -i -e "s/^max_input_time = 60/max_input_time = 3600/g" /etc/php.ini
sed -i -e "s/^memory_limit = 128M/memory_limit = -1/g" /etc/php.ini
sed -i -e "s/^post_max_size = 8M/post_max_size = 10G/g" /etc/php.ini
sed -i -e "s/^upload_max_filesize = 2M/upload_max_filesize = 10G/g" /etc/php.ini
sed -i -e "s/^;date.timezone =/date.timezone = Asia\/Tokyo/g" /etc/php.ini

/etc/php-fpm.d/www.conf の修正

/etc/php-fpm.d/www.conf は以下の項目を修正します。

Item Default Value New Value
user apache nginx
group apache nginx
listen /var/run/php-fpm/www.sock (変更無し)

修正例は以下の通りです。

sed -i -e "s/^user = apache/user = nginx/g" /etc/php-fpm.d/www.conf
sed -i -e "s/^group = apache/group = nginx/g" /etc/php-fpm.d/www.conf

また、このままの設定で進めると ownCloud を起動した後、管理画面に以下のようなエラーが表示されます。

PHPのシステム環境変数が正しく設定されていないようです。getenv("PATH") コマンドでテストして何も値を返さないことを確認してください。 PHP設定の注意事項と php-fpmを利用する場合のサーバー向け設定を インストールドキュメント ↗ で確認してください。

このエラーを避ける為に /etc/php-fpm.d/www.conf;clear_env = no からコメントを外しておきます。 修正例は以下の通りです。

sed -i -e "s/^;clear_env = no/clear_env = no/g" /etc/php-fpm.d/www.conf

PHP セッションディレクトリの所有者修正

また、PHP をインストールした直後は PHP のセッションディレクトリ (/var/lib/php/7.1/session) の所有者が apache ユーザになっており、Nginx から操作出来なくなってしまいます。 よって、所有グループを nginx グループに変更しておきます。

chown -R :nginx /var/lib/php/7.1/session

Nginx 設定ファイルの修正

以下の内容で /etc/nginx/conf.d/owncloud.conf というファイルを新規作成します。 upstream には php-fpm の UNIX ソケットファイルを指定し、PHP の処理を php-fpm へ転送します。 server_name には ownCloud で利用する FQDN を指定します。 SSL/TLS の設定が必要であれば追加します。

cat << EOF > /etc/nginx/conf.d/owncloud.conf
upstream php-handler {
        #server 127.0.0.1:9000;
        server unix:/var/run/php-fpm/www.sock;
}
server {
    listen 80;
    server_name example.com;

    #charset koi8-r;
    #access_log /var/log/nginx/example.access.log  main;
    #error_log /var/log/nginx/example.error.log;

    root /var/www/owncloud;

    client_max_body_size 10G;
    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 / {
        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(?:$|/) {
        root /var/www/owncloud;
        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_pass php-handler;
        include fastcgi_params;
    }
}
EOF

ownCloud を所定ディレクトリに展開する

公式サイトから ownCloud をダウンロードし、所定のディレクトリに展開します。 今回は現時点の最新版である ownCloud 10.0.3 をダウンロードし、/usr/share/owncloud というディレクトリに展開しています。 また、展開したファイル群は Nginx や php-fpm がアクセス出来るよう、所有者を nginx ユーザに変更しておきます。

curl -LO https://download.owncloud.org/community/owncloud-10.0.7.zip
unzip owncloud-10.0.7.zip -d /var/www
chown -R nginx:nginx /var/www/owncloud/

ownCloud へのログイン

ここまでの設定で ownCloud にログイン出来るはずです。 MariaDB は既に起動済みなので、Nginx と php-fpm を起動&自動起動の設定を行います。

service nginx start
service php-fpm start
chkconfig nginx on
chkconfig php-fpm on

ブラウザから http://FQDN と入力し、ownCloud へログインし、初期セットアップを完了させます。

APCu を有効化する

APCu を有効化します。 owncloud/config/config.php に以下の業務を追加します。

  'memcache.local' => '\OC\Memcache\APCu',

Linux OS 側の cron を利用するように設定する

ownCloud はデフォルトで定期処理を AJAX ベースの実装で行います。 これではパフォーマンス的に不利なので、定期処理は Linux OS 側の cron を使うように設定変更します。 以下の内容で /etc/cron.d/owncloud-cron-php を新規作成します。

* * * * * nginx php -f /var/www/owncloud/cron.php  > /dev/null 2>&1 || logger "cron failed. ret=$? `/bin/awk \'{print $1}\' /proc/$$/cmdline`"' > /etc/cron.d/owncloud-cron-php

cron の定義ファイルを作成したので、occ で ownCloud の設定を変更します(※ GUI から設定変更しても良いです)。

sudo -u nginx /var/www/owncloud/occ background:cron

実行結果は以下のようになります。

# sudo -u nginx /var/www/owncloud/occ background:cron
Set mode for background jobs to 'cron'

ファイルオーナーとは異なるユーザで実行すると以下のようなエラーになります。 よって、occ を実行する場合は sudo -u nginx のように指定し、実行ユーザを変更します。

# /var/www/owncloud/occ background:cron
Console has to be executed with the user that owns the file config/config.php
Current user: root
Owner of config.php: nginx
Try adding 'sudo -u nginx ' to the beginning of the command (without the single quotes)

不要なアプリを無効化する

利用方針次第ですが、不要と思うアプリは無効化します。 今回は以下を無効化しました。

番号 アプリ名 無効にしても良いと思うもの
1 Admin Config Report
2 Deleted files 無効にして良い
3 Federation 無効にして良い
4 Provisioning API
5 Share Files
6 Update notification
7 Versions 無効にして良い
8 Collaborative tags 無効にして良い
9 Comments 無効にして良い
10 First run wizard 無効にして良い
11 Mail Template Editor 無効にして良い
12 Market
13 Notifications
14 Video player 無効にして良い

WebDAV からアクセスする場合

Web ブラウザから ownCloud へアクセスしても良いのですが、日常的に利用するのであれば WebDAV クライアント・アプリケーションを使うのも便利です。 無料の WebDAV クライアントには以下のようなものがあります。

WebDAV クライアントからアクセスする場合は(ブラウザの場合とは違って)http://FQDN/remote.php/webdav/ という URL にアクセスします。

Nginx で Let's Encrypt の証明書を利用する

Nginx で Let's Encrypt の証明書を利用する場合、/etc/nginx/conf.d/owncloud.conf を以下のように修正します。 FQDN は適宜、修正します。

server {
    listen       443;
    server_name  FQDN;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/FQDN/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/FQDN/privkey.pem;

設定ファイルの修正が完了したら Nginx を再起動します。

service nginx restart

これで SSL/TLS が有効化されましたので、https で ownCloud へアクセス出来るようになりました。