升级 HTTPS 和 HTTP2

Designup 最初上线是用的 HTTP 协议,处于安全考虑升级为 HTTPS,后又出于访问速度的优化升级为 HTTP2

关于三者以及 SPDY 的区别和优劣,可以参考文章 HTTP,HTTP2.0,SPDY,HTTPS你应该知道的一些事, 应该已经介绍的比较完善了,此处不再赘述。

关于 HTTP2,先推荐一款 Chrome 插件 HTTP/2 and SPDY indicator,这个插件的闪电图标,在访问 HTTP2 网站的时候会变成蓝色,所以它也可以帮你更快捷的判断你的 HTTP2 是否配置成功。

当然不用它的话自然也可以从你的浏览器开发者工具中:

以下开始介绍升级步骤。

一、申请SSL证书

付费证书各位根据自己的经济状况考虑使用哪家。免费证书推荐两款

  • Let’s Encrypt,推荐使用第三方平台获取,方便快捷:SSL For Free

  • 阿里云-安全-CA证书服务中提供的,赛门铁克免费证书

个人使用后者,因为有效期久一些== 当然据说 Let’s Encrypt 有自动配置更新的方案,没有研究过,不多说。
然而后者藏得比较深,在进入证书选购页面后,需要先选择 保护类型 == 1个域名 以及 选择品牌 == Symantec后,证书类型才会出现 “免费证书” 这个选项。

免费证书是后台自动审核,如果域名在阿里云的话,只需配置信息的时候勾选一下自动配置域名就好,如果不在阿里云的话还需要到域名服务商添加一些解析记录才能通过审核,完成后下载安装即可。

二、配置 HTTPS

单纯升级 HTTPS 的话,有了 ssl 证书之后只需修改下 Nginx 的站点配置文件就好了,比如原来 HTTP 协议下, site.conf 文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
listen 80;
server_name silov.me;

if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2})"){
set $yy $1;
set $mm $2;
set $dd $3;
set $hh $4;
}

access_log /data/logs/nginx/blog/silov.me-$yy-$mm-$dd.access.log;
error_log /data/logs/nginx/blog/silov.me.error.log;

location / {
proxy_pass http://127.0.0.1:8066;
proxy_set_header Host $http_host;
}
}

那么升级 HTTPS 只需在 site.conf 中在添加一段如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
server {
listen 443 ssl;
server_name silov.me;

if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2})"){
set $yy $1;
set $mm $2;
set $dd $3;
set $hh $4;
}

access_log /data/logs/nginx/blog/silov.me-$yy-$mm-$dd.access.log;
error_log /data/logs/nginx/blog/silov.me.error.log;

ssl on;
ssl_certificate __YOUR_CERTFILE_PATH_.pem; // 文件路径替换
ssl_certificate_key __YOUR_CERT_KEY_PATH_.key; // 文件路径替换
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;

location / {
proxy_pass http://127.0.0.1:8066;
proxy_set_header Host $http_host;
}
}

然后执行

1
sudo nginx -s reload

HTTPS 配置即可生效。此时两段配置共存,HTTP 和 HTTPS 两种协议访问网站是都可以访问通的,若不需要 HTTP 协议的访问,则需要将监听80端口的server配置做如下改动即可:

1
2
3
4
5
server {
listen 80;
server_name _;
rewrite ^/(.*) https://silov.me/$1 permanent;
}

三、配置 HTTP2

若你的服务器不是 Ubuntu14.04,重点是 Nginx 版本 >= 1.9.5, 且 OpenSSL 版本 >= 1.0.1 ,那么只需在 HTTPS 的 Nginx 配置基础上,将 listen 443 ssl; 一行,改为 listen 443 ssl http2; 然后 nginx -s reload 就万事大吉了。

查看版本:

1
2
3
4
$nginx -v
nginx version: nginx/1.10.3 (Ubuntu)
$openssl version -v
OpenSSL 1.0.2g 1 Mar 2016

关键在于,若你的 Nginx版本 和 OpenSSL 版本不够,必须要升级:

1、升级OpenSSL,编译安装

官网下载:https://www.openssl.org/source/

1
2
3
4
5
wget http———————
tar xxx
cd xxx
./config shared (默认/usr/loca/ssl)
make && sudo make install

替换旧的OpenSSL:

1
2
3
4
5
6
7
sudo mv /usr/bin/openssl /usr/bin/openssl-old
sudo mv /usr/include/openssl /usr/include/openssl-old
sudo ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
sudo ln -s /usr/local/ssl/include/openssl/ /usr/include/openssl
sudo echo "/usr/local/ssl/lib" >> /etc/ld.so.conf
sudo ldconfig
openssl version

2、编译安装Nginx

官网下载最新版

1
2
3
4
5
wget httpxxxxx
tar nginx
cd nginx
./configure --prefix=/usr/local/nginx --with-openssl=/usr/local/ssl --with-http_ssl_module --with-http_v2_module
make && sudo make install

若遇到 PCRE 报错:

1
apt-get install libpcre3 libpcre3-dev 

报错修复参考文章:

http://blog.csdn.net/signmem/article/details/18974587

解决nginx.pid 报错问题:

1
sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf