さくらのVPSにNextcloudをインストールする

さくらのVPS にNextcloudをインストールするの続きです。
Nextcloud の動作に必要なミドルウェアと Nextcloud 本体をインストールしていきます。

  1. さくらのVPS 申し込みからSSH接続まで
  2. ミドルウェアとNextcloudのインストールまで(このページ)
  3. さくらのVPS×Nextcloudの考察

OSの情報とミドルウェアのバージョン構成

今回使用するCentOSの情報は次のとおりです。

# cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)

# uname -a
Linux xxxx.vs.sakura.ne.jp 3.10.0-1127.8.2.el7.x86_64 #1 SMP Tue May 12 16:57:42 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

各ミドルウェアと Nextcloud は次のバージョンを使用します。

nginx/1.18.0
php/7.4
MariaDB/10.5
redis/6.0
Nextcloud 19.0.3

Nginx、PHP(php-fpm)、MariaDB、Redisを使用します。Nginxの代わりに、Apache(mod_php/php-fpm)でも構築が可能です。Nextcloud のパッケージは、公式サイトのtarアーカイブから最新版を取得して使用します。

OSのセキュリティアップデート

OSテンプレート作成時からの更新分のパッケージをダウンロードします。SSDなだけあり処理速度はかなり早いです。

# yum update

Nginx のインストール

Nginxは公式リポジトリを追加してyumでインストールします。
/etc/yum.repos.d/nginx.repo を作成し、下記の内容で保存します。

[nginx-stable]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key

Nginxをインストールします。

# yum install nginx

TLS(SSL)自己証明書の作成

httpsでの接続ができるように、仮の自己証明書を作成してNginxの設定をします。正式なサーバ証明書がある場合には、この項目はスキップしてOKです。

# mkdir /etc/nginx/ssl
# openssl req -new -x509 -sha256 -newkey rsa:2048 -days 365 -nodes -out /etc/nginx/ssl/nginx.pem -keyout /etc/nginx/ssl/nginx.key
# chown root:root -R /etc/nginx/ssl/
# chmod 600 /etc/nginx/ssl/*
# chmod 700 /etc/nginx/ssl
  • nginx.key:暗号化鍵
  • nginx.pem:サーバ証明書

Nginx 設定ファイルの修正

Nextcloud 用の Nginx の設定ファイルは、Nextcloudの公式ドキュメントにサンプルがあるのでこれをベースに設定します。

/etc/nginx/conf.d/nextcloud.conf を新規作成し、下記の内容で保存します。server_name は環境に合わせて変更してください。

upstream php-handler {
    server unix:/var/run/php-fpm/php-fpm.sock;
}

server {
    listen 80;
    listen [::]:80;
    server_name ★FQDN又はIPアドレス;
    # enforce https
    return 301 https://$server_name:443$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name ★FQDN又はIPアドレス;

    ssl_certificate /etc/nginx/ssl/nginx.pem;
    ssl_certificate_key /etc/nginx/ssl/nginx.key;

    #add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
    add_header Referrer-Policy "no-referrer" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Download-Options "noopen" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Permitted-Cross-Domain-Policies "none" always;
    add_header X-Robots-Tag "none" always;
    add_header X-XSS-Protection "1; mode=block" always;

    fastcgi_hide_header X-Powered-By;
    root /var/www/html/nextcloud;

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location = /.well-known/carddav {
      return 301 $scheme://$host:$server_port/remote.php/dav;
    }
    location = /.well-known/caldav {
      return 301 $scheme://$host:$server_port/remote.php/dav;
    }

    client_max_body_size 512M;
    fastcgi_buffers 64 4K;

    gzip on;
    gzip_vary on;
    gzip_comp_level 4;
    gzip_min_length 256;
    gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
    gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;

    location / {
        rewrite ^ /index.php;
    }

    location ~ ^\/(?:build|tests|config|lib|3rdparty|templates|data)\/ {
        deny all;
    }
    location ~ ^\/(?:\.|autotest|occ|issue|indie|db_|console) {
        deny all;
    }

    location ~ ^\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+|.+\/richdocumentscode\/proxy)\.php(?:$|\/) {
        fastcgi_split_path_info ^(.+?\.php)(\/.*|)$;
        set $path_info $fastcgi_path_info;
        try_files $fastcgi_script_name =404;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $path_info;
        fastcgi_param HTTPS on;
        # Avoid sending the security headers twice
        fastcgi_param modHeadersAvailable true;
        # Enable pretty urls
        fastcgi_param front_controller_active true;
        fastcgi_pass php-handler;
        fastcgi_intercept_errors on;
        fastcgi_request_buffering off;
    }

    location ~ ^\/(?:updater|oc[ms]-provider)(?:$|\/) {
        try_files $uri/ =404;
        index index.php;
    }

    location ~ \.(?:css|js|woff2?|svg|gif|map)$ {
        try_files $uri /index.php$request_uri;
        add_header Cache-Control "public, max-age=15778463";
        #add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
        add_header Referrer-Policy "no-referrer" always;
        add_header X-Content-Type-Options "nosniff" always;
        add_header X-Download-Options "noopen" always;
        add_header X-Frame-Options "SAMEORIGIN" always;
        add_header X-Permitted-Cross-Domain-Policies "none" always;
        add_header X-Robots-Tag "none" always;
        add_header X-XSS-Protection "1; mode=block" always;
        access_log off;
    }

    location ~ \.(?:png|html|ttf|ico|jpg|jpeg|bcmap|mp4|webm)$ {
        try_files $uri /index.php$request_uri;
        access_log off;
    }
}

Redis インストール

KVS(キーバリューストア)として、redisサービスを使用します。Nextcloudのセッションやファイルロック管理に使用します。redisをインストールしない構成も可能ですが、redisがあると全体的にパフォーマンスが高くなります。

# yum install --enablerepo=remi redis

/etc/redis.conf をviで開き修正します。

設定ファイル内の下記行をコメントアウトします

# save 900 1
# save 300 10
# save 60 10000

redisサービスの起動します

# systemctl start redis
# systemctl enable redis

PHP7.4のインストール

PHP7.4をRemiリポジトリからインストールします。

remi リポジトリのインストール

# yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm

Nextcloud に必要な phpモジュールをインストールします。必要なモジュールはNextcloudの公式ドキュメントに記載されています。LDAP連携やSMBストレージを連携する場合には追加モジュールが必要です。

# yum install --enablerepo=remi-php74 ImageMagick php php-bcmath php-cli php-common php-devel php-fpm php-gd php-gmp php-intl php-json php-mbstring php-mysqlnd php-opcache php-pdo php-pear php-pear-Net-Curl php-pecl-apcu php-pecl-apcu-bc php-pecl-igbinary php-pecl-imagick php-pecl-mcrypt php-pecl-redis5 php-pecl-zip php-process php-soap php-xml

PHPの設定

PHPの設定については、ownCloudのパフォーマンスチューニングという記事がとても参考になります。

/etc/php-fpm.d/www.conf 新規作成し、下記内容で保存します。

[www]
user = nginx
group = nginx

listen = /var/run/php-fpm/php-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
listen.allowed_clients = 127.0.0.1

pm = dynamic
pm.max_children = 5
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 5
slowlog = /var/log/php-fpm/www-slow.log

env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
;php_admin_value[memory_limit] = 128M

php_value[session.save_handler] = redis
php_value[session.save_path]    = "tcp://127.0.0.1:6379"
php_value[soap.wsdl_cache_dir]  = /var/lib/php/wsdlcache
;php_value[opcache.file_cache]  = /var/lib/php/opcache

/var/lib/php/ ディレクトリの権限変更

# chown -R nginx. /var/lib/php/

/etc/php.d/40-apcu.ini を編集し、apc.enable_cli パラメータを有効にする

apc.enable_cli=1

Nginx、php-fpm サービスを起動します。

# systemctl start php-fpm
# systemctl enable php-fpm
# systemctl start nginx
# systemctl enable nginx

MariaDBのインストール

/etc/yum.repos.d/MariaDB.repo を新規作成し、下記の内容で保存します。
MariaDBリポジトリの情報は公式サイトを確認します。

# MariaDB 10.5 CentOS repository list - created 2020-09-21 08:31 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.5/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

MariaDBインストール

# yum install MariaDB-server MariaDB-client

/etc/my.cnf.d/nextcloud.cnf を新規作成し、下記の内容で保存します。

[mariadb]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysqld.log
innodb_buffer_pool_size=128M
innodb_log_file_size=512M
character-set-server=utf8mb4

[client-mariadb]
default-character-set = utf8mb4

MariaDBサービス起動

# systemctl start mariadb
# systemctl enable mariadb

初期設定を実施。※rootパスワードの設定以外はすべてデフォルトEnter

# mysql_secure_installation

初期設定時に設定したrootパスワードでログインできればOK

# mysql -u root -p

Nextcloud 用のデータベースユーザを作成
※adminpassword は実際のパスワードに変更する

> CREATE USER 'nextcloud_admin'@'localhost' IDENTIFIED BY 'adminpassword';

Nextcloudデータベースの作成

> CREATE DATABASE nextcloud DEFAULT CHARACTER SET utf8mb4;
> GRANT ALL ON nextcloud.* TO "nextcloud_admin"@"localhost";

作成したアカウントの権限確認方法

> SHOW GRANTS FOR 'nextcloud_admin'@'localhost';

web(80/443)ポートの開放

さくらのVPSでは、OSのファイアウォールとは別に、パケットフィルタ機能が搭載されています。コントロールパネルから、パケットフィルタの設定を編集し、Webサービス用のポート80/443を解放します。
サーバ情報のパケットフィルタタブから「パケットフィルタ設定へ」を選択します。
※2020年9月時点のβ版コントロールパネルからは、パケットフィルタの設定変更項目が見当たらなかったので、現行版のコントロールパネルから設定しています。

「解放ポートを追加する」から、Webフィルタを新しく追加します。画像のようにSSH(22)とWeb(80/443)が表示されていればOKです。設定を保存するボタンを押下して設定を保存します。

Nextcloud のインストール

Nextcloud 公式サイトから Nextcloud本体の tarアーカイブパッケージをダウンロードしてインストールをします。

tarアーカイブパッケージダウンロード

# mkdir -p /root/src
# cd /root/src
# wget https://download.nextcloud.com/server/releases/nextcloud-19.0.3.tar.bz2

パッケージ展開

# tar jxf nextcloud-19.0.3.tar.bz2
# chown -R nginx. nextcloud
# mv nextcloud /var/www/html/

Nextcloud 用のデータディレクトリ作成

# mkdir -p /home/data
# chown -R nginx. /home/data/

ブラウザから https://IPアドレス 又は https://FQDN へアクセスすると、下記のようなインストール&セットアップ画面が表示されます。

それぞれ次の内容を入力していきます。

項目名入力/選択値説明
ユーザ名任意作成する管理者アカウントのID
パスワード任意上記管理者アカウントのパスワード
データフォルダ/home/dataNextcloud が使用するプライマリデータディレクトリ アップロードしたファイルの実体が保存される
データベースMySQL/MariaDB使用するデータベースの種類
データベースのユーザ名nextcloud_adminNextcloud データベース用に作成した接続ユーザ名
データベースのパスワードadminpassword上記ユーザのパスワード
データベース名nextcloudNextcloud データベース用に作成したデータベース名
データベースのホスト名localhost:3306データベース(MariaDB)のホストとポート番号を指定する

入力が完了したら「セットアップを完了します」ボタンを押下します。
※「推奨アプリをインストール」は必要がなければチェックを外しておくほうがインストール処理は早く完了します。アプリは後から個別にインストールすることが可能です。

インストール処理が正しく完了すると、ログイン後の画面が表示されます。ここまで来ればあと少しです。

Nextcloud 設定ファイルの最適化

Nextcloudのインストール後、Nextcloudの設定ファイルが自動的に作成されているので設定ファイルを修正し最適化します。
/var/www/html/nextcloud/config/config.php を開きます。

メモリキャッシュ(redis)設定の追加。公式ドキュメントを参考に下記の内容を追加します。

'memcache.local' => '\OC\Memcache\APCu',
'memcache.distributed' => '\OC\Memcache\Redis',
'memcache.locking' => '\OC\Memcache\Redis',
'redis' => [
     'host' => '127.0.0.1',
     'port' => 6379,
],

Nextcloudのログ周りの設定を追加

'logtimezone' => 'Asia/Tokyo',
'logfile' => '/var/log/nextcloud/nextcloud.log',
'log_rotate_size' => 100 * 1024 * 1024,

※ログローテーションは、logrotated で設定しても良いです。
またログはデフォルトでは、データディレクトリ(/home/data)配下に出力されますが、ログの出力先を変更する場合は、出力先ディレクトリの作成が必要です。

# mkdir -p /var/log/nextcloud/
# chown nginx. /var/log/nextcloud/

最終的な設定ファイルは次のような感じになります。

<?php
$CONFIG = array (
  'instanceid' => '******',
  'passwordsalt' => '******',
  'secret' => '******',
  'trusted_domains' =>
  array (
    0 => 'IPアドレス又はFQDN',
  ),
  'memcache.local' => '\OC\Memcache\APCu',
  'memcache.distributed' => '\OC\Memcache\Redis',
  'memcache.locking' => '\OC\Memcache\Redis',
  'redis' => [
       'host' => '127.0.0.1',
       'port' => 6379,
  ],
  'logtimezone' => 'Asia/Tokyo',
  'logfile' => '/var/log/nextcloud/nextcloud.log',
  'log_rotate_size' => 100 * 1024 * 1024,
  'datadirectory' => '/home/data',
  'dbtype' => 'mysql',
  'version' => '19.0.3.1',
  'overwrite.cli.url' => 'https://127.0.0.1',
  'dbname' => 'nextcloud',
  'dbhost' => 'localhost:3306',
  'dbport' => '',
  'dbtableprefix' => 'oc_',
  'mysql.utf8mb4' => true,
  'dbuser' => 'nextcloud_admin',
  'dbpassword' => 'adminpassword',
  'installed' => true,
);

設定反映のためPHPの再起動をします。

# systemctl restart php-fpm

バックグラウンドジョブの設定

Nextcloud のバックグラウンドジョブの実行をcronサービスから起動できるようにします。デフォルトではブラウザログイン(操作時)にAjaxによりバックグラウンドジョブが起動されています。

/etc/cron.d/nextcloud を新規作成し、下記の内容で保存します。
※5分に1度 /var/www/nextcloud/cron.php を起動します。

*/5 * * * * nginx php -f /var/www/html/nextcloud/cron.php

/var/log/cron の実行ログや、Nextcloud 管理画面 => 基本設定 => バックグラウンドジョブの項目で、Cronが自動的に選択され、最終ジョブの実行部分に緑色のアイコンが表示されていればOKです。

アクティビティアプリの保存期間の調整

今回はディスク容量やメモリ容量の少ないインスタンスを選択しているため、データベースの肥大化防止のためアクティビティアプリを無効化又は、アクティビティの保存期間をデフォルト1年よりも少なくすることをおすすめします。

アクティビティの保存期間を制限する場合には、config.php に下記 'activity_expire_days' パラメータを設定します。単位は保存日数です。

'activity_expire_days' => 365,

アクティビティアプリの無効化はアプリ一覧画面からできますが、次のoccコマンドで無効化することが可能です。

# sudo -u nginx php /var/www/html/nextcloud/occ app:disable activity