為什么要將https轉(zhuǎn)發(fā)為http
當(dāng)前的互聯(lián)網(wǎng)應(yīng)用基本都要支持https協(xié)議,而當(dāng)瀏覽器頭通過(guò)https協(xié)議將請(qǐng)求發(fā)到到負(fù)責(zé)負(fù)載的nginx后,會(huì)由當(dāng)前nginx再以http協(xié)議向后端upstream進(jìn)行請(qǐng)求,之所以這么做是因?yàn)閔ttps協(xié)議的安全性也帶來(lái)的額外的性能消耗。而源端基本都是在一個(gè)內(nèi)網(wǎng)里面的,對(duì)于通訊協(xié)議的安全性要求沒(méi)那么高,采用http協(xié)議通訊性能會(huì)更優(yōu),也能降低證書的部署成本。
因此在實(shí)際應(yīng)用中的部署架構(gòu)如下方所示
瀏覽器 ---- https (http2) —> nginx (負(fù)載均衡) ---- http1.1—> nginx/tomcat/node (upstream 源端)
如何配置
假設(shè)我當(dāng)前的域名為 aaa.com
并且已經(jīng)有了aaa.com的ssl證書(自簽或購(gòu)買),本文重點(diǎn)不在于如何生成證書,具體就不寫了。
證書會(huì)包含2個(gè)文件:
aaa_com.key , aaa_com.crt
建議將這2個(gè)文件cpoy到 nginx的安裝目錄(默認(rèn)為:/usr/local/nginx)的ssl目錄中(需要自行創(chuàng)建)
然后創(chuàng)建aaa.com的虛擬主機(jī)配置文件aaa.conf,示例如下
server {
listen 80;
server_name www.aaa.com aaa.com;
access_log /data/log/nginx/aaa_access.log main;
error_log /data/log/nginx/aaa_error.log;
#核心代碼
rewrite ^(.*)$ https://${server_name}$1 permanent;
}
#配置源端
upstream aaa-upstream {
#源端的ip與端口
server x.x.x.x:port weight=5 max_fails=3 fail_timeout=30s;
}
server {
server_name www.aaa.com aaa.com;
#https相關(guān)配置,開啟http2.0
#啟用https需要安裝openssl,同時(shí)在安裝nginx的時(shí)候添加 --with-http_ssl_module --with-http_v2_module
listen 443 ssl http2;
#指定證書位置
ssl_certificate /usr/local/nginx/ssl/aaa_com.crt;
ssl_certificate_key /usr/local/nginx/ssl/aaa_com.key;
ssl_session_cache shared:SSL:10m;
#1m大約可以存儲(chǔ)4000個(gè)TLS握手,當(dāng)某個(gè)https連接在規(guī)定時(shí)間重連時(shí),可以通過(guò)session_cahce重用TLS秘鑰,也就是client只要發(fā)起一次http請(qǐng)求就可以再次進(jìn)行連接。
#根據(jù)TLS通訊過(guò)程,如果你的https開啟了session_cache,在第二步,server獲取到client請(qǐng)求就會(huì)去讀取session_cache文件,如果存在client的key就直接復(fù)用,進(jìn)行數(shù)據(jù)傳輸。
#設(shè)置存儲(chǔ)會(huì)話參數(shù)的高速緩存的類型和大小。緩存可以是以下任何一種類型:
# off 嚴(yán)禁使用會(huì)話緩存:nginx明確告訴客戶端會(huì)話可能不會(huì)被重用。
# none 會(huì)話緩存的使用被輕輕地禁止:nginx告訴客戶端會(huì)話可能被重用,但實(shí)際上不會(huì)將會(huì)話參數(shù)存儲(chǔ)在緩存中。
# builtin 建立在OpenSSL中的緩存; 僅由一個(gè)工作進(jìn)程使用。緩存大小在會(huì)話中指定。如果沒(méi)有給出大小,則等于20480個(gè)會(huì)話。內(nèi)置緩存的使用可能導(dǎo)致內(nèi)存碎片。
# shared 所有工作進(jìn)程之間共享的緩存。緩存大小以字節(jié)為單位指定; 一兆字節(jié)可以存儲(chǔ)大約4000個(gè)會(huì)話。每個(gè)共享緩存都應(yīng)該有一個(gè)任意的名字。具有相同名稱的緩存可以在多個(gè)虛擬服務(wù)器中使用。
# 兩種緩存類型都可以同時(shí)使用,例如:ssl_session_cache builtin:1000 shared:SSL:10m;
#注意:但只使用沒(méi)有內(nèi)置緩存的共享緩存應(yīng)該更有效率。
#ssi on; #服務(wù)器嵌套,主要是實(shí)現(xiàn)網(wǎng)站的內(nèi)容更新,時(shí)間和日期的動(dòng)態(tài)顯示,以及執(zhí)行shell和CGI腳本程序等復(fù)雜的功能。
ssl_session_timeout 10m;
access_log /data/log/nginx/aaa_access.log main;
error_log /data/log/nginx/aaa_error.log;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1; #這行很關(guān)鍵,沒(méi)有的話可能導(dǎo)致https訪問(wèn)報(bào)bad request 400
proxy_set_header Upgrade $http_upgrade; # 做websocket應(yīng)用,需要實(shí)時(shí)感知客戶端頭信息變化的場(chǎng)景需要加
proxy_set_header Connection "upgrade"; # 做websocket應(yīng)用,需要實(shí)時(shí)感知客戶端頭信息變化的場(chǎng)景需要加
#設(shè)定回源通過(guò)http協(xié)議
proxy_pass http://aaa-upstream;
}
}
重點(diǎn)說(shuō)明
-
要啟用nginx https支持,需要在安裝openssl,并安裝–with-http_ssl_module --with-http_v2_module 模塊,有需要可以參考tengine安裝(包含常用模塊)
-
建議開啟 ssl會(huì)話緩存,降低握手時(shí)間 ssl_session_cache shared:SSL:10m;
-
proxy_http_version 1.1; 需要重點(diǎn)關(guān)注,在實(shí)際使用中發(fā)現(xiàn),不配置的話,可能會(huì)導(dǎo)致轉(zhuǎn)發(fā)到源端的http請(qǐng)求變成http1.0協(xié)議,從而導(dǎo)致源端報(bào)bad request 400的異常(如果源端也是一個(gè)nginx負(fù)載的情況下),而且http1.0協(xié)議的性能最差,最好還是加上。
-
websocket 應(yīng)用場(chǎng)景(比如IM實(shí)時(shí)通訊),開啟以下配置文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-818704.html
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade"
這2行都是為了實(shí)時(shí)讓服務(wù)端能感知到客戶端的狀態(tài)變化文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-818704.html
- 創(chuàng)建好的aaa.conf,可以放到nginx安裝目錄下的conf/site/下,同時(shí)在conf/nginx.conf中的http對(duì)象配置中添加 include site/*.conf; 以便于各站點(diǎn)配置的分別維護(hù)
- 遇到問(wèn)題先定位一下是那一層出了問(wèn)題,是負(fù)載層,還是源端層,再判斷問(wèn)題根源
到了這里,關(guān)于tengine/nginx https請(qǐng)求 轉(zhuǎn)發(fā) http upstream的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!