title: Nextcloud 使用笔记
src: posts/2022-07-31-nextcloud.md
change log: None
created at: Jan. 24, 2026, 12:39 p.m., last updated: Jan. 24, 2026, 12:39 p.m.
先记录从一台旧电脑搬到另一旧电脑的操作步骤。总共耗时 1 天半,其中半天的时间卡在 nextcloud 和 php 不停报错的地方。
旧电脑是一台十年前家电下乡买的32位的联想笔记本 Debian 系统,从大学用到研究生毕业。现在屏幕坏了几条线,键盘也坏了,网卡时而不灵,光驱改装成了硬盘和。最后这半年用来做了个 nextcloud 服务器,感觉很棒。今天这台正式退役,感谢陪伴。
首先关掉服务。进入
sudo systemctl stop apache2
然后备份数据。参考 https://docs.nextcloud.com/server/31/admin_manual/maintenance/migrating.html
mysqldump -u root -pxxxx file > backup.sql # 数据库(账号密码这些)
rsync -av nextcloud > backup_folder/ # 应用
rsync -av /data/cloud > backoup_data/ # 数据盘,非常大,珍贵的数据
没安装前 APCU 先注释掉('memcache.local' => '\OC\Memcache\APCu',),否则新电脑刚开始用的时候会报错
Internal Server Error
The server encountered an internal error and was unable to complete your request.
Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report.
More details can be found in the server log.
新电脑是海鲜市场 400 块买的二手 nuc + 700 元二手硬盘盒(raid2 + 3)+ 两块 800 元 4T 的红盘(CMR)。

首先装好 debian server 系统。
然后配置 fstab 自动挂载 USB 接口的硬盘盒, fstab 使用参考。
# nextcloud
UUID=1cc2924d-80e7-4a8c-a20b-c39019c9f5f3 /data ext4 defaults,nofail 0 0
硬盘盒给 nextcloud 用来存用户数据,一定要记得加 nofail,不然u盘拔了就开不了机了。
Devices that are listed and not present will result in an error unless the nofail option is used.
sudo fdisk -l
sudo blkid
sudo vim /etc/fstab
重启确认大硬盘 ok。
apt install apache2 libapache2-mod-php mariadb-server wget unzip bzip2 curl mariadb-server
# php 还是推荐自己编译好了
# apt install php php-common php-curl php-gd php-mbstring php-mysql php-xml php-zip php-intl php-apcu php-imagick libmagickcore-6.q16-6-extra php-gmp php-bcmath
编辑文件 /etc/apache2/sites-available/nextcloud.conf
<VirtualHost *:80>
DocumentRoot /var/www/nextcloud
ServerName cloud.atian.icu
ServerAdmin a.tian@live.cn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /var/www/nextcloud/>
Require all granted
AllowOverride All
Options FollowSymLinks MultiViews
<IfModule mod_dav.c>
Dav off
</IfModule>
</Directory>
</VirtualHost>
sudo mariadb-secure-installation
如果需要链接dbear的话 sudo vim /etc/mysql/mariadb.cnf # 127.0.0.1 -> 0.0.0.0
添加账号和数据库。
CREATE DATABASE nextcloud;
CREATE USER 'nextcloud'@'%' identified by 'XXXXX';
CREATE USER 'nextcloud'@'localhost' identified by 'XXXXX';
GRANT Alter ON nextcloud.* TO 'nextcloud'@'localhost';
GRANT Create ON nextcloud.* TO 'nextcloud'@'localhost';
GRANT Create view ON nextcloud.* TO 'nextcloud'@'localhost';
GRANT Delete ON nextcloud.* TO 'nextcloud'@'localhost';
GRANT Delete history ON nextcloud.* TO 'nextcloud'@'localhost';
GRANT Drop ON nextcloud.* TO 'nextcloud'@'localhost';
GRANT Grant option ON nextcloud.* TO 'nextcloud'@'localhost';
GRANT Index ON nextcloud.* TO 'nextcloud'@'localhost';
GRANT Insert ON nextcloud.* TO 'nextcloud'@'localhost';
GRANT References ON nextcloud.* TO 'nextcloud'@'localhost';
GRANT Select ON nextcloud.* TO 'nextcloud'@'localhost';
GRANT Show view ON nextcloud.* TO 'nextcloud'@'localhost';
GRANT Trigger ON nextcloud.* TO 'nextcloud'@'localhost';
GRANT Update ON nextcloud.* TO 'nextcloud'@'localhost';
flush privileges;
导入数据。
mysql -u root -pxxxxxxx nextcloud < nextcloud.sql
2023 年 nextcloud 25 以上不支持自带的 php7.4(debian 11) 了,准备从源码编译, 以下内容记录如何在不使用 apt install php 的情况下 编一个适合 nextcloud 使用的 php 环境。
首先卸载系统自带的 php(也可以不卸载,反正用不到)。
sudo apt auto-remove php
安装编译需要的其他组件。
sudo apt install build-essential autoconf libtool bison re2c pkg-config libxml2-dev libsqlite3-dev libssl-dev zlib1g-dev apache2-dev libbz2-dev libcurl4-openssl-dev libpng-dev libonig-dev libzip-dev libsodium-dev libfreetype-dev libmagickcore-dev libmagickwand-dev libgmp-dev
# debian 12 不需要 bzip2-devel
下载解压配置 php 源码工程。
wget http://xxxx -O phpxxx.tar.gz
tar -xzvf phpxxx.tar.gz
./configure --with-curl --enable-gd --enable-mbstring --with-openssl --with-zip --with-zlib --with-mysqli --with-pdo-mysql --with-bz2 --with-apxs2 --enable-intl --with-sodium --with-jpeg --with-freetype --enable-pcntl --enable-bcmath --enable-sysvsem --enable-exif --with-gmp
make
sudo make install # 安装到 /usr/local
sudo cp php.ini-production /usr/local/lib/php.ini
php -m
# check:
# https://docs.nextcloud.com/server/25/admin_manual/installation/source_installation.html
现在命令行版本的 php 就装好了。
/usr/local/lib/php.ini 需要改 2 行
zend_extension=opcache
;打开注释
memory_limit = 512M
;加大
这里一定要多看官方文档,迁移过程中的报错都能找到解决方法。有些报错在网页上看不出来,用 php occ 命令一下子能找到报错的 log。
sudo chown atian /var/www/html/
rsync -av /nextcloud_home/ /var/www/html/
sudo vim config/config.php
vim config/config.php
cli: sudo -u www-data php occ check
web: 能登录
现在进入安全区啦!🎉
接下来做的优化也非常重要,最终你可以得到这个绿色的大勾勾 ✔
部署 ssl ,参考 阿里的文档
<VirtualHost *:443>
DocumentRoot /var/www/nextcloud
ServerName cloud.atian.icu
ServerAdmin a.tian@live.cn
SSLEngine on
SSLCertificateFile /data/ssl/cloud.atian.icu_public.crt
SSLCertificateKeyFile /data/ssl/cloud.atian.icu.key
SSLCertificateChainFile /data/ssl/cloud.atian.icu_chain.crt
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
</IfModule>
<Directory /var/www/nextcloud/>
Require all granted
AllowOverride All
Options FollowSymLinks MultiViews
<IfModule mod_dav.c>
Dav off
</IfModule>
</Directory>
</VirtualHost>
sudo systemctl restart apache2
crontab -u www-data -e
*/5 * * * * /usr/local/bin/php -f /var/www/nextcloud/cron.php
按照 nextcloud 官网手册 提示打开功能即可
** debian 12 不用配置 **
php 装好后可以看到 /lib/apache2/modules/ 里面的 libphp.so 更新了。
ls /lib/apache2/modules/ -alh
total 54M
drwxr-xr-x 2 root root 20K Oct 14 10:46 .
drwxr-xr-x 3 root root 4.0K Jul 29 2022 ..
-rw-r--r-- 1 root root 17K Mar 8 2023 httpd.exp
-rw-r--r-- 1 root root 4.5M Feb 23 2023 libphp7.4.so <- 旧的没卸载的话在这里
-rw-r--r-- 1 root root 46M Oct 14 10:46 libphp.so <- 新安装的 php
根据 php 官方文档,配置 apache 想要正常用起来,还需要检查这两个文件:
# 检查 php.conf 文件(需要自己新建并且编辑一下)
cat /etc/apache2/mods-available/php.conf
<FilesMatch ".+\.ph(ar|p|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch ".+\.phps$">
SetHandler application/x-httpd-php-source
# Deny access to raw php sources by default
# To re-enable it's recommended to enable access to the files
# only in specific virtual host or directory
Require all denied
</FilesMatch>
# Deny access to files without filename (e.g. '.php')
<FilesMatch "^\.ph(ar|p|ps|tml)$">
Require all denied
</FilesMatch>
# Running PHP scripts in user directories is disabled by default
#
# To re-enable PHP in user directories comment the following lines
# (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
# prevents .htaccess files from disabling it.
<IfModule mod_userdir.c>
<Directory /home/*/public_html>
php_admin_flag engine Off
</Directory>
</IfModule>
# 检查 php.load (man install 的时候自己会添加)
cat /etc/apache2/mods-available/php.load
LoadModule php_module /usr/lib/apache2/modules/libphp.so
修改路由器 host,把 cloud.xxxx.xxx 的 ip 直接换成内网 ip。这样客户端只用配置一个域名就可以实现在家用内网,在外用外网的功能。提速又省流量!
DNS 直接写局域网地址
参考 配置frp
[common]
server_addr = xx.xx.xxx.46
server_port = 7000
[web_cloud]
type = https
local_port = 443
subdomain = cloud
通过 wol 功能。
ip addr # get xx:xx:xx:xx:xx:xx
sudo ethtool enp3s0 # Supports Wake-on: pumbg
sudo ethtool -s enp3s0 wol g
sudo vim /etc/network/interfaces # append -> up ethtool -s enp3s0 wol g
通过 ssh, 给用户免密关机权限,记得添加在最后,避免被其他规则覆盖了。
echo 'a-tian ALL=(root) NOPASSWD: /sbin/shutdown' > /etc/sudoers.d/a-tian
这样控制端(例如树莓派)可以脚本来开关这台服务器。
#开机
#!/bin/bash -e
/usr/bin/wakeonlan xx:xx:xx:xx:xx:xx
#关机
#!/bin/bash -e
ssh atian@nuc5 "sudo /sbin/shutdown"
控制端可以配合 cron 或者 jenkins 使用来设置一些规则,例如我每天早上 9 点开机,晚上 1 点关机
wget http://pear.php.net/go-pear.phar -O go-pear.php
sudo php go-pear.php
# 从 pecl 上找到的地址
pecl install apcu
You should add "extension=apcu.so" to php.ini
pecl install imagick
You should add "extension=imagick.so" to php.ini
备选方案:
github 网络问题,可以通过直接编译来安装(或者改 DNS):
wget https://pecl.php.net/get/imagick-3.8.0.tgz
tar -xvzf imagick-3.8.0.tgz
cd imagick-3.8.0/
phpize
./configure
make
sudo make install