如何管理我的网络服务?

本文其实没有什么技术含量,更多是为了我日后进行回顾,一些端口信息和服务版本进行了混淆

服务概况

目前,我有一台阿里云的公网2c2g和内网4c8g两台服务器。内网服务器部署的服务有Halo博客、Chronoframe画廊、Nominatim地理编解码、Cloudreve网盘和AstrBot框架,公网上则运行了Napcat和哪吒面板。

frp穿透

云服务的性能瓶颈主要体现在内存上,早些时候我曾将AstrBot、Napcat和博客一起放在云上,结果就是服务器的内存占用轻松上90%,再安装些插件很容易就会OOM,然后一整台机子就宕机了,不得不重启。

为了解决这个问题,我将大多数服务都部署在内网机子上,再通过frp绑定到公网端口。为了确保安全,我开启了auth.token对连接进行了认证,并且所有连接采用frp提供的STCP协议进行传输,以此保证数据从内网服务器到公网服务器这段是加密的,而且避免了直接开放端口。

使用STCP后,需要在公网机器上使用frpc的visitors配置与内网的proxies配置进行握手连接。也就是说明只有本地才能直接访问穿透过来的数据,即使在防火墙和云服务器安全组均开放的条件下,其他人也是不能通过浏览器IP+端口的方式直接访问服务的。

[[proxies]]
name = "halo"
type = "stcp"
localIP = "127.0.0.1"
secretKey = "Kojc51UQrWJM5byt0F0W"
localPort = 16498
[[visitors]]
name = "halo_public"
type = "stcp"
serverName = "halo"
secretKey = "Kojc51UQrWJM5byt0F0W" #随机强密码,不代表本人使用
bindAddr = "127.0.0.1"
bindPort = 27655 #随机高位端口,不代表本人使用

为什么将Napcat与AstrBot分开部署而不是同时部署在内网机器?起初在进行服务前移时确实将Napcat和AstrBot一起移到了内网,但是出现了Napcat登录的QQ号被强制下线的问题,我考虑到可能是内网的原因,又把Napcat放回了公网,下线问题好像有所改善,但是过了几天又开始了。最后我把Napcat版本稍微回退了几个,得到了很好的改善,已经稳定运行好几天了。

nginx反向代理

前面提到,当使用了STCP协议后,便不再支持通过IP+端口的方式访问穿透过来的服务,但是本地是可以正常访问的,所以我们需要配置nginx反向代理,让nginx以本机访问127.0.0.1的方式建立连接。并且,使用nginx可以非常方便地使用certbot为域名签发SSL证书,至此整条数据链路从内网到公网都实现了数据加密。

使用子域名进行反向代理。

server {
    server_name blog.leyi.live;

    client_max_body_size 512M;
    client_body_timeout 300s;
    proxy_read_timeout 300s;

    # 访问日志
    access_log /var/log/nginx/blog_access.log;
    error_log /var/log/nginx/blog_error.log;

    location / {
        proxy_pass http://127.0.0.1:27655;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/blog.leyi.live/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/blog.leyi.live/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

只要nginx配置完成,使用certbot配置SSL证书就是一句话的事情,而且Cerbot会自动续签,非常简单、省心。

sudo certbot --nginx -d blog.leyi.live

监控与日志

使用哪吒面板能够清晰地观察每台服务器的物理状态,并且界面简约、美观。哪吒面板的部署与agent的部署官方文档写的都很清晰,可以一步步跟着来部署。

还有一个用于查看容器日志的Dozzle,每次容器出问题都要输入docker logs实在是太痛苦了,这个工具可以把所有的日志都打包整理好,还可以按照日志等级进行筛选。

这个工具也是用docker运行的,基本上一条命令就可以跑起来。在配置agent的时候遇到一个小坑,最新的镜像尝试运行agent模式容器会报错。

docker run -d \
--name dozzle-agent \
--restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
-p 7007:7007 \
docker.xuanyuan.run/amir20/dozzle:latest  agent

解决方法是不要拉取最新的标签,可以使用master标签的镜像再拉取。

评论