0%

云存储服务器搭建

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端口。