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

問題重現

  1. 先啟動 apache2

    1
    $ sudo service apache2 start
  2. 進入 /var/run 裡面 砍掉 pid file

    1
    $ sudo rm /var/run/apache2/apache2.pid
  3. 看目前 port 的狀況,會發現到 apache2 依然佔著 port

    1
    $ sudo netstat -tulnp | grep apache2
  4. 於是乎,因為在 /var/run/apache2 的 pid file 不見了,所以可以在啟動一次 apache

    1
    $ sudo service apache2 start
  5. $ sudo netstat -tulnp | grep apache2 可以看到兩個 apache listen 80 port,然後其中一個怎麼都砍不掉,即使 sudo service apache2 stop 也只會停掉其中一個。

暫時解決方式

需要把所有的 apache 砍掉,然後再重新啟動 apache

1
2
3
$ sudo killall apache2

$ sudo service apache2 start

造成影響

這會讓瀏覽網頁的人會隨機挑選一個 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,才會遇到這個神到不行的問題。