我們都知道,80端口是web服務的預設端口,其他主機通路web伺服器也是預設和80端口進行web互動,而一台伺服器也隻有一個80端口,這是約定俗成的标準.
我們來看下面兩個場景:
1.伺服器的80端口被占用了,我們想實作伺服器的其他端口(比如port:2368)web服務.
2.我們想在一台伺服器上實作多個站點的web服務.
要解決這個問題,需要用到反向代理,下面的小對話可能更容易了解‘反向代理’這個概念
主機H:我給你發了一個http get請求,IP分組部分資訊為:
a.我通路的域名(解析前的域名,如:www.domain.com). b.我要通路的IP(www.domain.com域名解析後的公網IP).
伺服器S的web服務程式收到IP分組後,先把這個IP分組丢給nginx(或Apache反向代理服務)看,nginx拿到IP分組後根據a.要通路的域名來檢查配置檔案,看是否需要轉其他端口.例如:配置檔案裡面有這樣的描述:
如果這個分組的a是www.domain1.com,那麼轉到2368端口; 如果這個分組的a是www.domain2.com,那麼轉到1243端口; 如果這個分組的a是www.domain3.com,那麼轉到2104端口; 否則就用80端口.
web服務程式照做,把相應端口的資料傳給主機H.
通俗的說,就是:伺服器根據主機來訪域名區分需要轉哪個端口.
利用上面的配置,我們就可以實作在一台伺服器上建立4個web服務站點.
實作反向代理一般有兩種方法:
1.Apache反向代理服務
2.nginx反向代理服務
其中nginx在負載均衡這方面比Apache更專業,小巧專一,很是優雅.
nginx反向代理的具體操作如下:
安裝nginx
以RedHat為例
1.下載下傳媒體
nginx部署之前,首先根據項目的需要選擇需要安裝的元件,實際環境一般會考慮需要支援gzip壓縮和rewrite子產品,是以安裝的第一步是下載下傳Ngix及Ngix的相關元件.
1) nginx本身
建議下載下傳最新版本媒體,目前最新的是:1.9.9
2) gzip壓縮依賴庫:zlib
下載下傳版本:Version 1.2.5
3)Rewrite子產品的正規表達式依賴庫:pcre
pcre庫簡稱:Perl相容正規表達式
下載下傳版本:pcre-8.38
2.開始安裝
1) .安裝 pcre
預設安裝到/usr/local/lib下即可,安裝完成後可以#ls -l /usr/local/lib/libpcre.so
2).安裝nginx
3) .配置nginx
安裝完成之後,配置目錄conf下有以下配置檔案,過濾掉了xx.default配置:
除了nginx.conf,其餘配置檔案,一般隻需要使用預設提供即可.
nginx.conf是主配置檔案,預設配置去掉注釋之後的内容如下圖所示:
worker_process表示工作程序的數量,一般設定為cpu的核數
worker_connections表示每個工作程序的最大連接配接數
server{}塊定義了虛拟主機
listener監聽端口
server_name監聽域名
location{}是用來為比對的 URI 進行配置,URI 即文法中的“/uri/”,location / { }比對任何查詢,因為所有請求都以 / 開頭.
root指定對應uri的資源查找路徑,這裡html為相對路徑,完整路徑為/opt/ opt/nginx-1.7.7/html/
index指定首頁index檔案的名稱,可以配置多個,以空格分開。如有多個,按配置順序查找.
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiInBnauADMjZDOzUWYiJjNhJjMldjZ3YzYxIWN5E2N5ADMjZGZfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.jpg)
從配置可以看出,nginx監聽了80端口、域名為localhost、跟路徑為html檔案夾(我的安裝路徑為/opt/nginx-1.7.7,是以/opt/nginx-1.7.7/html)、預設index檔案為index.html, index.htm、伺服器錯誤重定向到50x.html頁面。
可以看到/opt/nginx-1.7.7/html/有以下檔案:
檔案擴充名與檔案類型映射表,nginx根據映射關系,設定http請求響應頭的Content-Type值.
當在映射表找不到時,使用nginx.conf中default-type指定的預設值。例如,預設配置中的指定的default-type為application/octet-stream.
下面截一段mime.types定義的檔案擴充名與檔案類型映射關系,完整的請自行檢視:
nginx配置Fastcgi解析時會調用fastcgi_params配置檔案來傳遞伺服器變量,這樣CGI中可以擷取到這些變量的值。預設傳遞以下變量:
這些變量的作用從其命名可以看出.
對比下fastcgi.conf與fastcgi_params檔案,可以看出隻有以下差異:
即fastcgi.conf隻比fastcgi_params多了一行“fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;”
原本隻有fastcgi_params檔案,fastcgi.conf是nginx 0.8.30 (released: 15th of December 2009)才引入的.
原本nginx隻有fastcgi_params,後來發現很多人在定義SCRIPT_FILENAME時使用了寫死的方式。例如,fastcgi_param SCRIPT_FILENAME
/var/www/foo$fastcgi_script_name。于是為了規範用法便引入了fastcgi.conf。
不過這樣的話就産生一個疑問:為什麼一定要引入一個新的配置檔案,而不是修改舊的配置檔案?
這是因為fastcgi_param指令是數組型的,和普通指令相同的是:内層替換外層;和普通指令不同的是:當在同級多次使用的時候,是新增而不是替換.
換句話說,如果在同級定義兩次SCRIPT_FILENAME,那麼它們都會被發送到後端,這可能會導緻一些潛在的問題,為了避免此類情況,便引入了一個新的配置檔案。
是以不再建議大家使用以下方式(搜了一下,網上大量的文章,并且nginx.conf的預設配置也是使用這種方式):
而使用最新的方式:
與fastcgi_params一樣,傳遞哪些伺服器變量,隻有字首不一樣,以uwsgi_param開始而非fastcgi_param.
這三個檔案都是與編碼轉換映射檔案,用于在輸出内容到用戶端時,将一種編碼轉換到另一種編碼。
4).管理nginx服務
啟動:
停止
重新開機
檢視狀态
實作:編寫shell腳本,并把shell腳本啟動指令加到系統自啟名單.
vi /etc/init.d/nginx (輸入下面的代碼)
:wq 儲存并退出
設定檔案的權限:
這樣在控制台就很容易的操作nginx了:檢視nginx目前狀态、啟動nginx、停止nginx、重新開機nginx…
同樣的修改了nginx的配置檔案nginx.conf,也可以使用上面的指令重新加載新的配置檔案并運作,可以将此指令加入到rc.local檔案中,這樣開機的時候nginx就預設啟動了
加入一行 /etc/init.d/nginx start 儲存并退出,下次重新開機會生效。