one port, two programs
這真是太神奇了,可以在一個 port 上綁兩個 apache 呢!囧rz
問題
這是最近遇到的狀況,透過 netstat -tulnp
時,發現到 80 port 被兩個 apache 佔著,而且 pid 都不一樣,這完全超過我對 linux 的理解,認爲這種事情不能發生,但是他還是發生了
環境
Ubuntu 14.04.4 LTS
Apache Server version: Apache/2.4.18
問題重現
先啟動 apache2
1
$ sudo service apache2 start
進入 /var/run 裡面 砍掉 pid file
1
$ sudo rm /var/run/apache2/apache2.pid
看目前 port 的狀況,會發現到 apache2 依然佔著 port
1
$ sudo netstat -tulnp | grep apache2
於是乎,因為在 /var/run/apache2 的 pid file 不見了,所以可以在啟動一次 apache
1
$ sudo service apache2 start
從
$ sudo netstat -tulnp | grep apache2
可以看到兩個 apache listen 80 port,然後其中一個怎麼都砍不掉,即使sudo service apache2 stop
也只會停掉其中一個。
暫時解決方式
需要把所有的 apache 砍掉,然後再重新啟動 apache
1 | $ sudo killall apache2 |
造成影響
這會讓瀏覽網頁的人會隨機挑選一個 apache 來呈現網頁,畢竟有兩個程式在使用同一個 port,不過這也說明了 OS 似乎不管 port 有沒有被佔用,是應用程式自己要去判斷有沒有被佔用?
至於在沒有人手動砍 /var/run/apache2
底下 pid file 的情況之下,為什麼會出現這個問題就要再找看看了
update
經過同事解釋,應該是遇到這個類似的 bug,只是不知道為什麼這 bug 還存活在 2.4.18 裡,最後的解決方法,就是不同時執行兩次 service apache2 restart
。
我們機器上是有在 /etc/rc3.d/
裡設定開機啟動 apache,以及在 crontanb
裡寫了 @reboot service apache2 restart
,所以在開機的時候會執行了兩次 restart
,才會遇到這個神到不行的問題。