手当たり次第に書くんだ

飽きっぽいのは本能

Ubuntu 26.04 Nextcloud の基本構成 – Nginx / PHP-FPM / MariaDB で土台を作る

関連する記事

Ubuntu 26.04 で Nextcloud を構成する場合、Nginx、PHP-FPM、MariaDB、Redis、TLS、data directory、cron 実行を一つの流れとしてそろえる必要があります。どれか一つだけを設定しても、Nextcloud として安定して動く状態にはなりません。

この記事では、Nextcloud 33 系を配置し、occ maintenance:install で初期インストールできる土台を作ります。アプリ設定、trusted domains、mail、Redis lock、maintenance window などの config.php 調整は、別記事の Nextcloud 設定編で扱います。

この記事で扱うこと
  • Nextcloud base の構成要素を確認する
  • 専用 PHP-FPM pool と Nginx server block を作成する
  • MariaDB database、data directory、Nextcloud 本体を用意する
  • occ maintenance:install と systemd timer の確認を行う

構成要素を確認する

Nextcloud base では、Web server と PHP 実行環境だけでなく、database、cache、data directory、cron の境界をそろえます。特に data directory は document root の外に置き、PHP-FPM は Nextcloud 用 pool と socket を分けます。

要素役割
NginxHTTPS、静的ファイル、PHP への FastCGI 転送
PHP-FPMNextcloud の PHP 実行環境
MariaDBNextcloud の metadata database
Redisfile locking や cache の土台
data directoryユーザーファイルの実体
systemd timercron.php の定期実行

PHP-FPM pool を作成する

Nextcloud 用の PHP-FPM pool を作り、Unix socket で Nginx から接続します。socket を分けると、他の PHP アプリケーションと実行環境の境界を保ちやすくなります。

sudo tee /etc/php/8.5/fpm/pool.d/nextcloud.conf >/dev/null <<'EOF'
[nextcloud]
user = www-data
group = www-data
listen = /run/php/nextcloud-php8.5.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = dynamic
pm.max_children = 24
pm.start_servers = 4
pm.min_spare_servers = 4
pm.max_spare_servers = 12
pm.max_requests = 500
clear_env = no
EOF
sudo php-fpm8.5 -t
sudo systemctl restart php8.5-fpm.service

Nginx server block を作成する

/etc/nginx/sites-available/default に Nextcloud 用 server block を配置します。実際の FQDN、証明書、秘密鍵の path は環境に合わせて置き換えます。

sudo tee /etc/nginx/sites-available/default >/dev/null <<'EOF'
upstream php-handler {
  server unix:/run/php/nextcloud-php8.5.sock;
}
map $arg_v $asset_immutable {
  "" "";
  default ", immutable";
}
server {
  listen 80;
  listen [::]:80;
  server_name nextcloud.example.com;
  server_tokens off;
  return 301 https://$server_name$request_uri;
}
server {
  listen 443 ssl;
  listen [::]:443 ssl;
  http2 on;
  server_name nextcloud.example.com;
  root /var/www/html;
  ssl_certificate /etc/ssl/localcerts/server.crt;
  ssl_certificate_key /etc/ssl/localcerts/server.key;
  server_tokens off;
  client_max_body_size 10G;
  client_body_timeout 300s;
  fastcgi_buffers 64 4K;
  add_header Referrer-Policy "no-referrer" always;
  add_header X-Content-Type-Options "nosniff" always;
  add_header X-Frame-Options "SAMEORIGIN" always;
  add_header X-Robots-Tag "noindex, nofollow" always;
  add_header Strict-Transport-Security "max-age=15552000; includeSubDomains; preload" always;
  fastcgi_hide_header X-Powered-By;
  index index.php index.html /index.php$request_uri;
  location = /robots.txt {
  allow all;
  log_not_found off;
  access_log off;
  }
  location ^~ /.well-known {
  location = /.well-known/carddav { return 301 /remote.php/dav/; }
  location = /.well-known/caldav { return 301 /remote.php/dav/; }
  return 301 /index.php$request_uri;
  }
  location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/) {
  return 404;
  }
  location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
  return 404;
  }
  location ~ \.php(?:$|/) {
  rewrite ^/(?!index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+) /index.php$request_uri;
  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 on;
  fastcgi_max_temp_file_size 0;
  }
  location ~ \.(?:css|js|mjs|svg|gif|ico|jpg|png|webp|wasm|map)$ {
  try_files $uri /index.php$request_uri;
  add_header Cache-Control "public, max-age=15778463$asset_immutable";
  access_log off;
  }
  location /remote {
  return 301 /remote.php$request_uri;
  }
  location / {
  try_files $uri $uri/ /index.php$request_uri;
  }
}
EOF
sudo nginx -t
sudo systemctl restart nginx.service

MariaDB database と data directory を用意する

Nextcloud 用 database と user を作ります。password は実環境の値に置き換えます。data directory は document root の外に置き、www-data が読み書きできる状態にします。

sudo mariadb <<'EOF'
CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER IF NOT EXISTS 'nextcloud'@'localhost' IDENTIFIED BY 'CHANGE_ME_DB_PASSWORD';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost';
FLUSH PRIVILEGES;
EOF
sudo install -d -o www-data -g www-data -m 0750 /mnt/nextcloud
sudo usermod -aG redis www-data

Nextcloud 本体を配置する

Nextcloud 33 系の archive を取得し、document root に配置します。すでに /var/www/html/version.php がある環境では、既存インストールを上書きしないように状態を確認してから作業します。

sudo install -d -o root -g root -m 0755 /var/tmp/nextcloud-base
curl -L -o /var/tmp/nextcloud-base/latest-33.zip https://download.nextcloud.com/server/releases/latest-33.zip
cd /var/tmp/nextcloud-base
unzip latest-33.zip
sudo rsync -a /var/tmp/nextcloud-base/nextcloud/ /var/www/html/
sudo chown -R www-data:www-data /var/www/html
sudo chown www-data:www-data /mnt/nextcloud
sudo chmod 0750 /mnt/nextcloud

初期インストールを実行する

occ maintenance:install で database、admin user、data directory を指定して初期インストールします。admin password と database password は実環境の値に置き換えます。

cd /var/www/html
sudo -u www-data php occ maintenance:install --database=mysql --database-host=localhost --database-name=nextcloud --database-user=nextcloud --database-pass=CHANGE_ME_DB_PASSWORD --admin-user=admin --admin-pass=CHANGE_ME_ADMIN_PASSWORD --data-dir=/mnt/nextcloud
sudo -u www-data php occ status

cron.php を systemd timer で実行する

Nextcloud の background jobs は cron 方式で実行します。systemd timer を使うと、5 分間隔の実行状態を systemd 側で確認できます。

sudo tee /etc/systemd/system/nextcloudcron.service >/dev/null <<'EOF'
[Unit]
Description=Nextcloud cron.php job
[Service]
User=www-data
ExecCondition=/usr/bin/php -f /var/www/html/occ status -e
ExecStart=/usr/bin/php -f /var/www/html/cron.php
KillMode=process
EOF
sudo tee /etc/systemd/system/nextcloudcron.timer >/dev/null <<'EOF'
[Unit]
Description=Run Nextcloud cron.php every 5min
[Timer]
OnBootSec=5min
OnUnitActiveSec=5min
Unit=nextcloudcron.service
[Install]
WantedBy=timers.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now nextcloudcron.timer
systemctl status nextcloudcron.timer --no-pager

動作確認の見方

初期構築後は、Web 応答、PHP-FPM socket、database 接続、data directory、cron timer を分けて確認します。Nextcloud の画面が表示されても、cron や data directory の権限が未確認だと運用中に問題になります。

curl -I https://nextcloud.example.com/status.php
sudo -u www-data php /var/www/html/occ status
sudo -u www-data php /var/www/html/occ background:cron
systemctl list-timers nextcloudcron.timer --no-pager
ls -ld /mnt/nextcloud /var/www/html
確認するポイント
  • nginx -tphp-fpm8.5 -t が通るか
  • Nginx から PHP-FPM socket に接続できるか
  • MariaDB database と user が作成されているか
  • /mnt/nextcloud が document root の外にあり、www-data が扱えるか
  • nextcloudcron.timer が有効か

まとめ

Nextcloud base は、Nginx、PHP-FPM、MariaDB、Redis、data directory、cron をそろえて初めて土台になります。単に Nextcloud の zip を展開するだけではなく、PHP 実行環境、Web server、database、ファイル保存先、background jobs の責任範囲を分けて確認することが大切です。

この土台ができたら、次は config.php、trusted domains、overwrite settings、Redis lock、mail、maintenance window、アプリ設定などを Nextcloud 設定編で確認します。

関連する記事
Ubuntu 26.04 Nextcloud の基本構成 – Nginx / PHP-FPM / MariaDB で土台を作る

コメントを残す

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

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る