Nextcloud 私有云部署教程 / 02 - 安装部署
02 - 安装部署
掌握 Nextcloud 的多种安装方式:Web 安装向导、命令行安装、手动部署,以及 PHP 和数据库的初始配置。
2.1 安装前准备
系统要求
| 组件 | 最低要求 | 推荐配置 |
|---|---|---|
| 操作系统 | Ubuntu 22.04 / Debian 12 / RHEL 9 | Ubuntu 22.04 LTS |
| Web 服务器 | Nginx 1.22+ / Apache 2.4+ | Nginx 1.24+ |
| PHP | 8.1 | 8.2 |
| 数据库 | SQLite 3 | MySQL 8.0+ / MariaDB 10.6+ / PostgreSQL 15+ |
| 内存 | 512MB | 2GB+ |
| 磁盘 | 10GB | 根据需求规划 |
环境检查
# 检查操作系统版本
cat /etc/os-release
# 检查可用内存
free -h
# 检查磁盘空间
df -h
# 检查是否已安装 PHP
php -v
# 检查是否已安装数据库
mysql --version
# 或
psql --version
2.2 PHP 安装与配置
安装 PHP 及必要扩展
以 Ubuntu 22.04 为例:
# 添加 PHP PPA 源(获取最新版本)
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
# 安装 PHP 8.2 及所有必要扩展
sudo apt install -y \
php8.2-fpm \
php8.2-mysql \
php8.2-sqlite3 \
php8.2-xml \
php8.2-mbstring \
php8.2-zip \
php8.2-gd \
php8.2-curl \
php8.2-intl \
php8.2-bcmath \
php8.2-gmp \
php8.2-imagick \
php8.2-opcache \
php8.2-redis \
php8.2-apcu \
php8.2-ldap \
php8.2-smbclient \
php8.2-ftp
RHEL / CentOS / Fedora:
# 启用 Remi 仓库(提供 PHP 8.2)
sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm
sudo dnf module reset php -y
sudo dnf module enable php:remi-8.2 -y
# 安装 PHP 及扩展
sudo dnf install -y \
php-fpm \
php-mysqlnd \
php-xml \
php-mbstring \
php-zip \
php-gd \
php-curl \
php-intl \
php-bcmath \
php-gmp \
php-opcache \
php-redis \
php-apcu \
php-ldap
PHP 核心配置
编辑 PHP-FPM 配置文件(以 /etc/php/8.2/fpm/php.ini 为例):
; === 内存与执行时间 ===
memory_limit = 512M
max_execution_time = 300
max_input_time = 300
; === 文件上传 ===
upload_max_filesize = 16G
post_max_size = 16G
max_file_uploads = 100
; === 时区 ===
date.timezone = Asia/Shanghai
; === OPcache 配置 ===
opcache.enable = 1
opcache.enable_cli = 1
opcache.memory_consumption = 256
opcache.interned_strings_buffer = 32
opcache.max_accelerated_files = 20000
opcache.revalidate_freq = 60
opcache.save_comments = 1
opcache.jit = 1255
opcache.jit_buffer_size = 128M
; === APCu 缓存 ===
apc.enable_cli = 1
PHP-FPM 进程池配置
编辑 /etc/php/8.2/fpm/pool.d/nextcloud.conf:
[nextcloud]
user = www-data
group = www-data
listen = /run/php/nextcloud.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
; 动态进程管理
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 500
; 慢日志
slowlog = /var/log/php-fpm/nextcloud-slow.log
request_slowlog_timeout = 10s
; 超时
request_terminate_timeout = 300s
重启 PHP-FPM:
sudo systemctl restart php8.2-fpm
sudo systemctl enable php8.2-fpm
PHP 扩展验证
# 检查所有必要扩展是否已安装
php -m | grep -E "gd|mysql|xml|mbstring|zip|curl|intl|bcmath|gmp|opcache|redis|apcu|imagick"
期望输出应包含所有列出的扩展名。
2.3 数据库准备
MySQL / MariaDB
# 安装 MariaDB
sudo apt install -y mariadb-server
# 安全初始化
sudo mysql_secure_installation
创建 Nextcloud 数据库和用户:
-- 登录 MySQL
sudo mysql -u root -p
-- 创建数据库
CREATE DATABASE nextcloud
CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;
-- 创建专用用户并授权
CREATE USER 'ncuser'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'ncuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
PostgreSQL
# 安装 PostgreSQL
sudo apt install -y postgresql postgresql-contrib
# 创建数据库和用户
sudo -u postgres psql
CREATE USER ncuser WITH PASSWORD 'StrongPassword123!';
CREATE DATABASE nextcloud OWNER ncuser ENCODING 'UTF8' LC_COLLATE='en_US.UTF-8' LC_CTYPE='en_US.UTF-8' TEMPLATE template0;
GRANT ALL PRIVILEGES ON DATABASE nextcloud TO ncuser;
\q
2.4 Web 服务器配置
Nginx 配置
创建 /etc/nginx/sites-available/nextcloud:
upstream php-handler {
server unix:/run/php/nextcloud.sock;
}
server {
listen 80;
server_name cloud.example.com;
# 强制跳转 HTTPS(生产环境)
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name cloud.example.com;
ssl_certificate /etc/letsencrypt/live/cloud.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/cloud.example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
# 安全头
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "no-referrer" always;
root /var/www/nextcloud;
# 限制上传大小
client_max_body_size 16G;
client_body_timeout 300s;
fastcgi_buffers 64 4K;
# Gzip
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 ~ ^/(?:\.|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;
fastcgi_max_temp_file_size 0;
}
location ~ \.(?:css|js|svg|gif|png|jpg|ico|wasm|tflite|map|html|ttf|bcmap|mp4|webm)$ {
try_files $uri /index.php$request_uri;
add_header Cache-Control "public, max-age=15778463, $asset_immutable";
access_log off;
}
location ~ \.woff2?$ {
try_files $uri /index.php$request_uri;
expires 7d;
access_log off;
}
location /remote {
return 301 /remote.php$request_uri;
}
location / {
try_files $uri $uri/ /index.php$request_uri;
}
}
启用配置并重启:
sudo ln -s /etc/nginx/sites-available/nextcloud /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Apache 配置
# 安装 Apache 及必要模块
sudo apt install -y apache2 libapache2-mod-php8.2
sudo a2enmod rewrite headers env dir mime ssl
sudo a2enconf php8.2-fpm
创建 /etc/apache2/sites-available/nextcloud.conf:
<VirtualHost *:443>
ServerName cloud.example.com
DocumentRoot /var/www/nextcloud
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/cloud.example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/cloud.example.com/privkey.pem
<Directory /var/www/nextcloud/>
Require all granted
AllowOverride All
Options FollowSymLinks MultiViews
Satisfy Any
<IfModule mod_dav.c>
Dav off
</IfModule>
SetEnv HOME /var/www/nextcloud
SetEnv HTTP_HOME /var/www/nextcloud
</Directory>
# 安全头
Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains"
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
</VirtualHost>
2.5 安装 Nextcloud
方式一:命令行安装(推荐)
# 下载最新稳定版
cd /var/www
sudo wget https://download.nextcloud.com/server/releases/latest.tar.bz2
# 解压
sudo tar xjf latest.tar.bz2
# 设置目录权限
sudo mkdir -p /var/www/nextcloud/data
sudo chown -R www-data:www-data /var/www/nextcloud
# 使用 occ 命令行安装
sudo -u www-data php /var/www/nextcloud/occ maintenance:install \
--database "mysql" \
--database-name "nextcloud" \
--database-user "ncuser" \
--database-pass "StrongPassword123!" \
--admin-user "admin" \
--admin-pass "AdminPassword123!" \
--data-dir "/var/www/nextcloud/data"
安装成功输出:
Nextcloud was successfully installed
方式二:Web 安装向导
- 将文件解压到 Web 根目录并设置权限(同命令行安装的前 3 步)
- 浏览器访问
https://cloud.example.com - 按照安装向导填写管理员账号、数据库信息
- 点击「完成安装」
┌──────────────────────────────────────────────────┐
│ Nextcloud 安装向导 │
│ │
│ 管理员账号 │
│ ┌──────────────────────────────────────────────┐│
│ │ 用户名: admin ││
│ │ 密码: •••••••• ││
│ └──────────────────────────────────────────────┘│
│ │
│ 数据库配置 │
│ ┌──────────────────────────────────────────────┐│
│ │ 数据库: MySQL / MariaDB ││
│ │ 数据库用户: ncuser ││
│ │ 数据库密码: •••••••• ││
│ │ 数据库名: nextcloud ││
│ │ 数据库主机: localhost ││
│ └──────────────────────────────────────────────┘│
│ │
│ 数据目录: /var/www/nextcloud/data │
│ │
│ [ 完成安装 ] │
└──────────────────────────────────────────────────┘
方式三:Archive 手动安装
# 使用 ZIP 格式下载
sudo wget https://download.nextcloud.com/server/releases/latest.zip
sudo unzip latest.zip -d /var/www/
sudo chown -R www-data:www-data /var/www/nextcloud
2.6 安装后配置
设置可信域名
# 添加可信域名
sudo -u www-data php /var/www/nextcloud/occ config:system:set trusted_domains 0 --value="cloud.example.com"
sudo -u www-data php /var/www/nextcloud/occ config:system:set trusted_domains 1 --value="192.168.1.100"
# 查看当前可信域名
sudo -u www-data php /var/www/nextcloud/occ config:system:get trusted_domains
配置后台任务 (Cron)
# 设置 cron 任务(每 5 分钟执行)
sudo crontab -u www-data -e
添加以下行:
*/5 * * * * php -f /var/www/nextcloud/cron.php
或使用 systemd timer(推荐):
# 创建 systemd timer
sudo tee /etc/systemd/system/nextcloudcron.service << 'EOF'
[Unit]
Description=Nextcloud cron.php
[Service]
User=www-data
ExecStart=/usr/bin/php -f /var/www/nextcloud/cron.php
EOF
sudo tee /etc/systemd/system/nextcloudcron.timer << 'EOF'
[Unit]
Description=Run Nextcloud cron.php every 5 minutes
[Timer]
OnBootSec=5min
OnUnitActiveSec=5min
[Install]
WantedBy=timers.target
EOF
sudo systemctl enable --now nextcloudcron.timer
确认后台任务类型:
sudo -u www-data php /var/www/nextcloud/occ background:cron
SSL 证书(Let’s Encrypt)
# 安装 Certbot
sudo apt install -y certbot python3-certbot-nginx
# 获取证书
sudo certbot --nginx -d cloud.example.com
# 自动续期测试
sudo certbot renew --dry-run
2.7 安装验证
运行系统检查
# 检查系统状态
sudo -u www-data php /var/www/nextcloud/occ status
预期输出:
- installed: true
- version: 29.0.4.1
- versionstring: 29.0.4
- edition:
- maintenance: false
- needsDbUpgrade: false
- productname: Nextcloud
- extendedSupport: false
检查系统警告
# 检查是否有配置警告
sudo -u www-data php /var/www/nextcloud/occ maintenance:repair
浏览器访问管理后台 → 设置 → 管理 → 概览,检查是否有红色/黄色警告。
2.8 注意事项
- 目录权限:
data/目录权限必须正确,www-data用户需要读写权限,但不应被 Web 服务器直接访问 - data 目录位置: 生产环境建议将
data/目录放在 Web 根目录之外,如/data/nextcloud-data/ - 数据库字符集: MySQL 必须使用
utf8mb4字符集,否则 emoji 和特殊字符会出错 - 内存限制: 如果导入大量文件,
memory_limit可能需要临时提升到1G - SELinux / AppArmor: 如果系统启用了强制访问控制,需要设置正确的安全上下文
- 不要使用 root 安装: 始终使用
www-data用户运行occ命令
2.9 常见问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 白屏 | PHP 扩展缺失 | 检查 php -m 输出,确保所有扩展已安装 |
| 数据库连接失败 | 用户权限不足 | 检查 GRANT 权限,确认密码正确 |
| 文件上传限制 | PHP 配置限制 | 修改 upload_max_filesize 和 post_max_size |
| 权限错误 | 文件所有者不正确 | chown -R www-data:www-data /var/www/nextcloud |
| HTTPS 混合内容 | SSL 配置不完整 | 确保 config.php 中 overwriteprotocol 设为 https |
# 修复混合内容问题
sudo -u www-data php /var/www/nextcloud/occ config:system:set overwriteprotocol --value="https"
2.10 扩展阅读
上一章: 01 - Nextcloud 概述 下一章: 03 - 配置详解 — 深入理解 config.php 与各项高级配置。