域名购买及备案
可以上腾讯云或阿里云等云服务提供商购买,如果仅是作为学习使用的话,可以买一些冷门的域名,比较便宜,需要长期使用的话推荐一次性买较长的时间(譬如 3 年),此外可以留意下续期的费用,以免后面续期过贵。
域名购买后需要进行备案才能使用,否则访问网站是会被拦截的。在哪买的域名就在哪备案就好了,这样会方便一些,备案主体可以企业也可以是个人,按要求填写信息提交后一般都能通过,审核时间需要 7 个工作日甚至更长,提交后耐心等待就好。
申请 SSL 证书
这里以腾讯云上的操作为例进行说明。
腾讯云 SSL 控制台
先进入到 SSL 控制台
点击【申请免费证书】,个人学习使用的话使用免费的就可以了,申请后证书有效期为 3 个月,失效后再重新申请即可。
申请完后下载证书
本人使用的 nginx 做代理服务器,所以这里下载的是 nginx 对应的证书文件。
Nginx 配置
修改 Nginx 配置文件
配置示例如下:
server {
listen 443 ssl;
server_name xxx.xxx.xxx; # 替换为你的域名
# 指定证书和私钥路径
ssl_certificate /etc/nginx/ssl/xxx_bundle.crt; # 注意替换真实路径
ssl_certificate_key /etc/nginx/ssl/xxx.key; # 注意替换真实路径
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
# 后端接口访问转发 根据项目具体情况配置
location /api/ {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://docker-host:8080; # docker-host 是容器内的宿主机别名,下面的配置中会说
}
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
# HTTP重定向配置
server {
listen 80;
listen [::]:80;
server_name localhost;
return 301 https://$host$request_uri;
}
上传 SSL 证书至服务器
解压前面下载到的证书压缩包,上传后缀名为 .key 和 .crt 的证书文件至服务器,上传路径可以自定义。
Nginx 容器相关配置及启动
停止并移除现有容器
docker stop nginx && docker rm nginx
创建自定义Docker网络
# 创建名为mynet的自定义桥接网络(子网可自定义)
docker network create \
--driver=bridge \
--subnet=192.168.90.0/24 \
--gateway=192.168.90.1 \
mynet
重新运行Nginx容器并加入自定义网络
docker run \
-p 80:80 \
-p 443:443 \
--name nginx \
--network=mynet \ # 加入自定义网络
--add-host=docker-host:host-gateway \ # 添加宿主机别名解析(Docker 20.10+)
-v /mydata/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ # 替换实际路径
-v /mydata/nginx/conf/conf.d:/etc/nginx/conf.d \ # 替换实际路径
-v /mydata/nginx/log:/var/log/nginx \ # 替换实际路径
-v /mydata/nginx/html:/usr/share/nginx/html \ # 替换实际路径
-v /mydata/nginx/ssl:/etc/nginx/ssl \ # 替换实际路径,替换为前面证书上传的实际路径
-d nginx:1.20.2
技术原理说明
- **
--add-host=docker-host:host-gateway
**
该参数将宿主机的网关IP(如192.168.90.1
)绑定到容器内的docker-host
域名,实现容器通过别名直连宿主机服务。 - 自定义网络的隔离性
所有加入mynet
网络的容器可通过内网IP通信,避免流量经过公网。
验证代理请求路径
docker exec -it nginx curl -I http://docker-host:8080/api/health
至此已经配置完毕,可以尝试使用 https:<域名> 访问自己的网站。
扩展优化建议
-
后端服务容器化(可选)
若后端服务也容器化,可将其加入同一网络并通过服务名访问:bash # 启动后端服务容器 docker run -d --name backend --network=mynet your-backend-image # Nginx配置修改为 proxy_pass http://backend:8080;
-
防火墙加固
禁止公网IP直接访问后端端口,可以直接在服务器安全组中关闭后端端口。