开启https服务

1.安装包下的config.inc.php文件加入如下配置

/** 开启HTTPS */
define('__TYPECHO_SECURE__',true);

2.配置docker-compose.yml文件(nginx部分改动)

version: '2'
services:
  nginx:
    image: nginx:1.13.9-alpine
    ports:
      - "80:80"
      - 443:443 #ssl 默认是443端口,因此需要将443端口映射到宿主机
    restart: always
    volumes:
      - ./typecho:/app #前面是宿主机的,后面是容器内部的
      - ./nginxTypecho.conf:/etc/nginx/conf.d/default.conf #- . 这个表示docker-compose.yml所在路径
      - logs:/var/log/nginx 
      - ./ssl:/etc/nginx/cert:ro # 注意/etc/nginx/cert这个地址就是nginx中证书地址 :ro 表示设为只读

3.修改nginx.conf文件

server {
    listen 0.0.0.0:80;
    server_name www.xxx.cn xxx.cn;
    rewrite ^(.*)$ https://$host$1 permanent;  #把http的域名请求转成https
    #rewrite ^(.*) https://xxx.cn$1 permanent; #写死的转法
}

server {
    listen       443; #SSL 访问端口号为 443
    #listen    443 ssl;
    server_name  www.xxx.cn xxx.cn;
    
    #设置首选域,将xxx,cn强制重定向到www.xxx.cn上,防止搜索引擎重复错开统计,导致收录数据不正确
    if ($host != 'www.xxxx.cn' ) {
        rewrite ^/(.*)$ https://www.xxx.cn/$1 permanent;
    }
    
    ssl on; #启用 SSL 功能
    root /app; #对应的是nginx容器里面的路径
    index index.php; #网站主页路径。
    ssl_certificate      /etc/nginx/cert/1_xxx_bundle.crt; #nginx容器里面的证书文件名称,dockercompose中指定路径
    ssl_certificate_key  /etc/nginx/cert/2_xxx.key; #nginx容器里面的私钥文件名称
    ssl_session_timeout  5m;
    #请按照以下协议配置
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
    #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 
    ssl_prefer_server_ciphers on;
 
    access_log  /var/log/nginx/typecho_access.log  main;
    if (!-e $request_filename){  
        rewrite ^(.*)$ /index.php$1 last;
    }

    location ~ .*\.php(\/.*)*$ {
       try_files $uri $uri/ /index.php?$query_string; #nginx中try_files的的作用一般用户url的美化
       
       include        fastcgi_params;
             fastcgi_split_path_info ^(.+?.php)(/.*)$;
       fastcgi_param  PATH_INFO $fastcgi_path_info;
       fastcgi_param  PATH_TRANSLATED $document_root$fastcgi_path_info;
       fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
       fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
       fastcgi_index  index.php;
    set $path_info "";
        set $real_script_name $fastcgi_script_name;
        if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
                set $real_script_name $1;
                set $path_info $2;
        }
        
    if ($request_uri ~* ^(.*)think|invoke|gs\.gif|\.do|\.exe|captcha|myadmin|sql|FxCodeShell|\.jsp|public|/?XDEBUG) {
        return 403; #\是转义字符
    }

    if ($query_string ~* ^(.*)FxCodeShell.jsp) {
        return 403;
    }


       fastcgi_pass   php-fpm:9000;
    }
}

4.docker-compose stop

5.docker-compose up -d

6.使用https访问已经成功

本人还有个子域名 img.xxx 图床(使用又拍云)

了解之后发现我申请的域名是单域名, 如 baidu.com和ssl.baidu.com认为是两个域名,只是他们的主域名是baidu.com。因此我的子域名也需要在申请个ssl。填入域名地址。等待一会后再安装到我的又拍云上。

采坑:

nginx修改配置无法启动,logs查看发现没找到ssl证书路径,so 请反复确认路径是否正确,免得和我一样折腾半天才发现问题。

root@VM-0-12-ubuntu:/opt/app# docker logs e0
2020/01/16 07:29:15 [emerg] 1#1: BIO_new_file("/etc/nginx/cert/1_www.domain.com_bundle.crt") failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/etc/nginx/cert/1_www.domain.com_bundle.crt','r') error:2006D080:BIO routines:BIO_new_file:no such file)
nginx: [emerg] BIO_new_file("/etc/nginx/cert/1_www.domain.com_bundle.crt") failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/etc/nginx/cert/1_www.domain.com_bundle.crt','r') error:2006D080:BIO routines:BIO_new_file:no such file)