今天蒂窒,在nginx上面實踐http2.0,為什么強調(diào)nginx荞怒,因為目前nginx在前端請求中扮演一個中間調(diào)配刘绣、轉(zhuǎn)發(fā)的角色,大多數(shù)網(wǎng)站都有架設(shè)nginx挣输。
http2的優(yōu)點可以參見http2.0博客上講述。這里就不在重復(fù)福贞,這里著重講解一下nginx上操作實踐撩嚼,目前nginx從1.9.5開始支持了,瀏覽器谷歌40挖帘、firefox36都開始支持完丽,IE8暫時還沒有支持,只不過比較幸運的是拇舀,不支持的瀏覽器會自動轉(zhuǎn)為http1.1請求逻族。nginx的windows版本目前還沒有集成http2的組件,需要我們通過visual studio重新生產(chǎn)exe骄崩。linux環(huán)境下的安裝過程如下:
1.在開始我們的任務(wù)之前聘鳞,請先下載 OpenSSL 薄辅, pcre , Zlib 跟 Nginx源碼 抠璃,并且全部解壓到同一個目錄站楚,假設(shè)為nginx-http2/nginxsource ,這時候的代碼結(jié)構(gòu)如下:
2.準備好各種安裝包之后搏嗡,要解壓 tar zxvf *窿春,然后進入這個目錄
# 先進入nginx源碼目錄
cd nginx-http2/nginxsource/nginx-1.9.14
# 配置Nginx源碼
# --prefix:配置nginx最終安裝目錄,可以修改為你想要的目錄
# --with-http_ssl_module 跟 --with-http_v2_module 必帶采盒,因為 HTTP2.0采用 HTTPS 旧乞,HTTPS 基于 SSL/TLS
sudo ./configure --prefix=/home/kingdom/env/nginx-http2/nginx-http2 --with-http_ssl_module --with-pcre=../pcre-8.38--with-openssl=../openssl-1.0.2g--with-zlib=../zlib-1.2.8--with-http_v2_module
> 輸入管理員密碼然后回車
>make&&makeinstall
這樣就安裝完成了
3.生成SSL/TLS安全證書
要配置HTTP 2.0就需要啟動HTTPS,那就需要生成一個SSL/TLS證書磅氨,而OpenSSL正好可以做這件事情尺栖,買不起證書但自己造一個來臨時用還是可以的,直接執(zhí)行下面命令:
# 切換到nginx的根目錄(我這里是home/kingdom/env/nginx-http2/nginx-http2悍赢,請根據(jù)上一步編譯時候指定的--prefix對應(yīng)修改)
cd home/kingdom/env/nginx-http2/nginx-http2
cd conf
# 利用openssl命令生成公鑰跟密鑰
openssl genrsa -des3 -passout pass:x -outcert.pass.key2048
openssl rsa -passin pass:x -incert.pass.key-outcert.key
openssl req -new-keycert.key-outcert.csr
openssl x509 -req -days365-incert.csr -signkey server.key-outcert.crt
# 將crt跟key合并生成pem文件
cat cert.crt cert.key> cert.pem
# 刪除掉我們不需要用到的文件
rm -rf cert.crt cert.csr
4.修改Nginx配置
server {
? ? ? listen? ? ? 7104;
? ? ? server_name? localhost;
? ? ? location / {
? ? ? ? ? root? html;
? ? ? ? ? index? index.html index.htm;
? ? ? ? ? #return 301 https://$host$remote_port$request_uri;
}
? ? ? ? error_page? 500 502 503 504? /50x.html;
? ? ? location = /50x.html {
? ? ? root? html;
? ? }
}
server {
listen 443 ssl http2 default_server;
server_name? localhost;
ssl_certificate? ? ? cert.pem;
ssl_certificate_key? cert.key;
ssl_session_cache? ? shared:SSL:1m;
ssl_session_timeout? 5m;
# 我用原始的下面這段啟動報錯了决瞳,所以注釋掉改用了后面那段
#ssl_ciphers? HIGH:!aNULL:!MD5;
ssl_ciphers 'CHACHA20:EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:ECDHE-RSA-AES128-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA128:DHE-RSA-AES128-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA128:ECDHE-RSA-AES128-SHA384:ECDHE-RSA-AES128-SHA128:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA128:DHE-RSA-AES128-SHA128:DHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA384:AES128-GCM-SHA128:AES128-SHA128:AES128-SHA128:AES128-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4;';
ssl_prefer_server_ciphers? on;
location / {
root? html;
index? index.html index.htm;
}
}
這里我們設(shè)置了兩種端口,一個是https的默認端口443左权,一個是http的端口7104皮胡,之所以這樣設(shè)置就是為了后面比較兩者的效率
5.性能比較
這里我們使用一個簡單的例子來完成比較,一個簡單的index頁面赏迟,加載500張圖片的效率屡贺,如下圖所示
看下請求速度:
http2.0
http1.1
可以看出兩者時間上面差了近兩秒,當然這里僅僅是通過img的src進行加載的锌杀,如果有ajax請求的請情況甩栈,我們可以通過chrome自帶的檢測工具,如下圖糕再,http://192.168.14.183:7104/請求數(shù)已經(jīng)到達6個量没,這是ajax將會被阻塞,而http2突想,至始至終只有一個請求數(shù)殴蹄,可以實現(xiàn)無阻塞。
如何識別http2呢猾担?
在chrome的請求信息中我們可以看出袭灯,如下圖,這些都是http2特有的標示绑嘹。
這里要注意的一點稽荧,在配置nginx,conf中https的配置后工腋,一定要ps -ef|grep nginx 來查看進程數(shù)姨丈,然后kill -9 畅卓;殺掉進程,之后在啟動nginx构挤,這里的nginx -s reload 是不起作用的髓介。