Rails的部署方案中,有一種是Apache作為Reverse Proxy,把請求轉寄給應用程式伺服器(比如說Phusion Passenger)。 Apache作為反向代理伺服器,是如何與後面的應用程式伺服器互動的?
例如我的Apache監聽1080端口,查了一下進程資訊:
> ps aux | grep /MyWebsite/bin/httpd
googly 8353 0.0 0.0 73856 3280 ? Ss Aug26 0:00 /MyWebsite/bin/httpd -d /MyWebsite -f var/state/apache-1080/httpd.conf
googly 8391 0.0 0.0 73856 1828 ? S Aug26 0:00 /MyWebsite/bin/httpd -d /MyWebsite -f var/state/apache-1080/httpd.conf
... # 起了10个进程,并且我知道8353是父进程,其余的是子进程
當一個請求到來,首先會到Apache,Apache會從這些進程中分配一個進程來處理這個請求(例如分配了8391這個進程),那麼8391這個進程會做什麼呢?他是會把這個請求轉發給後面的應用程式伺服器(Phusion Passenger)嗎?如果是這樣,那麼應用伺服器是不是也有自己獨立的進程?還是說8391這個進程就已經可以當成應用伺服器的進程了,他自己就能處理這個請求?
Apache是如何與掛在他後面的應用程式伺服器互動的呢?
看到這個問題很久了當時沒有回答,現在來回答。
ruby語言是有http相關api的,你甚至可以自己寫一個簡單的靜態檔案伺服器。而且有許多強大的gem提供類似服務。
PHP語言在Apache下最普遍的運作方式是作為它的插件,換句話說就是把Apache變的可以回應php檔案請求了。
而用rails s或thin等web伺服器來啟動服務也是完全可以的,只是不管是對瀏覽者還是對開發者而言,都沒有那麼好用而已。
如果你配置的是反向代理的話,那麼 Apache 接下來會充當 HTTP 用戶端,以把同樣的請求發給應用程式伺服器,得到結果之後再發給真正的客戶端。
你起了apache之後它就會有十幾二十個進程起來(這要看你的配置了)
然後在apache收到request之後有一個程序會處理它,如果它符合反向代理的條件,就會把request發送到你的應用伺服器
其實應用程式伺服器應該也是能夠直接存取的(除非有什麼防火牆啊之類的)
反正就是應用程式伺服器收到了request,然後傳回一個response給apache
apache再把response傳回瀏覽器
不過在這過程中可能還需要設定下對於response中間的html裡面的url的改寫