目前已经从24.0.5升级到25.0.4(升级了4次)

原则 ,按官方手册。

好处,以后升级只用点打开升级器就行了(没啥意外都能成功)

要实现

一、     nextcloud的手动完全安装和http启动。

二、 https的实现。

三、优化(不定时更新中)

四、阿里域名解析的自动同步(本地有公网IP,但是不定时变化的,需要用阿里云解析以保证域名访问)

五、遗留问题

好处、可以直接B/S更新新版本,坏处,第一次安装动手的地方有点多。

安装环境   CentOS Stream release 9

php 8.1.11

apache  Apache/2.4.53 (CentOS Stream)

openssl版本  OpenSSL 3.0.1

nextcloud 版本 24.0.5

最终实现互联网的https域名访问nextcloud.

(docker的请看我其他文章)

一、     nextcloud的手动完全安装和http启动。

1、安装CentOS Stream 9

   默认安装,过程略

2、更新CentOS Stream 9

dnf update没反应,用的yum update. 就OK,后面再用dnf就正常,暂不知道原因。

yum update -y

3、安装其他

依赖包

dnf install -y epel-release yum-utils unzip curl wget \
bash-completion policycoreutils-python-utils mlocate bzip2

4、安装apache

4.1 安装

dnf install -y httpd

4.2服务加入自启动

systemctl enable httpd.service
systemctl start httpd.service

4.3 打开防火墙http和https 端口并更新(保证外网能访问)

firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --zone=public --add-service=https --permanent
firewall-cmd --reload

用自己电脑打开centos web页面,正常显示表示可正常访问。

5、创建网站配置文件

5.1 创建nextcloud.conf

 vi /etc/httpd/conf.d/nextcloud.conf

内容如下

<VirtualHost *:80>
  DocumentRoot /var/www/html/nextcloud/
  ServerName  your.server.com(根据实际情况改)

  <Directory /var/www/html/nextcloud/>
    Require all granted
    AllowOverride All
    Options FollowSymLinks MultiViews

    <IfModule mod_dav.c>
      Dav off
    </IfModule>

  </Directory>
</VirtualHost>

6、安装php

6.1 安装 Remi 存储库配置包的命令



dnf install https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-9.rpm

6.2 安装 yum-utils 软件包的命令(用于 yum-config-manager 命令):

dnf install yum-utils

 6.3 为 php 启用模块流:(请注意版本和你安装的php版本数字对应)

dnf module reset php
dnf module install php:remi-8.1
dnf update

6.4 安装所需模块

在原介绍上手动加入的全部的php模块

dnf install -y php php-gd php-mbstring php-intl php-pecl-apcu\
     php-mysqlnd php-opcache php-json php-zip php-posix php-fileinfo php-imap php-memcached php-gmp php-bcmath

6.5 安装可选模块 redis/imagick

dnf install -y php-redis php-imagick

7、数据库

7.1安装数据库主程序

dnf install -y mariadb mariadb-server

7.2 确保启用数据库服务以在引导时启动。

systemctl enable mariadb.service
systemctl start mariadb.service

7.3 提高 MariaDB 安全性:

mysql_secure_installation

命令执行后 默认安装第一个地方无密码


[root@localhost conf.d]# mysql_secure_installation

(不同版本略有不同)新手最好查一下每个地方的意思,确认y/n.免得不能远程连接数据库(比如备份)

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
无密码回车


Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n]
设置数据库密码,这里先yes

后面输入密码。并确认,再往后一路y

到这里完成


All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!
 

7.4 编辑数据库配置

vi /etc/my.cnf.d/ mariadb-server.cnf   (整体替换)

# These groups are read by MariaDB server.
# Use it for options that only the server (but not clients) should see
#
# See the examples of server my.cnf files in /usr/share/mysql/
#

# this is read by the standalone daemon and embedded servers
[server]
skip_name_resolve = 1
innodb_buffer_pool_size = 128M
innodb_buffer_pool_instances = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 32M
innodb_max_dirty_pages_pct = 90
query_cache_type = 1
query_cache_limit = 2M
query_cache_min_res_unit = 2k
query_cache_size = 64M
tmp_table_size= 64M
max_heap_table_size= 64M
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1

[client-server]
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mariadb.conf.d/

[client]
default-character-set = utf8mb4


# this is only for the mysqld standalone daemon
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mysqld/mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd


[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mariadb/mariadb.log
pid-file=/run/mariadb/mariadb.pid
character_set_server = utf8mb4
collation_server = utf8mb4_general_ci
transaction_isolation = READ-COMMITTED
binlog_format = ROW
innodb_large_prefix=on
innodb_file_format=barracuda
innodb_file_per_table=1
transaction_isolation = READ-COMMITTED
binlog_format = ROW
#
# * Galera-related settings
#
[galera]
# Mandatory settings
#wsrep_on=ON
#wsrep_provider=
#wsrep_cluster_address=
#binlog_format=row
#default_storage_engine=InnoDB
#innodb_autoinc_lock_mode=2
#
# Allow server to accept connections on all interfaces.

7.5 修改数据PHP模块数据库配置

vi /etc/php.d/30-pdo_mysql.ini
extension=pdo_mysql(原文是extension=pdo_mysql.so,但文档默认就是这样,我就没改了)

[mysql]
mysql.allow_local_infile=On
mysql.allow_persistent=On
mysql.cache_size=2000
mysql.max_persistent=-1
mysql.max_links=-1
mysql.default_port=
mysql.default_socket=/var/lib/mysql/mysql.sock  # Debian squeeze: /var/run/mysqld/mysqld.sock
mysql.default_host=
mysql.default_user=
mysql.default_password=
mysql.connect_timeout=60
mysql.trace_mode=Off
innodb_file_per_table=1

7.6 登录数据库并创建并为nextcloud创建库表

mysql -uroot -p

输入刚才创建的数据库root密码进入。

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.3.28-MariaDB-log MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>
 

CREATE USER 'nextcloud(自行决定用的库名B/S登录需要填写)'@'localhost' IDENTIFIED BY 'password(自行修改密码)';
CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
GRANT ALL PRIVILEGES on nextcloud.* to 'nextcloud(自行决定用的库名B/S登录需要填写)'@'localhost';
FLUSH privileges;

最后quit退出数据库。

7.7 验证创建情况(如果你用的账号是nextcloud)

 mysql -u nextcloud -p

输入密码进入数据库

执行 

show databases;

可得


+--------------------+
| Database           |
+--------------------+
| information_schema |
| nextcloud          |
+--------------------+
2 rows in set (0.002 sec)

数据库配置完成。

8、安装redis(确实不知道用不用装,哈哈)

dnf install -y redis
systemctl enable redis.service
systemctl start redis.service

9、下载存档文件并配置必要条件

9.1下载

官网---download server---ARCHIVE FILE

下载后是latest.zip(解压拷贝,或者拷贝再解压均可,目标是解压到var/www/html/nextcloud,注:不要搞两级nextcloud目录出来)

9.2 传输

拷贝到centos系统(如果windows有putty可以pscp拷贝pscp K:\XXXXXX\latest.zip root@XXX.XXX.XXX.XXXX:/var/www/html

在centos直接到var/www/html目录下直接执行unzip latest.zip,自动解压出nextcloud.

9.3 B/S初始化的数据文件目录准备

在B/S访问的初始化过程中,不会创建数据文件夹,因此我们将手动创建一个以帮助初始化安装向导:

建议创建到大的盘上比如/home/nextcloud/data

9.3.1 创建数据目录

mkdir /home/nextcloud

mkdir /home/nextcloud/data

9.3.2 链接数据盘到nextcloud网站

ln -s /home/nextcloud/data /var/www/html/nextcloud/data

9.3.3 确保网站读取权限

确保 apache 对整个 nextcloud 文件夹具有读写权限(软连接的数据目录也要赋权):

chown -R apache:apache /var/www/html/nextcloud

  chown -R apache:apache /home/nextcloud/data

9.3.4 重启阿帕奇

systemctl restart httpd.service

9.3.5 SELINUX设置

直接执行如下内容

semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/nextcloud/data(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/nextcloud/config(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/nextcloud/apps(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/nextcloud/.htaccess'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/nextcloud/.user.ini'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/nextcloud/3rdparty/aws/aws-sdk-php/src/data/logs(/.*)?'

restorecon -R '/var/www/html/nextcloud/'

setsebool -P httpd_can_network_connect on

关闭 selinux

setenforce 0

(如果页面访问有问题,把上面9.3.5的再执行一遍,我也不知道为什么)

完成HTTP页面配置。

重启阿帕奇

systemctl restart httpd.service

10 登录并初始化 

登录

XXX.XXX.XXX.XXX

进入登录页面

数据库选择mysql/maradDB.填写前面设置的账号,密码,库名,最后一个不用改

初始化完成后 

(如果出现  The gateway did not receive a timely response from the upstream server or application.

请访问登录为    XXX//index.php/login

)

(遇到过初始化卡死,但后面登录正常)

目前http的基本完成

重启阿帕奇,一些OK。

http模式安装到此结束。

二、 https的实现。

________________________________________________________________________

以下部分是配置https

本部分不包含apche证书申请第三方步骤,假设已经有了3个证书文件。

1、安装必要的SSL

yum -y install mod_ssl openssl

2、创建证书夹(根据实际情况)

在  /etc/httpd/中,创建一个cert目录并拷贝进去(方法自寻)。

3、修改vi /etc/httpd/conf.d/ssl.conf

查找以下内容修改(自己从默认的里面找了修改,部分是被注释掉的)(查找内容修改或添加,不是整体替换

<VirtualHost *:443>     
    ServerName   www.XXX.COM #修改为申请证书时绑定的域名。                    
    DocumentRoot "/var/www/html/nextcloud"
    SSLEngine on   
    SSLProtocol all -SSLv2 -SSLv3 # 添加SSL协议支持协议,去掉不安全的协议。
    SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM   # 修改加密套件。
    SSLHonorCipherOrder on
    SSLCertificateFile /etc/httpd/cert/XXXX_public.crt   # 将domain_name1_public.crt替换成您证书文件名。
    SSLCertificateKeyFile /etc/httpd/cert/XXX.key   # 将domain_name1.key替换成您证书的密钥文件名。
    SSLCertificateChainFile /etc/httpd/cert/XXX_chain.crt  # 将domain_name1_chain.crt替换成您证书的密钥文件名;证书链开头如果有#字符,请删除。
</VirtualHost>

4.重启apache 

systemctl restart httpd.service

完成,此时http.https均可访问

5.强制所有http重定向为https访问

修改/etc/httpd/conf.d/nextcloud.conf 

强制https,加入Redirect permanent / https://192.168.1.150   (以实际https地址为准)

修改后如下

<VirtualHost *:80>
  DocumentRoot /var/www/html/nextcloud/
  ServerName  192.168.1.150
  Redirect permanent / https://192.168.1.150

  <Directory /var/www/html/nextcloud/>
    Require all granted
    AllowOverride All
    Options FollowSymLinks MultiViews

    <IfModule mod_dav.c>
      Dav off
    </IfModule>

  </Directory>
</VirtualHost>

重启阿帕奇

systemctl restart httpd.service

三、优化部分(修改中)

配置工具

sudo -u apache /usr/bin/php /var/www/html/nextcloud/occ

执行系统cron

使用

sudo -u apache php -f /var/www/html/nextcloud/cron.php

配置1、优化 PHP 内存限制低于建议值 512MB

修改 vi /etc/php.ini中的

 memory_limit = 512M

重启PHP

systemctl restart php-fpm.service

配置2、改数据库(不知道是我第一次登录选错了,还是确实有问题,我的数据库被提示是qlite )

到nextcloud目录下直接执行(重装一遍确实没有这一步)

sudo -u apache php occ db:convert-type --all-apps mysql nextcloud  localhost nextcloud
 

配置三、MySQL 被用作数据库,但不支持 4 字节字符。要能够在文件名或评论中正确处理 4 字节字符 (如 emoji),建议在 MySQL 中启用 4 字节支持。(以前的,本次实际中没遇到)

到nextcloud目录下,进入维护模式

sudo -u apache php occ maintenance:mode --on

root权限进入数据库 mysql -uroot -p

输入 ALTER DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

退出,到nextcloud目录下

 sudo -u apache php occ maintenance:mode --off

sudo -u apache php occ config:system:set mysql.utf8mb4 --type boolean --value="true"
然后就好了。

配置四、内存缓存未配置。为了提升性能,请尽量配置内存缓存。

在  nexctloud/config/config.php中加入

'memcache.local' => '\OC\Memcache\APCu',

该参数根据文档提示,可不配置,但是配置了以后会导致OCC和cron任务异常。我改了,后来又注释掉了。

配置五,报错忘了,反正就是那个max-age

.在前面所属ssl.conf的<VirtualHost *:443> <VirtualHost>之间加入

    <IfModule mod_headers.c>
      Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
    </IfModule>

配置六

  • 您的网页服务器未正确设置以解析“/.well-known/webfinger”。更多信息请参见文档↗
  • 您的网页服务器未正确设置以解析“/.well-known/nodeinfo”。更多信息请参见文档↗
  • 您的网页服务器未正确设置以解析“/.well-known/caldav”。更多信息请参见文档↗
  • 您的网页服务器未正确设置以解析“/.well-known/carddav”。更多信息请参见文档↗

解决方案:

在上述的ssl.conf的<VirtualHost *:443> <VirtualHost>之间

加入 

<Directory /var/www/html>
    AllowOverride All
</Directory>

即可。

配置七、自动配置后台任务到cron自动任务

编辑apache账户cron

crontab -u apache -e

在新创建窗口输入,并保存

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

其他常见的配置建议请自行百度。

配置八、使用升级器升级后,有可能会有(升级了很多此只有1此有此提示)

提示为数据库丢失了一些索引。由于给大的数据表添加索引会耗费一些时间,因此程序没有自动对其进行修复。您可以在 Nextcloud 运行时通过命令行手动执行 "occ db:add-missing-indices" 命令修复丢失的索引。索引修复后会大大提高相应表的查询速度。

执行

 sudo -u apache /usr/bin/php /var/www/html/nextcloud/occ db:add-missing-indices

配置九、应用app更新超时的解决(主要是国际网络不稳定导致的)(慎改)

日志报告为Could not connect to appstore: Curl error 28  XXXXfromXXXX

表明是下了一部分网络波动导致的下载不完全,本办法不适合完全无数据的或其他原因的无数据(但是目前好像只遇到这种情况,不能更新或者报其他错误的,多试几次都可以)。

进入nextcloud文件夹。查找该文件nextcloud/lib/private/installer.php

在文档中查询timeout,修改其中的120到12000(1200好像还是不行我自己改的12000就没问题了)

$tempFile = $this->tempManager->getTemporaryFile('.tar.gz');
				$timeout = $this->isCLI ? 0 : 120;
				$client = $this->clientService->newClient();
				$client->get($app['releases'][0]['download'], ['sink' => $tempFile, 'timeout' => $timeout]);

注:此方法可能导致非此原因无法更新的app一直等待从而导致一直处于维护模式,需要手动关闭调用OCC关闭维护模式。

sudo -u apache /usr/bin/php /var/www/html/nextcloud/occ maintenance:mode --off(其他路径安装的自行修改)

如果是多个更新,(如emai),请自行判断是否更新结束(因为我有防火墙流量监控,流量2-3秒为0基本就可以判断有失败但又不是此类型的更新失败)。避免出现更新失败导致的意外情况。

配置十 PHP opchae得修改(修改前请bak.仅使用当前环境)

报错

  • PHP OPcache 模块没有正确配置。更多信息请参见文档 ↗
    • OPcache 内部字符串缓存几乎已满。为确保重复的字符串可以被有效地缓存,建议在您的 PHP 设置中 opcache.interned_strings_buffer 设置一个高于 8 的值。

/ETC/PHP.D/ 10-opcache.ini,查找修改如下参数,基本是连着得。

opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=512
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=1
opcache.save_comments=1

重启apache和php-fpm服务。

systemctl restart httpd.service

systemctl restart php-fpm.service

四、自动IP同步阿里云解析

默认centos 9 stream

自带python,默认没有安装pip,pip install aliyun-python-sdk-core aliyun-python-sdk-ecs会提示安装pip 

1、安装阿里云安装 aliyun-python-sdk-core 和 aliyun-python-sdk-ecs 

2\编写 域名IP修改dns.py

我只有A类地址

from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
import json
import requests
import re

# 初始化
client = AcsClient('XXXXXXXXX(填写自己DE)', 'XXXXXXXXXXXX(填写自己DE )', 'cn-hangzhou')
request = CommonRequest()
request.set_domain('alidns.aliyuncs.com')
request.set_version('2015-01-09')
domain = "your domain"
prefix = "www"

# 获取公网IP地址
html_text = requests.get("https://ip.tool.chinaz.com/").text
ip_text = re.findall(r'(?<![\.\d])(?:25[0-5]\.|2[0-4]\d\.|[01]?\d\d?\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)(?![\.\d])', html_text)
ip = ip_text[0]
print("公网IP地址:"+ ip)
print("域名:"+ prefix + "." + domain)

# 获取二级域名的RecordId
request.set_action_name('DescribeDomainRecords')
request.add_query_param('DomainName', domain)
response = client.do_action_with_exception(request)
jsonObj = json.loads(response.decode("UTF-8"))
records = jsonObj["DomainRecords"]["Record"]
record = None
for rec in records:
    if rec["RR"] == prefix:
        record = rec
        break
if record == None:
    print("未找到二级域名记录")
    exit()
elif record['Value'] == ip:
    print("现有IP记录已为最新")
    exit()

# 更新IP记录
request.set_action_name('UpdateDomainRecord')
request.add_query_param('RecordId', record['RecordId'])
request.add_query_param('RR', prefix)
request.add_query_param('Type', 'A')
request.add_query_param('Value', ip)
response = client.do_action_with_exception(request)

print("DDNS更新完成\n")

3、测试是否正常,执行python dns.py

4、加入自动计划任务/etc/crontab 

加入(每60分钟更新,前面是python目录,后面的dbs.py放的位置。修改成其他时间请自行百度)centos9的 自动任务默认是开启的。(centos9直接改文件好像不能生效(无论我重启服务重新加载crontal -l都是空的),直接在命令行用   crontab -e命令在新开窗的地方添加)

* */60 * * * /usr/bin/python /home/dns.py

[root@nextcloudcentos9 home]# python dns.py 
公网IP地址:XXX.XXX.XXX.XXX
域名:wwW.XXX.COM
现有IP记录已为最新

五 遗留问题

1、搭建完服务器后,每次重启服务器都提示某处权限问题。页面无法正常访问。

  但执行 setenforce 0  后就正常。所以我把它加入了开机启动项。再服务器服务器就没有问题了。重启就OK了。

2、安装完成。漏扫显示使用的SSL不安全。 默认openSLL下载的版本的3.0.1安全的版本是3.0.5以上。暂时没弄,因为貌似只能重新编译安装-_-!  不知道为啥yum install不给我直接装3.0.5的。而且编译完成,我的SSL是对了。但是我的yum和dnf不能用了。  还原之,先不折腾了。(可以不用管,后期随系统升级就行了

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐