无公网ip设备(树莓派)建站

其实这篇文章应该写在[宿舍树莓派捣鼓记录][2]里面的,不过考虑到其实这种方法适用于其他的各种设备,所以将其独立了出来,另外“无公网ip”的说法还是有一些标题党的,虽然我们的树莓派可以“无公网ip”,但是我们依旧需要一台有公网ip的机器来进行对树莓派的端口映射以及反向代理,其他的设备同理。

无公网ip的树莓派建站

周五晚上好无聊,又不想看书,所以写下这篇文章。虽然这篇文章是以树莓派作为无公网ip设备的例子来写的,但是其他的linux设备同样可以使用该方法,操作也基本一样。 可以看看demo,不过由于学校晚上断网断电,另外折腾过程中文件可能也会变化,所以不保证能够访问。

其实这篇文章应该写在宿舍树莓派捣鼓记录里面的,不过考虑到其实这种方法适用于其他的各种设备,所以将其独立了出来,另外“无公网ip”的说法还是有一些标题党的,虽然我们的树莓派可以“无公网ip”,但是我们依旧需要一台有公网ip的机器来进行对树莓派的端口映射以及反向代理,其他的设备同理。

至于“用有公网ip的机器来映射端口与反代”是不是多此一举,那就看你怎么看了。国外有公网ip的服务器可便宜得很,几块钱一个月就能得到一个具有独立ip的服务器了,但是这些服务器往往性能不咋地,而使用这种方法我们就可以使用家里性能强劲一些的机器提供web服务了(当然,树莓派只是折腾着好玩的,如果对性能有需求可以选用诸如nuc之类的性能强一些的迷你主机),而就算是树莓派,挂载一个硬盘再映射出去,也能作为一个网盘使用,数据也掌握在自己手上,不用担心服务商跑路之类的问题(只要你本地上传速度足够,虽然大陆下载国际上的数据实在是缓慢,但是上传方向的速度还是可以的)。我的树莓派在校园网之下,上传速度正好比较给力,到国外的机器能有六七十兆以上的速度。

设置cloudflare

这一步可有可无,如果你国外的服务器线路实在是太差了,可以用cloudflare优化一下(虽然这家伙大部分时候都是拖慢速度的),将域名服务器转到cloudflare后,添加一条记录,以pi.do.ci为例,解析到你用于映射与反代的服务器,并开启cdn(橙色云朵),不过不开cdn,仅作为dns解析也可以(这样的话就不需要把域名服务器转到cloudflare了)。 建议暂时只当作dns解析,稍后开启https的时候再开启cdn模式

树莓派安装nginx

这一步很简单,在树莓派用apt install nginx之类的命令把nginx装好即可,另外建议修改一下站点配置文件,我的系统中是/etc/nginx/sites-enable/default
(不通的发行版可能会有差异),建议直接在改目录下复制一份文件,并作出修改。 为了后面便于看出效果,我们先随便找个静态网站的页面放进去并作为网站根目录

在有些系统中,可能sites-enable中直接就是配置文件,而另外一些系统中,sites-enable里面的则是符号链接文件,指向sites-available中的实际文件,不过无论哪种情况,都是只有在sites-enable里面的配置文件才是真正启用的。,所以我们直接在sites-enable里面添加配置文件也是可以的,不过要注意复制的default是不是只是一个符号链接文件。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
git clone https://github.com/StartBootstrap/startbootstrap-new-age.git
cp /etc/nginx/sites-available/default /etc/nginx/sites-available/pi
#编辑如下
server {
        listen 80;
        listen [::]:80;
        root /var/www/html/startbootstrap-new-age;
        index index.html index.htm index.nginx-debian.html;
        server_name pi.do.ci;
        location / {
                try_files $uri $uri/ =404;
        }
}
#这里我就不设置ssl了,修改好之后重启一下nginx
systemctl restart nginx

设置frp

frp是用于端口映射的工具,它可以让具有公网ip的服务器充当中介,转发无公网ip的设备的端口,官方已经提供了详细的文档网上也有了很多成熟的教程,这里就不赘述了。

服务端设置

先从github release页面上下载frp。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
wget -O frp.tgz https://github.com/fatedier/frp/releases/download/v0.34.1/frp_0.34.1_linux_amd64.tar.gz
tar -zxvf frp.tgz
cd frp_0.34.1_linux_amd64/
#编辑服务端配置文件,其实不需要改什么,建议加上一个token字段防止端口映射被他人利用
nano frps.ini
#加上token
token=berrypi
#ctrl+o保存后退出
#另外,为了让我们在登出shell之后保持程序的运行并且方便管理,我们需要安装tmux或者screen之类的工具。
tmux new -s frp
./frps -c frps.ini
#正常运行之后便可以把界面挂到后台
ctrl+b+d

客户端设置

由于这次折腾用的是树莓派,而我装的是64位的系统(官方系统目前还是32位的),所以下载arm64的frp。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
wget https://github.com/fatedier/frp/releases/download/v0.34.1/frp_0.34.1_linux_arm64.tar.gz
tar -zxvf frp_0.34.1_linux_arm64.tar.gz
cd frp_0.34.1_linux_arm64
nano frpc.ini
#修改配置如下
[common]
server_addr = 用于映射的服务器ip
server_port = 7000
token = 前面设置的token
[piweb]
type = tcp
local_ip = 127.0.0.1
local_port = 80
remote_port = 8000
#之后同样在tmux或screen中运行frpc程序
tmux new -s frp
./frpc -c frpc.ini
ctrl+b+d

如果你仔细阅读了官方文档的话,可以发现他们还提供了type = http的参数,设置类型为http可以进行一些额外的操作,比如修改http请求中的header,给网页加上鉴权登录,自定义二级域名等操作,不过我们目前用不到这些功能,所以直接按照tcp转发即可。
成功启动转发
这时候直接访问映射服务器 ip:8000 理论上就能看到nginx的默认页面了(如果你开启了cdn,那就不要使用域名访问,cloudflare是不会帮你访问8000端口的)。
nginx的默认页面
但是这网站还要手动指定端口访问多不方便,所以我们还需要设置一下反向代理,让我们可以通过80/443端口访问到我们的机器。

设置反向代理

在用于反代的机器上的nginx站点配置文件夹/etc/nginx/sites-available (再次提醒,不同的发行版,甚至同一发行版的不同版本这个配置文件的表现可能有一点不同,比如在树莓派中,这个文件夹中直接就是文件,而到了ubuntu中,这个文件中又是指向site-available中同名文件的符号链接) 中新增一份配置文件。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
nano pi
#填入下面的内容
server {
        listen 80;
        listen [::]:80;
        root /var/www/html;
        index index.html index.htm index.nginx-debian.html;
        server_name pi.do.ci;
        
        location / {
           #被中转的机器(树莓派)没开ssl,就不用这个
           #proxy_ssl_name pi.do.ci;
           #proxy_ssl_server_name on;
           proxy_set_header  Host $http_host;
           proxy_set_header  X-real-ip $remote_addr;
           proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_redirect off;
           proxy_pass http://127.0.0.1:8000;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection "upgrade";
        }

}

如果你是在sites-available里面创建的配置文件,那么记得在sites-enable中添加一个软链接,sites-enable里面有的文件才是实际启用的站点,添加后记得重启nginx
另外,如果你用于中转的机器的默认站点配置文件开启了http 301重定向到https,那我们得把它给关了,不然直接重定向到443了,而我们这个站点配置是没有监听443端口的。
配置好之后,访问我们设置的域名,已经可以访问到网站了。
通过域名访问网站

通过cloudflare开启https

如果我们想开启https,又懒得折腾证书,可以直接通过开启cloudflare的cdn,并开启https重写,并使用灵活模式,使得用户浏览器到cloudflare这一段路走的https,而之后继续使用http进行通信。
点亮云朵开启cdn
默认就是灵活模式啦
另外建议进入边缘证书设置中启用“使用使用https”与“自动https重写”。
等待一段时间,当dns解析更新与证书签发都完成之后再度访问我们的网站,发现已经启用了https了。

nginx显示文件目录

另外,当我们想在树莓派上挂载一块硬盘,又懒得搭建专门的网盘程序时,可以开启nginx的目录显示功能(不过更加建议使用miniserv这个项目了,可以设置密码,还可以上传文件,并且更加好看)
编辑我们树莓派nginx配置文件中的pi文件。

1
2
3
4
5
6
7
8
#当然,这个location也是可以手动指定的,比如可以指定只在files路径下显示目录
location / {
#location中加入以下内容,之后重启nginx
#指定实际目录绝对路径;
        autoindex on;                            #开启目录浏览功能;
        autoindex_exact_size off;            #关闭详细文件大小统计,让文件大小显示MB,GB单位,默认为b;
        autoindex_localtime on;              #开启以服务器本地时区显示文件修改日期!
}

之后就是这个效果啦

开启全站缓存Always online

之前提到了,学校晚上会断网断电,但是在断网断电之后我们依旧可以让我们的网站能够访问,那就是借助Cloudflare的Always online服务,对整个网站的内容(静态内容)进行缓存,前往页面规则添加Always online并设置好参数即可。
Always online
之后我们可以把树莓派上的nginx服务器关闭看看,本来会提示错误的,但是开启全站缓存之后,网站依旧可以正常访问(当然可能有部分内容显示不正常,尤其是动态站点,不过我的网页是hexo生成的静态文件,所以看不出有什么变化。)还有就是,能够正常显示的前提是你访问的内容缓存过,也就是说,服务器离线之前有人访问过的文章才会被缓存下来,如果访问没被缓存的内容依旧会返回502错误的。

后记

其实这些操作并不难,不算特别有趣,也没有什么新的知识点,但是我还是从头到尾走了一遍,因为我的第一个网站就是几年前搭建在树莓派3b上的,那时候还使用了sakura frp作为映射,我当时很好奇——为什么通过我的域名访问他们的ip就能定向到我的网站而不是其他用户的网站呢?经过后来的学习,我知道了web服务器可以根据header中不同的host使用不同的网站根目录,而今天就是无聊之际想着通过实际操作来回答一下当年的疑问,所以有了这篇文章。

Licensed under CC BY-NC-SA 4.0
最后更新于 Oct 09, 2020 15:10 UTC
comments powered by Disqus
本站访客数:
使用 Hugo 构建
主题 StackJimmy 设计