第二部分 - 域名与站点
嗨嗨! 这篇文章分享如何低价获得域名, 创建自己的站点!
欸你说没有服务器? 请参考第一部分: 跳转到第一部分.
几个问题
为啥需要域名?
当我们访问网页的时候, 实际上是通过HTTP协议访问80端口, 那么服务器怎么知道你需要访问哪个服务呢?
如果我们有域名, 可以通过多个子域名(例如a.domain.com
和b.domain.com
来区分各个网站), 服务器通过分流工具 (例如Traefik/Nginx/Apache等) 决定向你展示哪个网站.
而且, 比起使用 IP 地址访问 (最初的98), 有一个域名可以更好地记忆, 还可以作为独特的个人邮箱 (例如[email protected]
)
付费还是白嫖?
白嫖很不错, 但在域名上花点小米可能是需要的~
这是因为免费的域名可能存在以下问题:
- 目前大多数可白嫖域名都是二级域名, 或只有一年有效期.
- 无法设置企业邮箱.
- 在微信显示为不良网站.
- 可能存在不稳定的情况.
为了避免你搞了半天气到爆炸, 推荐还是付费买便宜的域名啦~
买多久?
域名是按年购买的, 没有永久的~
如果你只是临时起意, 推荐使用腾讯云/阿里云的首年优惠域名.
如果你可能要长期使用, 更推荐买便宜域名 10 年哦.
(这是因为域名续费价格比新购更贵, 而且有长期域名后用作个人邮箱更心安)
主要的域名购买渠道
Option 1. 腾讯云 / 阿里云
如果你不需要一个长期的域名, 我推荐看看腾讯云的新人页面和阿里云的新人页面, 领取首年 1 元的域名, 基本足够使用啦.
如果你需要长期使用, 可以选择一些小众域名后缀, 200 元左右拿下 10 年域名:
阿里云: .top
(188) / .fun
(188) / .tech
(199) / .space
(188)
腾讯云: .site
(178) / .tech
(195) / .online
(175)
以上价格可能随时间变动, 双十一等消费节时也可能会有活动, 可以蹲一蹲看看: 腾讯云的活动页面和阿里云的活动页面.
Option 2. 其他可能更便宜的国外域名商
从国外域名商购买, 无需实名认证, 且对于.com
/ .net
等出名的域名可能更加便宜. (可以通过哪煮米进行比价)
各位前辈可以自行研究~
Option 3. 白嫖!
很可惜, 目前可以白嫖的大多数是一级域名一年(例如 Namecheap 学生计划), 或是二级域名, 因此不太推荐白嫖哦.
如果有需要, 可以访问以下资讯站: 如有乐享
链接各个子域名
当你购买了域名以后, 如何让它链接你的服务器呢?
你需要理解域名的工作原理!
有一天, 你打开了一个奇怪的站点:
- 你的电脑会查询 DNS 服务器;
- DNS 服务器会去问你的域名注册商;
- 域名注册商会去询问你设置的 NS 服务器;
- 最后 NS 服务器返回实际的地址.
这里, 我们使用 Cloudflare 作为 NS 服务器:
首先注册登录 Cloudflare, 点击 Add a site, 输入你刚刚注册的域名(例如
domain.com
):然后选择 Free Plan, 显示需要更改 Nameserver 服务器:
进入域名注册商网页, 找到更改 Nameserver 服务器地址的地方, 例如腾讯云:
修改后等待几个小时, 如下警告消失, 说明 Cloudflare 已经成功链接了你的域名:
进入 Cloudflare 中的 DNS 设置界面:
这里我们可以增加各个子域名, 例如我的域名是
domain.com
, 要增加一个名为blog.domain.com
的子域名, 需要增加一个A
类型的解析记录, Name 为blog
, 地址为你的服务器地址. 最后的Proxied
代表使用 Cloudflare 的 CDN, 这个如果你的服务器在国外推荐开启, 国内开启可以隐藏服务器 IP 避免攻击, 但会显著降低连接速度.
如何让你的服务器识别各个子域名并启用 HTTPS
这里我们一般使用 Docker 来运行各个子站点, 使用 Docker Compose 管理所有服务.
创建一个
traefik
文件夹, 并放入以下配置文件:dynamic.yml
:1
2
3
4
5
6
7
8
9
10
11
12
13
14http:
routers:
all-https:
rule: "HostRegexp(`{host:.+}`)"
entryPoints:
- web
tls: true
middlewares:
- to-https
priority: 1000
middlewares:
to-https:
redirectScheme:
scheme: httpsstatic.yml
:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35log:
level: DEBUG
filePath: "/var/log/traefik.log"
#accessLog:
# filePath: "/var/log/access.log"
# format: json
api:
dashboard: true
entryPoints:
web:
address: ":80"
websecure:
address: ":443"
http:
tls:
certResolver: le-dns
domains:
- main: domain.com
sans:
- "*.domain.com"
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
network: web
defaultRule: Host(`{{if index .Labels "com.docker.compose.service" }}{{ index .Labels "com.docker.compose.service" }}.domain.com{{else}}{{ trimPrefix `/` .Name }}.domain.com{{end}}`)
file:
filename: "/etc/traefik/dynamic.yml"
certificatesResolvers:
le-dns:
acme:
storage: "/acme.json"
email: [email protected]
dnsChallenge:
provider: cloudflare(请将上述文件中的 4 处 domain.com 替换为你的域名)
进入 Cloudflare 控制台, 进入 My Profile 中的 API Tokens, 创建一个 Token, 需要在
All zones
具有Zone.Zone, Zone.DNS
权限, 完成后复制Token.
创建一个
.env
文件夹, 并放入以下密钥文件:traefik.env
:1
2CF_API_EMAIL=你的Cloudflare账户邮箱
CF_API_KEY=你复制的 API Token创建一个
docker-compose.yml
文件:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39version: '3.9'
services:
qinglong:
image: whyour/qinglong
container_name: qinglong
restart: unless-stopped
volumes:
- ./qinglong:/ql/data:rw
labels:
- traefik.enable=true
- traefik.http.routers.qinglong.rule=Host(`ql.domain.com`)
- traefik.http.services.qinglong.loadbalancer.server.port=5700
traefik:
container_name: traefik
image: traefik
restart: unless-stopped
ports:
- 80:80
- 443:443
security_opt:
- no-new-privileges:true
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik/static.yml:/traefik.yml:ro
- ./traefik/dynamic.yml:/etc/traefik/dynamic.yml:ro
- ./traefik/acme.json:/acme.json:rw
- ./traefik/traefik.log:/var/log/traefik.log:rw
- ./traefik/access.log:/var/log/access.log:rw
- /etc/localtime:/etc/localtime:ro
env_file:
- ./.env/traefik.env
labels:
- traefik.enable=true
- traefik.http.routers.traefik.service=api@internal
- traefik.http.routers.traefik.middlewares=user-auth@file
networks:
web:
name: web这里, 对于每个服务, 可以在 label 中 使用如下设置:
- 使用
traefik.enable=true
表示该服务需要链接子域名. - 使用
traefik.http.routers.服务名.rule=Host(
子域名)
指定该服务需要链接的子域名 (不指定默认为服务名.域名
). - 使用
traefik.http.services.服务名.loadbalancer.server.port=容器内的HTTP端口
指定端口.
- 使用
在
docker-compose.yml
的同级目录, 执行docker-compose up -d
, 以启动服务.- 访问你设定的子域名 (例如
sign.domain.com
), 应该可以看到你的网站已经成功运行了!
接下来…
呼! 终于完成了部署, 现在你可以拥有各式各样的网站和服务了.
第三部分将分享如何狠狠压榨你的服务器: 跳转到第三部分