服务器折腾之旅:购入服务器,域名绑定与反向代理

宝贵的端午假期,干了几件事:科目二终于上车实操了;买了属于自己的云服务器。关于云服务器,两年以前我试用过阿里云的服务器,并在上面搭建起了自己的应用,当时的体验还不错,不过试用期三个月过去,并没有继续续费。

今年上旬随着关注了一些Github项目,拥有一个服务器的想法愈发强烈。假期第一天,在斟酌许久以后,终于在阿里云下单了一个两年的香港服务器,共计1900大洋。

服务器采购之旅

下单服务器之前,看了很多个厂商:阿里云是首选,腾讯云,华为云,火山引擎,七牛云都在清单上。从价格和服务上,阿里云都是性价比最高的选择。我最开始下单了一台华东的服务器,价格上两年只要一千块,但是在部署服务的时候遇到了不少需要折腾的地方:

首先就是大陆服务器的限制问题,导致docker的官方镜像源没办法拉,虽然可以用阿里云的加速源解决,但是还是有部分镜像在国内镜像源始终无法拉取。

其次是致命的访问问题,我在服务器上部署了几个应用,但是在安全组端口策略和防火墙策略已经放开的情况下,始终无法访问。这里附上我提的工单,不得不提,阿里云的售后服务效率很高,本以为假期无法回复,想不到迅速就给出了解答。

在解答的过程中,注意到是代理的问题,由于我的电脑和主机长年开着代理,导致访问时会出现阻塞,使用一个国际服务器在一定程度上可以解决这个问题。

亚太服务器中,香港和新加坡都是不错的选择。前者在国内访问速度更快,后者比前者要便宜300块钱,并且对国际访问更友好,权衡之下最终决定购入香港服务器。

域名绑定与Nginx反向代理

Nginx反代在这篇博客里简单介绍过,这里记录一下这次服务器部署的服务。首先,我在服务器上起了一个web服务,指向0.0.0.0:4444端口,在安全组策略配置过以后,可以通过IP:4444直接访问到这个服务,但是这显然不安全。

由于我有一个zerolovesea.top的域名,我希望将这个服务绑定在service.zerolovesea.top上,这样通过访问这个域名可以直接使用这个服务。首先需要在阿里云域名–>域名解析处添加一条A类型的主机记录,主机记录命名为se rvice,记录值为服务器ip。这样当访问service.zerolovesea.top时,就会跳转到服务器ip。

随后就是Nginx配置,首先我们添加一下service.zerolovesea.top.conf作为配置项(vim /etc/nginx/conf.d/service.zerolovesea.top.conf),配置如下:

1
2
3
4
5
6
7
8
9
10
server {
listen 80;
server_name service.zerolovesea.top;

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

我们需要监听服务器的http默认80端口,并将外部访问通过 http://service.zerolovesea.top 的请求,反向代理到本地的 http://127.0.0.1:4444。随后配置设置代理请求头,将客户端信息传递给服务器。

写完配置后,检查一下配置,并重启nginx:

1
sudo nginx -t && sudo systemctl reload nginx

在这之后,可以为域名申请一下SSL证书,使用certbot可以一键为nginx配置Https。

1
2
3
4
sudo apt update
sudo apt install certbot python3-certbot-nginx

sudo certbot --nginx

执行后,certbot会识别Nginx配置的所有域名,请求Let’s Encrypt 免费证书,随后修改 Nginx 配置文件,加上 SSL 配置。最后自动重启 Nginx 以生效。

Cloudflare代理配置

如果没有使用代理,那么之前的操作已经足够了,不过由于此前我的域名是通过CF代理的,因此需要在CF上配置一下DNS。同样添加一条A类型的service记录,指向服务器IP,代理状态打开。这时就大功告成了。访问service.zerolovesea.top直接可以访问到部署的应用。

streamlit服务部署踩坑

最后顺便记录一个踩坑心得。写了一个streamlit服务,使用Docker进行部署后,发现浏览器怎么都无法打开,显示Bad gateway Error code 502,该网页无法正常运作。安全组和入方向规则均已开放了端口,并且服务器和外网使用curl指令都可以获取到返回,就是浏览器上打不开。

检查后发现是由于Nginx 默认不转发Streamlit默认使用的WebSocket 协议头,在nginx配置里加上后就可以正常访问了。

curl 只取 HTML,不涉及 WebSocket、JS 执行,所以它不会暴露这个问题。

附上了最后我的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
server_name aidash.zerolovesea.top;

location / {
proxy_pass http://127.0.0.1:18502;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";


proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

修改完以后,sudo nginx -t && sudo systemctl reload nginx一下,顺利解决。

2025/6/1 于苏州