树莓派 | Apache2 + Webdav搭建NAS并映射至公网全流程踩坑记录

前言

个人很喜欢看电影也很喜欢收集电影,所以搞了2T的硬盘专门用来存搜罗到的电影。后来发现有个搭配树莓派的webdav服务,感觉很牛逼很方便,遂动手开搞。
在动手的过程中遇到了很多坑,特此记录并帮助大家规避。
中间会有很多小白向内容,冗杂的说错的恳请各位大佬指正或使用快捷键alt +f4开喷。

第零步:设备

¥158:Raspberry Pi 2B(无包装) + HDMI线 + 8G卡 + 七七八八
¥21.8:电源 + 线 + 壳

因为买的树莓派是无包装的9成新(好像),所以价格很便宜。第一次动手搞,本着贫穷节俭的思想,买了一个比较老的版本,用起来也没什么问题。

透明树莓派

第一步:Apache2 服务

Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中。

这次通过apache2实现webdav,所以理论上第一步是在树莓派上安装Apache2服务器:
sudo apt-get install -y apache2
但是!这里就会出现第一个坑,错误提示大概是:

Reading package lists... Done
Building dependency tree      
Reading state information... Done
...
Do you want to continue? [Y/n] y
Err:2 http://mirrordirector.raspbian.org/raspbian stretch/main armhf xrdp armhf 0.9.1-9
  404  Not Found [IP: 93.93.128.193 80]
Err:1 http://101.110.118.74/mirrordirector.raspbian.org/raspbian stretch/main armhf xorgxrdp armhf 0.9.1-9                                                  
  Could not connect to 101.110.118.74:80 (101.110.118.74), connection timed out
E: Failed to fetch http://101.110.118.74/mirrordirector.raspbian.org/raspbian/pool/main/x/xxx.deb  Could not connect to 101.110.118.74:80 (101.110.118.74), connection timed out
E: Failed to fetch http://mirrordirector.raspbian.org/raspbian/pool/main/x/xxx.deb  404  Not Found [IP: 93.93.128.193 80]
 
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?

这里比较好懂,重点留意最后一句就能理解是要更新apt-get了,那么就按照提示升级就好
apt-get update
但是!!!这里又会出现第二个坑!错误提示大概是这样的:

...
已下载 54.3 MB,耗时 3分 10秒 (285 kB/s)                                                                                                                                
E: Failed to fetchhttp://mirrors.opencas.cn/raspbian/raspbian/pool/main/o/openssl1.0/libssl1.0.2_1.0.2q-1~deb9u1_armhf.deb  Could not connect to mirrors.opencas.cn:80 (2001:cc0:2020:4075::211)  - connect (101: Network is unreachable)
E: Failed to fetchhttp://mirrors.opencas.cn/raspbian/raspbian/pool/main/o/openssl/libssl1.1_1.1.0j-1~deb9u1_armhf.deb  Could not connect to mirrors.opencas.cn:80 (2001:cc0:2020:4075::211)  - connect (101: Network is unreachable)
E: Failed to fetchhttp://mirrors.opencas.cn/raspbian/raspbian/pool/main/o/openssl/openssl_1.1.0j-1~deb9u1_armhf.deb  Could not connect to mirrors.opencas.cn:80 (2001:cc0:2020:4075::211) - connect (101: Network is unreachable)
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?

简单的来说,就是各种超时,原因就是因为源在墙外,需要换成墙内的,方法:

  1. sudo vi /etc/apt/sources.list
  2. 用#注释第一行,并替换为以下其中任一,这两个分别是中科大和清华的源,速度没问题,也基本不用担心不同步的问题
#中科大
deb http://mirrors.ustc.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi 
#清华
deb https://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi
  1. 保存退出
  2. sudo vi /etc/apt/sources.list.d/raspi.list
  3. 同上方法替换,依旧是熟悉的二选一
#中科大
deb https://mirrors.ustc.edu.cn/archive.raspberrypi.org/ stretch main ui
#清华
deb https://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ stretch main ui

到这里安装Apache2的坑基本都遇到了,现在就只要按照流程更新apt-get和安装Apache2就可以了:

apt-get update
sudo apt-get  install  -y apache2

第二步:开启Webdav服务

WebDAV (Web-based Distributed Authoring and Versioning) 一种基于 HTTP 1.1协议的通信协议。它扩展了HTTP 1.1,在GET、POST、HEAD等几个HTTP标准方法以外添加了一些新的方法,使应用程序可对Web Server直接读写,并支持写文件锁定(Locking)及解锁(Unlock),还可以支持文件的版本控制。

按说在Apache2中对WebDav协议的支持只有很简单的两句话:

#注意要切换至用户目录不然可能会报错
cd ~
sudo a2enmod dav
sudo a2enmod dav_fs

哇前面的第一步搞得那么麻烦这个两句话就可以搞定了吗...等等你刚刚说了按说?!

对的你没有猜错,这里可能会出现第二步的第一个错误:

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
...

解决方法:

  1. sudo vi .bashrc
  2. 在最后一行加入export LC_ALL=C
  3. 执行source .bashrc

为什么这么做?
看了这篇文章了解了下locale,上面报的warning意思大概可以归纳为
-LC_ALL变量的值unset
-LC_CTYPE和LC_MESSAGES的值设置的可能有问题

解决完成之后再执行开启Apache2中对WebDav协议的支持的那两句命令就应该没有什么问题了,之后就是创建共享目录、添加账户与权限和修改配置文件。

#开启对WebDav协议的支持
cd ~
sudo a2enmod dav
sudo a2enmod dav_fs

# 创建共享目录并修改权限
sudo mkdir -p /var/www/webdav
sudo chown -R www-data:www-data  /var/www/webdav

# 创建WebDav的访问用户数据库,顺便创建用户`pi`
sudo htpasswd -c /etc/apache2/webdav.password pi
# 创建guest用户
#sudo htpasswd /etc/apache2/webdav.password guest

# 修改用户数据库访问权限
sudo chown root:www-data /etc/apache2/webdav.password
sudo chmod 640 /etc/apache2/webdav.password

# 打开默认配置文件
sudo vim /etc/apache2/sites-available/000-default.conf

# 全部替换为以下内容(记得先备份):

Alias /webdav  /var/www/webdav


 Options Indexes
 DAV On
 AuthType Basic
 AuthName "webdav"
 AuthUserFile /etc/apache2/webdav.password
 Require valid-user
 

# 重启Apache2服务器
sudo systemctl restart apache2
# 或
sudo /etc/init.d/apache2 reload

这时候就可以浏览器打开http://树莓派ip地址/webdav并输入账号密码,如果看到如下页面,就表示webdav服务成功开启了!

You did it!

第三步:公网访问

要实现公网访问,首先需要一个公网ip,关于这一步在网上有很多讨论,几个要点总结如下:

  • 电信比移动好申请;
  • 大城市比二三线城市好申请;
  • 通用话术:家里有小孩需要装监控,大概率能过;
  • 雷区话术:要搭建个人网站,这个千万不要说,不然会被追着问各种杂七杂八的问题;
  • 如果就是不给/装傻怎么办?根据网上老哥的说法,硬肛就完事儿了。一级一级往上肛,最后可以一直告到网信办(?)就会在一周内解决。

作者坐标sz,用的是电信,打给10000号说要公网ip,直接就给办了,一两个小时就有了。

公网IP验证方法

  1. 登进路由器,在网关信息里看WAN口ip
    WAN IP
  2. 去ipip.net看它给出的你的ip地址是多少;
  3. 如果两个都一样,那恭喜你的公网IP搞到手了。

需要额外注意的一点是,这个ip地址会随着你的路由器重启之类的操作而重置,这个问题会在后面通过白嫖购买域名解析的方法解决。

在获得公网ip之后,可以通过端口映射使自己在公网也能访问到自己的webdav服务,以下按照我的具体情况展开,如果条件不符或能够更简便的操作(如TPLINK的路由器甚至可以直接搞一个二级域名,酸了)可以直接跳过。

我的路由器是电信给的光猫,具体型号是ZXHN F650。操作端口映射需要光猫的超级管理员权限,账号密码是telecomadmin/nE7jA%5m,具体情况因人而异,如果不对的话可以打电话给电信让他联系负责维修你周围片区的师傅,然后商量一下他应该就会告诉你的。

登进超级管理员账户后,点击应用 - 高级NAT设置 - DMZ设置,如下图

流程1

在DMZ主机IP地址内填上你的树莓派的IP地址,点击保存然后再点击第二行的虚拟服务器设置
流程2

填好你的外部端口、客户端IP地址(树莓派的ip地址)、内部端口(80,因为webdav用的是Apache所以使用80端口)然后点击保存。

现在再在浏览器访问http://你的公网ip:你填的外部端口号/webdav就会发现

惊不惊喜,意不意外

嗯?怎么回事?难道我们配错了吗?
不是的!这里完全就是电信的锅!根据研究表明,问题根本就出在这个电信光猫的DMZ是暴力映射,导致你在内网环境下用公网访问它就懵圈了,其实这个时候只要掏出手机用4G访问,大概率就是成功的。

如果在非内网环境下访问也成功了,那么恭喜你,第三步基于哈批电信光猫的端口映射公网IP访问你也成功搞定了!

----- 未完待续 -----

以下文章在本次实现过程中给予了我巨大帮助与部分问题的思路,特此记录并感谢:
❖ Ubuntu安装WebDav文件共享服务器(NAS)
玩树莓派(raspberry pi) 2/3 raspbian的遇到的一些问题
树莓派—raspbian软件源(全)
解决perl: warning: Setting locale failed.
中国电信光猫路由模式端口映射问题记录

你可能感兴趣的:(树莓派 | Apache2 + Webdav搭建NAS并映射至公网全流程踩坑记录)