1. 程式人生 > >Nginx反向代理Apache實現動靜結合

Nginx反向代理Apache實現動靜結合

當今最流行的WEB伺服器當屬Nginx和Apache了,最近接觸了nginx,那麼nginx的一大特點就是它本身是一個反向代理伺服器,且支援7層負載均衡,相比於apache,nginx對靜態內容對處理能力很強,對於動態內容還是apache效能更優,於是我突發奇想使二者結合使用,也即使用Nginx處理靜態內容,動態內容反向代理交給Apache處理。

    首先需要了解一下什麼是反向代理?這個概念貌似很耳熟,正向代理(也就是常說的“代理”)是我們經常接觸的概念,那麼接下來就通過正向代理與反向代理進行比較來更加形象的解釋什麼是反向代理。

正向代理

如下圖,我們本地計算機想要訪問google,被殘忍的”牆“阻斷了。於是乎我們在國外搭建一臺代理伺服器,讓這臺代理伺服器去請求google,然後把返回的內容傳遞給我,這就是一個正向代理的過程,在這個過程中

客戶端隱藏了身份,google並不知道是誰真正請求的它,這個代理伺服器就是充當了正向代理伺服器的角色。


反向代理

如下圖,我們本地計算機訪問baidu,baidu後面有大量的伺服器在運作,但是究竟是哪一臺為我們服務,我們不知道,但是我們只需要對反向代理伺服器發出請求即可,然後反向代理伺服器就會將我們對請求發到其後面對伺服器進行處理,然後返回資訊給代理伺服器,代理伺服器將資訊傳遞給我們,這個過程中對真正服務端進行隱藏。


兩者的區別在於代理的物件不一樣:正向代理代理的物件是客戶端,反向代理代理的物件是服務端

部分摘自知乎:https://www.zhihu.com/question/24723688/answer/128105528

Apache+Nginx

我的系統是macos10.13.3版本,首先使用brew安裝apache+nginx+php並進行簡單的配置(網上教程很多就不多說了)

這些安裝配置好後,我們首先需要修改Apache的httpd.conf配置檔案,將埠改為8080(其他也可),重啟。

然後修改Nginx的nginx.conf檔案,使其監聽埠80(我這裡預設是8080),並且將php檔案交給apache處理(去掉這三行前面的#即可,不開啟下面的php部分以及不需要啟動php-fpm)

接下來進行測試:

分別在兩個伺服器根目錄下(假設為apache_www和nginx_www)建立index.html,並寫入不同內容“apache”、“nginx”。

然後分別訪問http://localhost:80/與http://localhost:8080/。

輸出結果為“apache”、“nginx”,表示二者分別都可以處理靜態檔案

接下來將兩個index.html檔名修改為index.php,並分別寫入“<?php echo "apache";?>“、“<?php echo "nginx";?>”

然後分別訪問http://localhost:80/與http://localhost:8080/。

輸出結果均為apache,如果將上面三行註釋掉,訪問http://localhost:80/會顯示找不到相應檔案。

這就表示當我們使用nginx訪問php檔案的時候它會去把請求發給apache進行處理,然後接收apache返回的結果顯示到瀏覽器。

當我進行使用的時候就將兩個伺服器的根目錄apache_www和nginx_www合成一個www,這樣我們將專案放到裡面直接訪問localhost就預設將nginx當作前端伺服器,發揮其長處,處理高併發並交給apache去處理動態內容。

注意:

如果單臺伺服器的話,NGINX+APACHE+PHP 純粹多此一舉,多了一次請求轉發,效率肯定低,而且現在FPM已經足夠穩定。完全沒必要。

只有多臺伺服器叢集的話,apache+nginx反代才有意義.NGINX+APACHE+PHP 這種架構存在的原因除了apache出現比較早外,還因為當時FPM不如module模式穩定,如今的FPM/fastcgi模式效能並不比module差。