らくがきちょう

なんとなく

Amazon Linux に Nginx + ownCloud 10.0.3 をインストールする

Amazon Linux に ownCloud をインストールする手順をメモしておきます。

MariaDB のインストール

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

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

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

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.3.2/centos6-amd64/
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

インストールします。

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 のインストール

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

DB 接続時の維持設定

PHP から MariaDB へ接続する際、セッションを維持(パーシステンスの確保)を行うことで DB への接続が早くなるようにします。 /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

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

変更後

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

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

変更後

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

Nginx のインストール

Amazon Linux の標準リポジトリから Nginx をインストールしておきます。

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

/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 (変更無し)

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

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

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

clear_env = no

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

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

chown -R root: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 の設定が必要であれば追加します。

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;
    }
}

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

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

curl -L -O https://download.owncloud.org/community/owncloud-10.0.3.zip
unzip owncloud-10.0.3.zip -d /var/www
chown -R nginx:nginx /var/www/owncloud/

MySqlSchemaManager.php の修正

MariaDB 10.2: Install broken on master due to database column options #28695 によると MariaDB 10.2 と ownCLoud 10.x 系を組み合わせると以下のようなエラーになってしまい、ownCloud のインストール / アップグレードを行うことが出来ません。

rror while trying to create admin user: An exception occurred while executing 'ALTER TABLE oc_calendarsubscriptions CHANGE lastmodified lastmodified INT UNSIGNED DEFAULT NULL NOT NULL':

この問題を回避する為に owncloud/lib/composer/doctrine/dbal/lib/Doctrine/DBAL/Schema/MySqlSchemaManager.php 185 行目周辺を以下のように書き換えます。

変更前

            'default'       => isset($tableColumn['default']) ? $tableColumn['default'] : null,

変更後

            'default' => isset($tableColumn['default']) && !($tableColumn['default'] === 'NULL' && $tableColumn['null'] === 'YES') ? $tableColumn['default'] : null,

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)

サービスの起動

MariaDB は既に起動済みなので、Nginx と php-fpm を起動&自動起動の設定を行います。

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

ownCloud にログイン

ここまでの設定で ownCloud にログイン出来るはずです。 ブラウザから http://FQDN と入力し、ownCloud へログインします。

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

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

番号 アプリ名 無効にしても良いと思うもの
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 へアクセス出来るようになりました。


参考

/etc/my.cnf.d/server.cnf の初期状態

#
# These groups are read by MariaDB server.
# Use it for options that only the server (but not clients) should see
#
# See the examples of server my.cnf files in /usr/share/mysql/
#

# this is read by the standalone daemon and embedded servers
[server]

# this is only for the mysqld standalone daemon
[mysqld]

#
# * Galera-related settings
#
[galera]
# Mandatory settings
#wsrep_on=ON
#wsrep_provider=
#wsrep_cluster_address=
#binlog_format=row
#default_storage_engine=InnoDB
#innodb_autoinc_lock_mode=2
#
# Allow server to accept connections on all interfaces.
#
#bind-address=0.0.0.0
#
# Optional setting
#wsrep_slave_threads=1
#innodb_flush_log_at_trx_commit=0

# this is only for embedded server
[embedded]

# This group is only read by MariaDB servers, not by MySQL.
# If you use the same .cnf file for MySQL and MariaDB,
# you can put MariaDB-only options here
[mariadb]

# This group is only read by MariaDB-10.1 servers.
# If you use the same .cnf file for MariaDB of different versions,
# use this group for options that older servers don't understand
[mariadb-10.1]

/etc/php.d/30-mysqli.ini の初期状態

; Enable mysqli extension module
extension=mysqli.so

/etc/php.d/10-opcache.ini の初期状態

; Enable Zend OPcache extension module
zend_extension=opcache.so

; Determines if Zend OPCache is enabled
opcache.enable=1

; Determines if Zend OPCache is enabled for the CLI version of PHP
;opcache.enable_cli=0

; The OPcache shared memory storage size.
opcache.memory_consumption=128

; The amount of memory for interned strings in Mbytes.
opcache.interned_strings_buffer=8

; The maximum number of keys (scripts) in the OPcache hash table.
; Only numbers between 200 and 100000 are allowed.
opcache.max_accelerated_files=4000

; The maximum percentage of "wasted" memory until a restart is scheduled.
;opcache.max_wasted_percentage=5

; When this directive is enabled, the OPcache appends the current working
; directory to the script key, thus eliminating possible collisions between
; files with the same name (basename). Disabling the directive improves
; performance, but may break existing applications.
;opcache.use_cwd=1

; When disabled, you must reset the OPcache manually or restart the
; webserver for changes to the filesystem to take effect.
;opcache.validate_timestamps=1

; How often (in seconds) to check file timestamps for changes to the shared
; memory storage allocation. ("1" means validate once per second, but only
; once per request. "0" means always validate)
;opcache.revalidate_freq=2

; Enables or disables file search in include_path optimization
;opcache.revalidate_path=0

; If disabled, all PHPDoc comments are dropped from the code to reduce the
; size of the optimized code.
;opcache.save_comments=1

; If enabled, a fast shutdown sequence is used for the accelerated code
;opcache.fast_shutdown=0

; Allow file existence override (file_exists, etc.) performance feature.
;opcache.enable_file_override=0

; A bitmask, where each bit enables or disables the appropriate OPcache
; passes
;opcache.optimization_level=0xffffffff

;opcache.inherited_hack=1
;opcache.dups_fix=0

; The location of the OPcache blacklist file (wildcards allowed).
; Each OPcache blacklist file is a text file that holds the names of files
; that should not be accelerated.
opcache.blacklist_filename=/etc/php-7.0.d/opcache*.blacklist

; Allows exclusion of large files from being cached. By default all files
; are cached.
;opcache.max_file_size=0

; Check the cache checksum each N requests.
; The default value of "0" means that the checks are disabled.
;opcache.consistency_checks=0

; How long to wait (in seconds) for a scheduled restart to begin if the cache
; is not being accessed.
;opcache.force_restart_timeout=180

; OPcache error_log file name. Empty string assumes "stderr".
;opcache.error_log=

; All OPcache errors go to the Web server log.
; By default, only fatal errors (level 0) or errors (level 1) are logged.
; You can also enable warnings (level 2), info messages (level 3) or
; debug messages (level 4).
;opcache.log_verbosity_level=1

; Preferred Shared Memory back-end. Leave empty and let the system decide.
;opcache.preferred_memory_model=

; Protect the shared memory from unexpected writing during script execution.
; Useful for internal debugging only.
;opcache.protect_memory=0

; Allows calling OPcache API functions only from PHP scripts which path is
; started from specified string. The default "" means no restriction
;opcache.restrict_api=

; Enables and sets the second level cache directory.
; It should improve performance when SHM memory is full, at server restart or
; SHM reset. The default "" disables file based caching.
; RPM note : file cache directory must be owned by process owner
;   for mod_php, see /etc/httpd/conf.d/php.conf
;   for php-fpm, see /etc/php-fpm.d/*conf
;opcache.file_cache=

; Enables or disables opcode caching in shared memory.
;opcache.file_cache_only=0

; Enables or disables checksum validation when script loaded from file cache.
;opcache.file_cache_consistency_checks=1

; Implies opcache.file_cache_only=1 for a certain process that failed to
; reattach to the shared memory (for Windows only). Explicitly enabled file
; cache is required.
;opcache.file_cache_fallback=1

; Validate cached file permissions.
;opcache.validate_permission=0

; Prevent name collisions in chroot'ed environment.
;opcache.validate_root=0

; Enables or disables copying of PHP code (text segment) into HUGE PAGES.
; This should improve performance, but requires appropriate OS configuration.
opcache.huge_code_pages=1

/etc/php.d/40-apcu.ini の初期状態

; Enable APCu extension module
extension = apcu.so

;   This can be set to 0 to disable APCu
apc.enabled=1

;   Setting this enables APCu for the CLI version of PHP
;   (Mostly for testing and debugging).
;apc.enable_cli=0

;   Sets the path to text files containing caches to load from disk upon
;   initialization of APCu. preload_path should be a directory where each
;   file follows $key.data where $key should be used as the entry name
;   and the contents of the file contains serialized data to use as the value
;   of the entry.
;apc.preload_path=

;   The size of each shared memory segment, with M/G suffixe
;apc.shm_size=32M

;   The number of seconds a cache entry is allowed to idle in a slot in case
;   this cache entry slot is needed by another entry.
;apc.ttl=0

;   The number of seconds that a cache entry may remain on the
;   garbage-collection list.
;apc.gc_ttl=3600

;   If you begin to get low on resources, an expunge of the cache
;   is performed if it is less than half full. This is not always
;   a suitable way of determining if an expunge of the cache
;   should be per apc.smart allows you to set a runtime configuration
;   value which is used to determine if an expunge should be run
;   if (available_size < apc.smart * requested_size)
;apc.smart=0

;   A "hint" about the number variables expected in the cache.
;   Set to zero or omit if you are not sure;
;apc.entries_hint=4096

;   The mktemp-style file_mask to pass to the mmap module
apc.mmap_file_mask=/tmp/apc.XXXXXX

;   On very busy servers whenever you start the server or
;   modify files you can create a race of many processes
;   all trying to cache the same data at the same time.
;   By default, APCu attempts to prevent "slamming" of a key.
;   A key is considered "slammed" if it was the last key set,
;   and a context other than the current one set it ( ie. it
;   was set by another process or thread )
;apc.slam_defense=1

;   Defines which serializer should be used
;   Default is the standard PHP serializer.
;apc.serializer='default'

;   use the SAPI request start time for TTL
;apc.use_request_time=1

;   Enables APCu handling of signals, such as SIGSEGV, that write core files
;   when signaled. APCu will attempt to unmap the shared memory segment in
;   order to exclude it from the core file
;apc.coredump_unmap=0