LNMP 全站部署 SSL & HTTP/2[SPDY]

正如你所看到的,现在Yusky博客已经全面强制启用 HTTPS 协议,不过还有一个你看不到的——SPDY 协议。 :lol:

SPDY 是 Google 开发的基于传输控制协议(TCP)的应用层协议,开发组正在推动 SPDY 成为正式标准(现为互联网草案)。SPDY 协议类似于 HTTP,但旨在缩短网页的加载时间和提高安全性,通过压缩、多路复用和优先级来缩短加载时间。

SPDY 并不是首字母缩略字,而仅仅是“speedy”的缩写,意为“更快”,现为 Google 的商标。

Google Chrome 用户打开 chrome://net-internals/#spdy 就会发现你已经在使用 SPDY 协议了。

 

Nginx 的配置方法

系统自带的 OpenSSL 版本过低,不支持 SPDY,直接使用会报错以下错误:

nginx: [warn] nginx was built without OpenSSL NPN support, SPDY is not enabled for 0.0.0.0:443 in …

所以你要先下载最新的 OpenSSL,目前是 1.0.1e,这里是下载列表,红色标注的就是最新版了。

只下载、解压即可

cd /tmp
wget http://www.openssl.org/source/openssl-1.0.1e.tar.gz
tar zxvpf openssl-1.0.1e.tar.gz

然后下载最新的Nginx

解压、编译、安装

注意:这里的配置只是启用 SSL 和 SPDY 所需的最小参数,编译的时候请先查看你原有的模块加上去,否则会把其他的模块编译掉的
/usr/local/nginx/sbin/nginx -V 这个是查看nginx安装了什么模块
cd /tmp
wget http://nginx.org/download/nginx-1.5.6.tar.gz
tar zxvpf nginx-1.5.6.tar.gz
cd nginx-1.5.6
./configure --with-http_ssl_module --with-http_spdy_module --with-openssl=/tmp/openssl-1.0.1e
make
make install

如果是升级的话,编译完成后不要再执行 make install,不然会把原有的配置文件覆盖,正确的方法是直接删除旧的,把新的复制过去后执行 make upgrade:

cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
unalias cp
cp -f ./objs/nginx /usr/local/nginx/sbin/
make upgrade

 

 

Nginx 配置文件示例(有删减,不要直接使用)

server
{
    # 合并 http/https 主机
    listen 80;
    # 开启 ssl & spdy
    listen 443 ssl spdy;
    # 主机名
    server_name www.sinosky.org;
    # 为这个虚拟主机指定 PEM 格式的证书文件,这个文件可以包含其他的证书和服务器私钥,同样,密钥也必须是PEM格式
    ssl_certificate /home/www/etc/ssl/certs/main.crt;
    # 为这个虚拟主机指定 PEM 格式的私钥
    ssl_certificate_key /home/www/etc/ssl/private/main.key;
    # 指出为建立安全连接,服务器所允许的密码格式列表,密码指定为 OpenSSL 支持的格式
    # http://www.openssl.org/docs/apps/ciphers.html
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-RC4-SHA:ECDHE-RSA-AES128-SHA:AES128-GCM-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH:!CAMELLIA:!PSK:!SRP;
    # 指定要开启的 SSL 协议
    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    # 优化 SSL 的访问速度和资源消耗
    # 依赖 SSLv3 和 TLSv1 协议的服务器密码将优先于客户端密码
    ssl_prefer_server_ciphers on;
    # 设置储存 SSL 会话的缓存类型和大小
    ssl_session_cache shared:SSL:10m;
    # 设置客户端能够反复使用储存在缓存中的会话参数时间
    ssl_session_timeout 10m;
    # 不设置以下两项,Firefox 会报 sec_error_ocsp_unknown_cert 错误
    # 启用 OCSP 响应验证服务器
    ssl_stapling on;
    # CA 证书,可以与服务器证书放在一个文件里
    ssl_trusted_certificate /home/www/etc/ssl/certs/main.crt;
    # 以上设置在官方文档都有详细说明 http://nginx.org/en/docs/http/ngx_http_ssl_module.html
    # 强制使用 https(http 跳转到 https),$ssl_protocol 为所用的 SSL 协议,如果为空就一定是 http 了
    # 除此外的检测方法还有 $server_port = 80、$scheme = http、error_page 497 等,下面会详细说明
    if ($ssl_protocol = "") {
    return 301 https://$server_name$request_uri;
    }

    # HTTP Strict Transport Security,简称 HSTS
    # 当用户在浏览器输入不带协议的网址的时候,自动识别协议为 https,而不是 http
    # 如果你的子域没有全部部署 https,请去掉 includeSubDomains
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
}

再关于强制使用 https(http 跳转到 https),最常见的是配置两个主机,一个监听 80,一个监听 443,监听 80 的那个直接转发到 443。

再不常见的方法还有:合并 http/https 主机,检测 $server_port = 80、$scheme = http 或发送 error code 497 等。

$server_port 是浏览器请求到达的服务器端口号;$scheme 是所用的协议,有 http 和 https,不过使用 $ssl_protocol 和这两种检测方法对于 http://www.sinosky.org:443 无效,最典型的例子就是 phpMyAdmin 在登录时会请求 http://www.sinosky.org:443。

 

497 是 nginx 的状态码,意思是 The plain HTTP request was sent to HTTPS port,虽然也能起到跳转的作用,但返回到客户端是 302 而不是 301,不过对于 http://www.sinosky.org:443 有效,建议配合前面 3 种方法一块使用。

 

下面是 3 种方法的示例

if ($server_port = 80) {
    return 301 https://$server_name$request_uri;
}
if ($scheme = http) {
    return 301 https://$server_name$request_uri;
}
error_page 497 https://$server_name$request_uri;

 

提示一点,证书文件一定要含有签发证书的 CA 和 根 CA 的证书,并配置 ssl_trusted_certificate(nginx)或 SSLCertificateChainFile(apache),否则浏览器可能无法识别证书链。服务器的证书在最上面,二级 CA 在中间,最后是根 CA,顺序不能错。

 

比如 StartSSL 的证书(来自官方的说明),先获取 CA 的证书然后合并:

wget http://www.startssl.com/certs/ca.pem
wget http://www.startssl.com/certs/sub.class1.server.ca.pem
at ssl.crt sub.class1.server.ca.pem ca.pem >> /home/www/etc/ssl/certs/main.crt

再配置完成后,执行 /etc/init.d/nginx reload 或 /usr/local/nginx/sbin/nginx -s reload 重载 Nginx 配置文件即可正常访问了。

PS:开启之后速度也没慢多少,有个绿色的小锁看到到就是爽啊~~

主题测试文章,只做测试使用。发布者:Yusky,转转请注明出处:https://yusky.me/lnmp-enable-ssl-spdy.html

(0)
Yusky的头像Yusky
上一篇 2013 年 8 月 30 日 上午 3:16
下一篇 2013 年 10 月 24 日 下午 3:19

相关推荐

  • 独立博客联盟,1加1大于2的精英博客联盟

    你是站长么?你满脸彷徨,不好回答,即是又不是!因为你只有一个或几个独立博客,每天流量几十到一两百,偶尔过三百,仅此而已。用业内的话说,你是站长,离名博很远的站长。你建独立博客,只是为了分享,分享你的生活你的工作你的观点。你无所谓那一点点域名费和主机费,可你也真心的希望能够在默默敲击键盘用心发帖后能有所收获,敲下的文字有人欣赏。   你不是名博,没有…

    学习记录 2011 年 10 月 28 日
    15.5K400
  • 如何升级到CustomBuild 2.0?

    1.最好是先执行一些预安装命令,详见说明文档:DirectAdmin 常见预装组件命令2.删除原先的版本,升级到2.0 cd /usr/local/directadmin mv custombuild custombuild_1.x wget -O custombuild.tar.gz http://files.directadmin.com/service…

    Linux 2015 年 12 月 7 日
    1.9K00
  • Nginx编译参数记录

    包含SPDY、openssl-1.0.1i、sub_filter等常用东东 ./configure –user=www –group=www –with-http_ssl_module –with-http_gzip_static_module –without-mail_pop3_module –without-mail_imap_module…

    Nginx 2014 年 8 月 22 日
    4.7K20
  • Linux下使用openssl生成SSL证书 供nginx使用

    这里说下Linux 系统怎么通过openssl命令生成 证书。   首先执行如下命令生成一个4096位的key openssl genrsa -des3 -out hupohost.key 4096 然后他会要求你输入这个key文件的密码。不推荐输入。因为以后要给nginx使用。每次reload nginx配置时候都要你验证这个PAM密码的。 &n…

    Linux 2014 年 8 月 19 日
    9.8K60
  • bash scp command not found的解决方法

    今天在一系统上运行bash scp提示command not found,经过如下方法解决了,需要的朋友可以参考下安装了centos6.0,由于选择了最小安装,很多包没有安装,因此一些常用的命令也不支持,如下: # scp -bash: scp: command not found 我的解决方法是:在一台运行正常的CentOS 5.6服务器上找到scp所在的…

    Linux 2015 年 1 月 28 日
    4.9K00

回复 an9

您的电子邮箱地址不会被公开。 必填项已用 * 标注

评论列表(34条)

  • Lyndon的头像
    Lyndon 2014 年 4 月 7 日 下午 3:22

    博主我喜欢你的主题→→

    • Yu Sky的头像
      Yusky 2014 年 4 月 7 日 下午 6:04

      @Lyndon嘿嘿。。好基友做的。。http://cuelog.com/archives/430.html

  • 李云滨的头像
    李云滨 2013 年 12 月 11 日 下午 3:13

    还有啊 第一次访问https的时候超级慢
    以后就正常了
    怎么办

    • Yu Sky的头像
      Yusky 2013 年 12 月 12 日 上午 11:35

      @李云滨这正常的啊。目前我木找到解决的方法

  • 李云滨的头像
    李云滨 2013 年 12 月 11 日 下午 3:13

    试图把原来的模块给编译上去,可是弄不好,只好编译个默认的。
    smtp、pop什么的都没有 gzip倒是有

    我不明白 只是把系统从centos 6 换到 5
    恢复amh后TLS就不行了 不明白。。。

    amh也没见异常 各站都正常 也就不管了

    • Yu Sky的头像
      Yusky 2013 年 12 月 12 日 上午 11:34

      @李云滨我也是用的AMH的。 nginx我是编译到1.5.6的。 模块编译不难的,加上去就好啦

  • iKx.Me的头像
    iKx.Me 2013 年 11 月 25 日 下午 10:40

    虽然看不懂,但是既然来了 就留个言 哈哈· :grin:

  • kagami的头像
    kagami 2013 年 11 月 24 日 上午 12:07

    其实吧我觉得个人博客不怎么需要SSL啦,稍微会影响点用户体验的,毕竟会托慢点速度~后台倒是可以用SSL,啥时候我也去搞个证书,博主用的哪家的SSL证书啊

    • Yu Sky的头像
      Yusky 2013 年 11 月 24 日 下午 3:25

      @kagami用的最便宜的Comodo的。 搞这其实为了好玩拉~ 现在速度也不慢

    • masterchan的头像
      masterchan 2013 年 12 月 4 日 上午 1:05

      @Yusky可以支持子域名么????

    • Yu Sky的头像
      Yusky 2013 年 12 月 4 日 上午 11:56

      @masterchan这要看你的SSL证书。 SSL证书分单域名证书和泛域名证书,单域名证书就只能一个子域名或者根域名可用, 泛域名证书的话所有子域名都可以用。

    • 李云滨的头像
      李云滨 2013 年 12 月 11 日 下午 3:15

      @Yusky最便宜的泛域名也得几百块 好贵。。。

  • 酷特尔的头像
    酷特尔 2013 年 11 月 22 日 下午 2:15

    很不错的说。我也在学这东西。多多指点哈。

    • Yu Sky的头像
      Yusky 2013 年 11 月 22 日 下午 4:31

      @酷特尔好啊,有什么不懂的你可以问下我, 我懂的一定跟你说

  • jwen的头像
    jwen 2013 年 11 月 12 日 下午 10:06

    博主~你这个博客都是无刷新的感觉啊,好像不是用ajax的方法实现的啊?CSS3吗?感觉点击了没有提交页面的感觉,都是同一个页面~

    • Yu Sky的头像
      Yusky 2013 年 11 月 14 日 下午 7:21

      @jwen其实改变了页面的。只是无刷新

  • jwen的头像
    jwen 2013 年 11 月 12 日 下午 10:05

    博主~你这个博客都是无刷新的感觉啊,好像不是用ajax的方法实现的啊?CSS3吗?

    • Yu Sky的头像
      Yusky 2013 年 11 月 14 日 下午 7:21

      @jwen是用Ajax实现的啊,具体咋实现我就不知道勒,朋友做的主题啊

    • jwen的头像
      jwen 2013 年 11 月 14 日 下午 11:06

      @Yuskythanks , 百度了一下,找到了一款好像是jquery的插件来的。

    • Yu Sky的头像
      Yusky 2013 年 11 月 18 日 下午 1:32

      @jwen是有插件能弄成ajax。不过很多问题

  • 回头草的头像
    回头草 2013 年 11 月 3 日 上午 10:25

    改天也弄个这个

    • Yu Sky的头像
      Yusky 2013 年 11 月 3 日 上午 10:39

      @回头草哈哈,支持折腾,其实也不难的

  • 空空裤兜的头像
    空空裤兜 2013 年 10 月 30 日 下午 9:49

    以前也折腾过,始终没成功

    • Yu Sky的头像
      Yusky 2013 年 10 月 31 日 上午 12:49

      @空空裤兜嘿嘿。可以找我交流交流~~~ 比如先洗洗菊花神马的

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:[email protected]

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
自6.2开始主题新增页头通知功能,购买用户可免费升级到最新版体验