强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

02 - 安装部署

02 - 安装部署

掌握 Nextcloud 的多种安装方式:Web 安装向导、命令行安装、手动部署,以及 PHP 和数据库的初始配置。


2.1 安装前准备

系统要求

组件最低要求推荐配置
操作系统Ubuntu 22.04 / Debian 12 / RHEL 9Ubuntu 22.04 LTS
Web 服务器Nginx 1.22+ / Apache 2.4+Nginx 1.24+
PHP8.18.2
数据库SQLite 3MySQL 8.0+ / MariaDB 10.6+ / PostgreSQL 15+
内存512MB2GB+
磁盘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 安装向导

  1. 将文件解压到 Web 根目录并设置权限(同命令行安装的前 3 步)
  2. 浏览器访问 https://cloud.example.com
  3. 按照安装向导填写管理员账号、数据库信息
  4. 点击「完成安装」
┌──────────────────────────────────────────────────┐
│              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 注意事项

  1. 目录权限: data/ 目录权限必须正确,www-data 用户需要读写权限,但不应被 Web 服务器直接访问
  2. data 目录位置: 生产环境建议将 data/ 目录放在 Web 根目录之外,如 /data/nextcloud-data/
  3. 数据库字符集: MySQL 必须使用 utf8mb4 字符集,否则 emoji 和特殊字符会出错
  4. 内存限制: 如果导入大量文件,memory_limit 可能需要临时提升到 1G
  5. SELinux / AppArmor: 如果系统启用了强制访问控制,需要设置正确的安全上下文
  6. 不要使用 root 安装: 始终使用 www-data 用户运行 occ 命令

2.9 常见问题

问题原因解决方案
白屏PHP 扩展缺失检查 php -m 输出,确保所有扩展已安装
数据库连接失败用户权限不足检查 GRANT 权限,确认密码正确
文件上传限制PHP 配置限制修改 upload_max_filesizepost_max_size
权限错误文件所有者不正确chown -R www-data:www-data /var/www/nextcloud
HTTPS 混合内容SSL 配置不完整确保 config.phpoverwriteprotocol 设为 https
# 修复混合内容问题
sudo -u www-data php /var/www/nextcloud/occ config:system:set overwriteprotocol --value="https"

2.10 扩展阅读


上一章: 01 - Nextcloud 概述 下一章: 03 - 配置详解 — 深入理解 config.php 与各项高级配置。