らくがきちょう

なんとなく

CentOS7 に Nginx + php-fpm + MariaDB 構成で ownCloud 10.0.3 をインストールする

CentOS7 へ ownCloud 10.0.3 をインストールする手順をメモしておきます。

環境

今回は最終的に以下のミドルウェア / バージョンを構築しました。

  • CentOS 7.4.1708
    • mariadb-server-5.5.56-2.el7.x86_64
    • nginx-1.12.2-1.el7_4.ngx.x86_64
    • ownCloud 10.0.3
    • php-fpm-7.1.10-1.el7.remi.x86_64

必要パッケージのインストール

Nginx のリポジトリを追加します。 以下の内容で /etc/yum.repos.d/nginx.repo というファイルを新規作成します。

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

epel と remi リポジトリを追加した後、必要なパッケージ一式をインストールします。

yum -y install epel-release.noarch
yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum -y --enablerepo=nginx --enablerepo=remi-php71 install \
  mariadb \
  mariadb-server \
  nginx \
  php \
  php-dom \
  php-fpm \
  php-gd \
  php-mbstring \
  php-mysqlnd \
  php-pdo \
  php-pdo_mysql \
  php-pecl-zip

現時点で最新の PHP のバージョンは 7.2 ですが、ここでは意図的に PHP 7.1 系をインストールします。 PHP 7.2 系をインストールすると、ownCloud インストール後にアクセスすると以下のエラーメッセージが表示され、ownCloud にアクセス出来なくなってしまいます…

This version of ownCloud is not compatible with PHP 7.2
You are currently running 7.2.0RC4.

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 は以下の項目を修正します。 listen.ownerlisten.group が未設定のままだと php-fpm の UNIX ソケットファイル (/var/run/php-fpm/php-fpm.sock) の所有者が root になってしまい、Nginx と php-fpm が上手く連携出来ず、結果的に ownCloud が起動出来なくなってしまいます。

Item Default Value New Value
user apache nginx
group apache nginx
listen 127.0.0.1:9000 /var/run/php-fpm/php-fpm.sock
listen.owner (未設定) nginx
listen.group (未設定) nginx

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

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

chown -R root:nginx /var/lib/php/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/php-fpm.sock;
}
server {
    listen       80;
    server_name  example.com;

    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;

    root   /usr/share/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           /usr/share/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 /usr/share
chown -R nginx:nginx /usr/share/owncloud/

サービスの起動

Nginx、MariaDBphp-fpm を起動&自動起動設定します。

systemctl enable nginx.service
systemctl enable mariadb.service
systemctl enable php-fpm.service
systemctl start nginx.service
systemctl start mariadb.service
systemctl start php-fpm.service

MariaDB の設定

MariaDB の設定をする前に mysql_secure_installation で不要な設定を削除しておきます。

mysql_secure_installation

MariaDB 上に ownCloud 用のデータベースとユーザを作成します。 今回は以下としました。

Item Value
データベース名 owncloud
ユーザ名 owncloud
パスワード password

具体的には以下を実行します。

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

ownCloud へアクセスする

これでインストールは完了です。 Nginx の設定ファイルに server_name として指定した URL (http://example.com 等) にアクセスすると ownCloud のログイン画面が表示されるはずです。

f:id:sig9:20171023012752p:plain

PHP のモジュール不足等がある場合は以下のようなエラーが表示されます。 こういった場合は「不足している」と表示されたモジュールを追加インストールします。

f:id:sig9:20171023012805p:plain

参考

/etc/php.ini の初期状態

[PHP]
engine = On
short_open_tag = Off
precision = 14
output_buffering = 4096
zlib.output_compression = Off
implicit_flush = Off
unserialize_callback_func =
serialize_precision = -1
disable_functions =
disable_classes =
zend.enable_gc = On
expose_php = On
max_execution_time = 30
max_input_time = 60
memory_limit = 128M
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors = Off
display_startup_errors = Off
log_errors = On
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
html_errors = On
variables_order = "GPCS"
request_order = "GP"
register_argc_argv = Off
auto_globals_jit = On
post_max_size = 8M
auto_prepend_file =
auto_append_file =
default_mimetype = "text/html"
default_charset = "UTF-8"
doc_root =
user_dir =
enable_dl = Off
file_uploads = On
upload_max_filesize = 2M
max_file_uploads = 20
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60
[CLI Server]
cli_server.color = On
[Date]
[filter]
[iconv]
[intl]
[sqlite3]
[Pcre]
pcre.jit=0
[Pdo]
[Pdo_mysql]
pdo_mysql.cache_size = 2000
pdo_mysql.default_socket=
[Phar]
[mail function]
sendmail_path = /usr/sbin/sendmail -t -i
mail.add_x_header = On
[ODBC]
odbc.allow_persistent = On
odbc.check_persistent = On
odbc.max_persistent = -1
odbc.max_links = -1
odbc.defaultlrl = 4096
odbc.defaultbinmode = 1
[Interbase]
ibase.allow_persistent = 1
ibase.max_persistent = -1
ibase.max_links = -1
ibase.timestampformat = "%Y-%m-%d %H:%M:%S"
ibase.dateformat = "%Y-%m-%d"
ibase.timeformat = "%H:%M:%S"
[MySQLi]
mysqli.max_persistent = -1
mysqli.allow_persistent = On
mysqli.max_links = -1
mysqli.cache_size = 2000
mysqli.default_port = 3306
mysqli.default_socket =
mysqli.default_host =
mysqli.default_user =
mysqli.default_pw =
mysqli.reconnect = Off
[mysqlnd]
mysqlnd.collect_statistics = On
mysqlnd.collect_memory_statistics = Off
[PostgreSQL]
pgsql.allow_persistent = On
pgsql.auto_reset_persistent = Off
pgsql.max_persistent = -1
pgsql.max_links = -1
pgsql.ignore_notice = 0
pgsql.log_notice = 0
[bcmath]
bcmath.scale = 0
[browscap]
[Session]
session.save_handler = files
session.use_strict_mode = 0
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.referer_check =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.sid_length = 26
session.trans_sid_tags = "a=href,area=href,frame=src,form="
session.sid_bits_per_character = 5
[Assertion]
zend.assertions = -1
[mbstring]
[gd]
[exif]
[Tidy]
tidy.clean_output = Off
[soap]
soap.wsdl_cache_enabled=1
soap.wsdl_cache_dir="/tmp"
soap.wsdl_cache_ttl=86400
soap.wsdl_cache_limit = 5
[sysvshm]
[ldap]
ldap.max_links = -1
[dba]
[curl]
[openssl]

/etc/php-fpm.d/www.conf の初期状態

[www]
user = apache
group = apache
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog = /var/log/php-fpm/www-slow.log
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = files
php_value[session.save_path]    = /var/lib/php/session
php_value[soap.wsdl_cache_dir]  = /var/lib/php/wsdlcache