或许是 Nginx 上配置 HTTP2 最实在的教程了

前言

从 2015 年 5 月 14 日 HTTP/2 协议正式版的发布到现在已经快有一年了,越来越多的网站部署了 HTTP2,HTTP2 的广泛应用带来了更好的浏览体验,只要是 Modern 浏览器都支持,所以部署 HTTP2 并不会带来太多困扰。

虽然 h2 有 h2c (HTTP/2 Cleartext) 可以通过非加密通道传输,但是支持的浏览器初期还是比较少的,所以目前部署 h2 还是需要走加密的,不过由于 Let’s Encrypt 大力推行免费证书和证书的廉价化,部署 h2 的成本并不高。

介绍

HTTP 2.0即超文本传输协议 2.0,是下一代HTTP协议。是由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis (httpbis)工作小组进行开发。是自1999年http1.1发布后的首个更新。

HTTP/2 协议是从 SPDY 演变而来,SPDY 已经完成了使命并很快就会退出历史舞台(例如 Chrome 将在「2016 年初结束对 SPDY 的支持」;Nginx、Apache 也已经全面支持 HTTP/2 ,并也不再支持 SPDY)。

一般的大家把 HTTP2 简称为 h2,尽管有些朋友可能不怎么愿意,但是这个简称已经默认化了,特别是体现在浏览器对 HTTP2 都是这个简写的。

配置

普通的 HTTPS 网站浏览会比 HTTP 网站稍微慢一些,因为需要处理加密任务,而配置了 h2 的 HTTPS,在低延时的情况下速度会比 HTTP 更快更稳定!

现在电信劫持事件频发,网站部署了 HTTPS 加密后可以杜绝大部分劫持,但不是完全。像电子商务行业对 HTTPS 加密可是标配啊,因此部署 h2 更是势在必行。

证书

这里是 免费和便宜 SSL 证书介绍,大家可以从这里购买或者申请免费的 SSL 证书,免得 Chrome 弹出红色的页面令人不悦,从而拒绝了大多数访客。

Web 服务器

说明

默认编译的 Nginx 并不包含 h2 模块,我们需要加入参数来编译,截止发文,Nginx 1.9 开发版及以上版本源码需要自己加入编译参数,从软件源仓库下载的则默认编译。 Tengine 可以同时部署 h2 和 SPDY 保证兼容性,Nginx 则是一刀切不再支持 SPDY。

安装/编译

如果你编译的 Nginx 不支持,那么在 ./configure 中加入:--with-http_v2_module ,如果没有 SSL 支持,还需要加入 --with-http_ssl_module

然后 make && make install 即可。

配置

主要是配置 Nginx 的 server 块, 。
修改相关虚拟机的 .conf 文件,一般在 /usr/local/nginx/conf/vhost/ 或者 /etc/nginx/conf/,具体参考你的环境指导,不懂请回复。

server {
listen 443 ssl http2 default_server;
server_name www.mf8.biz;

ssl_certificate /path/to/public.crt;
ssl_certificate_key /path/to/private.key;

注:将 server_name www.mf8.biz; 中的 www.mf8.biz 替换为你的域名。

然后通过 /usr/local/nginx/sbin/nginx -t 或者 nginx -t 来检测是否配置正确,然后重启 Nginx ,即可。

检验

在 Chrome 浏览器上可以通过,HTTP/2 and SPDY indicator 来检验,如果地址栏出现蓝色的闪电就是 h2

也可以在 chrome://net-internals/#http2 中检查。注意版本要新,姿势要帅!

配置进阶

大家都知道去年的心血漏洞将 SSL 推到了风口浪尖,所以单单支持了 h2 ,我们任然需要对 SSL 做一些安全的优化!

配置赫尔曼密钥

openssl dhparam -out dhparam.pem 2048 // 在 ssh 运行, openssl 生成 2048 位的密钥而不是当作参数写入 nginx.conf 文件。

ssl_dhparam /path/to/dhparam.pem; //在 .conf 中配置

禁止不安全的 SSL 协议,使用安全协议

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

禁止已经不安全的加密算法

ssl_ciphers 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4';

缓解 BEAST 攻击

ssl_prefer_server_ciphers on;```

启用 HSTS

此举直接跳过 301 跳转,还降低了中间人攻击的风险!配置在 .conf 中即可

`add_header Strict-Transport-Security max-age=15768000;`

301 跳转

80 端口跳转到 443 端口
```nginx
server {
 listen 80;
 add_header Strict-Transport-Security max-age=15768000;
 return 301 https://www.yourwebsite.com$request_uri;
}

缓存连接凭据

ssl_session_cache shared:SSL:20m;
ssl_session_timeout 60m;

OCSP 缝合

ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/nginx/cert/trustchain.crt;
resolver 233.5.5.5 233.6.6.6 valid=300s;

欢迎你的补充!

通过 www.ssllabs.com 即可检验 HTTPS 配置的安全性和实用性!

来自:https://www.mf8.biz/archives/71/

时间: 2024-10-02 01:05:23

或许是 Nginx 上配置 HTTP2 最实在的教程了的相关文章

Nginx上配置Basic Authorization登录认服务证的教程_nginx

关于Basic Authorization在HTTP中,Basic Authorization基本认证是一种用来允许Web浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式. 在发送之前是以用户名追加一个冒号然后串接上口令,并将得出的结果字符串再用Base64算法编码.例如,提供的用户名是Aladdin.口令是open sesame,则拼接后的结果就是Aladdin:open sesame,然后再将其用Base64编码,得到QWxhZGRpbjpvcGVuIHNlc2

在NGINX上配置HTTPS---血的教训--要重启NGINX

重启,不是重载!!! 是STOP & START 而不是RELOAD!!! 纠结了好几天...(难道有的NGINX上不用重启????)   你妹的,上次也是,,PHP-FPM,将一个PHP的程序连MYSQL数据库从IP更改为域名,也要重启PHP-FPM才生效!!!! 跟WIN一样??重启也能解决UX80%的问题???? ~~~~~~~~~~~~~~~~~~   Nginx SSL 数字证书安装 第一步:获取服务器证书 1.  获取域名型(DV)中级证书访问:/support/root-dvssl

Nginx上配置域名永久重定向

当我们的站点更换域名的时候,需要将所有针对旧域名的请求全部重定向到新域名上.步骤如下: 1.假定我们的旧域名为111cn.net,新域名为www.111cn.net. 2.在Nginx上,为新域名配置一个server.  代码如下 复制代码 server {     listen       80;     server_name  www.111cn.net;     # 其它省略 } 3.在Nginx上,为旧域名配置一个server.  代码如下 复制代码 server {     list

在ubuntu9.0上配置MySQL集群详细教程

家在网上都能找到都是RedHat系统等等,对Ubuntu系统MySQL集群就没有介绍文章,我现在写写Ubuntu这个MySQL集群方法.新手不要骂我,呵呵. 介绍网络环境: 测试环境: Server1: ndbd 192.168.245.11 Server2: ndbd 192.168.245.12 Server3: mysqld –ndb-cluster 192.168.245.13 ndbd: 数据库节点. mysqld –ndb-cluster: MySQL服务器节点,程序直接访问的是这台

在CentOS上配置Java环境变量的教程_java

rhel 和 centos linux 使用yum命令后,将 OpenSDK 安装到/usr/lib/jvm/ 目录: [root@dabu.info ~]# ls -l /usr/lib/jvm/ 输出如下: total 4 drwxr-xr-x. 3 root root 4096 Feb 24 17:00 java-1.7.0-openjdk-1.7.0.51.x86_64 lrwxrwxrwx. 1 root root 21 Feb 24 17:00 jre -> /etc/alterna

IIS6上配置404页面的图文教程(url+文件)_win服务器

首先先说明下消息类型: url 与 文件. 一般情况下如果选择了url那么返回的404页面是200状态(也就是返回给搜索引擎是正常存在的页面),而选择了文件那么才是告诉搜索页引擎没有找到页面,返回的是400页面内容,这样对搜索引擎来税具有较好的友好度,其实我们现在大多数都是使用文件格式. 推荐使用 文件啊 步骤/方法 打开IIS 找到你的网站,点右键,选择属性 选择"自定义错误"标签页,找到404的那一项,点"编辑属性"按钮 在"消息类型"里选&

ubuntu上配置Nginx+PHP5 FastCGI服务器配置

ubuntu上配置Nginx+PHP5 FastCGI服务器配置_nginx_脚本之家 首先安装或编译Nginx. 安装Nginx 源码包可以在官方主页上下载.Ubuntu 9.04可以直接通过apt安装,也可以从这里下载最新的deb包:sudo apt-get install nginx 如果要自己编译的话,需要确保自己已经有编译器和PCRE的库(用于Nginx的rewrite模块,如果不需要这个模块可以在configure时使用./configure –without-rewrite).编译

Linux上配置Nginx+PHP5(FastCGI)

原为地址:http://www.laruence.com/2009/07/28/1030.html Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,以事件驱动的方式编写,所以有非常好的性能,同时也是一个非常高效的反向代理.负载平衡.其拥有匹配Lighttpd的性能,同时还没有Lighttpd的内存泄漏问题,而且Lighttpd的mod_proxy也有一些问题并且很久没有更新. 因此我打算用其替代Apache应用于Linux服务器上.但是Nginx并不支持cgi方式运行,原因是可以减少因此带

负载均衡-请问一下nginx里配置upstream 如何能获得最终负载到哪台服务器上呢

问题描述 请问一下nginx里配置upstream 如何能获得最终负载到哪台服务器上呢 请问一下nginx里配置upstream 如何能获得最终负载到哪台服务器上呢 解决方案 这个是nginx自己内部的处理了,你只能从access.log等中去查看