ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

虚拟机手工部署Nextcloud私有云盘:Ubuntu Server+LAMP

虚拟机手工部署Nextcloud私有云盘:Ubuntu Server+LAMP 1. 部署方案选型为什么我把 nextcloud 塞进了虚拟机nextcloud 这套私有云盘我前后折腾过至少五种装法从最早的树莓派裸机、到 Docker Compose、再到直接怼在一台旧笔记本的 Ubuntu 23.10 Server 版上。最后稳定留下来的方案反而是看起来最笨的那个一台虚拟机 Ubuntu 23.10 Server Apache/PHP/MariaDB 手工部署。这篇文章讲的就是这套方案的完整落地过程从按下虚拟机开机那一刻到浏览器里出现 nextcloud 的登录页全程开箱即用也不需要你有任何 Linux 基础。先说说这套方案解决什么问题。nextcloud 本质是一个跑在你自己设备上的网盘服务手机相册自动备份、电脑文件多端同步、在线文档协作这些它都能干。但它对运行环境有要求需要 Web 服务器、需要 PHP、需要数据库这三样缺一个都起不来。直接装在物理机上一旦配置搞乱了想重来就得重装系统而装在虚拟机里快照一拍怎么折腾都能一键回滚。这是我坚持用虚拟机的核心理由也是新手最该优先考虑的一点。适合谁看完全没接触过 Linux 的小白、想给自己家和工作室搭个私有网盘的普通用户、以及那些被各种一键脚本坑过想搞明白底层到底发生了什么的折腾党。如果你追求的是三分钟部署完Docker 方案确实更快但如果你想知道 nextcloud 到底跑在什么之上、出问题该从哪一层排查那手工部署这条路的收获会大得多。后面第三章我会把每条命令都拆开讲清楚为什么这么写。1.1 三种主流部署方式的真实对比很多人一上来就纠结用哪个方式装其实把这三种方式摊开对比一下答案就很清楚了。我把它们的关键差异整理成了一张表你可以直接按自己的需求对号入座。对比项虚拟机手工部署Docker 部署物理机裸装上手门槛中等需敲命令但有完整路径低一条 compose 命令中等环境隔离完全隔离崩溃不影响主机进程级隔离共享内核无隔离回滚难度快照秒回最省心删容器重建极难基本靠重装资源开销额外占用 1~2GB 内存开销小无额外开销排查难度层次清晰逐层排查网络与卷映射容易绕晕与主机配置耦合迁移能力导出 ovf 直接搬走迁移镜像即可换机器要重装适合人群想学原理的、要长期跑的熟悉容器生态的有闲置硬件的虚拟机方案真正的价值在于边界清晰。Web 服务器挂了、数据库炸了、PHP 配置写错了最坏情况也就是在虚拟机内部重来一遍主机上的东西一根毛都不会掉。而 Docker 虽然轻但它的网络模型bridge、host、自定义网络和卷映射对新手来说反而是个更陡的坎——我见过太多人卡在容器里能看到文件、主机上找不到这种问题上。至于裸机除非你有一台完全闲置的机器可以专门干这件事否则我不建议。还有一个常被忽略的点虚拟机的快照功能本身就是最好的学习工具。你想试试升级 PHP 版本、想改数据库字符集、想装个没见过的插件拍个快照再动手搞坏了直接回到拍快照那一刻一分钟的事。这种随便试错的安全感是推动你把一套服务真正学明白的关键。1.2 为什么选 Server 版而不是 Desktop 版Ubuntu 23.10 提供了桌面版和 Server 版两种镜像nextcloud 部署必须选Server 版这不是偏好问题是刚需。桌面版自带图形界面安装包体积大约 4~5GB装完之后系统里跑着一堆桌面相关的服务显示管理器、输入法框架、通知中心、文件管理器索引进程。这些东西每一个都在吃内存和 CPU而你的虚拟机资源本来就紧张。更麻烦的是桌面版的图形界面在虚拟机里会持续消耗显存和 CPU 做渲染一台 4GB 内存的虚拟机装完桌面版可用内存可能只剩 2GB 出头再跑 Apache、PHP、MariaDB很容易在同步大文件的时候被 OOM Killer 干掉进程。Server 版装完大概 1.5~2GB跑起来常驻内存占用在 200MB 左右剩下全是给服务的。另外 Server 版默认不装图形界面所有的操作都通过命令行完成——这看起来是缺点实际上是优点因为你会发现网上关于 nextcloud 的所有教程、报错信息、配置文件路径全部都是基于命令行的图形界面在这里帮不上任何忙。提示如果你实在不习惯纯命令行可以装完 Server 版之后再补一个轻量的 Web 管理面板但不要装完整桌面环境这是两回事。另外一个必须提前说清楚的事情Ubuntu 23.10 是短期支持版本不是 LTS。它的官方维护周期只有 9 个月理论上到 2024 年 7 月就已经停止常规安全更新了。这意味着如果你是要长期跑的生产环境我强烈建议换成 22.04 LTS 或者更新的 LTS 版本。但如果你只是想学习、想在内网搭个实验环境23.10 完全够用软件包版本还更新一些自带的 PHP 是 8.2MariaDB 是 10.11兼容性上反而更省心。这个取舍你自己判断我后面所有命令都是按 23.10 的包名写的LTS 版本上包名基本一致个别地方需要微调。1.3 资源规划内存、CPU、磁盘到底给多少这一步决定你后面会不会因为资源不够而反复返工值得花十分钟算清楚。先说结论再给你推导过程。资源项最低可用推荐配置为什么CPU1 核2 核文件同步是 CPU 敏感型任务内存2 GB4 GBPHP 数据库 系统缓存系统盘20 GB40 GB系统 程序 数据库数据盘按需单独挂载 100GB数据与系统分离方便迁移内存这块我拆开算一下。Ubuntu Server 23.10 系统本身常驻约 200~300MBApache 用 mod_php 模式跑每个 PHP 进程大概占 40~80MBnextcloud 的请求并发一上来就是 5~10 个进程算 500MB 左右MariaDB 默认的 InnoDB 缓冲池是 128MB加上各种线程开销算 400MB再留 500MB 给文件系统缓存和系统突发占用。加起来大约是 1.7GB所以 2GB 是能跑起来但紧张4GB 是跑得舒服。磁盘分两块来看。第一块是系统盘Ubuntu Server 装完加常用工具大概占 6~8GBPHP 相关扩展再加 200MBNextcloud 程序本体解压后约 500MB。给 40GB 是留出后续升级和日志增长的空间没必要省。第二块是数据盘这才是真正需要计算的地方。按每个用户分配 50GB 配额来算5 个用户就是 250GB10 个用户就是 500GB。数据盘我给的建议是系统盘和数据盘分开。虚拟机里挂两块虚拟磁盘系统装在 40GB 那块上nextcloud 的数据目录默认就叫 data单独挂到另一块盘上。这样做的好处是将来想迁移数据、想扩容、想做快照都可以只针对数据盘操作系统盘随便折腾。如果虚拟机软件支持精简置备Thin Provision数据盘实际占用只按写入量增长虚报 500GB 是完全安全的。注意千万不要用软链接把数据目录指向一个通过网络共享挂载的路径。nextcloud 对数据目录的文件锁有严格要求放在网络共享上会出现文件锁定失败的诡异报错而且很难排查。2. 虚拟机创建与 Ubuntu 23.10 Server 安装实操环境准备好了就开始动手。这一章我会把虚拟机创建的每一个关键参数都讲清楚它是干什么的因为很多人在这一步随手点下一步后面遇到网络不通、磁盘不够用的时候又完全不知道问题出在哪。2.1 虚拟机软件选择与安装要点主流的虚拟机软件就那么几款桌面端用 VMware Workstation 或者 VirtualBoxWindows 11 上还可以用自带的 Hyper-V。这三款都能完成任务差异主要在细节体验上。VMware Workstation 的优点是网络配置界面直观、快照管理好用、USB 设备直通稳定缺点是个人使用需要留意授权条款。VirtualBox 完全免费开源功能也够用但网络配置相对绕一点桥接模式有时候需要额外装扩展包。Hyper-V 是系统自带的性能不错但它和 VirtualBox 之类的软件存在底层冲突同一台机器上一般只能启用一个。我的建议是手上有什么就用什么不要把时间浪费在换软件上。如果你之前装过 VMware 的虚拟机但打不开配置界面比如菜单里没有设置选项一般是虚拟机处于运行或挂起状态先关机再进设置就好如果是在 Windows 上安装后提示需要管理员权限右键用管理员身份运行一次即可之后正常启动。安装完虚拟机软件后先做两件事一是确认 CPU 虚拟化支持已经在 BIOS 里打开Intel VT-x 或 AMD-V二是确认宿主机有至少 8GB 内存否则你自己用起来会卡。至于虚拟机文件存放位置别放系统盘找一个空间充裕的分区因为后面虚拟机会越滚越大。2.2 新建虚拟机的关键参数怎么填新建虚拟机的向导里这几个参数是关键其他的一路默认即可。CPU 分配 2 核。1 核也能跑但 nextcloud 在生成图片预览、扫描文件、计算文件校验和的时候会明显感到卡顿。宿主机如果是 4 核以上给 2 核是安全的不要把所有核心都分配出去。内存 4096MB。如果你宿主机只有 8GB 内存那就给 2048MB同时后续在系统里配置 2GB 的 swap 分区来补足。我下面给的所有命令在 2GB 内存下也能跑通。磁盘 40GB选择拆分成多个文件。这个选项是让虚拟磁盘随使用量增长而不是一创建就占满 40GB 物理空间。对于 SSD 宿主机来说这个选项几乎没有性能损失但能省下大量空间。网络适配器先选 NAT。原因后面 2.4 节会详细讲简单说就是 NAT 模式下虚拟机一定能上网装系统时需要联网下载一些东西这是最稳的起步配置。固件类型选 UEFI如果向导里有这个选项不要选 BIOS。UEFI 启动更快而且现在的系统镜像基本都是按 UEFI 优化的。如果虚拟机启动后卡在 boot 提示界面九成是固件类型和镜像不匹配——把镜像重新挂载一次或者切换固件类型再试。不要勾选启动时连接软盘之类的选项这些老古董留着只会让启动顺序变复杂。启动顺序里把光驱/CD-ROM 排到硬盘前面装完系统后可以不管它UEFI 会自动跳过空光驱。创建完成后先在虚拟机设置里把安装镜像Ubuntu 23.10 Server 的 ISO 文件挂到虚拟光驱上。Ubuntu 官方下载页面提供的是 Live Server 镜像文件名类似ubuntu-23.10-live-server-amd64.iso大小约 2GB。下载完记得校验一下哈希值镜像损坏会导致安装过程随机出错那种问题排查起来非常浪费时间。2.3 网络模式的选择NAT 还是桥接这是新手最容易困惑的一个点我用最直白的方式解释。NAT 模式虚拟机会被分配一个私有网段的地址VMware 默认是 VMnet8 网段形如 192.168.x.x。虚拟机能访问外网但局域网里的其他设备看不见它。宿主机可以直接访问虚拟机的网站因为宿主机本身就是这个虚拟网络的网关。如果你只是想让宿主机自己访问 nextcloudNAT 完全够用。桥接模式虚拟机会像一台独立设备一样接入你家路由器分到一个和宿主机同网段的地址。这时候手机、平板、家里的其他电脑都能直接访问虚拟机的 IP适合全家人都要用的场景。我的实操建议是先装系统用 NAT装完之后再切桥接或者反过来也行只要记得切换后虚拟机的 IP 会变。因为如果你一上来就用桥接路由器分配的 IP 可能是动态的下次重启虚拟机地址就变了你会莫名其妙发现网站打不开了。所以无论用哪种模式后面第三章我都会让你配置静态 IP这是必须做的一步。还有一种情况值得提一下如果你用的是 NAT 模式但想让宿主机之外的设备访问需要在虚拟机软件里配置端口转发把宿主机的 80 端口映射到虚拟机的 80 端口。不过这只是临时方案长期跑还是桥接 静态 IP 更省心。提示如果你在虚拟机的网络适配器列表里看到 VMnet1 带黄色感叹号那是该虚拟网卡没有正确安装或被禁用通常重装一次虚拟网卡或者重启宿主机的虚拟网络服务即可。这个报错和你要部署的 nextcloud 没有直接关系但如果虚拟网卡彻底失效NAT 模式下的虚拟机就上不了网。2.4 Ubuntu 23.10 Server 安装过程的每一步镜像挂好开机。下面按安装向导的顺序说每一步只讲需要注意的地方。启动引导出现 GRUB 菜单时选 Try or Install Ubuntu Server直接回车。如果屏幕卡住超过两分钟没反应多半是 ISO 没挂对关机检查虚拟光驱设置。语言选择选 English。不要选中文因为 Server 版的中文语言包在部分终端环境下会出现乱码而且所有报错信息在网上检索时都是英文的选英文能让你搜索效率提升一个量级。系统装完后可以单独配置时区和中文输入支持不影响使用。键盘布局默认 English (US) 就行。安装类型选 Ubuntu Server不要选 Ubuntu Server (minimized)。精简版会省掉一些你后面要用的工具包反而要手动补装。网络配置向导会自动通过 DHCP 拿到一个地址。这一步先接受装完系统后我们再去配置文件里改成静态 IP。如果这里显示网络未连接检查虚拟机的网络适配器是否勾选了已连接以及是不是选了仅主机模式。代理配置留空直接继续。镜像源地址默认的官方源在国内访问可能较慢。如果你的宿主机网络环境正常直接用默认如果下载很慢可以在这一步填一个就近的镜像源地址格式是完整的 URL。这一步填错了会导致安装非常慢但不会失败装完之后还能改。磁盘分区这是最关键的一步。选择 Custom storage layout然后手动创建分区。我的建议方案是挂载点大小文件系统说明/boot/efi512 MBfat32UEFI 必需/剩余全部ext4系统与程序swap2 GBswap内存不足时的缓冲因为这一章我们只在系统盘上装系统数据盘可以在系统装好后再挂载。如果你已经一次性挂了两块虚拟磁盘可以在这一步顺便把第二块盘也划分好挂载点写/var/ncdata不过这个目录必须先创建出来。用户信息用户名建议用简单的英文比如ncadmin。密码设复杂一点因为这台机器后面会暴露在局域网里。这个用户会自动拥有 sudo 权限。SSH 服务勾选 Install OpenSSH server。这样以后你可以用宿主机的终端软件直接连进去操作不用在虚拟机窗口里敲命令效率高很多。软件包选择向导最后会问你要不要预装一些软件比如 docker、各种服务全部不选直接继续。我们要自己一步步装这样出问题才知道是哪个环节。安装过程大约 5~10 分钟。结束后提示重启记得先把虚拟光驱里的 ISO 卸载或者断开否则可能又从光盘启动一遍。重启后用刚才设的账号登录看到命令提示符系统部分就完成了。3. Nextcloud 服务端部署全流程这一章是核心。我们按系统初始化 → 装环境 → 建数据库 → 放程序 → 配 Web 服务器 → 浏览器初始化 → 命令行加固的顺序推进每一步都会说明它在干嘛。3.1 系统初始化更新、时区、主机名、静态 IP登录后第一件事是更新系统并装几个基础工具sudo apt update sudo apt full-upgrade -y sudo apt install -y curl wget unzip vim net-tools接着设置时区和主机名。时区错了会导致日历、日志时间全乱sudo timedatectl set-timezone Asia/Shanghai sudo hostnamectl set-hostname cloud然后配置静态 IP。Ubuntu Server 用 netplan 管理网络配置文件一般在/etc/netplan/下文件名类似00-installer-config.yaml。用ip a先看清你的网卡名常见的是ens33、ens160、enp0s3然后编辑network: version: 2 ethernets: ens33: dhcp4: false addresses: - 192.168.1.50/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: [192.168.1.1, 223.5.5.5]这里192.168.1.50是你想给虚拟机固定的地址/24表示子网掩码 255.255.255.0via 192.168.1.1是网关也就是你家路由器的地址。网关地址一定要填对填错了虚拟机就上不了网。改完后执行sudo netplan apply ip a确认地址已经生效。另外要提醒一句这个静态地址要选在路由器的 DHCP 分配范围之外否则可能出现地址冲突比如路由器给别的设备也分了 .50。如果你不确定 DHCP 范围选一个偏大的数字比如 .200 之后的。注意netplan 的 YAML 文件对缩进极其敏感必须用空格不能用 Tab。改错了执行netplan apply会直接报错并提示行号照着改就行。3.2 LAMP 栈安装Apache、PHP 8.2 与 MariaDBNextcloud 官方推荐的是 Apache PHP 数据库MySQL/MariaDB/PostgreSQL 三选一的组合。数据库这块很多人第一反应会想到 Microsoft SQL Server 那套但 nextcloud 对它的支持并不完整官方主推的是 MariaDB 或者 PostgreSQL。MariaDB 在 Ubuntu 23.10 的仓库里是 10.11 版本跟 nextcloud 的兼容性经过大量验证我们用这个。一条命令把需要的包全装上sudo apt install -y apache2 mariadb-server \ libapache2-mod-php php-gd php-mysql php-curl php-mbstring \ php-intl php-gmp php-bcmath php-xml php-imagick php-zip \ php-apcu php-redis imagemagick这里面每个 PHP 扩展都有它的用处我把关键的几个列出来这样你以后看到 PHP module xxx is missing 的提示就知道该装哪个扩展作用缺了会怎样php-gd图片缩略图处理相册不显示预览图php-intl国际化与本地化页面语言混乱php-gmp大数运算部分加密功能异常php-bcmath精确数学运算配额计算可能出错php-imagick高级图像处理无法生成视频缩略图、图片预览变差php-xmlXML 解析安装向导直接报错php-mbstring多字节字符处理中文文件名乱码php-zip压缩包处理无法下载文件夹为 zip现实验证下来php-imagick和php-intl这两个是最容易被忽略但又最影响体验的一定要装。装完之后重启 Apache 让 PHP 模块生效sudo systemctl restart apache2 sudo systemctl enable apache23.3 数据库规划与建库建号MariaDB 装好后在 Ubuntu 上 root 用户默认走 unix_socket 认证也就是说你只要用 sudo 就能直接进数据库不需要密码sudo mysql进去之后创建数据库和专用账号。这里有个细节字符集必须用 utf8mb4而且排序规则要用 general_ci 或者 unicode_ci否则中文文件名、emoji 表情都会出问题CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER ncuserlocalhost IDENTIFIED BY 换成你的强密码; GRANT ALL PRIVILEGES ON nextcloud.* TO ncuserlocalhost; FLUSH PRIVILEGES; EXIT;有几个点要注意。第一不要把数据库账号设成 root也不要用 root 去连 nextcloud权限太大反而危险而且 MariaDB 的 root 走 socket 认证模式PHP 用 TCP 连是连不上的很多人卡在这一步就是因为填了 root 账号。第二密码里别用特殊符号中的引号类字符容易在配置文件转义时出问题。第三localhost不能改成127.0.0.1之外的其他地址除非你的数据库在另一台机器上。创建完之后立刻验证一下能不能连mysql -u ncuser -p -h localhost nextcloud -e SELECT 1;能返回结果就说明账号没问题可以进入下一步。3.4 下载 Nextcloud、目录规划与权限设置目录规划我建议这样路径用途/var/www/nextcloud程序本体/var/ncdata用户数据与配置数据把数据目录放在 Web 根目录外面是个重要的安全习惯这样即使 Web 服务器被配置错误暴露了目录列表数据文件也不会被直接下载。下载并解压cd /tmp wget https://download.nextcloud.com/server/releases/latest.zip unzip latest.zip sudo mv nextcloud /var/www/创建数据目录并设置权限sudo mkdir -p /var/ncdata sudo chown -R www-data:www-data /var/www/nextcloud sudo chown -R www-data:www-data /var/ncdata sudo chmod -R 755 /var/www/nextcloud sudo chmod -R 750 /var/ncdata这里解释一下为什么是 www-data。Apache 在 Ubuntu 下默认以www-data用户运行它必须有权限去读写这些目录。755 表示所有者可读写执行其他人可读可执行750 表示其他人完全没权限数据目录用更严格的权限。注意每次执行 occ 命令时都必须用sudo -u www-data php occ因为 occ 会在数据目录下写文件。如果你直接用 root 跑会生成一批 root 属主的文件然后 Web 页面就会报无法写入 config 目录而且这个错误很难从表面看出来原因。3.5 Apache 虚拟主机配置与 PHP 参数调优先启用需要的 Apache 模块sudo a2enmod rewrite headers env dir mime ssl sudo systemctl restart apache2新建配置文件/etc/apache2/sites-available/nextcloud.confVirtualHost *:80 ServerName cloud.lab.local DocumentRoot /var/www/nextcloud Directory /var/www/nextcloud/ Require all granted AllowOverride All Options FollowSymLinks MultiViews /Directory ErrorLog ${APACHE_LOG_DIR}/nextcloud_error.log CustomLog ${APACHE_LOG_DIR}/nextcloud_access.log combined /VirtualHostAllowOverride All这一行是关键nextcloud 自带.htaccess文件来做 URL 重写和安全防护如果这里是AllowOverride None页面会直接报 500 错误。启用站点并禁用默认站点sudo a2ensite nextcloud.conf sudo a2dissite 000-default.conf sudo systemctl reload apache2接着调 PHP。编辑/etc/php/8.2/apache2/php.ini找到并修改这几项memory_limit 512M upload_max_filesize 16G post_max_size 16G max_execution_time 3600 max_input_time 3600 output_buffering 0 date.timezone Asia/Shanghai这里的数值不是随便填的。upload_max_filesize和post_max_size必须配套一般post_max_size要略大于等于upload_max_filesize因为上传时除了文件本身还有表单数据。memory_limit设 512M 就够了因为 nextcloud 用的是分块上传不会把整个 16GB 文件读进内存——这是很多人误解的地方以为要传大文件就得设一个巨大的 memory_limit其实设置过大反而容易把服务器拖垮。再单独建一个 opcache 配置文件/etc/php/8.2/apache2/conf.d/99-nextcloud-opcache.iniopcache.enable1 opcache.enable_cli1 opcache.memory_consumption256 opcache.interned_strings_buffer32 opcache.max_accelerated_files10000 opcache.save_comments1 opcache.revalidate_freq60opcache.save_comments1必须开nextcloud 的很多功能依赖代码注释里的注解信息关掉之后会出现一些非常隐蔽的报错。改完重启sudo systemctl restart apache23.6 浏览器完成初始化向导到这一步打开宿主机浏览器访问http://192.168.1.50换成你设的静态 IP应该能看到 nextcloud 的安装向导了。如果打不开先跳到第五章排查。向导里填这些管理员账号用户名和密码自己定密码要强。这个账号是超级管理员别用 admin 这种容易被猜到的名字。数据目录改成/var/ncdata不要用默认的/var/www/nextcloud/data。数据库类型选 MySQL/MariaDB地址填localhost数据库名nextcloud用户ncuser密码填刚才设的表前缀保持默认的oc_。点安装等一两分钟。安装过程会创建几十张表如果卡在这一步超过三分钟多半是数据库连接有问题去/var/log/apache2/nextcloud_error.log看具体报错。安装完成后会跳转到登录页。这时候先别急着传文件还有几项必须的配置要做。3.7 occ 命令行收尾与安全加固occ是 nextcloud 的命令行管理工具位于程序根目录下。先进入维护模式cd /var/www/nextcloud sudo -u www-data php occ maintenance:mode --on添加信任域名。默认配置只信任localhost用 IP 访问会提示 Access through untrusted domainsudo -u www-data php occ config:system:set trusted_domains 1 --value192.168.1.50如果你还打算用域名访问继续加2、3这样的序号。序号 0 是 localhost不要覆盖它。设置默认电话区域和强制 HTTPS 前的准备sudo -u www-data php occ config:system:set default_phone_region --valueCN sudo -u www-data php occ config:system:set overwrite.cli.url --valuehttp://192.168.1.50/顺手加上 APCu 缓存和几个后台任务配置sudo -u www-data php occ config:system:set memcache.local --value\OC\Memcache\APCu sudo -u www-data php occ config:system:set filelocking.enabled --valuetrue sudo -u www-data php occ background:cron最后一步是配置系统 cron 来跑后台任务。nextcloud 默认用 AJAX 方式触发后台任务用户不打开页面就不干活缩略图、文件扫描都会滞后。改用系统 cron 更靠谱sudo crontab -u www-data -e加入这一行每 5 分钟执行一次*/5 * * * * php -f /var/www/nextcloud/cron.php退出维护模式sudo -u www-data php occ maintenance:mode --off sudo -u www-data php occ maintenance:repairmaintenance:repair会修复一些数据库结构和文件缓存的问题装完跑一次是个好习惯。4. 让主机和局域网设备访问这台虚拟机服务跑起来了但如果只有宿主机的浏览器能打开那这个私有云盘的价值就丢了一大半。这一章解决访问问题顺便把 HTTPS 补上。4.1 三种网络模式下的访问路径分情况说。NAT 模式宿主机可以直接访问虚拟机的 IP但局域网里其他设备不行。VMware 的 NAT 网络默认是 VMnet8 段你的虚拟机 IP 就在这个网段里。如果想让手机也能访问需要在虚拟机的网络设置里添加一条端口转发规则把宿主机的 8080 端口映射到虚拟机的 80 端口然后手机访问http://宿主机IP:8080。这个方案能用但每次宿主机 IP 变了都要改不太适合长期。桥接模式虚拟机拿到和宿主机同网段的地址家里所有设备都能直接访问。这是我最推荐的方案。切换方法是先关掉虚拟机在虚拟机设置里把网络适配器从 NAT 改成桥接桥接到宿主机实际联网的那块网卡不要桥接到虚拟网卡开机后重新配置 netplan 里的静态 IP注意要换成新网段的地址。仅主机模式虚拟机和宿主机组成一个独立网络只能互相访问完全不能上外网。适合纯实验不推荐日常使用。切换网络模式后记得回头修改trusted_domains把新的 IP 加进去否则又会报 untrusted domain。4.2 自签名证书与强制 HTTPS内网环境用 HTTP 其实问题不大但 nextcloud 的客户端尤其是手机 App对 HTTPS 有要求很多功能在没有加密的情况下会被限制。内网没有公网域名申请正式证书不现实用自签名证书是最实际的方案。生成证书sudo openssl req -x509 -nodes -days 825 -newkey rsa:2048 \ -keyout /etc/ssl/private/nextcloud.key \ -out /etc/ssl/certs/nextcloud.crt \ -subj /CCN/STLocal/LLocal/OHomeLab/CN192.168.1.50这里把CN设置成 IP 地址因为浏览器访问时用的就是 IP。825 天这个数值是苹果系设备对证书有效期的上限超过之后 iOS 客户端会拒绝连接。再建一个 HTTPS 的虚拟主机配置/etc/apache2/sites-available/nextcloud-ssl.confVirtualHost *:443 ServerName 192.168.1.50 DocumentRoot /var/www/nextcloud SSLEngine on SSLCertificateFile /etc/ssl/certs/nextcloud.crt SSLCertificateKeyFile /etc/ssl/private/nextcloud.key Directory /var/www/nextcloud/ Require all granted AllowOverride All Options FollowSymLinks MultiViews /Directory Header always set Strict-Transport-Security max-age15552000; includeSubDomains ErrorLog ${APACHE_LOG_DIR}/nextcloud_ssl_error.log CustomLog ${APACHE_LOG_DIR}/nextcloud_ssl_access.log combined /VirtualHost启用并重载sudo a2ensite nextcloud-ssl.conf sudo systemctl reload apache2然后在 nextcloud 里告诉它自己跑在 HTTPS 后面sudo -u www-data php occ config:system:set overwriteprotocol --valuehttps浏览器访问https://192.168.1.50会提示证书不受信任这是自签名证书的正常现象点高级 → 继续访问即可。手机客户端连接时也会提示选择信任就行。注意如果你后面把 IP 改了证书里的 CN 就对不上了需要重新生成一次证书。这是自签名方案的最大不便之处如果介意可以考虑用内网的 DNS 给自己解析一个固定域名再签证书。4.3 桌面端和手机端首次连接浏览器登录成功后建议先装桌面客户端。在客户端里填服务器地址https://192.168.1.50然后会跳到浏览器做一次授权登录授权完成后客户端就接管了。桌面客户端的核心价值是选择性同步和虚拟文件功能前者让你只同步指定子文件夹后者让你在本地只看到文件名、点开才下载对硬盘小的机器特别友好。手机端同理装完填服务器地址授权登录然后打开相册自动备份。这里有个实操经验第一次自动备份千万不要一次性全开如果你的相册里有几万张照片服务器会被瞬间打满PHP 进程数和数据库连接数都会爆。建议先设置只备份最近一个月的照片观察服务器负载稳定之后再逐步放开。5. 踩坑实录与常见问题速查前面几章都是顺利路径但实际部署中一定会遇到问题。这一章把我踩过的坑整理出来你遇到报错的时候可以直接对照。5.1 安装阶段最常翻车的四个点第一个坑Apache 起来了但页面 500。九成是.htaccess没生效检查虚拟主机配置里的AllowOverride All有没有写以及rewrite模块有没有启用sudo a2enmod rewrite。极少数情况是 SELinux/AppArmor 拦截Ubuntu 默认不启用 SELinux可以忽略。第二个坑安装向导卡在数据库那一步。最常见的原因是数据库用户填了root。MariaDB 的 root 走 socket 认证PHP 通过 TCP 连不上。换成我们创建的ncuser就好。其次是数据库主机名填了127.0.0.1之外的地址或者密码里带了引号类字符。第三个坑装完之后提示无法写入 config 目录。这是权限问题而且往往是你之前用 root 跑过一遍 occ 命令导致的。解决办法是统一改回 www-datasudo chown -R www-data:www-data /var/www/nextcloud sudo chown -R www-data:www-data /var/ncdata第四个坑上传大文件失败进度条到某个百分比就断。检查三处php.ini里的upload_max_filesize和post_max_size、Apache 的反向代理设置如果你用了、以及虚拟机的磁盘空间。还有一个隐蔽原因是/tmp分区太小PHP 上传时会先写到临时目录如果临时目录装不下分块就会失败。5.2 运行阶段报错速查表现象最可能的原因处理方向提示访问不受信任的域名trusted_domains 未加当前 IPocc 添加对应序号页面样式全乱、按钮无反应静态资源没加载URL 重写失效检查 rewrite 模块与 AllowOverride手机客户端连不上无 HTTPS 或证书被拒配置自签名证书并信任后台任务一直显示上次运行 X 小时前仍在使用 AJAX 模式配置系统 cron 并切换模式缩略图不显示缺 php-imagick 或 imagemagick补装并重启 Apache中文文件名乱码数据库字符集不是 utf8mb4重建数据库指定字符集与排序规则系统时间显示异常时区未设置timedatectl 设置并重启 PHP上传速度慢、CPU 打满图片预览生成占用资源限制预览尺寸或关闭视频预览磁盘空间莫名其妙满了日志或版本文件堆积检查 /var/log 与 data 下的临时目录页面打开空白PHP 内存不足或 opcache 异常查 error log重启 Apache这张表覆盖了八成以上的日常问题。遇到没见过的报错第一步永远是去看/var/log/apache2/nextcloud_error.log和/var/log/mysql/error.lognextcloud 自己的日志在/var/ncdata/nextcloud.log。这三个文件看下来基本没有查不出的问题。5.3 快照、备份与后续升级的取舍部署完成之后第一件事是给虚拟机拍快照。这时候是一个干净的、可用的基线状态后面不管怎么折腾都能退回这里。我给这台虚拟机的快照命名习惯是带上日期和状态描述比如2024-05-10-clean-install这样一眼就知道退回的是哪个阶段。日常备份分两层。系统层用虚拟机快照每周或者每次做重大变更之前拍一次快照不要超过三天的使用周期因为它会占用磁盘空间而且长期保留大量快照会拖慢虚拟机性能。数据层用 nextcloud 自带的方式occ里有导出配置的命令数据目录直接复制就行。如果数据量大用rsync做增量同步到另一块盘或者 NAS 上是更实际的方案。备份的时候要特别注意三样东西必须一起备份缺一个都恢复不了数据目录含 config、数据库导出、以及occ的当前版本号。数据库可以用mysqldump导出mysqldump -u ncuser -p --single-transaction --routines --triggers nextcloud nextcloud-db-$(date %F).sql--single-transaction保证导出期间不会锁表服务可以继续运行。升级这件事我要泼一盆冷水nextcloud 的跨大版本升级必须逐级进行不能跳版本。比如你现在装的是 27想升到 29必须 27 → 28 → 29 这样走而且每个大版本的最后一个小版本才允许升级到下一个大版本。升级过程中数据目录一旦损坏恢复成本极高。所以我的实操原则是能不动就不动要升级先拍快照升级前做好数据库和数据的完整备份。至于occ upgrade之外的那些一键升级脚本我建议谨慎使用。它们大多会跳过版本检查直接替换文件短期看着方便长期容易留下数据库结构和代码不匹配的隐患而这种问题往往在几个月后才以奇怪的方式暴露出来。我个人在这套环境上跑了挺长时间最大的体会是把最初始的安装过程完整走一遍比事后看一百篇排查文章都管用。因为当你亲手敲过每一条命令、见过每一个配置文件在什么地方后面遇到任何报错你脑子里都能大致定位到是哪一层出了问题——是网络、是 Web 服务器、是 PHP 还是数据库。这种层次感才是手工部署虚拟机方案最有价值的部分也是我到现在还不用一键脚本的原因。
返回列表