让你的网站支持 https 访问,很简单!

27 阅读3分钟

iPad壁纸🗓文字篇19_2_舞木子_来自小红书网页版.jpg

域名购买及备案

可以上腾讯云或阿里云等云服务提供商购买,如果仅是作为学习使用的话,可以买一些冷门的域名,比较便宜,需要长期使用的话推荐一次性买较长的时间(譬如 3 年),此外可以留意下续期的费用,以免后面续期过贵。
域名购买后需要进行备案才能使用,否则访问网站是会被拦截的。在哪买的域名就在哪备案就好了,这样会方便一些,备案主体可以企业也可以是个人,按要求填写信息提交后一般都能通过,审核时间需要 7 个工作日甚至更长,提交后耐心等待就好。

申请 SSL 证书

这里以腾讯云上的操作为例进行说明。

腾讯云 SSL 控制台

先进入到 SSL 控制台

console.cloud.tencent.com/ssl

点击【申请免费证书】,个人学习使用的话使用免费的就可以了,申请后证书有效期为 3 个月,失效后再重新申请即可。 image.png

申请完后下载证书

image.png

本人使用的 nginx 做代理服务器,所以这里下载的是 nginx 对应的证书文件。

image.png

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 的证书文件至服务器,上传路径可以自定义。

image.png

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:<域名> 访问自己的网站。


扩展优化建议

  1. 后端服务容器化(可选)​
    若后端服务也容器化,可将其加入同一网络并通过服务名访问:

    bash
    # 启动后端服务容器
    docker run -d --name backend --network=mynet your-backend-image
    
    # Nginx配置修改为
    proxy_pass http://backend:8080;
    
  2. 防火墙加固
    禁止公网IP直接访问后端端口,可以直接在服务器安全组中关闭后端端口。