到1月10日网站的 ecs 云主机就要到期了;
看了一下控制台,续费一年的话可以打3折,只要250¥,
于是去首页看了一下,新购一台同等配置的才99¥,当然选择新购了;
于是今天加班回来后,花了一个半小时完成了迁移
记录一下主要流程,后面补充细节
- 控制台新购一台云主机
- 控制台重置密码
- 操作系统基础配置
- 拉取nginx镜像, 上传站点静态文件
- 添加 ipv6 支持
- 更新 dns 记录
- 更新 https 证书; 包括 (www 和 blog) 的 2 个 证书
操作系统基础配置
- yum update 更新全部包后重启
- 添加 docker-ce 官方源, 然后安装 docker
- 放置 ssh key, 并禁止密码登陆, 设置允许 root 用户远程登陆(仅允许key方式), 修改 ssh端口号
过程中的问题
1. ipv6
主机设置 ipv6 地址后, 公网ping不通,排查了主机设置很久后都没有结果。
然后就去控制台上找,才发现每个v6地址都需要单独开通公网服务,而且是需要单独付费的;
这里我的排查干扰是当我拿新的主机v6配置去比对旧主机的配置时,发现有点不一样,以为是这个问题导致的,结果是干扰。还是不能自以为是,要从全流程的角度看。
详情可以参考我以前的一篇文章
记录阿里云站点开启ipv6的步骤
2. https 证书问题
原本阿里云的免费证书有效期是一年的,但这次更新才发现去年11月后调整了政策,只能给3个月的证书了;
我决定后面另外找一个免费证书机构, 支持泛域名或一年有效期,这两个肯定得有一个;
实在不行也得弄个 ACEM 那种自动续订证书的;
3. wireguard 隧道
我以前是用 ecs 对 家里的主机做了内网穿透,网站其是是放在内网家里的;
这个 ecs 实质只起到一个流量转发的作用;
后来发现有些漏扫和攻击也引到家庭网了,于是在 ecs 放置了一个 nginx 做一些基础拦截,只转发有效流量;
但是因为我最近多次搬家,每次搬为了不停服(重视),都需要将在线的部分(就这个站点),先迁移到云上来,然后搬家完后再迁下来,费力。
隔段时间可能还会搬家,所以这段时间就不转去内网了,也就不配 WG 隧道了;
家庭网的入口从另一个腾讯云的服务器单独走;
当前阶段的 nginx 配置
docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
services:
nginx:
restart: always
# image: nginx:1.24.0
image: nginx:1.25.3-alpine
network_mode: host
command:
["nginx", "-g", "daemon off;"]
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./blog.conf:/etc/nginx/blog.conf:ro
- /home/wait/data:/data
- ./cert:/cert
environment:
NGINX_ENTRYPOINT_QUIET_LOGS: off
|
nginx.conf
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
worker_processes 1;
error_log /dev/stderr;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
server_tokens off;
log_format main 'ecs:$hostname:$server_port:$msec:$connection:$connection_requests '
'$request_id '
'[$time_iso8601] $status $request_time $bytes_sent $body_bytes_sent '
'"$remote_addr" "$http_x_forwarded_for" '
'"$upstream_addr" "$upstream_status" "$upstream_response_time" '
'$request_length "$content_length" "$host" "$http_host" '
'"$server_protocol" "$request_method" "$request_uri" "$http_referer" '
'"$http_content_type" "$http_user_agent" "$request_body"';
access_log /dev/stdout main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
server {
listen 172.17.8.148:80;
listen [::]:80;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 172.17.8.148:443 ssl default_server;
listen [::]:443 ssl default_server;
http2 on;
server_name chenwx.top;
ssl_certificate /cert/www.chenwx.top.pem;
ssl_certificate_key /cert/www.chenwx.top.key;
include blog.conf;
}
server {
listen 172.17.8.148:443 ssl;
listen [::]:443 ssl;
http2 on;
server_name blog.chenwx.top;
ssl_certificate /cert/blog.chenwx.top.pem;
ssl_certificate_key /cert/blog.chenwx.top.key;
include blog.conf;
}
}
|
blog.conf
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
ssl_session_timeout 30m;
ssl_session_cache shared:MozSSL:1m;
ssl_session_tickets off;
ssl_protocols TLSv1.3;
ssl_prefer_server_ciphers off;
gzip on;
gzip_min_length 20k;
gzip_comp_level 2;
gzip_buffers 16 32k;
gzip_types text/plain text/css text/javascript application/javascript;
# 拦截非 get-post 请求
if ($request_method !~ ^(GET|POST|HEAD)$ ) {
return 404;
}
# 拦截非 主站 请求
if ( $host !~ ^(chenwx.top|www.chenwx.top|blog.chenwx.top)$ ){
return 404;
}
error_page 404 /404.html;
location = /health {
access_log off;
return 200 "ok";
}
location / {
root /data/blog;
index index.html;
}
location ^~ /tools/ {
root /data;
index index.html;
try_files $uri @route;
}
location @route {
rewrite ^.*$ /tools/index.html last;
}
location ^~ /files/ {
root /data;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
location = /files/ {
root /data;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
sub_filter '<a href="../">../</a>' '';
}
location ~* ^.+\.(jpg|gif|png|mp3|zip)$ {
root /data/blog;
expires 3d;
}
|