By Z.H. Fu
https://fuzihaofzh.github.io/blog/
## 摘要
随着云概念的普及,越来越多的人开始使用云存储服务,与此同时提供云服务的公司也越来越多。本文给出了私人云存储服务的搭建方法,实现了利用seafile在家里假设服务器,在其他地方备份的模式;同时,由于在家里的网络是内网,外接无法访问,本文通过内网穿透的方式实现了外网对内网的访问;最后,通过nginx实现了反向代理,将外网的访问统一到80端口。
seafile服务搭建
![NN](/blog/images/seafile.jpg)
我们这里的私人存储服务采用的工具seafile实现,seafile是非常优秀的一个工具,支持在Windows,Linux和Raspberry Pi 上搭建服务,而客户端则可运行在Windows,Linux,Mac OS和Android上,实现多种平台间的数据同步。下面给出实现步骤
1、首先我们到https://www.seafile.com/download/ 上下载seafile的安装包。
2、按照服务文档http://manual-cn.seafile.com/ 安装,这里没有什么坑,都还比较顺利。
内网穿透
由于我们的云存储服务一般都放在家里,需要从外部访问,但是外部访问的地址该怎么填呢?是不是直接填自己的ip就行了?不幸的是,对大多数人来讲,这是不行的。我们先来查查自己的ip,查询ip有两种方法,一是在命令行里面输入ifconfig,二是登录http://ip.cn/ 查询,经过查询后,发现两个ip不一样,查阅资料后发现是因为家里的网络通常是被运营商再包过一层,使用的ip是运营商提供的内网ip,相当于处在了一个局域网里面,因而无法从外部直接访问,那么这个时候就需要采用内网穿透的方式来提供对外的访问。所谓的内网穿透实际上也还是需要借助外部服务器的,在这里向大家推荐一个软件叫做ngrok,其工作原理就是在他的服务器上建立一个子域名,并和本地服务器关联,所有访问外部服务器的请求都被转到了本地服务器,实现了外部访问。由于众所周知的缘故ngrok主页无法访问,好在国内有人做了一个类似的服务,下面给出实现步骤:
1、到www.tunnel.mobi 下载ngrok 1.7。
2、新建配置文件 ~/.ngrok
内容如下:
1 2 3 4 5 6
| server_addr: "tunnel.mobi:44433" trust_host_root_certs: true tunnels: www.yoursite.org: proto: http: 80
|
3、运行ngrok
1
| ./ngrok start www.yoursite.org
|
运行后能看到结果如下:
1 2 3 4 5 6 7 8
| ngrok (Ctrl+C to quit)
Tunnel Status online Version 1.7/1.7 Forwarding http://www.yoursite.org -> 127.0.0.1:80 Web Interface 127.0.0.1:4040 # Conn 3 Avg Conn Time 0.00ms
|
其中,www.yoursite.org 是你的域名,外网通过访问该域名来访问你本机的80端口即127.0.0.1:80。注意这里需要在域名服务商那里加一条CNAME记录。如果没有自己的域名,可以直接采用yoursite.tunnel.mobi子域名的形式来访问,具体设置方式可以参考www.tunnel.mobi的官方教程。
反向代理
仔细研究seafile的文档发现,它开启了两个端口即seafile:8000,seahub:8082。8000端口用于提供网络访问页面,而8082端口则用于文件传输。可是,ngrok只能将域名转到一个指定的端口上,不支持一个域名两个端口,所以在这里我们就需要采用反向代理的方式,在80端口架设一个nginx服务,而所有的请求都访问80端口,随后再由nginx反向代理到8000和8082端口。我们首先来看nginx的配置文件,nginx的默认配置文件是 /usr/local/nginx/conf/nginx.conf,将其关键部分摘录如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| location / { proxy_pass http://127.0.0.1:8000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_script_name; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; fastcgi_param REMOTE_ADDR $remote_addr; access_log /var/log/nginx/seahub.access.log; error_log /var/log/nginx/seahub.error.log; }
location /seafhttp { rewrite ^/seafhttp(.*)$ $1 break; proxy_pass http://127.0.0.1:8082; client_max_body_size 0; proxy_connect_timeout 36000s; proxy_read_timeout 36000s; }
|
注意这里8000端口和官方文档采用的方式不同,官方是采用fastcgi来实现,经过实测,发现fastcgi方式无法访问,因而这里是直接通过代理端口实现。在这个文件里,location表示访问的地点,第一个是
/
即表示要访问根目录,而第二段/seafhttp则表示要访问根下的/seafhttp目录。
这一切完成后,我们做一个启动文件,同时开启这些服务:
1 2 3 4
| sudo /usr/local/nginx/sbin/nginx sudo /path/to/seafile/seafile-server-latest/seafile.sh start sudo /path/to/seafile/seafile-server-latest/seahub.sh start ./ngrok start www.yoursite.org
|
同理我们给出停止脚本:
1 2 3
| sudo /usr/local/nginx/sbin/nginx -s stop sudo /path/to/seafile/seafile-server-latest/seafile.sh stop sudo /path/to/seafile/seafile-server-latest/seahub.sh stop
|
动态域名解析
如果你的本机ip地址和在http://ip.cn/ 上查到的相同,则说明你的运营商是直接连接Internet的,那么这时候直接在seafile中配置你的ip地址即可,而由于运营商通常采用动态ip,因此,ip改变后我们便无法访问服务器,这时候就需要用动态域名解析,国内提供该服务的公司主要是花生壳,而很多路由器直接提供了花生壳的服务支持,具体方式是登录192.168.1.1,一般用户名和密码都是admin,找到动态DNS项,在其中填写你的域名即可。
端口映射
这时候你的电脑不是直接连接网线,而是通过路由器连接的网络,那么要访问你电脑上的端口则需要先做一个端口映射,端口映射是干这么一件事,例如你的服务器接在路由器上,而别人要访问路由器的80端口,在设置了端口映射后,路由器直接将该访问转接到你的服务器的80端口。