一步步教您在 CentOS 7 上搭建 ownCloud 私有云

一步步教您在 CentOS 7 上搭建 ownCloud 私有云

一、前言

国内的公有云越来越不靠谱。丢文件的、信息泄漏的比比皆是……

国外的公有云虽然比较靠谱,但是价格普遍偏高,而且国内访问非常不方便。

公有云用着都很不爽,那么我们不妨来搭一个私有云然后自己爽吧!

那么,私有云用哪个软件好呢?

目前来说,大名鼎鼎的 ownCloud 是私有云的最佳解决方案。它不仅是开源的,而且个人用户全免费!

ownCloud 说到底其实就是一个网站,它需要 PHP、数据库等后端环境。

虽然网上也有许多私有云的搭建教程,但是各人的系统环境各有不同,而且软件版本又是不断更新的,所以很难一次完美搭建。

本文纯属个人经验分享,所有的步骤我在写完之后都有重装系统然后全部重新走一遍验证一次。

如果想提高一次成功的几率,建议使用全新安装的系统,然后严格按照我的步骤要求来做。

如果有错误,可以的话麻烦留言提出,谢谢!

二、所需软件 & 环境

  • 操作系统:CentOS 7.4.1708 最小安装 (已关闭 SELinux 和防火墙)
  • 应用软件: Nginx 1.10.2 、MariaDB 5.5.56 、PHP 7.1.8 、Redis 3.2.10 、ownCloud 10.0.3
  • 域名: http://cloud.example.com
  • http://cloud.example.com 数字证书 (推荐免费的 Let's Encrypt)

三、安装软件

3.1 添加 EPEL & WEBTATIC 软件源

yum -y install epel-release && rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm && yum -y update

3.2 安装所需软件包

yum -y install nginx mariadb-server redis lbzip2 php71w-common php71w-fpm php71w-gd php71w-mysql php71w-mbstring php71w-intl php71w-mcrypt php71w-pecl-imagick php71w-xml php71w-pecl-redis samba-client

3.3 下载 & 安装 ownCloud

curl -O https://download.owncloud.org/community/owncloud-10.0.3.tar.bz2 && tar -xf ./owncloud-10.0.3.tar.bz2 && rm -rf ./owncloud-10.0.3.tar.bz2 && mv owncloud /usr/share/nginx/ && chown -R nginx:nginx /usr/share/nginx/owncloud && find /usr/share/nginx/owncloud -type d -exec chmod 755 {} \; && find /usr/share/nginx/owncloud -type f -exec chmod 644 {} \;

3.4 创建 ownCloud 数据目录

ownCloud 上的数据将存储到 /var/lib/owncloud 中。

mkdir /var/lib/owncloud && chown nginx:nginx /var/lib/owncloud

四、配置数据库

4.1 初始化数据库

4.1.1 启动服务

systemctl start mariadb

4.1.2 进行安全设置

mysql_secure_installation 

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

In order to log into MySQL to secure it, we'll need the current
password for the root user.  If you've just installed MySQL, 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):   #回车即可
OK, successfully used password, moving on...

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

Set root password? [Y/n] y  #使用密码验证
New password:   #输入 root 密码
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!

#后面的问题全部按y回车,这里省略。

4.2 ownCloud 专属数据库的设置

4.2.1 进入数据库命令行界面

mysql -u root -p

Enter password: #输入密码按回车

出现 MariaDB [(none)]> 指示符就说明进入了。

4.2.2 创建一个用户用于读写 ownCloud 数据库

CREATE USER 'owncloud'@'localhost' IDENTIFIED BY 'owncloud';

4.2.3 创建 ownCloud 数据库

CREATE DATABASE owncloud;

4.2.4 为用户授予读写权限

GRANT ALL PRIVILEGES ON owncloud.* TO 'owncloud'@'localhost' IDENTIFIED BY 'owncloud';

4.2.5 刷新权限表

FLUSH PRIVILEGES;

数据库设置完成。按 Ctrl + D 退出 MySQL 命令行界面。

五、配置 Nginx

5.1 创建 ownCloud 专属配置文件

vi /etc/nginx/conf.d/owncloud.conf

请按实际情况以及注释提示修改以下内容,在命令行窗口按下 i ,将内容直接粘贴到命令行窗口中,再按下 ESC ,最后输入 :wq 按回车。

upstream php-handler {
    server unix:/run/php-fpm/owncloud.sock;
}

server {
    listen 80;
    server_name cloud.example.com;  # cloud.example.com 改为您的域名
    
    location /.well-known/acme-challenge/ {
        root /usr/share/nginx/owncloud;
    }
    
    location / {
        return 301 https://$server_name$request_uri;
    }
}

server {
    listen 443 ssl http2;
    server_name cloud.example.com;  # cloud.example.com 改为您的域名

    ssl_certificate /etc/pki/tls/owncloud.pem;  # 域名证书文件位置,需要修改
    ssl_certificate_key /etc/pki/tls/private/owncloud_key.pem;  # 域名证书私钥文件位置,需要修改

    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "-ALL:EECDH+AES256:EDH+AES256:AES256-SHA:EECDH+AES:EDH+AES:!ADH:!NULL:!aNULL:!eNULL:!EXPORT:!LOW:!MD5:!3DES:!PSK:!SRP:!DSS:!AESGCM:!RC4";
    ssl_dhparam /etc/pki/tls/certs/dh4096.pem;
    ssl_prefer_server_ciphers on;
    keepalive_timeout    70;
    ssl_stapling on;
    ssl_stapling_verify on;

    add_header Strict-Transport-Security "max-age=15552000; includeSubDomains";
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options "SAMEORIGIN";
    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;

    root /usr/share/nginx/owncloud;

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location = /.well-known/carddav {
        return 301 $scheme://$host/remote.php/dav;
    }
    location = /.well-known/caldav {
        return 301 $scheme://$host/remote.php/dav;
    }

    client_max_body_size 16G;
    fastcgi_buffers 64 4K;

    gzip off;

    error_page 403 /core/templates/403.php;
    error_page 404 /core/templates/404.php;

    location / {
        rewrite ^ /index.php$uri;
    }

    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ {
        return 404;
    }
    location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
        return 404;
    }

    location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+|core/templates/40[34])\.php(?:$|/) {
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name; 
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param HTTPS on;
        fastcgi_param modHeadersAvailable true; 
        fastcgi_param front_controller_active true;
        fastcgi_read_timeout 180; 
        fastcgi_pass php-handler;
        fastcgi_intercept_errors on;
        fastcgi_request_buffering off; 
    }

    location ~ ^/(?:updater|ocs-provider)(?:$|/) {
        try_files $uri $uri/ =404;
        index index.php;
    }

    location ~ \.(?:css|js)$ {
        try_files $uri /index.php$uri$is_args$args;
        add_header Cache-Control "max-age=15778463";
        add_header X-Content-Type-Options nosniff;
        add_header X-Frame-Options "SAMEORIGIN";
        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;
        access_log off;
    }

    location ~ \.(?:svg|gif|png|html|ttf|woff|ico|jpg|jpeg|map)$ {
        add_header Cache-Control "public, max-age=7200";
        try_files $uri /index.php$uri$is_args$args;
        access_log off;
    }
}

5.2 生成 Nginx 所需的 DH 文件

openssl dhparam -out /etc/pki/tls/certs/dh4096.pem 4096

速度可能会有些慢,请耐心等待!

六、配置 PHP-FPM

6.1 创建 ownCloud 专属配置文件

vi /etc/php-fpm.d/owncloud.conf

请在命令行窗口中按下 i ,将以下内容直接粘贴到命令行窗口中,再按下 ESC ,最后输入 :wq 按回车。

[owncloud]
user = nginx
group = nginx
listen = /run/php-fpm/owncloud.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0600
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog = /var/log/php-fpm/owncloud-slow.log
php_admin_value[error_log] = /var/log/php-fpm/owncloud-error.log
php_admin_flag[log_errors] = on
php_value[memory_limit] = 512M
php_value[session.save_handler] = files
php_value[session.save_path]    = /var/lib/php/session
php_value[soap.wsdl_cache_dir]  = /var/lib/php/wsdlcache
php_value[upload_max_filesize] = 16G
php_value[post_max_size] = 16G
php_value[max_input_time] = 3600
php_value[max_execution_time] = 3600
php_value[date.timezone] = Asia/Shanghai
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

6.2 创建 PHP 会话目录

mkdir -p /var/lib/php/session && chown -R nginx:nginx /var/lib/php/session

七、启动服务

systemctl start nginx php-fpm redis

如需开机启动,请执行

systemctl enable nginx php-fpm mariadb redis

八、配置 ownCloud

8.1 初始化 ownCloud

打开浏览器,输入 https://cloud.example.com ,回车打开。然后按图片提示进行 ownCloud 的初始化。

初始化完毕之后会出现登录界面,这时候我们先关闭浏览器。

8.2 配置缓存 & 启用本地文件读取

vi /usr/share/nginx/owncloud/config/config.php

请在命令行窗口中使用方向键将光标移至 倒数第二行开头(installed 那里) ,然后按下 o,将以下内容直接粘贴到命令行窗口中(效果如下图),再按下 ESC ,最后输入 :wq 按回车。

'memcache.local' => '\OC\Memcache\Redis',
'redis' => [
   'host' => 'localhost',
   'port' => 6379,
],
'memcache.locking' => '\OC\Memcache\Redis',
'files_external_allow_create_new_local' => true,

8.3 配置计划任务 & 完工!

crontab -e

请在命令行窗口中按下 O(大写) ,将以下内容直接粘贴到命令行窗口中,再按下 ESC ,最后输入 :wq按回车。

*/15 * * * * sudo -u nginx php -f /usr/share/nginx/owncloud/cron.php > /dev/null 2>&1

然后打开浏览器,输入 https://cloud.example.com ,回车打开。用刚才设置的账号登录之后根据图片提示来设置。

然后,大功告成了!


九、不完美的地方

WebDAV 几乎无法在 macOS 的 Finder 上使用(下图中的官方文档已提到)。

一旦上传文件,就会提示 -36 错误。拉取文件时也会经常性出错。

可能是由于 macOS 系统会自动生成点开头的隐藏文件才导致发生错误(苹果:怪我咯~)。

macOS 用户可以使用第三方工具(如 Yummy FTP Pro)来使用 WebDAV 服务。

十、注意事项

  1. ownCloud 对服务器的磁盘的 I/O 性能要求较高。如果服务器的磁盘的 I/O 性能不够,在处理文件时速度会比较慢。
  2. 如果服务器没有公网 IP 地址,建议使用 Ngrok 之类的内网穿透工具配合云主机使用。切记不要直接在云主机上搭建 ownCloud!原因你懂的。
  3. 请务必设置高强度的密码以策安全。
  4. 目前不推荐购买 ownCloud 的手机客户端,功能少而且体验很一般。建议使用支持 WebDAV 的文件管理器。

十一、参考文献

  1. (官网)Installation
  2. (官网)NGINX Configuration
  3. (官网)Uploading big files > 512MB
编辑于 2019-05-20

文章被以下专栏收录