Nextcloudの環境構築(CentOs7/nginx/php/MySQL)

# システム環境
OS
　・CentOs7
Webサーバ
　・Nginx
その他ミドルウェア
　・PHP 8.0
　・PHP-FPM 8.0
　・MySQL 8.0
　・Redis 6.2
アプリケーション
　・Nextcloud 22.2.0

#全体の流れ
1 必要パッケージのインストール
2 Nginxのインストールと設定
3 PHPのインストールと設定
4 MySQLのインストールとDB作成
5 Nextcloudのインストールとセットアップ
6 Redisのインストールと設定
7 セキュリティ＆セットアップ警告リストの対応
　
###1　必要パッケージのインストール
####1-1 Nextcloudの環境構築に必要なパッケージのインストール

```:ターミナル
sudo yum install -y epel-release yum-utils unzip curl wget bash-completion bzip2
```

####1-2 インストール終了後システムのアップデート

```:ターミナル
sudo yum update -y
```

###2　Nginxのインストールと設定
####2-1 Nginxのインストール

```:ターミナル
sudo yum install nginx -y
```

####2-2 nextcloud.confファイルの作成
/etc/nginx/conf.dディレクトリにnextcloud.confファイルを作成します

```:/etc/nginx/conf.d
sudo touch nextcloud.conf
```
####2-3 /etc/nginx/conf.d/nextcloud.confファイルの編集

```:/etc/nginx/conf.d
sudo vi nextcloud.conf
```
ファイルが開けたら i を入力すると編集ができるようになります

```:/etc/nginx/conf.d/nextcloud.conf
 upstream php-handler {
    server unix:/var/run/php-fpm/php-fpm.sock;
}

server {
    listen 80;
    listen [::]:80;
    server_name (サーバのIPアドレス);

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

    # Path to the root of your installation
    root /var/www/html/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;

    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$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/.+|ocs-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|ocs-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|woff|svg|gif|mp4)$ {
        try_files $uri /index.php$uri$is_args$args;
        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;
        # Optional: Don't log access to assets
        access_log off;
    }

    location ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ {
        try_files $uri /index.php$uri$is_args$args;
        # Optional: Don't log access to other assets
        access_log off;
    }
}
```
上記を入力できたらEsc→:wqを入力することで保存することができます

####2-4 起動と自動起動の設定
nginxの設定ができましたので、起動と自動起動を行います

```:ターミナル
sudo systemctl start nginx  //起動方法

sudo systemctl enable nginx  //自動起動方法
```
補足：nginxのログは/var/log/nginx/に出力されます


###3 PHPのインストールと設定

####3-1 PHPモジュールのインストール
```:ターミナル
sudo yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm -y
```
```:ターミナル
sudo yum install --enablerepo=remi,remi-php80 php php-fpm php-cli php-common php-curl php-gd php-mbstring php-mysqlnd php-process php-xml php-opcache php-pecl-apcu php-intl php-pecl-redis php-pecl-zip php-pear -y
```

####3-2 PHP-FPMの設定
　www.confファイルの文量が多いので、変更箇所のみ記載します

```:/etc/php-fpm.d/www.conf
< user = apache

> user = nginx
-----
< group = apache

> group = nginx
-----
< listen = 127.0.0.1:9000

> listen = /var/run/php-fpm/php-fpm.sock
-----
< ;listen.owner = nobody
< ;listen.group = nobody
< ;listen.mode = 0660

> listen.owner = nginx
> listen.group = nginx
> listen.mode = 0666
-----
< ;env[HOSTNAME] = $HOSTNAME
< ;env[PATH] = /usr/local/bin:/usr/bin:/bin
< ;env[TMP] = /tmp
< ;env[TMPDIR] = /tmp
< ;env[TEMP] = /tmp

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

####3-3 PHPセッションディレクトリのグループ情報を変更
```:ターミナル
sudo chown -R root:nginx /var/lib/php/session
```

####3-4 起動と自動起動の設定

```:ターミナル
sudo systemctl start php-fpm  //起動方法

sudo systemctl enable php-fpm  //自動起動方法
```
補足：PHP-FPMのログは/var/log/php-fpm/に出力されます

###4 MySQLのインストールとDB作成
####4-1 MariaDB関連ライブラリの確認と削除
CentOs7ではMariaDBがデフォルトとなっている為、関連ライブラリを削除します

```:ターミナル
rpm -qa | grep mariadb    //存在の確認

sudo yum remove mariadb-libs  //削除
sudo rm -rf /var/lib/mysql/
```

####4-2 インストール
```:ターミナル
rpm -ivh https://dev.mysql.com/get/mysql80-community-release-el7-2.noarch.rpm

sudo yum install mysql-community-server
```

####4-3 起動と自動起動の設定
```:ターミナル
sudo systemctl start mysqld.service    //起動

sudo systemctl enable mysqld.service   //自動起動
```

####4-4 パスワードの確認
インストール時にrootのパスワードがlogに出力されているのでgrepで確認

```:ターミナル
grep password /var/log/mysqld.log
```

```:ターミナル
//grepで出力されるログ例
2021-10-28T02:20:42.844277Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: ZrZlt!ZNt6kS
```
上記の例だと[ZrZlt!ZNt6kS]が初期パスワードとなります
後の作業で使用するのでパスワードを控えておいて下さい

####4-5 基本セットアップ
```:ターミナル
sudo mysql_secure_installation
```
パスワードが求められますので、先ほど控えたパスワードを入力します
New password、Re-enter new passwordでrootユーザのパスワードを設定する以外はEnterキーを押していきます

####4-6 DBとユーザの作成
以下の通り設定しております
　-ユーザ名：sampleuser
　-DB名：sampledb
　-パスワード：Samplepass%2021
（任意のユーザ名、DB名、パスワードを入力してください）

```:ターミナル
mysql -u root -p

CREATE DATABASE sampledb DEFAULT CHARACTER SET utf8mb4;
CREATE USER 'sampleuser'@'localhost' IDENTIFIED BY 'Samplepass%2021';
SHOW GRANTS FOR 'sampleuser'@'localhost';

exit;
```

###5 Nextcloudのインストールとセットアップ

####5-1 インストール
```:ターミナル
wget https://download.nextcloud.com/server/releases/nextcloud-22.2.0.tar.bz2
```

####5-2 セットアップ
インストールしたNextcloudのパッケージを展開します

```:ターミナル
tar xf nextcloud-22.2.0.tar.bz2
```
<br>
展開したNextcloudをドキュメントルートにコピー
(本記事のドキュメントルートは2-3で設定しているように/var/www/html/となります)

```:ターミナル
sudo cp -R nextcloud/ /var/www/html/
```
<br>

dataディレクトリを作成します

```:ターミナル
sudo mkdir /var/www/html/nextcloud/data
```
<br>

全フォルダ及びファイルの所有権を変更

```:ターミナル
sudo chown -R nginx:nginx /var/www/html/nextcloud
```
<br>

PHP-FPMとnginxの再起動を行います

```:ターミナル
sudo systemctl restart nginx

sudo systemctl restart php-fpm
```

####5-3 ブラウザからNextcloudの設定
ブラウザで指定したURLにアクセスしてNextcloudの画面を表示させてください

![nextcloudセットアップ画面.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372159/b06934ec-74e0-0e73-79e9-5eefbdf6b06a.jpeg)

<br>

#####5-3-1 管理者アカウントを作成します
　-ユーザ名：admin
　-パスワード：adominpass
　(任意のユーザ名とパスワードを入力してください)

#####5-3-2 データベースの指定
「ストレージとデータベース」を押下し、データベースはMySQLを選択します

下記には4-6で設定した内容を入力します(本記事では下記内容)
　-データベースのユーザ名：sampleuser
　-データベース名：sampledb
　-データベースのパスワード：Samplepass%2021
　-DBのホスト名：　localhost:3306　

情報を入力後、「セットアップを完了」ボタンを押下
(必要に応じて「推奨アプリのインストール」チェックボタンを押してください)


###6 Redisのインストールと設定

####6-1 Redisのインストール
```:ターミナル
sudo yum install --enablerepo=remi redis -y
```

####6-2 設定ファイルの編集
```:ターミナル
sudo cp -pi /var/www/html/nextcloud/config/config.php{,.orig}
```

phpタグ内に下記を追記します

```:/var/www/html/nextcloud/config/config.php
'memcache.distributed' => '\\OC\\Memcache\\Redis',
'memcache.locking' => '\\OC\\Memcache\\Redis',
'memcache.local' => '\\OC\\Memcache\\APCu',
'redis' => 
array (
  'host' => 'localhost',
  'port' => 6379,
),
```

####6-3 起動と自動起動
```:ターミナル
sudo systemctl start redis


sudo systemctl enable redis
```

nginxとphp-fpmを再起動しておきます

```:ターミナル
sudo systemctl restart nginx


sudo systemctl restart php-fpm
```
(補足：Redisのログは/var/log/redisに出力されます)


###7 セキュリティ＆セットアップ警告リストの対応
メニュバーの「概要」ボタンを押下すると、セキュリティ＆セットアップ警告リストの一覧が表示されます。
本記事ではその一部の対応方法について記載します
![セットアップバー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372159/22780728-e85a-3eed-168b-3965114c1291.png)

####7-1 デフォルトの電話地域の設定
phpタグ内に下記を追記してください

```:/var/www/html/nextcloud/config/config.php
'default_phone_region' => 'JP
```

####7-2 メモリーキャッシュの構成
phpタグ内に下記を追記してください

```:/var/www/html/nextcloud/config/config.php
'memcache.local' => '\OC\Memcache\APCu',
```

####7-3 推奨されるPHPモジュールのインストール
　・bcmath
　・gmp
　・imagick

```:ターミナル
sudo yum install php80-php-bcmath php80-php-gmp php80-php-imagick

sudo cp /etc/opt/remi/php80/php.d/20-bcmath.ini /etc/php.d/

sudo cp /etc/opt/remi/php80/php.d/20-gmp.ini /etc/php.d/

sudo cp /etc/opt/remi/php80/php.d/40-imagick.ini /etc/php.d/

sudo cp /opt/remi/php80/root/usr/lib64/php/modules/bcmath.so /usr/lib64/php/modules/

sudo cp /opt/remi/php80/root/usr/lib64/php/modules/gmp.so /usr/lib64/php/modules/

sudo cp /opt/remi/php80/root/usr/lib64/php/modules/imagick.so /usr/lib64/php/modules/

sudo systemctl restart nginx && systemctl restart php-fpm
```

<br>
##参考記事
[Nextcloudドキュメント](https://docs.nextcloud.com/server/latest/admin_manual/installation/source_installation.html)
<br>

https://qiita.com/S_Katz/items/9e88b2816eff56c348c9#%E3%82%A4%E3%83%B3%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%82%B5%E3%83%BC%E3%83%90redis

<br>
##さいごに
本記事を最後まで読んで頂きありがとうございます。
業務でNextcloudを構築したので、備忘録として本記事を投稿しました。