Skip to content

Ruyu-Blog 博客升级HTTPS

首先需要SSL证书

推荐免费SSL证书

Let's Encrypt

官网:https://letsencrypt.org/zh-cn/

Let's Encrypt 是一个免费提供SSL证书的网站

手动申请

因为我的项目使用的是Docker不是,自动申请/续签不太适用,所以使用手动申请,自动申请方法自己去看官方文档

使用Certbot ACME客户端

选择好对应的环境

我的是 Nginx + CentOS7的环境

安装 Certbot

bash
sudo snap install --classic certbot

准备 Certbot 命令

bash
sudo ln -s /snap/bin/certbot /usr/bin/certbot

手动运行方式

bash
certbot -d 域名(可以使用*.代表所有二级域名) --manual --config-dir config --work-dir work --logs-dir logs --preferred-challenges dns certonly

后续根据提示进行邮箱填写、DNS的TXT记录验证、等等…… 然后会得到两个关键文件,注意看提示信息的路径

其他证书

当然你也可以用其他的SSL证书,如腾讯云、阿里云,注意要把证书文件名跟本篇文章教程证书文件名一样,不然容易出问题

Nginx配置

项目目录新建ssl目录,把这两个文件copy进去

bash
mkdir ssl

更改Dockerfile

FROM nginx

MAINTAINER 博客前台

RUN rm /etc/nginx/conf.d/default.conf

COPY default.conf /etc/nginx/conf.d/
COPY ssl/fullchain.pem /etc/nginx/ssl/fullchain.pem
COPY ssl/privkey.pem /etc/nginx/ssl/privkey.pem
COPY nginx.conf /etc/nginx/nginx.conf

COPY dist/ /usr/share/nginx/html/

更改default.conf


   server {
        listen 443 ssl;              # 监听端口

        server_name [主域名];    # 域名

        ssl_certificate    /etc/nginx/ssl/fullchain.pem;
        ssl_certificate_key  /etc/nginx/ssl/privkey.pem;

        location / {
             root   /usr/share/nginx/html;
             index  index.html index.htm;
             try_files $uri $uri/ /index.html =404;
        }

      # 配置代理路径
      location /api/ {
          proxy_pass http://[后端ip+:[端口]]/;        # 转发请求的目标地址
          proxy_set_header Host $host;             # 设置请求头中的Host字段
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                            # 设置HTTP头中的X-Forwarded-For字段,表示客户端真实IP,多个IP用逗号隔开
          proxy_set_header X-Real-IP $remote_addr; # 设置请求头中的X-Real-IP字段,表示客户端真实IP
      }

      # 配置代理路径
      location /wapi/ {
          proxy_pass https://[音乐后端]/;        # 转发请求的目标地址
      }

        # 配置错误页面
        error_page 404 /404.html;           # 404错误页
      location = /404.html {
          internal;                       # 不接受外部访问
          root /usr/share/nginx/html;     # 404错误页文件所在目录
      }
  }

  server {
        listen 443 ssl;
        server_name [后台域名];

        ssl_certificate    /etc/nginx/ssl/fullchain.pem;
        ssl_certificate_key  /etc/nginx/ssl/privkey.pem;
 

      location / {
          proxy_pass http://[后台地址或者内外ip]:[端口,部署文档是:81]/;
          client_max_body_size 100M;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header X-Forwarded-Proto $scheme;
      }
  }
  
  # 自己部署的一言接口,用官网的可以删除
  server {
       listen 443 ssl;
       server_name [域名];

       ssl_certificate    /etc/nginx/ssl/fullchain.pem;
       ssl_certificate_key  /etc/nginx/ssl/privkey.pem;
	

        location / {
           proxy_pass http://[后台地址或者内外ip]:[端口]/;
       }

    }

  server {

    listen 443 ssl;
    server_name [minio域名];

    ssl_certificate    /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key  /etc/nginx/ssl/privkey.pem;

    location / {

        proxy_pass http://[后台地址或者内外ip]:[端口]/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
      }

    }

  # 音乐模块前台(菜单栏那个),如果没有就删掉
  server {

    listen 443 ssl;
    server_name [音乐模块前台域名];

    ssl_certificate    /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key  /etc/nginx/ssl/privkey.pem;


     location / {
         proxy_pass http://[后台地址或者内外ip]:[端口]/;
      }

    }

  server {

    listen 443 ssl;
    server_name [音乐后端域名];

    ssl_certificate    /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key  /etc/nginx/ssl/privkey.pem;

    location / {
        proxy_pass http://[后台地址或者内外ip]:[端口]/;
     }

  }

  # 按照你的需求,要啥就配啥,如一言,跟音乐模块前台不需要的就可删除对应配置
  server {
        listen 80;
        
        server_name [前台域名] www.[前台域名] [后台域名] [一言接口] [minio域名] [音乐前台]

        return 301 https://$host$request_uri;
    }

新建nginx.conf

bash
vim default.conf

内容

bash

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

     ssl_session_timeout 5m;
     ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
     ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
     ssl_prefer_server_ciphers on;



    include /etc/nginx/conf.d/*.conf;
}

修改运行命令

多加一个 443端口

bash
docker run --name blog-qt -d -p 80:80 -p 443:443 blog-qt

目录结构

reset_blog-qt 文件可以无视,这是我自己的脚本文件

最后

最后按照部署文档重新 build 重新 run 就可以跑起来了,注意 run 命令使用上面的 注意:网站升级为https后,如果网站还有http的东西,就会报不安全错误,所有http链接的相关图片将无法加载,需要把相关的请求接口跟图片路径也该为https的,所以上面也配了https的一言跟音乐后端接口等等,相关图片只能自己去数据库把http改为https了