CentOS 8 に Nextcloud 17 を Nginx / PHP-FPM 7.3 / MariaDB で構築する手順

このガイドでは、CentOS 8 サーバー(推奨: 2GB RAM、25GB 空き、2 vCPU)に Nextcloud 17 を Nginx、PHP-FPM 7.3、MariaDB でインストールし、Let’s Encrypt で HTTPS を有効化する手順を詳述します。各ステップごとに必要なコマンド、SELinux の設定、トラブルシューティング、運用上の注意点や更新手順も含みます。初期インストールから運用準備、バックアップや証明書更新までカバーしています。
重要: 本手順は CentOS 8 向けです。別ディストリビューションや OS バージョンではリポジトリ名やパッケージが異なります。
目的と想定読者
目的: CentOS 8 環境で Nextcloud 17 を安全に稼働させる。 想定読者: Linux サーバーの基本操作(systemctl、dnf、vim、firewall-cmd)ができるシステム管理者。
用語(1行)
- Nextcloud: オープンソースのセルフホスト型ファイル同期/共有プラットフォーム。簡潔: Dropbox のセルフホスト版。
目次
- 前提条件
- 概要(実施項目)
- ステップ 1: Nginx のインストール
- ステップ 2: PHP-FPM 7.3 のインストール
- ステップ 3: PHP-FPM の設定
- ステップ 4: MariaDB のインストールとデータベース作成
- ステップ 5: Let’s Encrypt SSL 発行
- ステップ 6: Nextcloud のダウンロードとインストール
- ステップ 7: Nginx 仮想ホスト設定
- ステップ 8: SELinux 設定
- ステップ 9: Nextcloud ウェブインストーラー
- 運用・保守: 自動証明書更新、cron、バックアップ、トラブルシューティング
- セキュリティ強化とベストプラクティス
- 受け入れ基準
- 管理者/運用者チェックリスト
- 参考リンク
前提条件
- CentOS 8 がインストールされたサーバー
- ルート権限(sudo)が使用可能
- 固定の公開ドメイン名(本例では cloud.hakase-labs.io を使用)
- ポート 80 と 443 が外部から到達可能
推奨サーバースペック: 2 GB RAM、25 GB 以上の空きディスク、2 つの CPU。
重要: 実運用時はディスク I/O、バックアップ、監視などを考慮してリソースを検討してください。
実施項目(概要)
- Nginx をインストールしてファイアウォールを設定
- PHP-FPM 7.3 と推奨モジュールを REMI 経由で導入
- PHP 設定(メモリ、timezone、opcache)を調整
- MariaDB を導入し Nextcloud 用データベースとユーザーを作成
- Certbot で Let’s Encrypt 証明書を取得
- Nextcloud 17 をダウンロードして配置
- Nginx の仮想ホストを用意して HTTPS を強制
- SELinux のコンテキストを設定
- ブラウザでインストールウィザードを実行
ステップ 1 - Nginx のインストール
まず Nginx をインストールし、firewalld で HTTP/HTTPS を開けます。
インストール:
sudo dnf install nginx
サービス開始と自動起動登録:
systemctl start nginx
systemctl enable nginx
ステータス確認:
systemctl status nginx
起動済みであればブラウザでサーバーの IP またはドメインにアクセスすると Nginx のデフォルトページが表示されます。
firewalld に HTTP/HTTPS を追加:
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
firewall-cmd --reload
注意: クラウド環境(AWS、GCP、Azure 等)では OS レベル以外にクラウドのセキュリティグループやファイアウォール設定も確認してください。
ステップ 2 - PHP-FPM 7.3 のインストール
Nextcloud 17 は PHP 7.2/7.3 を推奨します。本手順では REMI リポジトリの PHP 7.3 を利用します。
まず PowerTools、EPEL、REMI を有効化します:
sudo dnf config-manager --set-enabled PowerTools
sudo dnf install epel-release
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
リポジトリ一覧を確認:
dnf repolist
PHP モジュール一覧確認と REMI モジュール有効化:
dnf module list php
dnf module enable php:remi-7.3
必要な PHP パッケージをインストール(Nextcloud 用):
sudo dnf install php-fpm php-cli php-devel php-gd php-mysqlnd php-pear php-xml php-mbstring php-pdo php-json php-pecl-apcu php-pecl-apcu-devel php-pecl-imagick-devel php-intl php-opcache php-zip
ステップ 3 - PHP-FPM 7.3 の設定
Nextcloud に適した php.ini と PHP-FPM の設定を行います。
php.ini の編集:
vim /etc/php.ini
以下を編集(コメント解除して変更):
memory_limit = 512M
date.timezone = Asia/Jakarta
cgi.fixpathinfo = 0
メモ: timezone は運用場所に合わせて適切なものに置き換えてください(例: Asia/Tokyo)。
opcache のチューニング:
vim /etc/php.d/10-opcache.ini
次のように設定:
opcache.enable=1
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1
PHP-FPM のワーカ設定:
vim /etc/php-fpm.d/www.conf
以下を変更:
user = nginx
group = nginx
listen = /run/php-fpm/www.sock
環境変数と opcache のファイルキャッシュをアンコメント:
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
php_value[opcache.file_cache] = /var/lib/php/opcache
セッションと opcache 用ディレクトリを作成し所有権を nginx に:
mkdir -p /var/lib/php/{session,opcache}
chown -R nginx:nginx /var/lib/php/{session,opcache}
サービス起動と自動起動登録:
systemctl enable php-fpm
systemctl start php-fpm
状態確認:
netstat -pl | grep php
systemctl status php-fpm
重要: PHP のメモリ設定や opcache は利用状況に応じて調整してください。小規模環境では 512M は妥当ですが、大規模では増やす必要があります。
ステップ 4 - MariaDB のインストールと設定
MariaDB をインストールして root のパスワード設定、Nextcloud 用のデータベース/ユーザーを作成します。
インストール:
sudo dnf install mariadb mariadb-server
サービス開始と有効化:
systemctl start mariadb
systemctl enable mariadb
初期セキュリティ設定:
mysql_secure_installation
対話では通常以下を推奨:
Set a root password? [Y/n] Y
Remove anonymous users? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
データベースとユーザー作成(例):
mysql -u root -p
-- パスワード入力
create database nextcloud_db;
create user nextclouduser@localhost identified by 'nextcloudpassdb';
grant all privileges on nextcloud_db.* to nextclouduser@localhost identified by 'nextcloudpassdb';
flush privileges;
exit;
注意: パスワードは実運用では強力なものに置き換えてください。ソフトコードしないでください。
ステップ 5 - Let’s Encrypt SSL 証明書を取得
Certbot を使い無料の証明書を発行します。ここでは webroot を使った証明書取得を例示します。
インストール:
sudo dnf install certbot
証明書の発行(ドメインとメールを自分のものに変えてください):
certbot certonly --webroot --webroot-path /usr/share/nginx/html --agree-tos -m [email protected] -d cloud.hakase-labs.io
発行後の証明書場所:
ls -lah /etc/letsencrypt/live/cloud.hakase-labs.io/
証明書は /etc/letsencrypt/live/
重要: 証明書の自動更新を必ず設定してください(下記に手順あり)。
ステップ 6 - Nextcloud のダウンロードと配置
Nextcloud 17 の配布アーカイブをダウンロードして /var/www に展開します。
unzip が必要:
sudo dnf install unzip
ダウンロードと展開:
cd /var/www/
wget https://download.nextcloud.com/server/releases/nextcloud-17.0.2.zip
unzip nextcloud-17.0.2.zip
データディレクトリを作成:
mkdir -p /var/www/nextcloud/data/
所有者を nginx に設定:
sudo chown -R nginx:nginx /var/www/nextcloud
注意: Nextcloud の data ディレクトリは可能なら別ストレージ(別ディスクや LVM、NFS)に置き、適切にバックアップしてください。ディスク I/O が重要です。
ステップ 7 - Nginx の仮想ホスト設定
/etc/nginx/conf.d に nextcloud.conf を作成し、PHP-FPM ソケットと SSL 証明書パスを指定します。
cd /etc/nginx/conf.d/
vim nextcloud.conf
以下のサンプルをベースに domain と証明書パスを変更して貼り付けてください(ソースからそのまま転載)。
upstream php-handler {
#server 127.0.0.1:9000;
server unix:/run/php-fpm/www.sock;
}
server {
listen 80;
listen [::]:80;
server_name cloud.hakase-labs.io;
# enforce https
return 301 https://$server_name:443$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name cloud.hakase-labs.io;
# 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/ssl/nginx/fullchain.pem;
ssl_certificate_key /etc/ssl/nginx/privkey.pem;
# Add headers to serve security related headers
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/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\/.+)\.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;
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;
}
location ~ \.(?:css|js|woff2?|svg|gif|map)$ {
try_files $uri /index.php$request_uri;
add_header Cache-Control "public, max-age=15778463";
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)$ {
try_files $uri /index.php$request_uri;
access_log off;
}
}
設定テストと再起動:
nginx -t
systemctl restart nginx
ネットワークポート確認:
netstat -plntu
注意: 上の設定内の ssl_certificate と ssl_certificate_key は certbot のパスに合わせて変更してください。
ステップ 8 - SELinux の設定
SELinux を enforcing のまま運用する場合、Nextcloud 用ディレクトリに適切なコンテキストを設定します。
policycoreutils-python-utils をインストール:
sudo dnf install policycoreutils-python-utils
ファイルコンテキストを設定:
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/data(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/config(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/apps(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/assets(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/.htaccess'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/.user.ini'
restorecon -Rv '/var/www/nextcloud/'
重要: SELinux を緩める代わりに適切なラベルを付与することが推奨されます。
ステップ 9 - ブラウザで Nextcloud ウェブインストール
ブラウザで https://cloud.hakase-labs.io/ を開くとインストールウィザードが表示されます。
- 管理者アカウントを作成
- データフォルダの場所を確認(通常 /var/www/nextcloud/data)
- データベースで MySQL/MariaDB を選び、ステップ 4 で作成した nextcloud_db / nextclouduser / nextcloudpassdb を入力
“Finish Setup” をクリックしてインストールを完了すると、ダッシュボードが表示されます。
インストール後の画面例:
おめでとうございます — Nextcloud 17 が稼働しています。
運用・保守のポイント
自動証明書更新
certbot による自動更新は通常 systemd タイマーや cron を使います。動作確認:
certbot renew --dry-run
自動更新が成功すれば systemd の timer または cron により 60 日毎に実行されます。自動更新後に nginx を再読み込みする設定例:
# /etc/cron.d/certbot-reload の例
0 3,15 * * * root certbot renew --post-hook "systemctl reload nginx"
注意: cron の書き方は環境に合わせてください。systemd の timer を利用する方法もあります。
Nextcloud の cron ジョブ
Nextcloud のメンテナンスジョブは system cron(推奨)または AJAX を使用します。system cron を設定する場合、Nextcloud 管理画面で cron を選択し、次のように cron を登録します:
*/15 * * * * php -f /var/www/nextcloud/cron.php
この cron は root で実行することが多いですが、所有者 nginx のユーザーで実行する場合はパスや環境を調整してください。
バックアップ方針(簡易)
- データディレクトリ(/var/www/nextcloud/data)の定期バックアップ
- Nextcloud 設定ファイル(/var/www/nextcloud/config)とカスタムアプリのバックアップ
- MariaDB の定期ダンプ(mysqldump)とリストア確認
- バックアップはオフサイトに保管(別サーバーやクラウドストレージ)
例: MariaDB のダンプ
mysqldump -u root -p nextcloud_db > nextcloud_db-$(date +%F).sql
アップデートについて
- OS とパッケージ(dnf)を定期的に更新
- Nextcloud のメジャーバージョンアップはテスト環境で先に検証後に本番へ
- Nextcloud アップデートでは PHP や DB 要件が変わることがあるため、互換性を必ず確認
セキュリティ強化とベストプラクティス
- HTTPS を常に有効にする。HSTS は理解した上で有効化する。
- 強力な管理者パスワードと 2 要素認証(可能ならアプリで有効化)を使用する。
- 外部公開 API を制限する(必要なエンドポイントのみ公開)。
- 定期的にログをレビューし、不審なアクセスを検知する。
- 可能であればバックアップからの復旧手順を文書化し、定期的にリハーサルを実施する。
SELinux/Firewall の注意点
- SELinux を無効化するよりも適切なラベルを付与する。
- ファイアウォールは最小権限で許可し、必要なプロトコルのみ開放する。
トラブルシューティング(よくある症状と対処)
症状: ブラウザでページが 502 Bad Gateway を返す
- 原因: php-fpm が停止している、またはソケットパスが異なる。
- 対処:
- systemctl status php-fpm
- nginx の設定で fastcgi_pass が unix:/run/php-fpm/www.sock と一致しているか確認
- /run/php-fpm/www.sock の存在とパーミッションを確認
症状: ファイルアップロード時に 413 Request Entity Too Large
- 対処: nginx の client_max_body_size を増やす(例 512M)。php.ini の upload_max_filesize, post_max_size も確認。
症状: Nextcloud ログやブラウザで “No database driver found”
- 対処: php-mysqlnd がインストールされているか確認。php-fpm 再起動。
症状: Let’s Encrypt の発行が失敗する
- 対処: HTTP-01 (webroot) を使用する場合、80 番ポートへ外部から到達可能であり、指定した –webroot-path にファイルが配置されることを確認。nginx が 80 をリッスンしているか。
受け入れ基準
- HTTPS で Nextcloud のログインページにアクセスできること。
- 管理者アカウントでログインし、ファイルのアップロード/ダウンロードができること。
- cron による定期ジョブが動作していること(ログで確認)。
- MariaDB に接続でき、Nextcloud のテーブルが作成されていること。
管理者と運用者のチェックリスト
管理者用(導入時):
- ドメインと DNS が正しく設定されている
- ポート 80/443 が開放されている
- SELinux 設定を実施した
- Nextcloud データディレクトリの所有権が nginx に設定されている
- 証明書を取得して nginx に設定した
運用者用(運用日常):
- certbot renew –dry-run を定期確認
- Nextcloud と OS の更新計画を管理
- バックアップの定期実行とリストア検証
- 監視(ログ、トラフィック、ディスク使用量)を設定
代替アプローチと注意点
- Apache を利用する場合は mod_php ではなく php-fpm を利用することを推奨します。Apache 用の設定は公式ドキュメントを参照してください。
- データベースに PostgreSQL を使うことも可能です。Nextcloud は MySQL/MariaDB と PostgreSQL の両方に対応しています。
- 大規模環境や高可用性が必要な場合は、外部ストレージ(S3、NFS)、分散 DB、ロードバランサを検討してください。
参考・リンク
- Nextcloud 公式ドキュメント: https://docs.nextcloud.com/
まとめ
このガイドでは CentOS 8 に Nextcloud 17 を Nginx、PHP-FPM 7.3、MariaDB を使って導入する一連の手順を示しました。インストールだけでなく、SELinux の取り扱い、証明書管理、自動更新、運用チェックリストまでを含めています。運用を始めたら定期的なバックアップとアップデート、監視の設定を優先してください。
短い発表文(社内向け)
Nextcloud 17 を CentOS 8 に Nginx + PHP-FPM 7.3 + MariaDB でセットアップし、Let’s Encrypt による HTTPS を有効化しました。システムは SELinux 有効環境で稼働し、運用向けチェックリストとバックアップ手順を整備しています。