LOADING
2489 字
12 分钟
NextCloud私有云部署
2026-08-22
教程
/
手顺
部署

服务器上部署 Nextcloud 主要有三种主流方式:

  • 手动部署(LNMP/LAMP):最灵活,可定制性最强,适合对服务器有完全控制权、希望深入理解各组件运行原理的用户

  • Docker Compose 部署:部署和迁移方便,环境隔离,适合希望快速上线、易于维护的用户

  • Nextcloud All-in-One (AIO):官方推荐的最简单方式,一个命令启动所有服务,包含备份、办公室套件等,适合新手或不想操心细节的用户

本笔者有一台 Ubuntu 22.04的云服务器,选择手动部署方式

那么下面是使用 Nginx + PHP-FPM + MariaDB + Redis 组合的详细手动部署教程

一、前提准备

  • 一台运行 Ubuntu 22.04 或 24.04 LTS 的服务器
  • 具有 sudo 权限的非 root 用户
  • (可选)已解析到服务器 IP 的域名

硬件最低建议:2GB 内存 / 2 vCPU


二、更新、安装基础组件和 Nginx

Terminal window
sudo apt update && sudo apt upgrade -y
sudo apt install -y wget curl unzip gnupg2 nginx
sudo systemctl enable --now nginx

验证 Nginx 是否运行:

Terminal window
sudo systemctl status nginx

应显示 active (running)


三 、安装 PHP 8.2 及所有必须扩展

Nextcloud 目前要求 PHP 8.1 ~ 8.3,以 PHP 8.2 为例:

1. 安装PHP 8.2

Terminal window
# 添加 PPA源 并更新
sudo apt update
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt update
# 安装 PHP 8.2
sudo apt install -y php8.2-fpm php8.2-cli
# 验证安装
php -v

2. 安装必须扩展

Terminal window
sudo apt update
sudo apt install -y php8.2-xml php8.2-mbstring php8.2-gd php8.2-zip php8.2-curl php8.2-bcmath php8.2-gmp php8.2-imagick php8.2-redis php8.2-mysql

插件安装不完整则无法正常使用

3. 配置 PHP 上传限制

Nextcloud 默认需要处理大文件,修改 PHP-FPM 配置:

Terminal window
sudo sed -i 's/^upload_max_filesize = .*/upload_max_filesize = 10G/' /etc/php/8.2/fpm/php.ini
sudo sed -i 's/^post_max_size = .*/post_max_size = 10G/' /etc/php/8.2/fpm/php.ini

验证修改:

Terminal window
grep -E 'upload_max_filesize|post_max_size' /etc/php/8.2/fpm/php.ini

应显示两项均为 10G(与 Nginx 的 client_max_body_size 10G 保持一致)

4. 配置 OPcache

Nextcloud 管理后台会对未正确配置 OPcache 的环境显示性能警告。修改两个文件:

php.ini — 取消注释并调整:

Terminal window
sudo sed -i \
-e 's/^;opcache.enable=1/opcache.enable=1/' \
-e 's/^;opcache.memory_consumption=128/opcache.memory_consumption=128/' \
-e 's/^;opcache.interned_strings_buffer=8/opcache.interned_strings_buffer=8/' \
-e 's/^;opcache.max_accelerated_files=10000/opcache.max_accelerated_files=10000/' \
-e 's/^;opcache.revalidate_freq=2/opcache.revalidate_freq=1/' \
-e 's/^;opcache.save_comments=1/opcache.save_comments=1/' \
/etc/php/8.2/fpm/php.ini

10-opcache.ini — 启用 JIT(PHP 8.x 特有):

Terminal window
sudo vim /etc/php/8.2/fpm/conf.d/10-opcache.ini

将 opcache.jit=off 改为:

opcache.jit=1255
opcache.jit_buffer_size=128M

revalidate_freq=1 表示每秒检查一次文件变更,生产环境推荐值;开发环境可设为 0 1255 是 PHP JIT 的 disable_specializer 模式,兼顾兼容性与性能

5. 可选扩展

以下扩展非必须但推荐按需安装:

Terminal window
sudo apt install -y php8.2-intl php8.2-smbclient
  • php8.2-intl:国际化支持,Nextcloud 官方推荐,缺少会导致管理后台警告
  • php8.2-smbclient:支持挂载 SMB/CIFS 外部存储

6. imagick 安全策略加固

php8.2-imagick 依赖的 ImageMagick 默认允许处理 SVG、MSL 等格式,存在 XXE、SSRF 和任意文件读写风险。需要编辑策略文件禁用危险编码器:

Terminal window
sudo vim /etc/ImageMagick-6/policy.xml

在 </policymap> 前添加:

<!-- 安全加固:禁用危险编码器 -->
<policy domain="coder" rights="none" pattern="MSL" />
<policy domain="coder" rights="none" pattern="SVG" />
<policy domain="coder" rights="none" pattern="MVG" />
<policy domain="coder" rights="none" pattern="URL" />
<policy domain="coder" rights="none" pattern="HTTPS" />
<policy domain="coder" rights="none" pattern="HTTP" />
<policy domain="coder" rights="none" pattern="EPHEMERAL" />
<policy domain="coder" rights="none" pattern="LABEL" />

这些编码器 Nextcloud 不需要,禁用后不影响正常图片处理(GIF/JPEG/PNG/WEBP/HEIC/TIFF 均保留)

启动 PHP-FPM:

Terminal window
sudo systemctl enable --now php8.2-fpm

四、安装MariaDB数据库

Terminal window
sudo apt install -y mariadb-server
sudo systemctl enable --now mariadb

安全初始化(设置 root 密码等):

Terminal window
sudo mysql_secure_installation

登录数据库并创建 Nextcloud 专用库和用户:

Terminal window
sudo mysql -u root -p
CREATE DATABASE nextcloud;
CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY '你的强密码';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost';
FLUSH PRIVILEGES;
EXIT;

五、安装 Redis 缓存

Terminal window
sudo apt install -y redis-server
sudo systemctl enable --now redis-server

配置 Redis 使用 Unix Socket(比 TCP 更快):

Terminal window
sudo nano /etc/redis/redis.conf

找到并修改/添加:

unixsocket /var/run/redis/redis-server.sock
unixsocketperm 770

将 www-data 用户加入 redis 组,然后重启:

Terminal window
sudo usermod -aG redis www-data
sudo systemctl restart redis-server

六、下载并安装 Nextcloud

1. 下载最新版本

Terminal window
cd /tmp
wget https://download.nextcloud.com/server/releases/latest.zip

2. 解压到 Web 目录

Terminal window
sudo unzip -q latest.zip -d /var/www/
sudo rm /tmp/latest.zip

3. 创建数据目录(放在 Web 根目录外,更安全)

Terminal window
sudo mkdir -p /var/nextcloud-data

4. 设置正确的权限

Terminal window
sudo chown -R www-data:www-data /var/www/nextcloud
sudo chown -R www-data:www-data /var/nextcloud-data

七、配置 Nginx

注意:将 your-domain.com 替换为你的实际域名/子域名或 IP 地址

1. DNS解析

先将 子域名 A记录指向服务器IP,确保解析生效后再继续。

2. 安装 certbot

Terminal window
sudo apt install certbot python3-certbot-nginx

3. 先用 HTTP 配置启动站点(用于申请证书)

创建一个临时的 HTTP-only 配置:

Terminal window
sudo vim /etc/nginx/sites-available/nextcloud

写入以下临时配置:

server {
listen 80;
listen [::]:80;
server_name your-domain.com;
root /var/www/nextcloud;
index index.php index.html;
# certbot 验证路径
location /.well-known/acme-challenge/ {
allow all;
}
location / {
return 301 https://$host$request_uri;
}
}

4. 启用站点

Terminal window
# 删除默认站点,避免冲突
sudo rm /etc/nginx/sites-enabled/default 2>/dev/null
# 软链接 nextcloud 站点
sudo ln -s /etc/nginx/sites-available/nextcloud /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

5. 申请 SSL 证书

Terminal window
sudo certbot certonly --nginx -d your-domain.com

6. 替换为完整的 Nextcloud Nginx 配置

证书申请成功后,将临时配置替换为完整配置:

Terminal window
sudo vim /etc/nginx/sites-available/nextcloud

写入以下完整配置:

upstream php-handler {
server unix:/run/php/php8.2-fpm.sock;
}
# ========== Nextcloud 主服务器(443) ==========
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name your-domain.com;
# SSL 证书(Let's Encrypt 路径)
ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
# SSL 优化
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# gzip 压缩(放在 server 顶层,全局生效)
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;
root /var/www/nextcloud;
index index.php index.html index.htm;
client_max_body_size 10G;
client_body_timeout 300s;
# 去除不必要的头
fastcgi_hide_header X-Powered-By;
location = / {
if ( $http_user_agent ~ ^DavClnt ) {
return 302 /remote.php/webdav/$is_args$args;
}
try_files $uri $uri/ /index.php$request_uri;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location ^~ /apps/rainloop/app/data {
deny all;
}
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\/.+|oc[ms]-provider\/.+|.+\/vendor\/) /index.php$request_uri;
fastcgi_split_path_info ^(.+?\.php)(\/.*|)$;
try_files $fastcgi_script_name =404;
set $path_info $fastcgi_path_info;
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_read_timeout 300s;
}
# 长期缓存的静态资源(图片/CSS/JS/字体/媒体)
# 安全头必须在每个 location 中重复声明,Nginx 的 add_header 不会从 server 继承
location ~* \.(?:css|js|svg|gif|png|jpg|ico|wasm|tflite|map|woff2?|eot|ttf|otf|mp4|webm|ogg)$ {
try_files $uri /index.php$request_uri;
add_header Cache-Control "public, max-age=15778463, immutable" always;
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 "noindex, nofollow" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;
access_log off;
}
# 短期缓存(RSS/Atom)
location ~* \.(?:rss|atom)$ {
try_files $uri /index.php$request_uri;
add_header Cache-Control "public, max-age=3600" always;
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 "noindex, nofollow" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;
access_log off;
}
# 文本文件
location ~* \.(?:html|htm|txt|md|log)$ {
try_files $uri /index.php$request_uri;
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 "noindex, nofollow" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;
access_log off;
}
# remote WebDAV 相关文件
location ~* ^/remote/(.*)\.(txt|xml|json)$ {
try_files $uri /index.php$request_uri;
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 "noindex, nofollow" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;
access_log off;
}
location ~ ^\/(?:updater|oc[ms]-provider)(?:$|\/) {
try_files $uri $uri/ =404;
index index.php;
}
location = /.well-known/carddav {
return 301 $scheme://$host/remote.php/dav;
}
location = /.well-known/caldav {
return 301 $scheme://$host/remote.php/dav;
}
location = /.well-known/webfinger {
return 301 $scheme://$host/index.php/.well-known/webfinger;
}
location = /.well-known/nodeinfo {
return 301 $scheme://$host/index.php/.well-known/nodeinfo;
}
location ~ /\.ht {
deny all;
}
location / {
try_files $uri $uri/ /index.php$request_uri;
}
}
# ========== HTTP 强制跳转 HTTPS ==========
server {
listen 80;
listen [::]:80;
server_name your-domain.com;
location /.well-known/acme-challenge/ {
allow all;
}
return 301 https://$host$request_uri;
}

7. 测试并重载 Nginx

Terminal window
sudo nginx -t
sudo systemctl reload nginx

8. 配置防火墙(UFW)

如果服务器启用了 UFW,需要放行 HTTP/HTTPS 流量:

Terminal window
sudo ufw allow 'Nginx Full'
sudo ufw status

如果使用的是阿里云、腾讯云等云服务器,安全组规则中也需要放行 80 和 443 端口


八、通过浏览器完成安装

  1. 在浏览器中访问 https://你的子域名/域名 图片

  2. 按照引导页面操作:

    • 创建管理员账户:设置用户名和密码
    • 数据库配置:
      • 数据库类型:选择 `MariaDB
      • 数据库名:nextcloud
      • 数据库用户:nextcloud
      • 数据库密码:设置的密码
      • 数据库主机:localhost
    • 数据目录:填入 /var/nextcloud-data
  3. 点击 “完成安装”,等待安装完成

  4. 安装完成后补充 HTTPS 覆写配置

Terminal window
sudo -u www-data php /var/www/nextcloud/occ config:system:set overwrite.cli.url --value=https://your-domain.com
sudo -u www-data php /var/www/nextcloud/occ config:system:set overwriteprotocol --value=https
  1. 接入 Redis 缓存

之前安装了 Redis 但还未接入 Nextcloud,现在编辑 config.php 添加配置:

Terminal window
sudo vim /var/www/nextcloud/config/config.php

在 $CONFIG = array ( ); 之前添加以下内容:

'memcache.local' => '\OC\Memcache\Redis',
'memcache.distributed' => '\OC\Memcache\Redis',
'redis' => array(
'host' => '/var/run/redis/redis-server.sock',
'port' => 0,
),

port => 0 表示使用 Unix Socket 而非 TCP,性能更好

重启 PHP-FPM 使配置生效:

Terminal window
sudo systemctl restart php8.2-fpm

验证 Redis 已接入(管理后台 → 基本设置 → 性能,应显示 Redis 作为本地缓存)

  1. 配置 Cron 定时任务

Nextcloud 后台任务默认使用 AJAX,效率低且依赖浏览器访问。切换为系统 cron:

Terminal window
# 编辑 www-data 用户的 crontab
sudo -u www-data crontab -e

添加以下内容:

*/5 * * * * php -f /var/www/nextcloud/cron.php

设置 Nextcloud 使用 cron 模式:

Terminal window
sudo -u www-data php /var/www/nextcloud/occ background:cron

验证:

Terminal window
sudo -u www-data crontab -l

应显示 */5 * * * * php -f /var/www/nextcloud/cron.php

管理后台 → 基本设置 → 后台任务,应显示「Cron」而非「AJAX」


九、常见问题排查

问题解决方法
页面 502 Bad Gateway检查 PHP-FPM 是否运行:sudo systemctl status php8.2-fpm
页面 403 Forbidden检查目录权限:sudo chown -R www-data:www-data /var/www/nextcloud
上传文件大小受限修改 Nginx 中 client_max_body_size 和 PHP 中 upload_max_filesize、post_max_size
Redis 连接失败检查 Redis 是否运行:sudo systemctl status redis-server,确认 socket 路径正确

1. 浏览器白屏

说明 Nginx 已成功响应请求,但 PHP 执行阶段发生了致命错误且未输出任何内容 (1) 检查 Nginx 和 PHP-FPM 错误日志

Terminal window
# 查看 Nginx 错误日志最后 50 行
sudo tail -50 /var/log/nginx/error.log
# 查看 PHP-FPM 错误日志最后 50 行
sudo tail -50 /var/log/php8.2-fpm.log
# 如果上面没有有用信息,查看 Nextcloud 自身日志
sudo tail -50 /var/www/nextcloud/data/nextcloud.log

(2) 确认文件所有权和权限

Terminal window
# 修复整个 Nextcloud 目录的所有权
sudo chown -R www-data:www-data /var/www/nextcloud/
# 确保 config 目录可写(安装过程需要写入 config.php)
sudo chmod 750 /var/www/nextcloud/config/
sudo chmod 750 /var/nextcloud-data/

2. 快速诊断命令汇总

Terminal window
echo "=== Nginx Error ===" && sudo tail -20 /var/log/nginx/error.log
echo "=== PHP-FPM Status ===" && sudo systemctl is-active php8.2-fpm
echo "=== Socket ===" && ls -la /run/php/php8.2-fpm.sock
echo "=== Config Dir ===" && ls -la /var/www/nextcloud/config/
echo "=== Data Dir ===" && ls -la /var/www/nextcloud/data/

至此, Nextcloud 手动部署已经完成,enjoy!

NextCloud私有云部署
/tech/hands-share/nextcloud-private/
作者
J.
发布于
2026-08-22
许可协议
CC BY-NC-SA 4.0
编辑于 2026-08-22

部分信息可能已经过时

Profile Image of the Author
J.
我是Jiy,热爱生活的学生一只~
公告
欢迎来到我的博客!
目录
行
器
律
目录