<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
前幾天給客戶部署服務,把服務都啟動完成,準備驗證的時候,發現怎麼都存取不到服務,但在伺服器裡面通過curl
來存取介面發現服務是通的,於是展開了一場漫長的排查過程。
先說一下我們服務的部署框架,用openresty
作為反向代理層、docker
部署具體的服務。簡化的架構圖如下。
瀏覽器存取服務,經過openresty
轉發到具體的服務。我們服務有兩個域名,比如叫 a.example.com
和 b.example.com
。
在發現存取不同時,立刻檢視了openresty
的紀錄檔,發現無論是a域名
還是b域名
的請求,紀錄檔顯示全部打到a域名
上去了。
再看紀錄檔的詳細資訊發現openresty
的$host
值不是域名而是ip。發現這個後,開啟瀏覽器偵錯工具,重新重新整理頁面,發現瀏覽器的請求是有$host
值的。
那是哪一步把$host
丟了呢?在我們服務的openresty
上一層可能還存在其他的代理層?感覺有這個可能,之前客戶說過他們也有幾層代理。一般代理都是nginx
,難道nginx
轉發請求到openresty
會把host
丟了嗎?應該不會啊。
找來客戶的運維,問他我們服務的上一層有沒有代理,他們說有其他代理,然後說,他們用的是Apache
做的代理。
嗯?Apache
?不好意思,觸及到我的知識盲區了,只是聽說過,並沒有實際的用過。Apache
轉發請求到openresty
會把host
丟失嗎?這個我也不清楚。
然後問客戶運維,還有沒有其他代理?他們說還有CDN
、F5
、Apache
,就這些了。
現在整體的架構清楚了,架構圖如下
好吧,代理還挺多,先聯絡CDN
廠商,讓他們協助排查下,CDN
廠商還挺配合,給查了紀錄檔,發現從CDN
經過的請求是有host
的。
然後,檢視F5
的紀錄檔,經過各種許可權申請,終於看到了F5
的紀錄檔,發現F5
的紀錄檔也是有host
的。
那隻剩下Apache
了,又經過各種許可權申請,檢視到了Apache
的紀錄檔,嗯,找到罪魁禍首了,Apache
向後轉發的時候,並沒有把host
的值給帶過來。查到這裡,我也鬆了口氣,還好不是我們服務的問題,要不然還要受一大頓批評。
既然找到原因了,就讓客戶運維去排查為什麼Apache
沒有把host
給帶過來。一個小時過去了,沒有任何迴應。。。
此時,已經凌晨12點了,客戶運維還沒有訊息,咱也不能坐以待斃,想想有沒有其他辦法。
於是,在伺服器上通過tcpdump
抓包,看看Apache
帶過來了什麼東西。
通過抓包來看,Apache
確實沒有把host
帶過來,但是有個其他的請求頭引起了我的注意:X-Forwarded-Host
、X-Forwarded-Server
。這兩個請求頭居然有域名資訊。
既然host
沒有域名資訊,其他兩個頭存在,那麼我是否可以做一箇中轉把X-Forwarded-Host
的域名資訊設定給host
呢。想了一下,是可以的,我可以再做一箇中轉本機轉發到本機,然後把X-Forwarded-Host
的值賦值給host
就好了,說幹就幹。
再新增一個default.conf檔案放到openresty
的設定目錄,內容如下:
server { listen 80; server_name _; location / { proxy_pass http://127.0.0.1:80; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_x_forwarded_host; } access_log /data/nginx/logs/default.access.log main; }
設定好了,重啟openresty
試一下,果然可以了。大功告成!
此時,已經凌晨1點了,快睜不開眼了,想著終於可以睡覺了。
剛高興了沒10分鐘,客戶運維突然我問,你們服務已經對外提供服務了嗎,怎麼會這麼多紀錄檔,一會好幾個G了。瞬間不困了,趕緊檢視原因,開啟nginx紀錄檔,發現列印了好多127.0.0.1
,很不正常。
而且紀錄檔列印的很快,怎麼看著有點像死迴圈?難道剛才加的openresty
設定有問題?重新看了看3個openresty
組態檔:examplea.conf
、exampleb.conf
、default.conf
,感覺沒啥問題呢,又仔細分析了下。
突然又想到,如果是一個C域名呢?
因為只有A域名和B域名的設定,沒有其他域名的設定,所以其他域名又會到default.conf
裡,如此就產生了死迴圈,既然找到了原因,那就好辦了繼續改吧。
如果我加個if
判斷,只有A域名和B域名才做轉發,其他域名明顯不是我的 服務,直接返回200就好了。
server { listen 80; server_name _; location / { set $target_domain 0; if ($http_x_forwarded_host != 'a.example.com'){ set $target_domain "${target_domain}1"; } if ($http_x_forwarded_host != 'b.example.com'){ set $target_domain "${target_domain}2"; } if ($target_domain = "012"){ return 200; } proxy_pass http://127.0.0.1:80; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_x_forwarded_host; } access_log /data/nginx/logs/default.access.log main; }
好了,到此問題終於解決了,更多關於Openresty獲取不到Host的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45