在AI辅助下很快把几乎忘记的小vps捡起来了

简介

  • 问了大模型Nginx Proxy Manager怎么配置

  • 问了二级域名怎么往vps上挂,能用来做什么,考虑后面新建一些站点,作为以后的实用型页面或者纯粹没用的小玩意

AI可真好用啊

四月虽然也很忙,不过最近终于重新登录,把FGO第一部打完了,建号十年只玩了这么一点,上去一看感觉熟悉又陌生。

如果不是因为新手机空间够大、够折腾,我是不会折磨自己玩手机游戏的。

第一阶段:部署Nginx Proxy Manager(反向代理)

1
2
3
mkdir -p ~/npm && cd ~/npm
vim docker-compose.yml # 编写NPM的compose 文件
docker-compose up -d # 启动NPM(暴露80/443/81)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# docker-compose.yml
version: '#'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
container_name: nginx-proxy-manager
restart: always
ports:
- '80:80' # HTTP流量
- '81:81' # 管理后台流量
- '443:443' # HTTPS流量
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt

作用:NPM作为统一入口,占用服务器的80/443端口,负责SSL证书申请+域名分发。

第二阶段:准备任意站点文件

projectname改为任意需要的二级域名

1
2
sudo mkdir -p /opt/projectname
sudo vim /opt/projectname/index.html #写入静态页面

作用:站点文件放在宿主机,方便直接修改。

第三阶段:启动projectname容器(第一次,失败)

1
2
3
4
5
6
docker run -d \
--name projectname \
--restart unless-stopped \
-p 127.0.0.1:8081:80 \
-v /opt/projectname:/usr/share/nginx/html:ro \
nginx:alpine

问题:projectname容器用了 -p 127.0.0.1:8081:80,但NPM也在容器里。容器访问宿主机 127.0.0.1 不是宿主机本身,导致NPM无法通过 127.0.0.1:8081找到projectname。

第三阶段(重复):关键修复 —— 加入同一Docker网络

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 先查NPM在哪个网络
docker inspect nginx-proxy-manager \
--format '{{range $k,$v := .NetworkSettings.Networks}}{{$k}}{{end}}'

# 输出:npm_default

docker rm -f projectname

docker run -d \
--name projectname \
--restart unless-stopped \
--network npm_default \
-v /opt/projectname:/usr/share/nginx/html:ro \
nginx:alpine

核心点: - 去掉-p端口映射(外部根本不需要直接访问projectname) - 加上--network npm_default,让projectname和NPM在同一个Docker网络里 - 两个容器可以通过容器名直接通信http://projectname

第四阶段:域名解析

登录域名解析管理 → NetworkingDomains → 选择domain.com

添加一条A记录:

字段 说明
Type A IPv4解析
Hostname projectname 只填子域名部分,不要写完整域名
Will Direct To 你的服务器IP 就是NPM所在的那台vps
TTL 3600(默认) 或改成 600 加快生效

填完点Create Record

如果有IPv6,再加一条AAAA记录,Hostname同样是projectname,指向服务器的 IPv6 地址。

为什么这步必须在 SSL 之前

Let's Encrypt的HTTP-01验证流程是:

1
2
3
4
5
6
7
Let's Encrypt服务器
↓ 访问 http://projectname.domain.com/.well-known/...
↓ (这时需要DNS能解析到你的服务器!)
你的 NPM
↓ 返回验证文件

Let's Encrypt 签发证书

如果DNS没生效就点Request SSL Certificate,NPM 会报错:

1
2
Internal Error / CommunicationError / 
unauthorized :: ... DNS problem: NXDOMAIN

验证DNS是否生效

在本机或服务器上跑:

1
2
3
4
5
6
7
8
9
# 方法 1:dig
dig projectname.domain.com +short
# 期望输出:你的服务器 IP

# 方法 2:nslookup
nslookup projectname.domain.com

# 方法 3:在线工具
# https://dnschecker.org 输入域名看全球解析状态

只有当dig返回正确IP后,才去NPM点SSL

泛域名的省事做法(推荐)

如果你以后还会加 xxx.domain.com 各种子域名,一次性配置泛解析更省心:

在域名解析页面加一条:

Type Hostname Will Direct To
A * 服务器 IP

这样以后新加blog.domain.comapi.domain.comwhatever.domain.com不用再动DNS,直接在NPM里加Proxy Host就行。

不过要注意:泛解析 + Let's Encrypt通配符证书 需要DNS-01验证(要在NPM里配域名解析页面的API Token),比单域名麻烦一点。如果只是每个子域名单独申请证书,泛A记录 + HTTP-01仍然能正常工作,推荐这种。

第五阶段:验证 + 上线

1
2
3
4
5
6
7
8
9
10
# 从NPM容器内部测试能否访问projectname
docker exec nginx-proxy-manager wget -qO- http://projectname #无所谓的步骤

# NPM 后台(:81)添加 Proxy Host:
# Domain: projectname.domain.com
# Forward Hostname: projectname ← 容器名
# Forward Port: 80
# SSL: 勾选 Let's Encrypt

curl -I https://projectname.domain.com # 验证成功

projectname之后的修改方式

静态页面极简修改流程:

1
sudo vim /opt/projectname/index.html

立即生效! 不需要重启容器,因为: - -v /opt/projectname:/usr/share/nginx/html:ro挂载,不是拷贝 - 浏览器刷新即可看到新内容(如有缓存加 ?v=2)

如果要加新页面/图片:

1
2
sudo cp about.html /opt/projectname/
sudo cp -r images /opt/projectname/

只有在修改nginx配置(不是html)时才需要:

1
docker restart projectname