CentOS8にNextcloudをインストールする – 周辺ソフトウェアの設定

Nextcloudを起動する前に、NginxやMariaDBなどの設定を行います。

この記事で行うこと

  1. ファイル権限及びSELinuxの設定
  2. Nginxの設定
  3. php-fpmの設定
  4. MariaDBの設定

1. ファイル権限及びSELinuxの設定

前回展開したNextcloudの本体は、現状所有者が設定されていません。

nginxがこのファイルを開けるように、所有者をnginxにします。

[root@localhost ~]# chown nginx:nginx -R /srv/nextcloud/

また、SELinuxの設定を変更して、Webサーバが /srv/nextcloud/ を参照できるようにします。

SELinuxはchown等で管理する権限より更に細かい権限を管理するシステムです。

巷では無効化することが流行っているらしいですが……

[root@localhost ~]# semanage fcontext -a -t httpd_sys_rw_content_t '/srv/nextcloud(/.*)?'
[root@localhost ~]# restorecon -R /srv/nextcloud/
  • semanage : SELinuxの設定を変更するコマンドです。
  • focontext : SELinuxのファイルコンテキスト(そのファイルを何に使うか)の設定を行うコマンドです。
  • -a : ファイルコンテキスト付与のルールを新たに作成するオプションです。(addの略)
  • -t httpd_sys_rw_content_t : -t はコンテキストのタイプ名を指定するオプションです。今回は httpd_sys_rw_content_t というWebサーバが利用できるというタイプを指定します。
  • '/srv/nextcloud(/.*)?' : 追加する対象を指定します。今回は /srv/nextcloud 以下の全てのファイルを指定します。 (/.*)? は正規表現で、中身のあらゆるものを対象とすることを表しています。
  • restorecon : 1行目のコマンドではルールを作るだけで実際にファイルコンテキストを付与しません。このコマンドでファイルコンテキストの更新を行って、新しく作ったルールを適用します。
  • -R : 指定したディレクトリ以下の全てにコマンドを適用する為のオプションです。
  • /srv/nextcloud/ : コマンドの対象を指定します。

ちなみに、適用されたコンテキストを確認するには、ls-Z というオプションを付けて実行します。( -Z は必ず大文字です)

一番右に httpd_sys_rw_content_t とあるのが確認できますね。

[root@localhost ~]# ls -Z /srv/nextcloud/index.html
unconfined_u:object_r:httpd_sys_rw_content_t:s0 /srv/nextcloud/index.html

httpd_sys_rw_content_t は読み書きは出来ますが実行は出来ません。しかし、Nextcloudの拡張機能などでは実行を要するファイルをダウンロードする場合があります。

この時、該当のファイルを毎回探して実行可能なコンテキストに設定し直すのは難しいので、Webサーバに関連するコンテキストは実際のコンテキストに関係なく読み書き実行を可能にする設定を行います。

[root@localhost ~]# setsebool -P httpd_unified on
  • setsebool : SELinuxで準備されているルールを適用するか否かを設定するコマンドです。
  • -P : 再起動後にも設定を維持するためのオプションです。このオプションがない場合、再起動したら設定した内容が消えてしまいます。(大文字必須です)
  • httpd_unified : 先程説明した、Webサーバに関係するコンテキストは全て読み書き実行が可能と扱うルールです。
  • on : 設定を有効化します。無効化するときはもちろん off です。

また、Nextcloudはサーバのアップデートや追加アプリの取得のためネットワークに接続します。しかし、SELinuxの初期設定ではWebサーバがネットワークに接続しに行くのは禁止されているので、許可する設定を行います。

[root@localhost ~]# setsebool -P httpd_can_network_connect on
  • httpd_can_network_connect : その名の通り、Webサーバがネットワークに接続するのを許可するルールです。

2. Nginxの設定

Nextcloud用のNginxの設定ファイルを作成します。

Nginxの設定ファイルについては以下の記事を参照してください。

設定ファイル名は分かりやすく /etc/nginx/conf.d/nextcloud.conf とします。

Nextcloudの公式サイトNginxの設定例が載っていますので、Web Root(ホストをNextcloud用に使う場合)の設定例を改変して使用します。

この設定はHTTPS化が出来ている前提です。基本的にファイルをやりとりするのにHTTPSを使わないのはあり得ない選択です。

ただ、どうしてもHTTPS無しで使いたいのであれば、 # enforce https から ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; の行を削除すれば多分動きます。保証はしませんが……

"" で括られている部分は設定を自分の環境に合わせてください。

# upstream php-handlerの部分は同じような設定がphp-fpmで設定されているので不要です。

server {
    listen 80;
    listen [::]:80;
    server_name "ホスト名"; 
    # enforce https
    return 301 https://$server_name:443$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name "ホスト名";

    # 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
 # この行以下4行はLet's Encryptで自動生成される設定を流用します。
    ssl_certificate "証明書の場所(Let's Encryptでは初期値でfullchain.pemというファイル名)";
    ssl_certificate_key "秘密鍵の場所(Let's Encryptでは初期値でprivkey.pemというファイル名)";
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; 

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

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

    # Path to the root of your installation
    root /srv/nextcloud;
 # 前回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:$server_port/remote.php/dav;
    }
    location = /.well-known/caldav {
      return 301 $scheme://$host:$server_port/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;
    }

    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-fpm; # upstreamで設定されている名前を指定。恐らく
 php-fpm.conf に upstream php-fpm と設定されているはずです。
        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, css and map files
    # Make sure it is BELOW the PHP block
    location ~ \.(?:css|js|woff2?|svg|gif|map)$ {
        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;" always;
        #
        # 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 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;

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

    location ~ \.(?:png|html|ttf|ico|jpg|jpeg|bcmap|mp4|webm)$ {
        try_files $uri /index.php$request_uri;
        # Optional: Don't log access to other assets
        access_log off;
    }
}

3. php-fpmの設定

php-fpmで環境変数を使えるように設定を変更します。

変更する設定ファイルは /etc/php-fpm.d/www.conf となります。

環境変数の設定自体は存在するのですが「 ; 」でコメントアウトされているので、これを有効にします。

編集する箇所は以下です。「-」は削除する行(変更前)、「+」は追加する行(変更後)となります。

- ;env[HOSTNAME] = $HOSTNAME
+ env[HOSTNAME] = $HOSTNAME
- ;env[PATH] = /usr/local/bin:/usr/bin:/bin
+ env[PATH] = /usr/local/bin:/usr/bin:/bin
- ;env[TMP] = /tmp
+ env[TMP] = /tmp
- ;env[TMPDIR] = /tmp
+ env[TMPDIR] = /tmp
- ;env[TEMP] = /tmp
+ env[TEMP] = /tmp

4. MariaDBの設定

MariaDBの設定ファイルを編集します。

まずは /etc/my.cnf.d/client.cnf ファイルを編集します。

編集する箇所は以下です。[]で表されるブロック毎に編集してください。「-」は削除する行(変更前)、「+」は追加する行(変更後)となります。

[client]
+ default-character-set = utf8mb4

次に /etc/my.cnf.d/server.cnf ファイルを編集します。

innodb_buffer_pool_size はサーバのメモリが多ければそれに合わせて値を増やすことでパフォーマンスが向上します。

[server]
+ skip-name-resolve
+ innodb_buffer_pool_size = 128M
+ innodb_buffer_pool_instances = 1
+ innodb_flush_log_at_trx_commit = 2
+ innodb_log_buffer_size = 32M
+ innodb_max_dirty_pages_pct = 90
+ query_cache_type = 1
+ query_cache_limit = 2M
+ query_cache_min_res_unit = 2k
+ query_cache_size = 64M
+ tmp_table_size= 64M
+ max_heap_table_size= 64M
+ slow-query-log = 1
+ slow-query-log-file = /var/log/mysql/slow.log
+ long_query_time = 1

[mysqld]
+ character-set-server = utf8mb4
+ collation-server = utf8mb4_general_ci
+ transaction_isolation = READ-COMMITTED
+ binlog_format = ROW
+ innodb_large_prefix=on
+ innodb_file_format=barracuda
+ innodb_file_per_table=1

次にユーザとデータベースの作成です。

以下記事の通りに、 nextcloud というユーザと nextcloud というユーザを作成して、権限を付与します。

[root@localhost ~]# mariadb
MariaDB [(none)]> create database nextcloud;
MariaDB [(none)]> create user nextcloud identified by '任意のパスワード';
MariaDB [(none)]> grant all privileges on nextcloud.* to nextcloud;
MariaDB [(none)]> exit;

なお、MariaDBの初期設定でunix_socket認証を使わない設定にしていた場合、 -u root -p とオプションを指定する必要があります。

ちなみに、Nextcloudの公式サイトではMariaDBに関連するPHPの設定も変更が必要と書かれていますが、デフォルト値で問題ありません。(というよりデフォルト値を改めて明示しているだけです)

まとめ

今回はNextcloudを起動する前に必要な設定を行っていきました。

次回はいよいよNextcloudにアクセスしてみたいと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です