从零搭建WebDAV服务器

前言

  • 起因:
    • App端需要实现WebDAv客户端功能,搭建一台WebDAV服务器满足客户端的增删改查需求。
    • 云端现有的WebDAV服务器不能满足自己的需要
  • 从零开始:
    • 下载centOS服务器镜像
    • 安装centOS服务器系统
    • 安装指定版本nginx
    • 在centOS服务器上安装WebDAV服务
  • 环境
    • macOS10.14.6
    • Parallels Desktop 14,虚拟机软件,安装centOS服务器
    • centOS7.6,centOS操作系统
    • SecureCRT,centOS操作系统的macOS客户端

安装centOS

  • 下载centOS7.6镜像
  • 利用Parallels新建centOS系统,新建完成后,光盘加载centOS7.6镜像进行系统安装。过程很简单,这里不做介绍。
  • 打开Parallels->设备->网络->桥接网络->Wi-Fi,把虚拟机和macOS放在同一个本地局域网中,方便本地测试WebDAV服务。
  • 系统安装完成后,需要配置IP,才能通信,步骤如下
    • 执行vi /etc/sysconfig/network-scripts/ifcfg-eth0打开文件
    • 更改如下内容
      • BOOTPROTO=static # 从dhcp修改为static
      • ONBOOT=yes # 从no修改为yes
    • 添加如下内容
      1
      2
      3
      4
      5
      6
      IPADDR=192.168.1.248
      NETMASK=255.255.255.0
      GATEWAY=192.168.1.1
      DNS1=192.168.1.1
      DNS2=8.8.8.8
      DNS3=114.114.114.114
  • IP配置完成后,需要执行service network restart重启网络,就可以通信了。如果还是不能通信,需要执行reboot
  • 使用SecureCRT连接上服务器,你可以愉快地玩耍了

安装Parallels Tools

  • 安装Parallels Tools高效地使用虚拟机,让你达到事倍功半的效果。
  • 打开顶部工具栏->操作->安装Parallels Tools...,加载Parallels Tools光盘
  • 挂载光盘mount /dev/cdrom /media
  • 执行cd /media && ./install进行安装,会报错,要求手动安装一些依赖包。
  • 使用如下命令升级系统内核,过程比较慢,请耐心等待。内核升级后,会安装上面要求的依赖包。
    1
    2
    3
    sudo yum clean all
    sudo yum update
    reboot
  • 利用./install重新执行安装就可以了

安装常用命令

  • 安装下载命令yum install wget -y
  • 安装rz和sz命令,可以在SecureCRT上使macOS和centOS服务器互传文件
    1
    yum install lrzsz -y

安装nginx时加载WebDAV模块

  • 进入用户级的源码目录cd /usr/local/src,下载nginx安装包
    1
    wget -c https://nginx.org/download/nginx-1.18.0.tar.gz
  • nginx自带的dav模块功能有限,我们需要扩展它的功能,下载webDAV扩展包
  • 解压webDAV扩展包
    1
    2
    tar -zxvf nginx-dav-ext-module-3.0.0.tar.gz 
    mv nginx-dav-ext-module-3.0.0 nginx-dav-ext-module
  • 安装编译必备工具包
    1
    yum -y install gcc pcre-devel openssl openssl-devel libxslt-devel
  • 因为nginx并没有默认内建WebDAV模块,所以需要我们在配置市手动开启,并加入扩展模块
    1
    2
    3
    tar -zxvf nginx-1.18.0.tar.gz 
    cd nginx-1.18.0
    ./configure --prefix=/usr/local/nginx --with-http_dav_module --add-module=/usr/local/src/nginx-dav-ext-module
  • 编译安装make && make install,大功告成。

启动nginx

服务启动

  • 当执行service nginx start会出现Failed to start nginx.service: Unit not found.错误
  • 执行vi /etc/init.d/nginx,填写一下内容,然后保存退出
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    #!/bin/sh
    # nginx - this script starts and stops the nginx daemin
    #
    # chkconfig: - 85 15

    # description: Nginx is an HTTP(S) server, HTTP(S) reverse \
    # proxy and IMAP/POP3 proxy server

    # processname: nginx
    # config: /usr/local/nginx/conf/nginx.conf
    # pidfile: /usr/local/nginx/logs/nginx.pid

    # Source function library.

    . /etc/rc.d/init.d/functions

    # Source networking configuration.

    . /etc/sysconfig/network

    # Check that networking is up.

    [ "$NETWORKING" = "no" ] && exit 0

    nginx="/usr/local/nginx/sbin/nginx"

    prog=$(basename $nginx)

    NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"

    lockfile=/var/lock/subsys/nginx

    start() {

    [ -x $nginx ] || exit 5

    [ -f $NGINX_CONF_FILE ] || exit 6

    echo -n $"Starting $prog: "

    daemon $nginx -c $NGINX_CONF_FILE

    retval=$?

    echo

    [ $retval -eq 0 ] && touch $lockfile

    return $retval

    }


    stop() {

    echo -n $"Stopping $prog: "

    killproc $prog -QUIT

    retval=$?

    echo

    [ $retval -eq 0 ] && rm -f $lockfile

    return $retval

    }



    restart() {

    configtest || return $?

    stop

    start

    }


    reload() {

    configtest || return $?

    echo -n $"Reloading $prog: "

    killproc $nginx -HUP

    RETVAL=$?

    echo

    }

    force_reload() {

    restart

    }


    configtest() {

    $nginx -t -c $NGINX_CONF_FILE

    }



    rh_status() {

    status $prog

    }


    rh_status_q() {

    rh_status >/dev/null 2>&1

    }

    case "$1" in

    start)

    rh_status_q && exit 0
    $1
    ;;

    stop)


    rh_status_q || exit 0
    $1
    ;;

    restart|configtest)
    $1
    ;;

    reload)
    rh_status_q || exit 7
    $1
    ;;


    force-reload)
    force_reload
    ;;
    status)
    rh_status
    ;;


    condrestart|try-restart)

    rh_status_q || exit 0
    ;;

    *)

    echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
    exit 2

    esac
  • 然后执行以下语句
    1
    2
    3
    cd /etc/init.d
    chmod 755 nginx
    chkconfig --add nginx
  • 重新执行service nginx start发现成功了。

开机启动

  • 编辑vi /lib/systemd/system/nginx.service
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [Unit]
    Description=nginx
    After=network.target

    [Service]
    Type=forking
    ExecStart=/usr/local/nginx/sbin/nginx
    ExecReload=/usr/local/nginx/sbin/nginx -s reload
    ExecStop=/usr/local/nginx/sbin/nginx -s quit
    PrivateTmp=true

    [Install]
    WantedBy=multi-user.target
  • 服务开启systemctl enable nginx.service
  • 再次执行启动命令service nginx start

配置WebDAV

  • 新建根目录,并授权
    1
    2
    mkdir /usr/local/nginx/webdav
    chmod 777 /usr/local/nginx/webdav
  • 编辑vim /usr/local/nginx/conf/nginx.conf,配置nginx虚拟服务器。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    server {
    listen 80;
    location / {
    root /usr/local/nginx/webdav;
    dav_methods PUT DELETE MKCOL COPY MOVE; #DAV支持的请求方法
    dav_ext_methods PROPFIND OPTIONS; #DAV扩展支持的请求方法
    charset utf-8; #设置为utf-8不然中文容易乱码
    create_full_put_path on; #启用创建目录支持
    dav_access user:rw group:r all:r; #设置新创建的文件和目录的访问权限
    limit_except GET PROPFIND OPTIONS HEAD { #匿名用户只有查看权限,登录用户才能进行读写操作
    auth_basic "Authorized Users Only";
    auth_basic_user_file /usr/local/nginx/conf/passwd.conf;
    }
    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;
    min_delete_depth 0;
    }
    }
    *
  • 设置Webdav账号(test01)密码(123)
    • 安装htpasswd工具:yum install -y httpd-tools
    • 生成用户认证文件:htpasswd -c /usr/local/nginx/conf/passwd.conf test01
  • 重启服务service nginx restart后,当我们兴高采烈地在浏览器输入http://192.168.1.248进行访问时,发现报了一大堆错误。根据以往经验,这是防火墙的原因。

防火墙设置

  • 防火墙默认情况下会在开启状态,并且会开机启动。因为WebDav用的是80端口,并且没有在防火墙上暴露出去,所以不能对外提供服务,两个方法可以解决:
    • 直接关闭防火墙,这个不安全,所以不推荐
    • 开发WebDAV使用的80端口,推荐这个方案
  • 执行以下命令,开放这个端口,这样外部就能访问.
    1
    2
    firewall-cmd --permanent --zone=public --add-port=80/tcp
    firewall-cmd --reload
  • 查看防火墙端口信息firewall-cmd --list-ports,发现已经暴露出去,再次访问就可以了。
    1
    2
    [root@localhost ~]# firewall-cmd --list-ports
    80/tcp

测试

  • macOS或windows端都有相应的WebDAV客户端,使用客户端测试一下服务器的增删改查功能。
  • 测试过程中,如果出现问题,肯定是我们搭建的服务器有有问题,因为我们下载的客户端都是相对成熟的。
  • 测试没有问题就可以在App端接入了。