一、問題
IOS 開發(fā)使用 NSURLconnection 發(fā)送 HTTP POST請求的時(shí)候末早,一直timeout烟馅。
繼而發(fā)現(xiàn)safari無法訪問網(wǎng)站,但是chrome和其他的瀏覽器都沒有任何問題然磷。
提前說一下郑趁,這個(gè)問題出現(xiàn)在** ngixn-1.9.0+/apache2.4 **的反向代理上
我的服務(wù)器是 LANMP 組合的,其中 nginx 版本是 1.12.0 姿搜,而apache的版本是 2.4
二寡润、排查過程
1. 檢查服務(wù)器通訊和網(wǎng)絡(luò)原因
首先發(fā)現(xiàn)IOS端能夠ping通服務(wù)器,但是新問題出現(xiàn)了safari無法訪問網(wǎng)站舅柜,同樣的網(wǎng)站chrome中能夠訪問梭纹。
2. 客戶端排查
IOS客戶端開發(fā)者請求同樣的https API ,發(fā)現(xiàn)能夠拿到response致份,只有我的網(wǎng)站不行变抽。
3. 網(wǎng)站系統(tǒng)排查
試了好幾個(gè)API測試平臺以及各種瀏覽器,發(fā)現(xiàn)都沒有問題,最后發(fā)現(xiàn):
蘋果原生的應(yīng)用 如safari绍载,無論是 IOS 的 safari 還是 max osx 的 safari 都無法訪問網(wǎng)站
4. 排查SSL問題
因?yàn)槲矣玫氖?Let's Encrypt 的 SSL 證書太伊,因此測試了我其他使用SSL證書網(wǎng)站能否在 safari 中打開,發(fā)現(xiàn)都沒問題。
5. 進(jìn)一步排查網(wǎng)站系統(tǒng)
在排查過程中逛钻,發(fā)現(xiàn)當(dāng)訪問純靜態(tài)頁面僚焦,如 https://www.demo.com/index2.html 的時(shí)候,沒有任何問題曙痘,能夠正常訪問芳悲。
但是如果訪問動態(tài)頁面,如 https://www.demo.com/index2.php的時(shí)候边坤,都是錯(cuò)誤的名扛,也就是說 phpinfo() 都無法訪問。
因此感覺問題可能出現(xiàn)在 nginx 或者是 apache 上
6. 各種查資料
為此我在 segmentfault.com 上提問的問題也編輯了很多次茧痒,問清了IOS開發(fā)方面的一些概念后肮韧,最后確定了問題出現(xiàn)服務(wù)器方面。
所以在 stackoverflow 上各種關(guān)鍵字查旺订,主要查的是
- nginx
- safari can not open website
在一個(gè)提問中發(fā)現(xiàn)弄企,HTTP2可能存在問題,因此我看了一下我的網(wǎng)站的log区拳,nginx.log 和 apache.log 我都配置了拘领。
不看不知道,嚇一跳:
1)demo.com_apache.log 中都是正常的200請求:
2)demo.com_nginx.log 中也都正常樱调,但是需要注意的是:
- 請求都是 HTTP/2.0 請求
- 訪問一次網(wǎng)站约素,會出現(xiàn)好幾十甚至一百次鏈接請求</red>(這個(gè)我把日志清空后,訪問一次笆凌,nginx訪問日志就出現(xiàn)了N多條)
- 請求都是200的
7. 確定了問題最終出現(xiàn)在nginx上面圣猎,而且是反向代理的問題。
三乞而、解決
前后折騰了將近一天送悔,最后在 stackoverflow 上找到了同樣的問題,問題說:
safari 因?yàn)槭褂肏TTP/2.0 請求而拿不到response
其中提到了我在別的問題中也看到的一個(gè)內(nèi)容晦闰,已經(jīng)有人在nginx中討論過這個(gè)問題:
【"Upgrade" header should not be proxied over h2】
隱藏 Nginx 的 Upgrade header
具體為什么放祟,可以去nginx上的討論看看鳍怨,很詳細(xì)呻右。
操作:
修改 nginx proxy配置中 proxy_hide_header 成 Upgrade
proxy_hide_header Upgrade