关于为什么升级https就不说了 一句话为了装逼
前期准备
证书
怎么买证书就不说了,穷人用的是阿里云提供的的塞门铁客的DV SSL
免费版证书,阿里云每人可以申请20张DV SSL证书
(一条200,括号内删除。。。一脸正经.gif)。
单域名
注意一个DV SSL
只能验证一个域名,很坑的一点是这里说的是二级域名。即我申请的viking666.com
证书只能验证viking666.com
不能验证www.viking666.com
也不能验证myblog.viking666.com
(我这里不是为了打广告.一脸正经.gif)。
解决办法
- 买域名通配版的证书(假装很便宜.jpg)
- 多申请几个 反正一个阿里云账号能申请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.com
和 www.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失效解决办法