共计 14651 个字符,预计需要花费 37 分钟才能阅读完成。
以 CentOS 7、MariaDB、PHP 7、Nginx 为环境编译安装 Nextcloud 私有云。
一、安装操作系统
首先安装操作系统,Nextcloud 只支持 Linux,由于个人习惯的原因,选择了 CentOS 7,使用最小化安装(为了保证之后的步骤能在只有最小化安装的 VPS 上重现,也为了节约硬件资源)。
1、启用网卡
最小化的 CentOS 7 安装完毕后,默认是没有启用网卡的,在本地登录系统后,首先进入网络配置目录,列出目录中的网卡配置文件
cd /etc/sysconfig/network-scripts/
ll | grep ifcfg-
运行结果
[root@localhost network-scripts]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# ll | grep ifcfg
-rw-r--r--. 1 root root 312 Aug 30 10:01 ifcfg-enp0s3
-rw-r--r--. 1 root root 254 Sep 12 2016 ifcfg-lo
除了 ifcfg-lo 以外的那个文件就是网卡配置文件,具体名称可能会有所不同。
然后使用 vi 编辑该文件,将最后一行“ONBOOT=no”改成“ONBOOT=yes”并保存退出。
通过命令重启网络服务,是配置生效
service network restart
如果不想通过 DHCP 动态获取 IP 地址,也可以在网络配置文件中添加以下配置项指定网络参数
IPADDR0=192.168.21.128 # 设置 IP 地址
PREFIXO0=24 # 设置子网掩码
GATEWAY0=192.168.21.2 # 设置网关
DNS1=8.8.8.8 # 设置主 DNS
DNS2=8.8.4.4 # 设置备 DNS
网卡启用后,就可以通过 SSH 远程操作、通过 yum 方便的安装程序了。
查看 ip 地址,可以通过 ip 命令
ip addr
2、配置环境
通过 yum 安装依赖组件
yum -y install wget zip unzip
yum -y install gcc gcc-c++ cmake
yum -y install openssl openssl-devel gnutls gnutls-devel bison bison-devel zlib-devel libevent-devel curl-devel ncurses ncurses-devel perl perl-devel libxml2 libxml2-devel
yum -y install bzip2 bzip2-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel gmp gmp-devel readline readline-devel libxslt libxslt-devel
yum -y install gd gd-devel libicu libicu-devel openldap openldap-devel libsmbclient libsmbclient-devel ImageMagick ImageMagick-devel recode recode-devel autoconf psmisc.x86_64 krb5-libs.x86_64 krb5-devel.x86_64
通过 yum 的额外源安装依赖组件
yum -y install epel-release
yum repolist
yum -y install libc-client libc-client-devel libmcrypt libmcrypt-devel jemalloc jemalloc-devel redis libtidy libtidy-devel
关闭 SELinux,可先通过 sestatus - v 命令查看 SELinux 是否开启
/usr/sbin/sestatus -v
修改 /etc/selinux/config,将’SELINUX=enforcing’改为’SELINUX=disabled’,重启系统即可生效,或者本次可以使用’setenforce 0’临时关闭。
二、安装 MariaDB
首先下载并编译安装
wget https://downloads.mariadb.org/interstitial/mariadb-10.2.8/source/mariadb-10.2.8.tar.gz
tar -zxvf mariadb-10.2.8.tar.gz
cd mariadb-10.2.8
cmake .
make && make install
useradd MySQL
chown -R mysql:mysql /usr/local/mysql/
mkdir /var/log/mariadb
chown -R mysql:mysql /var/log/mariadb
cd /usr/local/mysql
scripts/mysql_install_db --user=mysql
ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
然后修改 /etc/my.cnf,修改 pid-file 的值
pid-file=/var/lib/mysql/mysql.pid
接着将 MariaDB 设为系统服务,在 /usr/lib/systemd/system/ 下创建一个名为 mysql.service 的脚本,内容如下
[Unit]
Description=MariaDB database server
After=network.target
[Service]
Type=simple
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld_safe
TimeoutSec=300
PrivateTmp=true
[Install]
WantedBy=multi-user.target
修改脚本权限,添加、启动服务,然后运行管理工具
chmod 755 /usr/lib/systemd/system/mysql.service
systemctl daemon-reload
systemctl enable mysql.service
systemctl start mysql.service
/usr/local/mysql/bin/mysql_secure_installation
mysql_secure_installation 的输入如下,牢记自己的数据库 root 密码
Set root password? [Y/n] Y
New password:
Re-enter new password:
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
登录到 mysql shell 为 Nextcloud 创建用户和数据库。
/usr/local/mysql/bin/mysql -u root -p
验证 root 密码后,在 mysql shell 执行
create database nextcloud_db;
create user nextclouduser@localhost identified by 'nextclouduser@';
grant all privileges on nextcloud_db.* to nextclouduser@localhost identified by 'nextclouduser@';
flush privileges;
exit
这样就创建了一个 nextcloud_db 数据库和 nextclouduser 用户,用户密码为’nextclouduser@’。
三、安装 Nginx
首先编译安装 Nginx
wget https://ftp.pcre.org/pub/pcre/pcre-8.41.tar.gz
tar -zxvf pcre-8.41.tar.gz
wget http://www.zlib.net/zlib-1.2.11.tar.gz
tar -zxvf zlib-1.2.11.tar.gz
wget https://www.openssl.org/source/openssl-1.0.2l.tar.gz
tar -zxvf openssl-1.0.2l.tar.gz
wget http://nginx.org/download/nginx-1.13.4.tar.gz
tar -zxvf nginx-1.13.4.tar.gz
cd nginx-1.13.4
./configure --with-http_ssl_module --with-pcre=../pcre-8.41 --with-zlib=../zlib-1.2.11 --with-openssl=../openssl-1.0.2l --with-http_v2_module
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
useradd nginx
mkdir /var/www
chown -R nginx:nginx /var/www
然后将 Nignx 设为系统服务,在 /usr/lib/systemd/system/ 下创建一个名为 nginx.service 的脚本,内容如下
[Unit]
Description=nginx - high performance web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
[Install]
WantedBy=multi-user.target
修改脚本权限,开启 Nginx 服务
chmod 755 /usr/lib/systemd/system/nginx.service
systemctl daemon-reload
systemctl enable nginx.service
systemctl start nginx.service
使用 nginx -s reload 可以重载配置而不需要重启 nginx
开放防火墙 HTTP、HTTPS 端口
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
systemctl restart firewalld
四、安装 PHP
安装依赖组件,执行 php 安装配置
wget https://github.com/skvadrik/re2c/releases/download/1.0.2/re2c-1.0.2.tar.gz
tar -zxvf re2c-1.0.2.tar.gz
cd re2c-1.0.2
./configure
make && make install
cd ..
wget -O php7.tar.gz http://cn2.php.net/get/php-7.1.8.tar.gz/from/this/mirror
tar -zxvf php7.tar.gz
cd php-7.1.8
ln -s /usr/lib64/libc-client.so /usr/lib/
ln -s /usr/lib64/libssl.so /usr/lib/
ln -s /usr/lib64/libldap.so /usr/lib/
./configure \
--enable-fpm \
--enable-ctype \
--enable-dom \
--enable-xml \
--enable-json \
--enable-mbstring \
--enable-posix \
--enable-simplexml \
--enable-xmlreader \
--enable-xmlwriter \
--enable-zip \
--enable-fileinfo \
--enable-intl \
--enable-ftp \
--enable-exif \
--enable-pcntl \
--enable-sockets \
--enable-session \
--enable-gd-native-ttf \
--enable-gd-jis-conv \
--enable-inline-optimization \
--enable-shared \
--enable-bcmath \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--enable-mbregex \
--enable-pcntl \
--with-pdo-mysql \
--with-mhash \
--with-libxml-dir \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-iconv-dir \
--with-zlib \
--with-curl \
--with-bz2 \
--with-mcrypt \
--with-openssl \
--with-xsl \
--with-pcre-dir \
--with-pear \
--with-freetype-dir \
--with-xmlrpc \
--with-gettext \
--with-readline \
--with-recode \
--with-tidy \
--with-ldap \
--with-gmp \
--with-kerberos
编辑 MakeFile,找到开头是‘EXTRA_LIBS =’这一行,在结尾加上’-llber’
EXTRA_LIBS = -lcrypt -lcrypto -lssl -lcrypto -lz -lexslt -ltidy -lresolv -lcrypt -lrecode -lreadline -lncurses -lrt -lmcrypt -lldap -lstdc++ -lgmp -lpng -lz -ljpeg -lcrypto -lssl -lcrypto -lcurl -lbz2 -lz -lcrypto -lssl -lcrypto -lrt -lm -ldl -lnsl -lxml2 -lz -lm -ldl -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -lcurl -lxml2 -lz -lm -ldl -lfreetype -ldl -lm -licui18n -licuuc -licudata -ldl -lm -licuio -lxml2 -lz -lm -ldl -lcrypt -lxml2 -lz -lm -ldl -lxml2 -lz -lm -ldl -lxml2 -lz -lm -ldl -lxml2 -lz -lm -ldl -lxslt -lxml2 -lz -ldl -lm -lcrypt -llber
然后编译安装
make && make install
mkdir -p /var/lib/php/session
chown nginx:nginx -R /var/lib/php/session/
cp php.ini-production /usr/local/etc/php.ini
cp /usr/local/etc/php-fpm.conf.default /usr/local/etc/php-fpm.conf
cp /usr/local/etc/php-fpm.d/www.conf.default /usr/local/etc/php-fpm.d/www.conf
编辑 /usr/local/etc/php-fpm.conf,最后一行改成
include=etc/php-fpm.d/*.conf
编辑 /usr/local/etc/php-fpm.d/www.conf
; 修改 user 和 group 这两行,大概在 20 行左右
user = nginx
group = nginx
; 取消这行的注释,���概在第 60 行左右
listen.allowed_clients = 127.0.0.1
; 取消这几行的注释,大概在第 330 行左右
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
开启 php-fpm 服务
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod +x /etc/init.d/php-fpm
chkconfig --add php-fpm
service php-fpm start
安装扩展模块
cd ..
pecl install smbclient
pecl install imagick
wget -O igbinary.zip https://github.com/igbinary/igbinary7/archive/master.zip
unzip igbinary.zip
cd igbinary7-master
phpize
./configure CFLAGS="-O2 -g" --enable-igbinary
make && make install
pecl install apcu
pecl install redis
复制 /usr/local/etc/php.ini 到 /usr/local/lib/
cp /usr/local/etc/php.ini /usr/local/lib/
修改 /usr/local/lib/php.ini,搜索’extension=’,在这段后面添加
extension=smbclient.so
extension=imagick.so
extension=igbinary.so
extension=redis.so
extension=apcu.so
zend_extension=opcache.so
继续修改 php.ini,搜索“[opcache]”,将以下行注释去掉,并修改为对应的配置值
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=1
opcache.save_comments=1
继续修改 php.ini,在最后面添加
[apc]
apc.enabled=1
apc.shm_segments=1
apc.shm_size=64M
apc.ttl=7200
apc.user_ttl=7200
apc.enable_cli=1
遇到的问题总结
a、安装完扩展模块后,在 /usr/local/etc/php.ini 配置了,却发现一直无法加载成功,后来才发现我安装的 php 配置文件路径应该在 /usr/local/lib,拷贝过去就对了
b、使用命令 php - i 可以查看 php 的相关信息,包括使用的配置文件路径、扩展模块路径等等
c、使用命令 php - m 可以查看成功加载了的模块,如果扩展模块安装成功了,就可以看到
d、php 的扩展模块有两种安装方式,最简单的就是使用 pecl,类似于 yum,指定模块名称后就可以一键下载、编译、安装了,当然如果有依赖库的话必须先进行安装,再在 php.ini 里面加上 extension 配置项即可
e、php 的扩展模块另外一种安装方式,就是下载模块的源代码,解压后进入源代码目录,执行 phpize 生成 configure 文件,然后就是执行 configure、make、make install 了,最后在 php.ini 增加配置项
五、安装 Nextcloud
下载解压到 www 目录
wget https://download.nextcloud.com/server/releases/nextcloud-12.0.2.zip
unzip nextcloud-12.0.2.zip
mv nextcloud /var/www/
chown -R nginx:nginx /var/www
生成 SSL 证书
mkdir -p /etc/nginx/cert/
openssl req -new -x509 -days 365 -nodes -out /etc/nginx/cert/nextcloud.crt -keyout /etc/nginx/cert/nextcloud.key
chmod 700 /etc/nginx/cert
chmod 600 /etc/nginx/cert/*
修改 nginx 服务配置文件 /usr/local/nginx/conf/nginx.conf 为以下内容,将“yourname.domain”替换为自己的域名,修改 client_max_body_size 可以设置最大可上传的文件大小
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {worker_connections 1024;
}
http {include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local]"$request" '
# '$status $body_bytes_sent"$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream php-handler {server 127.0.0.1:9000;
#server unix:/var/run/php5-fpm.sock;
}
server {listen 80;
server_name yourname.domain;
# enforce https
return 301 https://$server_name$request_uri;
}
server {listen 443 ssl http2;
server_name yourname.domain;
ssl_certificate /etc/nginx/cert/nextcloud.crt;
ssl_certificate_key /etc/nginx/cert/nextcloud.key;
# Add headers to serve security related headers
# Before enabling Strict-Transport-Security headers please read into this
# topic first.
# add_header Strict-Transport-Security "max-age=15768000;
# includeSubDomains; preload;";
#
# WARNING: Only add the preload option once you read about
# the consequences in https://hstspreload.org/. This option
# will add the domain to a hardcoded list that is shipped
# in all major browsers and getting removed from this list
# could take several months.
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
# Path to the root of your installation
root /var/www/nextcloud/;
location = /robots.txt {allow all;
log_not_found off;
access_log off;
}
# The following 2 rules are only needed for the user_webfinger app.
# Uncomment it if you're planning to use this app.
#rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
#rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json
# last;
location = /.well-known/carddav {return 301 $scheme://$host/remote.php/dav;
}
location = /.well-known/caldav {return 301 $scheme://$host/remote.php/dav;
}
# set max upload size
client_max_body_size 512M;
fastcgi_buffers 64 4K;
# Enable gzip but do not remove ETag headers
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;
# Uncomment if your server is build with the ngx_pagespeed module
# This module is currently not supported.
#pagespeed off;
location / {rewrite ^ /index.php$uri;
}
location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ {deny all;
}
location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {deny all;
}
location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+)\.php(?:$|/) {fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param HTTPS on;
#Avoid sending the security headers twice
fastcgi_param modHeadersAvailable true;
fastcgi_param front_controller_active true;
fastcgi_pass php-handler;
fastcgi_intercept_errors on;
fastcgi_request_buffering off;
}
location ~ ^/(?:updater|ocs-provider)(?:$|/) {try_files $uri/ =404;
index index.php;
}
# Adding the cache control header for js and css files
# Make sure it is BELOW the PHP block
location ~ \.(?:css|js|woff|svg|gif)$ {try_files $uri /index.php$uri$is_args$args;
add_header Cache-Control "public, max-age=15778463";
# Add headers to serve security related headers (It is intended to
# have those duplicated to the ones above)
# Before enabling Strict-Transport-Security headers please read into
# this topic first.
# add_header Strict-Transport-Security "max-age=15768000;
# includeSubDomains; preload;";
#
# WARNING: Only add the preload option once you read about
# the consequences in https://hstspreload.org/. This option
# will add the domain to a hardcoded list that is shipped
# in all major browsers and getting removed from this list
# could take several months.
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
# Optional: Don't log access to assets
access_log off;
}
location ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ {try_files $uri /index.php$uri$is_args$args;
# Optional: Don't log access to other assets
access_log off;
}
}
}
让 Nginx 重新载入配置
nginx -s reload
使用域名或者 IP 访问,就会出现初始设置页面,在这里设置 Nextcloud 管理员用户名和密码,然后选择使用的数据库为 MySQL/MariaDB,填入之前设置数据库时的用户名(nextclouduser)、密码(nextclouduser@)、数据库名称(nextcloud_db),位置(不知为何我这里 localhost 访问数据库会被拒绝,设为 127.0.0.1 才行),然后确认进行初始化后就可以使用了。
有一次安装完了打开返回 503,重新执行了一遍“chown -R nginx:nginx /var/www”就可以了
六、添加信任域名
Nextcloud 本身的安全机制,会检查访问的域名,如果没有配置在信任域名中,会提示正在通过不信任的域名访问。
Nextcloud 初始化完毕后,会生成“/var/www/nextcloud/config/config.php”配置文件,里面的’trusted_domains’配置项为信任域名,初始化完毕后只有一项,为主机的 IP 地址。可以修改该配置项,添加绑定的域名
'trusted_domains' =>
array (0 => '192.168.56.101',
1 => 'yourname.domain',
),
七、开启内存缓存
开启内存缓存,可以提升响应速度。之前我们已经通过 yum 安装了 redis 服务,通过 pecl 安装了 php 的 apcu、redis 组件,下面先把 redis 设置为系统服务,再修改 Nextcloud 的配置。
1、配置 redis 服务
设置服务自启、启动服务
systemctl enable redis
systemctl start redis
2、修改 Nextcloud 配置
修改 /var/www/nextcloud/config/config.php 文件,在配置加入
'memcache.local' => '\OC\Memcache\APCu',
'memcache.locking' => '\OC\Memcache\Redis',
'redis' => array('host' => 'localhost',
'port' => 6379,
),
重新启动 nginx 服务即可生效
systemctl restart nginx
八、客户端
Nextcloud 提供各个平台的客户端,但功能有区别。
1、Windows 客户端
桌面客户端有 Windows、Linux、Mac 平台的,功能应该都一样的,我只试用了 Windows 客户端。
Windows 客户端仅有的功能就是同步,可以建立任意数量的同步映射,为本地的文件夹和 Nextcloud 服务器上的文件夹建立镜像映射关系,不管是增加、修改还是删除文件,在同步后都两边都会保持一致。仅有的同步策略就是镜像方式,没有更多的设置。
这样的功能比较适用于移动办公,将自己的工作区同步到云上,一是可以起到备份的作用,二是可以在多台电脑上使用相同的工作区环境。
2、Android 客户端
手机客户端有 Android、iPhone、Windows Phone 平台的,我只试用了 Android 客户端。
Android 客户端基本和 Web 页面是一样的,并没有多大用处。
有一个自动同步的功能,可以将本地目录和服务器上目录建立映射,策略可以选择仅将本地的文件同步到服务器、并且可以选择同步后是否删除本地的文件。本来这个功能应该是备份手机照片的利器,可是这个功能仅仅能检测到新增加的文件,对于已有的文件是不处理的,瞬间变为了鸡肋,除非新买手机就装上,或者先把以前的用其他方法人工备份。
3、第三方客户端
Nextcloud 对外提供 WebDAV 接口,因此可以使用第三方的客户端。Android 平台上,FolderSync 是一个比较好用的、可以备份手机照片的软件。
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-12/149720.htm