最近為南方基地的平臺編寫監控介面,採用BS構架,其中有一個監測虛擬機器是否當機的功能。
過程為:監控機發出訪問請求–>介面分析請求–>啟動socket檢測目標虛擬機器是否當機。
因為通過ICMP協議檢測,所以用了 SOCK_RAW 的socket型別。
伺服器使用apache + php + mysql,發現程式出錯,提示說沒有許可權建立socket。後來查資源得知,此類socket需要root許可權或者以cgi方式跑php結合用 setuid() 才能建立socket。
解決方法:改用nginx+php-cgi+mysql解決。
在編譯php的時候,要做以下修改才能用root使用者啟動服務。
1.找到php的原始碼$src_path/sapi/cgi/fpm/fpm_unix.c (版本不一樣,最好是通過 find $src_path -name fpm_unix.c)
2.在檔案頂部增加一個巨集定義:#define I_REALLY_WANT_ROOT_PHP
3.重新 configure make make install
4.php-fpm.conf 將user、group都修改成root