半熟前端

軟體工程師 / 台灣人 / 在前端的路上一邊探索其他領域的可能性

雜記

記一次 debug 流程 — connection refused

前言

大約從前幾個月開始,我的 google chrome 就時常有莫名其妙 connection refused 的情況發生,有時候有些網頁就是開不起來,但用其他裝置開卻正常。雖然覺得怪怪的,但想說可能是伺服器設定的問題,而且也沒有造成什麼困擾,就這樣繼續用下去了。

設定 custom domain

後來,當我順手買了 .dev 網域後,奇怪的事情的發生了。當我設定好 CNAME,也確定 SSL 生效,但是不管我怎麼在 chrome 重新整理,就是一直顯示 CONNECTION_REFUSED。一般來說這個問題有幾個,第一個是 server 端沒有開 port、另外一個是防火牆設定,我瞧瞧這兩個設定,發現都沒有問題。為了保險起見,我用了 dig xxx.dev +nostats +nocomments +nocmd 來查看 CNAME 是否設定正確。完全沒問題。

接下來查看看 SSL 的問題,我用了 SSL checker 來檢查 SSL 是否有正確設定,也有。

好,或許是等待設定生效需要一陣子,我就等了 10 分鐘再看看,還是不行,chrome 還是慘白的 CONENCTION_REFUSED。接下來我用手機看看,發現可以成功進入網頁。

這時候我開始懷疑或許是電腦中的某些設定出錯了,於是開始檢查相關的設定,首先先用 curl blog.kalan.dev 瞧瞧。結果出現了錯誤:

curl: (7) Failed to connect to blog.kalan.dev port 80: Connection refused

嗯,chrome 的結果與 curl 的結果相同,所以更加確信是電腦本身的設定有誤了,接下來我用了 wget 來看看發生了什麼事。

wget https://blog.kalan.dev
--2019-03-18 23:11:46--  https://blog.kalan.dev/
正在查找主機 blog.kalan.dev (blog.kalan.dev)... 127.0.0.1, 0.0.0.1
正在連接 blog.kalan.dev (blog.kalan.dev)|127.0.0.1|:443... 失敗: Connection refused。
正在連接 blog.kalan.dev (blog.kalan.dev)|0.0.0.1|:443... 失敗: No route to host。

等等,查找主機竟然找到 127.0.0.1?意思是說我把這個 domain 加進去 hosts 裡了嗎?在我的印象中完全沒有這件事,但又抱著一絲期待來瞧瞧 /etc/hosts/private/etc/hosts 這兩個檔案。

結果還是一樣,我沒有設定 domain 在本機 hosts 當中,但至少知道原因是什麼了,因為某個設定導致 blog.kalan.dev 被設定在 127.0.0.1 當中。到這裡我已經完全不清楚有什麼可能原因了。但當我在亂試的時候,發現一件奇怪的事,我發現任何 xxx.dev 都有同樣的狀況,而其他 domain 卻沒有這樣的問題。

這時候我突然想起了一件事,大約在 4 年前,我為了學習 Ruby On Rails,所以順道下載了 powder。簡單來說就是他能夠讓你在 access 網站的時候,順便幫你啟 server,這件事超方便的!所以當時我就開心地安裝了。

但是,仔細看一下官方文件,發現 session3_1 寫著:

The POW_DOMAINS environment variable specifies a comma-separated list of top-level domains for which Pow will serve DNS queries and HTTP requests. The default value for this list are the two test,dev domains, meaning Pow will configure your system to resolve *.test and *.dev to 127.0.0.1 and serve apps in ~/.pow under the .test and .dev domains.

哦哦哦哦哦,原來就是你把我的 IP 吃掉了,因為指向 127.0.0.1,然後電腦本身沒有開 443 port,所以才會出現 CONNECTION_REFUSED。 所以我那些沒有看到的網頁,或許都是用 .dev 域名也說不定。

幾件事情可以記錄一下:

  • 發現 CONNECTION_REFUSED 的時候,直接用 wget 看看主機連線是否正確
  • 或者用 curl --ipv4 -v “your.site.com” 檢查主機連線