维京博客升级https记录

  1. 云栖社区>
  2. 博客>
  3. 正文

维京博客升级https记录

wsqy 2017-06-08 10:52:11 浏览1786
展开阅读全文

关于为什么升级https就不说了 一句话为了装逼

前期准备

证书

怎么买证书就不说了,穷人用的是阿里云提供的的塞门铁客的DV SSL免费版证书,阿里云每人可以申请20张DV SSL证书(一条200,括号内删除。。。一脸正经.gif)。

单域名

注意一个DV SSL只能验证一个域名,很坑的一点是这里说的是二级域名。即我申请的viking666.com 证书只能验证viking666.com 不能验证www.viking666.com也不能验证myblog.viking666.com(我这里不是为了打广告.一脸正经.gif)。

解决办法

  1. 买域名通配版的证书(假装很便宜.jpg)
  2. 多申请几个 反正一个阿里云账号能申请20个

我的方案

由于只是验证https的可用性,所以只申请了一个证书来验证viking666.com,别的域名如 www.viking666.com 和 myblog.viking666.com依旧采用http协议

下载证书和私钥

进入aliyun控制台-我的证书-下载,是一个zip文件里面包含一个xxx.pem和xxx.key文件类似于

旧的配置

upstream django_myblog {
    server unix:///www/myblog/log/myblog.sock; # for a file socket
    # server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}

server {
       listen 80;

       server_name viking666.com myblog.viking666.com www.viking666.com;
       charset     utf-8;
       # max upload size
       client_max_body_size 75M;   # adjust to taste
       access_log /www/myblog/log/nginx_access.log;
       error_log /www/myblog/log/nginx_error.log;
       location /media  {
            alias /www/myblog/media/;
        }

        location /static {
            alias /www/myblog/static/;
        }
       # Finally, send all non-media requests to the Django server.
       location / {
           uwsgi_pass  django_myblog;
           include     /www/myblog/uwsgi_params; # the uwsgi_params file you installed
    }

}

很简单的配置,具体的参数是什么意思 可以参考我的另外一篇部署博客 uwsgi+nginx部署django项目

升级

保留走http协议的部分

由于myblog.viking666.comwww.viking666.com还是走的http协议,所以旧的配置依旧是可用的,只要删掉server_name中的 viking666.com就可以了

http跳转到https

创建一个新的nginx配置文件,主体依旧采用旧的配置,但是跟上一节不同这里的server_name中只保留 viking666.com
还要加一句所以得都301重定向到 https中 return 301 https://$server_name$request_uri;
全部配置如下

server
{
    listen 80;

    server_name viking666.com;
    charset utf-8;
    # max upload size
    client_max_body_size 75M; # adjust to taste
    access_log /www/myblog/log/nginx_access.log;
    error_log /www/myblog/log/nginx_error.log;

    #告诉浏览器有效期内只准用 https 访问
    add_header Strict-Transport-Security max-age=15768000;
    #永久重定向到 https 站点
    return 301 https://$server_name$request_uri;

    location /media
    {
        alias /www/myblog/media/;
    }

    location /static
    {
        alias /www/myblog/static/;
    }
    # Finally, send all non-media requests to the Django server.
    location /
    {
        uwsgi_pass django_myblog;
        include /www/myblog/uwsgi_params; # the uwsgi_params file you installed
    }

}

https部分

创建一个新的nginx配置文件,里面的配置如下

server
{
    listen 443;

    server_name viking666.com;
    charset utf-8;
    # max upload size
    client_max_body_size 75M; # adjust to taste
    access_log /www/myblog/log/nginx_access.log;
    error_log /www/myblog/log/nginx_error.log;

    #告诉浏览器不要猜测mime类型
    add_header X-Content-Type-Options nosniff;

    ssl on;
    ssl_certificate /www/myblog/log/cert/214135044190984.pem;
    ssl_certificate_key /www/myblog/log/cert/214135044190984.key;
    # 缓存有效期
    ssl_session_timeout 60m;
    # 可选的加密算法,顺序很重要,越靠前的优先级越高.
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    # 安全链接可选的加密协议
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    #在 SSLv3 或 TLSv1 握手过程一般使用客户端的首选算法,如果启用下面的配置,则会使用服务器端的首选算法
    ssl_prefer_server_ciphers on;

    location /media
    {
        alias /www/myblog/media/;
    }

    location /static
    {
        alias /www/myblog/static/;
    }
    # Finally, send all non-media requests to the Django server.
    location /
    {
        uwsgi_pass django_myblog;
        include /www/myblog/uwsgi_params; # the uwsgi_params file you installed
    }

}

关于新加的配置已经注释的很仔细了,这里就不继续展开了。

踩的坑

nginx启动失败

修改好上述的nginx配置重启nginx一直启动失败,查看日志(systemctl status nginx.service -l)发现是报错Failed to start A high performance web server and a reverse proxy server这里注意到一点 nginx: [emerg] duplicate upstream "django_myblog" in /etc/nginx/sites-enabled/myblog_root.conf:2

感觉是这里的upstream冲突的,直接删掉其余的配置文件中的 upstream 只保留旧的那个文件中的(上面的我已删掉),重启搞定。

静态文件失败

重启完打开viking666.com会发现已经是https的了但是静态文件全部失败,百度一下就知道https不能使用http的静态文件格式,我的bootstrap jquery等都是用的CDN,这里可以把这些资源下载下来,但是有点治标不治本,也可以修改协议从http修改为https可以了。但是因为有一些二级域名还是采用的http的协议 所以这个方法也不是很好,这里有个方法就是不写具体的协议他就会使用网站本身的协议。
如在https的网站中引用http路径的js或css会导致不起作用,其形如:
<script src="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css"></script>
解决办法:
将http:去掉,改为
<script src="//cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css"></script>

参考文献

阿里云技术文档 这里在各个控制台里看,放不了链接
Nginx Http 重定向至 Https
https网站引用http路径的js和css失效解决办法

网友评论

登录后评论
0/500
评论
wsqy
+ 关注