
我在 Debian Jessie 伺服器上運行 Nginx、FCGI 和 Request Tracker。 Request Tracker 由 Nginx 提供服務,但 FCGI 位於它們之間。重要的是 FCGI 伺服器有時會發生故障,導致 RT 用戶看到 502 錯誤。修復很簡單,但這只是因為我在過去一個月左右的時間裡已經完成了無數次。如果我不在並且其他人必須重新啟動 FCGI 伺服器,他們可能會遇到困難。另外,停止和重新啟動伺服器很煩人,但您需要這樣做才能將變更套用到 RT。
所有這一切都讓我想到這一點:如何才能最好地使命令變得更簡單?一個腳本?一項服務,所以它存在於/etc/init.d
?還有別的事嗎?我是 Debian 和 Linux 的新手,所以不太了解我的選擇或每個選擇的參與程度。以下是您必須發出的命令:
netstat -antp | grep LIST | grep 12345
(這會找到綁定到連接埠12345的FCGI伺服器,因此我可以獲得PID。假設我們的PID是8091。)
kill 8091
spawn-fcgi -u someUser -g someGroup -a 127.0.0.1 -p 12345 /opt/rt4/sbin/rt-server.fcgi
這裡的一個重要注意事項是該netstat
命令不能返回任何內容。如果確實如此,則 FCGI 伺服器已無提示地發生故障,因此您可以跳過該kill
命令並直接執行該spawn-fcgi
命令。否則,請保留該kill
命令。
理想情況下,我希望有啟動/停止/重新啟動選項,例如/etc/init.d/rt-fcgi-server
.不過,我不知道如何終止該進程,因為需要先找到 PID。我考慮過使用一個.pid
文件,但我不知道如何告訴spawn-fcgi
使用一個文件,也不知道如何處理這樣的文件,即使我有它。我什至不知道它是否會執行我想要的操作(保留 PID,這樣我就可以避免使用該netstat
命令)。
我希望這一切都是有道理的。我基本上希望有一個命令或與 相關的命令/etc/init.d
來控制命令的結果spawn-fcgi
。我希望非 root 用戶(他們對 Linux 的了解比我還少)能夠登入並運行單一命令,並且我不介意在不使用 的情況下查詢此進程的狀態netstat
,即使我不必獲取 PID 來殺死它。這樣我就可以使用 Monit 之類的東西在伺服器失敗時自動重新啟動伺服器。
答案1
我將從 FreeBSD 的角度來寫這個答案,但它應該適用於 Linux 和 Debian ...軟體包名稱和其他內容可能會改變。
我同樣對spawn-fcgi 不滿意。在 FreeBSD 上,它有一個 rc.d 腳本,但它不遵守 rc.d 規則(例如,它不能「重新啟動」)。
然而,在spawn-fcgi手冊的底部,它提到了監督。透過一些搜索,發現了「daemontools」...在 FreeBSD 上,有 daemontools 和 daemontools-encore 的軟體包。 -encore看起來比較新,功能也比較多,所以就選擇了它。我的daemontools-encore版本是1.10_1。
在 FreeBSD 上,為 svscan 提供了 rc.d 腳本。在 FreeBSD 上,它會掃描 /var/service 中的子目錄,並為每個目錄執行「監督」。我接受了這個預設配置並放入svscan_enable="YES"
/etc/rc.conf。對於 Linux,我不知道 rc 腳本,但它說 /service 是預設目錄。
在 /var/service 內部,我建立了 rt-fcgi,並在 rt-fcgi 內部建立了 run。 「運行」包含:
#!/bin/sh
spawn-fcgi -u www -g www -s /tmp/rt.sock -n -- /usr/local/sbin/rt-server.fcgi
顯然,在 Linux 上,這需要您正在使用的使用者和群組以及 rt-server.fcgi 的位置。
svscan 系統似乎會通告進程標題中的最後幾行錯誤。還有其他選擇。我的看起來像:
46495 - IJ 0:00.01 /usr/local/bin/readproctitle service errors: ...tory (/var/run/rt44/data/gpg). GnuPG support has been disabled (/usr/local/lib/perl5/site_perl/RT/Config.pm:790)\n[52465] [Tue Mar 7 21:09:54 2017] [warning]: The requested port (443) does NOT match the configured WebPort (80). Perhaps you should Set($WebPort, 443); in RT_SiteConfig.pm, otherwise your internal hyperlinks may be broken. (/usr/local/lib/perl5/site_perl/RT/Interface/Web.pm:1328)\n
……這意味著我沒有正確配置 gnupg。看起來你可能會在那裡查找錯誤之類的東西,除非你為 svscan 配置日誌。
對於一個 fcgi 來說,這是一個相當繁瑣的操作,但它是封裝的並且可以工作。它處理因任何原因退出的腳本,但它不管理 PID 檔案或套接字(除了建立套接字檔案)。
我必須說,比起這個亂七八糟的東西,我更喜歡 WSGI 標準。