Amazon LinuxにNextCloudをインストールする完全手順

システム構成

  • AWS (EC2, EFS, Directory Service)
  • Amazon Linux release 2 (Karoo)
  • Nginx 1.17
  • PHP 7.3.6
  • MySQL 8.0.16
  • Let's Encrypt
  • NextCloud 16.0.1

今回はインターネット上からはアクセスできないプライベートサブネット上に構築しました。

ミドルウェアのインストール

基本的にAdmin manualに沿って作業しました。 https://docs.nextcloud.com/server/16/admin_manual/installation/index.html

サーバ要件の確認

f:id:boost-up:20190618074859p:plain
NextCloud16サーバ要件

PHPのインストール

まず初めにPHPをインストールします。 今回は最新版の7.3を使います。

インストール済みかどうか確認

sudo yum list installed | grep php 私が使ったAmazon Linuxの環境にはインストールされていませんでした。

リポジトリにphp73があるか確認

sudo yum list available | grep php73 存在しないのでremiからインストールすることにします。

epelリポジトリの設定

ここはCentOSとはコマンドが違います。 sudo amazon-linux-extras install epel

remiリポジトリの設定

RPMの設定をインストールします。 sudo yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

改めてリポジトリにphp73があるか確認

sudo yum list available | grep php73

php73.x86_64                            2.0-1.el7.remi                remi-safe
php73-build.x86_64                      2.0-1.el7.remi                remi-safe
php73-php.x86_64                        7.3.6-1.el7.remi              remi-safe
php73-php-ast.x86_64                    1.0.1-1.el7.remi              remi-safe
php73-php-bcmath.x86_64                 7.3.6-1.el7.remi              remi-safe
php73-php-brotli.x86_64                 0.7.0-1.el7.remi              remi-safe
php73-php-cli.x86_64                    7.3.6-1.el7.remi              remi-safe
php73-php-common.x86_64                 7.3.6-1.el7.remi              remi-safe
php73-php-componere.x86_64              3.1.0-1.el7.remi              remi-safe
php73-php-dba.x86_64                    7.3.6-1.el7.remi              remi-safe
php73-php-dbg.x86_64                    7.3.6-1.el7.remi              remi-safe
php73-php-devel.x86_64                  7.3.6-1.el7.remi              remi-safe
php73-php-embedded.x86_64               7.3.6-1.el7.remi              remi-safe
php73-php-enchant.x86_64                7.3.6-1.el7.remi              remi-safe
php73-php-fpm.x86_64                    7.3.6-1.el7.remi              remi-safe
php73-php-gd.x86_64                     7.3.6-1.el7.remi              remi-safe
php73-php-geos.x86_64                   1.0.0-11.el7.remi             remi-safe
php73-php-gmp.x86_64                    7.3.6-1.el7.remi              remi-safe
php73-php-horde-horde-lz4.x86_64        1.0.10-6.el7.remi             remi-safe
php73-php-imap.x86_64                   7.3.6-1.el7.remi              remi-safe
php73-php-interbase.x86_64              7.3.6-1.el7.remi              remi-safe
php73-php-intl.x86_64                   7.3.6-1.el7.remi              remi-safe
(以下省略)

大丈夫そうです。

インストール

NextCloudで必要なPHPモジュールは以下の通りです。

f:id:boost-up:20190618075853p:plain
NextCloudで必要なPHPモジュール

一通り必要となるモジュールを入れておくことにします。

sudo yum install php73 php73-php-devel php73-php-fpm php73-php-json php73-php-gd php73-php-mbstring php73-php-xml php73-php-pecl-zip php73-php-pdo php73-php-intl php73-php-ldap php73-php-smbclient php73-php-imap php73-php-gmp php73-php-pecl-apcu php73-php-pecl-imagick php73-php-pecl-imagick-devel php73-php-process php73-php-mysqlnd php73-php-opcache libxml2 zlib-devel
Installed:
  php73.x86_64 0:2.0-1.el7.remi
  php73-php-devel.x86_64 0:7.3.6-1.el7.remi
  php73-php-fpm.x86_64 0:7.3.6-1.el7.remi
  php73-php-gd.x86_64 0:7.3.6-1.el7.remi
  php73-php-gmp.x86_64 0:7.3.6-1.el7.remi
  php73-php-imap.x86_64 0:7.3.6-1.el7.remi
  php73-php-intl.x86_64 0:7.3.6-1.el7.remi
  php73-php-json.x86_64 0:7.3.6-1.el7.remi
  php73-php-ldap.x86_64 0:7.3.6-1.el7.remi
  php73-php-mbstring.x86_64 0:7.3.6-1.el7.remi
  php73-php-mysqlnd.x86_64 0:7.3.6-1.el7.remi
  php73-php-opcache.x86_64 0:7.3.6-1.el7.remi
  php73-php-pdo.x86_64 0:7.3.6-1.el7.remi
  php73-php-pecl-apcu.x86_64 0:5.1.17-1.el7.remi
  php73-php-pecl-imagick.x86_64 0:3.4.4-1.el7.remi
  php73-php-pecl-imagick-devel.x86_64 0:3.4.4-1.el7.remi
  php73-php-pecl-zip.x86_64 0:1.15.4-1.el7.remi
  php73-php-process.x86_64 0:7.3.6-1.el7.remi
  php73-php-smbclient.x86_64 0:1.0.0-1.el7.remi
  php73-php-xml.x86_64 0:7.3.6-1.el7.remi
  zlib-devel.x86_64 0:1.2.7-17.amzn2.0.2

Dependency Installed:
  ImageMagick6-libs.x86_64 0:6.9.10.49-1.el7.remi
  LibRaw.x86_64 0:0.14.8-5.amzn2.20120830git98d925.1
  OpenEXR-libs.x86_64 0:1.7.1-7.amzn2.0.2
  atk.x86_64 0:2.22.0-3.amzn2.0.2
  audit-libs-python.x86_64 0:2.8.1-3.amzn2.1
  autoconf.noarch 0:2.69-11.amzn2
  automake.noarch 0:1.13.4-3.1.amzn2
  avahi-libs.x86_64 0:0.6.31-19.amzn2
  cairo.x86_64 0:1.14.8-2.amzn2.0.2
  checkpolicy.x86_64 0:2.5-6.amzn2
  cpp.x86_64 0:7.3.1-5.amzn2.0.2
  cups-libs.x86_64 1:1.6.3-35.amzn2
  environment-modules.x86_64 0:3.2.10-10.amzn2.0.2
  fftw-libs-double.x86_64 0:3.3.3-8.amzn2.0.2
  fontconfig.x86_64 0:2.10.95-11.amzn2.0.2
  fontpackages-filesystem.noarch 0:1.44-8.amzn2
  fribidi.x86_64 0:0.19.4-6.amzn2.0.2
  gcc.x86_64 0:7.3.1-5.amzn2.0.2
  gcc-c++.x86_64 0:7.3.1-5.amzn2.0.2
  gd.x86_64 0:2.0.35-26.amzn2.0.2
  gd-last.x86_64 0:2.2.5-8.el7.remi
  gdk-pixbuf2.x86_64 0:2.36.5-1.amzn2.0.2
  ghostscript.x86_64 0:9.06-8.amzn2.0.5
  ghostscript-fonts.noarch 0:5.50-32.amzn2
  glibc-devel.x86_64 0:2.26-32.amzn2.0.1
  glibc-headers.x86_64 0:2.26-32.amzn2.0.1
  graphite2.x86_64 0:1.3.10-1.amzn2.0.2
  graphviz.x86_64 0:2.30.1-21.amzn2.0.1
  gtk-update-icon-cache.x86_64 0:3.22.26-4.amzn2
  gtk2.x86_64 0:2.24.31-1.amzn2.0.2
  harfbuzz.x86_64 0:1.3.2-1.amzn2.0.2
  hicolor-icon-theme.noarch 0:0.12-7.amzn2
  ilmbase.x86_64 0:1.0.3-7.amzn2.0.2
  jasper-libs.x86_64 0:1.900.1-33.amzn2
  kernel-headers.x86_64 0:4.14.121-109.96.amzn2
  keyutils-libs-devel.x86_64 0:1.5.8-3.amzn2.0.2
  krb5-devel.x86_64 0:1.15.1-20.amzn2.0.1
  lcms2.x86_64 0:2.6-3.amzn2.0.2
  libICE.x86_64 0:1.0.9-9.amzn2.0.2
  libSM.x86_64 0:1.2.2-2.amzn2.0.2
  libX11.x86_64 0:1.6.5-1.amzn2.0.2
  libX11-common.noarch 0:1.6.5-1.amzn2.0.2
  libXau.x86_64 0:1.0.8-2.1.amzn2.0.2
  libXaw.x86_64 0:1.0.13-4.amzn2.0.2
  libXcomposite.x86_64 0:0.4.4-4.1.amzn2.0.2
  libXcursor.x86_64 0:1.1.15-1.amzn2
  libXdamage.x86_64 0:1.1.4-4.1.amzn2.0.2
  libXext.x86_64 0:1.3.3-3.amzn2.0.2
  libXfixes.x86_64 0:5.0.3-1.amzn2.0.2
  libXfont.x86_64 0:1.5.2-1.amzn2.0.2
  libXft.x86_64 0:2.3.2-2.amzn2.0.2
  libXi.x86_64 0:1.7.9-1.amzn2.0.2
  libXinerama.x86_64 0:1.1.3-2.1.amzn2.0.2
  libXmu.x86_64 0:1.1.2-2.amzn2.0.2
  libXpm.x86_64 0:3.5.12-1.amzn2.0.2
  libXrandr.x86_64 0:1.5.1-2.amzn2.0.2
  libXrender.x86_64 0:0.9.10-1.amzn2.0.2
  libXt.x86_64 0:1.1.5-3.amzn2.0.2
  libXxf86vm.x86_64 0:1.1.4-1.amzn2.0.2
  libargon2.x86_64 0:20161029-3.el7
  libargon2-devel.x86_64 0:20161029-3.el7
  libatomic.x86_64 0:7.3.1-5.amzn2.0.2
  libc-client.x86_64 0:2007f-16.el7
  libcgroup.x86_64 0:0.41-15.amzn2
  libcilkrts.x86_64 0:7.3.1-5.amzn2.0.2
  libcom_err-devel.x86_64 0:1.42.9-12.amzn2.0.2
  libedit-devel.x86_64 0:3.0-12.20121213cvs.amzn2.0.2
  libfontenc.x86_64 0:1.1.3-3.amzn2.0.2
  libglvnd.x86_64 1:1.0.0-1.amzn2.0.2
  libglvnd-egl.x86_64 1:1.0.0-1.amzn2.0.2
  libglvnd-glx.x86_64 1:1.0.0-1.amzn2.0.2
  libicu62.x86_64 0:62.1-3.el7.remi
  libitm.x86_64 0:7.3.1-5.amzn2.0.2
  libkadm5.x86_64 0:1.15.1-20.amzn2.0.1
  libldb.x86_64 0:1.3.4-1.amzn2
  libmpc.x86_64 0:1.0.1-3.amzn2.0.2
  libmpx.x86_64 0:7.3.1-5.amzn2.0.2
  libpng.x86_64 2:1.5.13-7.amzn2.0.2
  libquadmath.x86_64 0:7.3.1-5.amzn2.0.2
  libraqm.x86_64 0:0.1.1-1.el7
  librsvg2.x86_64 0:2.40.16-1.amzn2.0.2
  libsanitizer.x86_64 0:7.3.1-5.amzn2.0.2
  libselinux-devel.x86_64 0:2.5-12.amzn2.0.2
  libselinux-python.x86_64 0:2.5-12.amzn2.0.2
  libsemanage-python.x86_64 0:2.5-11.amzn2
  libsepol-devel.x86_64 0:2.5-8.1.amzn2.0.2
  libsmbclient.x86_64 0:4.8.3-4.amzn2.0.1
  libtalloc.x86_64 0:2.1.13-1.amzn2
  libtdb.x86_64 0:1.3.15-1.amzn2
  libtevent.x86_64 0:0.9.36-1.amzn2
  libthai.x86_64 0:0.1.14-9.amzn2.0.2
  libtool.x86_64 0:2.4.2-22.2.amzn2.0.2
  libtool-ltdl.x86_64 0:2.4.2-22.2.amzn2.0.2
  libverto-devel.x86_64 0:0.2.5-4.amzn2.0.2
  libwayland-client.x86_64 0:1.14.0-2.amzn2.0.1
  libwayland-server.x86_64 0:1.14.0-2.amzn2.0.1
  libwbclient.x86_64 0:4.8.3-4.amzn2.0.1
  libwebp7.x86_64 0:1.0.2-1.el7.remi
  libwmf-lite.x86_64 0:0.2.8.4-41.amzn2.0.3
  libxcb.x86_64 0:1.12-1.amzn2.0.2
  libxml2-devel.x86_64 0:2.9.1-6.amzn2.3.2
  libxshmfence.x86_64 0:1.2-1.amzn2.0.2
  libxslt.x86_64 0:1.1.28-5.amzn2.0.2
  libzip5.x86_64 0:1.5.2-1.el7.remi
  lyx-fonts.noarch 0:2.2.3-1.el7
  m4.x86_64 0:1.4.16-10.amzn2.0.2
  mesa-libEGL.x86_64 0:17.2.3-8.20171019.amzn2.0.4
  mesa-libGL.x86_64 0:17.2.3-8.20171019.amzn2.0.4
  mesa-libgbm.x86_64 0:17.2.3-8.20171019.amzn2.0.4
  mesa-libglapi.x86_64 0:17.2.3-8.20171019.amzn2.0.4
  mpfr.x86_64 0:3.1.1-4.amzn2.0.2
  ncurses-c++-libs.x86_64 0:6.0-8.20170212.amzn2.1.2
  ncurses-compat-libs.x86_64 0:6.0-8.20170212.amzn2.1.2
  ncurses-devel.x86_64 0:6.0-8.20170212.amzn2.1.2
  oniguruma5.x86_64 0:6.9.2-1.el7.remi
  openssl-devel.x86_64 1:1.0.2k-16.amzn2.1.1
  pango.x86_64 0:1.40.4-1.amzn2.0.2
  pcre-devel.x86_64 0:8.32-17.amzn2.0.2
  perl-Data-Dumper.x86_64 0:2.145-3.amzn2.0.2
  perl-Test-Harness.noarch 0:3.28-3.amzn2
  perl-Thread-Queue.noarch 0:3.02-2.amzn2
  php73-php-cli.x86_64 0:7.3.6-1.el7.remi
  php73-php-common.x86_64 0:7.3.6-1.el7.remi
  php73-runtime.x86_64 0:2.0-1.el7.remi
  pixman.x86_64 0:0.34.0-1.amzn2.0.2
  policycoreutils-python.x86_64 0:2.5-22.amzn2
  poppler-data.noarch 0:0.4.6-3.amzn2
  python-IPy.noarch 0:0.75-6.amzn2.0.1
  samba-client-libs.x86_64 0:4.8.3-4.amzn2.0.1
  samba-common.noarch 0:4.8.3-4.amzn2.0.1
  samba-common-libs.x86_64 0:4.8.3-4.amzn2.0.1
  setools-libs.x86_64 0:3.3.8-2.amzn2.0.2
  tcl.x86_64 1:8.5.13-8.amzn2.0.2
  urw-fonts.noarch 0:2.4-16.amzn2
  xorg-x11-font-utils.x86_64 1:7.5-20.amzn2.0.2
  xz-devel.x86_64 0:5.2.2-1.amzn2.0.2

Complete!

無事にインストールできました。

バージョン確認

php73 -v

PHP 7.3.6 (cli) (built: May 28 2019 09:32:59) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.6, Copyright (c) 1998-2018 Zend Technologies
サービスの起動と確認
sudo systemctl start php73-php-fpm
sudo systemctl status php73-php-fpm
● php73-php-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/usr/lib/systemd/system/php73-php-fpm.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2019-06-12 23:53:21 UTC; 26s ago
 Main PID: 12827 (php-fpm)
   Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"
   CGroup: /system.slice/php73-php-fpm.service
           tq12827 php-fpm: master process (/etc/opt/remi/php73/php-fpm.conf)...
           tq12828 php-fpm: pool www
           tq12829 php-fpm: pool www
           tq12830 php-fpm: pool www
           tq12831 php-fpm: pool www
           mq12832 php-fpm: pool www

問題なく起動できました。

自動起動の設定

sudo systemctl enable php73-php-fpm.service

PHPのインストール作業はこれで完了です。

MySQLのインストール

次にDBのインストール作業に移ります。 今回は最新版の8.0を使います。

インストール済みかどうか確認

sudo yum list installed | grep mysql MySQLはなさそうです。 sudo yum list installed | grep maria

mariadb-libs.x86_64                   1:5.5.62-1.amzn2.0.1           installed

mariadb-libsがインストール済みなので削除します。

mariadb-libsのアンインストール

sudo yum remove mariadb-libs これでOKです。

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

sudo rpm -ivh https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm

インストール

sudo yum install mysql-community-server mysql-community-devel

Installed:
  mysql-community-devel.x86_64 0:8.0.16-2.el7
  mysql-community-server.x86_64 0:8.0.16-2.el7

Dependency Installed:
  mysql-community-client.x86_64 0:8.0.16-2.el7
  mysql-community-common.x86_64 0:8.0.16-2.el7
  mysql-community-libs.x86_64 0:8.0.16-2.el7

Complete!

無事にインストールできました。

バージョン確認

mysql --version

mysql  Ver 8.0.16 for Linux on x86_64 (MySQL Community Server - GPL)
サービスの起動と確認
sudo systemctl start mysqld
sudo systemctl status mysqld
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2019-06-12 23:59:50 UTC; 12s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 13115 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 13193 (mysqld)
   Status: "SERVER_OPERATING"
   CGroup: /system.slice/mysqld.service
           mq13193 /usr/sbin/mysqld

Jun 12 23:59:42 ip-10-0-1-176.ap-northeast-1.compute.internal systemd[1]: Sta...
Jun 12 23:59:50 ip-10-0-1-176.ap-northeast-1.compute.internal systemd[1]: Sta...
Hint: Some lines were ellipsized, use -l to show in full.

問題なく起動できました。

自動起動の設定

sudo systemctl enable mysqld

MySQLのインストール作業はこれで完了です。

Nginxのインストール

リポジトリの設定

新規にファイルを作成して必要情報を記載します。 sudo vi /etc/yum.repos.d/nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
インストール

sudo yum install nginx

Installed:
  nginx.x86_64 1:1.17.0-1.el7.ngx

Complete!

無事にインストールできました。

バージョン確認

nginx -v

nginx version: nginx/1.17.0
サービスの起動と確認
sudo systemctl start nginx
sudo systemctl status nginx
● nginx.service - nginx - high performance web server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2019-06-13 00:03:07 UTC; 5s ago
     Docs: http://nginx.org/en/docs/
  Process: 13391 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
 Main PID: 13392 (nginx)
   CGroup: /system.slice/nginx.service
           tq13392 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx....
           mq13393 nginx: worker process

Jun 13 00:03:07 ip-10-0-1-176.ap-northeast-1.compute.internal systemd[1]: Sta...
Jun 13 00:03:07 ip-10-0-1-176.ap-northeast-1.compute.internal systemd[1]: PID...
Jun 13 00:03:07 ip-10-0-1-176.ap-northeast-1.compute.internal systemd[1]: Sta...
Hint: Some lines were ellipsized, use -l to show in full.

問題なく起動できました。

自動起動の設定

sudo systemctl enable nginx

Nginxのインストール作業はこれで完了です。

NextCloudのダウンロード

設定作業を始める前にNextCloudもダウンロードして配置しておきます。

インストール先ディレクトリの作成
sudo mkdir /var/www/
cd /var/www
最新版のダウンロード

sudo wget https://download.nextcloud.com/server/releases/nextcloud-16.0.1.zip

Zipの解凍

sudo unzip nextcloud-16.0.1.zip

ディレクトリの所有者の変更

sudo chown -R nginx:nginx /var/www/

これでOKです。

さて、材料が揃ったところでここからが作業の本丸となります。

PHPの初期設定

Nginxの場合はphp-fpmを使うことになります。 今回はsocketファイルを使ってNginxと通信することにします。

confファイルの編集

ファイルを開いて編集します。 sudo vi /etc/opt/remi/php73/php-fpm.d/www.conf

まずは実行ユーザを変更します。

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
- user = apache
+ user = nginx
; RPM: Keep a group allowed to write in log dir.
- group = apache
+ group = nginx

socketファイルのパスを指定します。

; The address on which to accept FastCGI requests.
; Valid syntaxes are:
;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific IPv4 addres
s on
;                            a specific port;
;   '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 addres
s on
;                            a specific port;
;   'port'                 - to listen on a TCP socket to all addresses
;                            (IPv6 and IPv4-mapped) on a specific port;
;   '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
- listen = 127.0.0.1:9000
+ listen = /var/run/php-fpm/php-fpm.sock

socketファイルを使うユーザを指定します。

; Set permissions for unix socket, if one is used. In Linux, read/write
; permissions must be set in order to allow connections from a web server.
; Default Values: user and group are set as the running user
;                 mode is set to 0660
-;listen.owner = nobody
+ listen.owner = nginx
- ;listen.group = nobody
+ listen.group = nginx
;listen.mode = 0660

confファイルの末尾に環境変数関連の設定を追加します。

+clear_env = no
session_save_pathの所有者の変更

NextCloudはPHP sessionモジュールを使うのですが、この設定を漏らすとインストール後にログインができない事象に行き当たってしまいます。 PHPのログにもNextCloudのログにも何も吐き出されず、私はこれを漏らしたために3日ほど先人を求めて彷徨いました。

sessionの所有者をPHPの実行ユーザに変更します。

sudo chown -R nginx:nginx /var/opt/remi/php73/lib/php/session
sudo systemctl restart php73-php-fpm.service
socketファイル用のディレクトリを用意

先ほどconfファイルで指定したディレクトリを用意します。 こちらも所有者はPHPの実行ユーザです。

sudo mkdir /var/run/php-fpm
sudo chown nginx:nginx /var/run/php-fpm
サービスの再起動

sudo systemctl restart php73-php-fpm /var/runはtmpfsのため、これだけだとサーバ再起動時に設定が消えてしまいます。

OS再起動時にもディレクトリが用意されるように設定

以下のファイルを新規に作成し、設定を追記して保存します。 sudo vi /etc/tmpfiles.d/php-fpm.conf

sudo chown nginx:nginx /var/run/php-fpm
d /var/run/php-fpm 0755 nginx nginx
OS再起動して確認

一旦ここでOSを再起動してphp-fpmが自動起動することを確認します。 ls -la /var/run/ | grep php-fpm

drwxr-xr-x  2 nginx  nginx            60 Jun 13 04:06 php-fpm

大丈夫そうです。

MySQLの初期設定

NextCloudではインストール時にデータベースやMySQLユーザを自動作成してくれますので、 ここでは最低限必要な初期設定を行います。

rootパスワードの確認

MySQLをインストールしたときに発行されるrootパスワードを確認します。 sudo cat /var/log/mysqld.log | grep root

2019-06-12T23:59:47.342052Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: {default_password}

{default_password}部分が初期パスワードですのでこれを控えます。

mysql_secure_installationの実行

mysql_secure_installation 先ほど確認した初期パスワードを入力して新しいパスワードに変更します。

my.cnfの設定

以下のファイルを編集して保存します。 MySQL 8.0から新しいログイン認証方式としてcaching_sha2_passwordが採用され、これがデフォルトになっていますが、NextCloudはcaching_sha2_passwordに対応していないため、このままでは接続ができません。 そのため、ログイン認証方式を5系以前のデフォルトであるmysql_native_passwordに変更します。 また、要件次第にはなりますが、今回は照合順序も変更します。 sudo vi /etc/my.cnf

末尾に以下を追記して保存します。

default_authentication_plugin=mysql_native_password collation_server = utf8mb4_ja_0900_as_cs_ks




サービスの再起動

sudo systemctl restart mysqld

ログインの確認

sudo mysql -u root -p 先ほど変更した新しいrootパスワードでログインします。

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 8.0.16 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
rootユーザの認証方式を変更

先ほどmy.cnfでログイン認証方式を変更していますが、 既存ユーザはユーザごとに認証方式を保持しているため、これも変更しておきます。 mysql> SELECT user, host, plugin FROM mysql.user;

+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+

caching_sha2_password になっているのがわかります。

rootの認証方式をmysql_native_passwordに変更します。 mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '{password}';

mysql> SELECT user, host, plugin FROM mysql.user;

+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | mysql_native_password |
+------------------+-----------+-----------------------+

これでOKです。

Let’s Encryptのインストール

続いてTLS(SSL)の準備をします。 Chromeが非TLSサイトを排除してしまってから、TLS対応はいよいよ不可欠となりました。 Let’s Encryptの登場によってオレオレ証明書を使わなくてよくなったのが本当に助かります。

なお、今回のNextCloudはプライベートセグメントに配置するため、 well-knownを使った外部からの認証ができませんので、DNS方式で認証を受けることにします。

※ 当初はリバースプロキシ方式で認証を受けたのですが、やはり外部からの侵入経路を用意することに抵抗感が拭えなかったので、 パブリックドメインのサブドメインを使うことで、DNS認証で対応することにしました。

Certbotのインストール

sudo yum install certbot

Installed:
  certbot.noarch 0:0.31.0-2.el7

Dependency Installed:
  pyOpenSSL.x86_64 0:0.13.1-3.amzn2.0.2
  python-ndg_httpsclient.noarch 0:0.3.2-1.el7
  python-requests-toolbelt.noarch 0:0.8.0-1.el7
  python-zope-component.noarch 1:4.1.0-5.el7
  python-zope-event.noarch 0:4.0.3-2.el7
  python-zope-interface.x86_64 0:4.0.5-4.amzn2.0.2
  python2-acme.noarch 0:0.31.0-1.el7
  python2-certbot.noarch 0:0.31.0-2.el7
  python2-configargparse.noarch 0:0.11.0-1.el7
  python2-future.noarch 0:0.16.0-15.20181019gitbee0f3b.el7
  python2-josepy.noarch 0:1.1.0-1.el7
  python2-mock.noarch 0:1.0.1-10.el7
  python2-parsedatetime.noarch 0:2.4-5.el7
  python2-pyrfc3339.noarch 0:1.0-2.el7
  python2-requests.noarch 0:2.6.0-0.el7
  python2-six.noarch 0:1.9.0-0.el7
  pytz.noarch 0:2016.10-2.amzn2.0.1

Complete!
Certbotの実行

以下ではhoge.comがパブリックドメイン、今回構築するNextCloudはサブドメイン形式でfuga.hoge.comとします。 sudo certbot certonly --preferred-challenges dns-01 --authenticator manual --domain fuga.hoge.com

実行すると以下のところで止まります。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.fuga.hoge.com with the following value:

{random values}

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue

上記の{random values}を確認します。

DNS設定の追加

DNSサーバのTXTレコードとして先ほど確認した{random values}を追加します。

Key: _acme-challenge.fuga.hoge.com
Value: {random values}
Let's Encryptに戻ってEnter

TXTレコードが確認できるようになるまで少し時間がかかりますが、 一定の時間を置いたら先ほどのLet's Encryptの画面に戻ってEnterを押します。

Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/fuga.hoge.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/fuga.hoge.com/privkey.pem
   Your cert will expire on 2019-09-14. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

無事に証明書が発行されました。

Nginxの初期設定

長かった道のりももう少しです。 ミドルウェア周りはこれで最後です。Nginxの初期設定を行います。

confファイルの作成

confファイルの設定例は公式サイトを参考にしています。 パスなどは環境に合わせて修正している他、暗号化スイートの設定など若干追加・変更しています。

Nginx configuration — Nextcloud latest Administration Manual latest documentation

以下のファイルを編集して保存します。 sudo vi /etc/nginx/conf.d/default.conf

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

server {
    listen 80;
    listen [::]:80;
    server_name fuga.hoge.com;
    # enforce https
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name fuga.hoge.com;

    # Use Mozilla's guidelines for SSL/TLS settings
    # https://mozilla.github.io/server-side-tls/ssl-config-generator/
    # NOTE: some settings below might be redundant
    ssl_certificate /etc/letsencrypt/live/fuga.hoge.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/fuga.hoge.com/privkey.pem;

    ssl_ciphers ECDHE+RSAGCM:ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!EXPORT:!DES:!3DES:!MD5:!DSS;
    ssl_prefer_server_ciphers on;

    # Add headers to serve security related headers
    # Before enabling Strict-Transport-Security headers please read into this
    # topic first.
    # add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
    #
    # WARNING: Only add the preload option once you read about
    # the consequences in https://hstspreload.org/. This option
    # will add the domain to a hardcoded list that is shipped
    # in all major browsers and getting removed from this list
    # could take several months.
    add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains;';
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;
    add_header Referrer-Policy no-referrer;

    # Remove X-Powered-By, which is an information leak
    fastcgi_hide_header X-Powered-By;

    # Path to the root of your installation
    root /var/www/nextcloud/;

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

    # The following 2 rules are only needed for the user_webfinger app.
    # Uncomment it if you're planning to use this app.
    #rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
    #rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;

    # The following rule is only needed for the Social app.
    # Uncomment it if you're planning to use this app.
    # rewrite ^/.well-known/webfinger /public.php?service=webfinger last;

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

    # set max upload size
    client_max_body_size 512M;
    fastcgi_buffers 64 4K;

    # Enable gzip but do not remove ETag headers
    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;

    # Uncomment if your server is build with the ngx_pagespeed module
    # This module is currently not supported.
    #pagespeed off;

    location / {
        rewrite ^ /index.php$request_uri;
    }

    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\/.+)\.php(?:$|\/) {
        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_param HTTPS on;
        #Avoid sending the security headers twice
        fastcgi_param modHeadersAvailable true;
        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;
    }

    # Adding the cache control header for js and css files
    # Make sure it is BELOW the PHP block
    location ~ \.(?:css|js|woff2?|svg|gif)$ {
        try_files $uri /index.php$request_uri;
        add_header Cache-Control "public, max-age=15778463";
        # Add headers to serve security related headers (It is intended to
        # have those duplicated to the ones above)
        # Before enabling Strict-Transport-Security headers please read into
        # this topic first.
        # add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
        #
        # WARNING: Only add the preload option once you read about
        # the consequences in https://hstspreload.org/. This option
        # will add the domain to a hardcoded list that is shipped
        # in all major browsers and getting removed from this list
        # could take several months.
        add_header X-Content-Type-Options nosniff;
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Robots-Tag none;
        add_header X-Download-Options noopen;
        add_header X-Permitted-Cross-Domain-Policies none;
        add_header Referrer-Policy no-referrer;

        # Optional: Don't log access to assets
        access_log off;
    }

    location ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ {
        try_files $uri /index.php$request_uri;
        # Optional: Don't log access to other assets
        access_log off;
    }
}
サービスの再起動

sudo systemctl restart nginx

これでOKです。

ブラウザを起動してNextCloudにアクセス

https://fuga.hoge.comにアクセスして以下の画面が出ればOKです。

f:id:boost-up:20190618090828p:plain
NextCloudインストール画面

ブログは事後なので簡単ですが、この画面に辿り着くまでトラブルシュートやLet's Encryptのやり直しなど諸々で約10時間くらいかかりました。

NextCloudのインストール

ここまでくればもう一息です。

管理者アカウント情報の入力

任意のユーザー名とパスワードを入力します。

ストレージとデータベース

入力欄が表示されていない場合は「ストレージとデータベース」の右端にある▼を押してください。

データフォルダにはNextCloudにアップロードしたファイルなどの他、NextCloudのログファイルなどの管理系の情報も格納されます。 今回はスケーラビリティと耐障害性を考慮し、Amazon EFS (Amazon Elastic File System)を使うことにしました。

コストの観点ではS3を使うことも考えましたが、ファイルサーバのバックエンドとして使うにはS3はやはり読み取り一貫性と結果整合性が問題となりうる場面があると思い、EFSをNFSマウントする方法を採用することにしました。 今回はDBをローカルに作っているので見直しは必要ですが、EFSであればAPサーバとしてのNextCloudをスケールアウトすることも可能ですし。

データベースはMySQL/MariaDBを選択します。 MySQL/MariaDBの選択肢が表示されない場合はpdo_mysqlがインストールされていないと思われます。 PostgreSQLを使う場合はpdo_pgsqlをインストールすることで選択できるようになります。

データベースのユーザー名とデータベースのパスワードですが、ここではrootユーザ(データベース作成権限のあるMySQLユーザを指定します)を指定します。 インストールプロセスの中で、次に指定するデータベース名のデータベースと接続用ユーザーが自動作成されます。 作成された接続用ユーザーとそのパスワードはインストール完了後、config/config.phpで確認することができます。

データベースのホスト名は入力欄下部に注意書きがある通り、ポート番号をホスト名とともに設定する必要があります。 5432はPostgreSQLのデフォルトポート番号になるので、MySQLを使う場合は3306を指定します。 ホスト名は1台のサーバにAP/DBを同居させる場合はlocalhost、それ以外の場合はDBサーバのIPアドレス等を指定します。 今回は同居構成とするため、localhost:3306にしました。

ここまでの入力が終わったら、「セットアップを完了します」をクリックします。 インストールが開始され、しばらく(私の環境では1分弱)待つと画面が切り替わり、管理者アカウントでログインした状態となります。

f:id:boost-up:20190619080710p:plain
インストール完了後に表示される画面

NextCloudのインストールはこれで完了です!!

長かった。。。