Nginx 輕鬆學 圖文並茂 一學就會 附案例源碼

  • 2020 年 3 月 30 日
  • 筆記

導讀

  篇幅較長,乾貨滿滿,需花費較長時間,轉載請註明出處!

Nginx概述

簡介

  Nginx (engine x) 是一個高性能HTTP反向代理web伺服器,同時也提供了IMAP/POP3/SMTP服務。Nginx是由伊戈爾·賽索耶夫為俄羅斯訪問量第二的Rambler.ru站點(俄文:Рамблер)開發的,第一個公開版本0.1.0發佈於2004年10月4日。

  Nginx是一款輕量級的Web 伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器,在BSD-like 協議下發行。其特點是佔有記憶體少並發能力,事實上nginx的並發能力在同類型的網頁伺服器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。

代理伺服器

  代理伺服器根據代理對象不同,可以分為正向代理伺服器與反向代理伺服器。這裡的“正”與“反”均是站在客戶端角度來說的。

正向代理

  正向代理是對客戶端代理客戶端C服務端S獲取資源,但於某些原因不能直接訪問服務端,而是通過另外一台主機P向服務端發送請求。當服務端處理完畢請求將響應發主機P,主機P接收到來自服務端的響應後將響應又轉給客戶端C。此時的主機P,就稱為客戶端C正向代理伺服器

  客戶端在使用正向代理伺服器時是知道其要訪問的目標伺服器的地址等資訊的。

  正向代理伺服器是伺服器的用戶(客戶端)架設的主機,與伺服器無關,正向代理伺服器的出現,使服務端根本就不知道真正客戶端的存在。

反向代理

  反向代理,其實客戶端對代理是無感知的,因為客戶端不需要任何配置就可以訪問,我們需要將請求送到反向代理伺服器由反向代理伺服器選擇目標伺服器獲取數據後,在將響應返回給客戶端,此時反向代理伺服器和目標伺服器對外就是一個伺服器,暴露的是代理伺服器地址,隱藏了真實伺服器IP地址

兩者區別

  在知乎上找了2張圖,可以幫助我們更好的理解。

 

Nginx的特點

  • 高並發
  • 低消耗
  • 熱部署
  • 高擴展
  • 高可用

Nginx的web請求處理機制

  Nginx結合多進程機制和非同步機制對外提供服務非同步機制使用的是非同步非阻塞方式。Nginx的master進程會生成多個worker進程,master進程負責管理這些worker進程生命周期接受外部命令解析perl腳本等。而worker進程則用於接受和處理客戶端請求

  每個worker進程能夠使用非同步非阻塞方式處理多個客戶端請求。當某個worker進程接收到客戶端的請求後,會調用IO進程處理,如果不能立即得到結果,worker進程就去處理其他的請求。當IO返回結果後,就會通知worker進程,而worker進程得到通知後,就會掛起當前正在處理的事務,拿IO返回結果去響應客戶端請求,worker進程採用的是epoll事件驅動模型IO進行通訊的。epoll模型底層採用的是“回調callback”代替里輪詢,使效率高於select模型。

Nginx的下載與安裝

Nginx的下載

nginx的官網:http://nginx.org/

  註:主線版,是最新的版本;穩定版,推薦生產環境下使用;舊版,以前的版本。

百度雲盤地址

鏈接:https://pan.baidu.com/s/1kjQST_x1Sf_thg3XDmqx6w  密碼:18sc

將nginx上傳至linux

環境搭建

前期準備

  因為nginx是C語言寫的,而且是源碼安裝,安裝前需安裝C語言環境!!!

yum install -y gcc-c++ gcc

安裝依賴庫

  基本的Nginx功能依賴於一些基本的庫,在安裝Nginx之前需要提前安裝這些庫。

  pcre-devel:pcre,Perl Compatible Regular Expressions,Perl腳本語言兼容正則表達式,為Nginx提供正則表達式庫。

  openssl-devel:為Nginx提供SSL(安全套接字層)密碼庫,包含主要的密碼演算法,常用的密鑰和證書封裝管理功能及SSL協議,並提供豐富的應用程式供測試或其他目的使用。

  在安裝之前需要注意,很多庫具有devel庫與非devel庫兩種。devel庫表示development開發庫,比非devel庫會多出一些頭文件、靜態庫、源碼包等。而這些包在運行時不可能用到,但在開發時有可能用到。所以對於程式設計師來說,一般都是需要安裝devel庫的。不過在yum安裝devel庫時,由於其依賴於非devel庫,所以其會先自動安裝非devel庫,而後再安裝devel庫。所以真正安裝時,只需顯示的安裝devel庫即可。

 yum -y install pcre-devel openssl-devel

解壓Nginx包

tar -zxvf nginx-1.16.1.tar.gz -C /opt/apps

進入剛才解壓後的目錄

查看幫助(可忽略)

./configure --help

安裝模組

此時Nginx解壓路徑下會多出一個:Makefile

系統配置資訊

  • path prefix:Nginx安裝目錄
  • binary file:Nginx命令文件
  • modules path:Nginx模組存放路徑
  • configuration prefix:Nginx配置文件存放路徑
  • configuration file:Nginx配置文件名
  • pid file:Nginx的進程id文件
  • error log file:錯誤日誌文件
  • http access log file:http訪問日誌文件
  • http xxx:其他http請求相關的文件

  配置成功後,再次查看Nginx解壓目錄,發現其中多出一個文件Makefile。後面的編譯就是依靠該文件進行的。

編譯安裝

  這是兩個命令,make:為編譯命令;make install:為安裝命令,可以分別執行。這裡使用&&將兩個命令連接執行,會在前面命令執行成功的前提下才會執行第二個命令。

編譯安裝完成後,會在/usr/local下出現nginx目錄

進入安裝目錄

設置任務目錄可以使用sbin(可忽略)

ln -n /usr/local/nginx/sbin/nginx /usr/local/sbin    格式:  ln -n 源路徑 目標路徑

註:軟鏈接建立完成後就可以在任意路徑下使用nginx命令

Nginx命令

  • 查看命令選項:nginx -h
  • 啟動命令:nginx -c file
  • 停止命令:nginx -s stop/quit
  • 平滑重啟命令:nginx -s reload
  • 測試配置文件命令:nginx -tq

nginx -t:測試配置文件是否正確,默認只測試默認的配置文件conf/nginx.conf

nginx -T:測試配置文件是否正確,並顯示配置文件內容

nginx -tq:在配置文件測試過程中,禁止顯示非錯誤資訊,即只顯示錯誤資訊

啟動nginx

  啟動後,並查看,發現有2個執行緒,一個master,一個worker

查看nginx埠號

nginx頁面訪問測試

註:linux需關閉防火牆!!!!

Nginx性能調優

查看nginx配置文件

nginx進程

  worker_processes,工作進程,用於指定Nginx的工作進程數量。該值應該設置為多少合適呢?其數值一般設置為cpu內核數量,或內核數量的整數倍。注意,現代的cpu一般都是多核,即一塊cpu中包含多個內核。

  若當前系統具有2塊cpu,而每塊cpu中包含2個內核,那麼worker_processes的值一般可以設置為4或8個。當然也可以為2個。

  不過需要注意,該值不僅僅取決於cpu內核數量,還與硬碟數量及負載均衡模式相關,在不確定時還可以指定其值為auto

worker_cpu_affinity的設置

  為了進一步提高系統性能,我們會將worker進程與具體的內核進行綁定。該綁定操作是通過worker_cpu_affinity屬性進行設置的。affinity,密切關係。

  不過,若指定worker_processes的值為auto,則無法設置worker_cpu_affinity。該設置是通過二進位進行的。每個內核使用一個二進位表示,0代表內核關閉;1代表內核開啟。也就是說,有幾個內核,就需要使用幾個二進位位。

  下面通過幾個例子來增進對worker_processes與worker_cpu_affinity的理解  

Nginx核心功能

請求定位

探究歡迎頁面顯示原因

訪問資源

查看nginx.conf配置

使用perl語言自定義一個網站

檢測語法格式是否正確

重啟nginx

訪問成功

  註:字打錯了,應該是“歡迎來到陳彥斌的Nginx!!”

靜態代理

  Nginx靜態代理,將所有的靜態資源,如:css、js、html、jpg等資源放到Nginx伺服器,而不存在應用伺服器Tomcat中,當客戶端發出的請求是對這些靜態資源的請求時,Nginx直接將這些靜態資源響應給客戶端,而無需提交給應用伺服器處理。這樣就降低了應用伺服器的壓力

  同時,Nginx對於靜態資源的處理較Tomcat,性能更高效率更高。所以,在實際生產環境下,會使用Nginx作為靜態代理伺服器,專門處理靜態資源的響應。

  Nginx對於靜態資源請求的攔截方式,可以通過靜態資源名稱的擴展名攔截,也可以通過靜態資源所在的目錄名稱攔截

創建目錄存放文件

往images目錄下存放一些圖片

編輯nginx.conf配置文件

擴展名攔截

擴展名攔截測試

目錄名攔截

負載均衡

   負載均衡,Load Balancing,就是將對請求的處理分攤多個操作單元上進行。這個均衡是指在大批量訪問前提下的一種基本均衡,並非是絕對的平均。

  對於Web工程中的負載均衡,就是將相同的Web應用部署多個不同的Web伺服器上,形成多個Web應用伺服器。當請求到來時,由負載均衡伺服器負責請求事先設定好的比例向Web應用伺服器進行分發,從而增加系統的整體吞吐量

總體規劃

  該機群包含一台Nginx伺服器,兩台Tomat伺服器。

  首先開發一個web工程,將其打包。然後,在克隆出兩台Tomcat主機,前面的web工程分別部署到這兩台Tomcat主機上。然後,在Nginx伺服器上設置對這兩台Tomcat主機的均在均衡。 

配置說明

  1. tomcat伺服器1:ip地址192.168.31.213
  2. tomcat伺服器2:ip地址192.168.31.214
  3. nginx伺服器:ip地址192.168.31.201

創建一個Web工程

項目結構圖

配置一台Tomcat主機

具體配置,請參考另一篇部落格:點我直達

複製並配置另一台Tomcat主機

   克隆上面配置好的Tomcat主機

配置Nginx主機

配置nginx.conf

  註:weight權重

平滑重啟nginx

項目的啟動與訪問

 

導讀

  篇幅較長,乾貨滿滿,需花費較長時間,轉載請註明出處!背景音樂若影響到您,網頁選項卡右上角即可關閉~~!

Nginx概述

簡介

  Nginx (engine x) 是一個高性能HTTP反向代理web伺服器,同時也提供了IMAP/POP3/SMTP服務。Nginx是由伊戈爾·賽索耶夫為俄羅斯訪問量第二的Rambler.ru站點(俄文:Рамблер)開發的,第一個公開版本0.1.0發佈於2004年10月4日。

  Nginx是一款輕量級的Web 伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器,在BSD-like 協議下發行。其特點是佔有記憶體少並發能力,事實上nginx的並發能力在同類型的網頁伺服器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。

代理伺服器

  代理伺服器根據代理對象不同,可以分為正向代理伺服器與反向代理伺服器。這裡的“正”與“反”均是站在客戶端角度來說的。

正向代理

  正向代理是對客戶端代理客戶端C服務端S獲取資源,但於某些原因不能直接訪問服務端,而是通過另外一台主機P向服務端發送請求。當服務端處理完畢請求將響應發主機P,主機P接收到來自服務端的響應後將響應又轉給客戶端C。此時的主機P,就稱為客戶端C正向代理伺服器

  客戶端在使用正向代理伺服器時是知道其要訪問的目標伺服器的地址等資訊的。

  正向代理伺服器是伺服器的用戶(客戶端)架設的主機,與伺服器無關,正向代理伺服器的出現,使服務端根本就不知道真正客戶端的存在。

反向代理

  反向代理,其實客戶端對代理是無感知的,因為客戶端不需要任何配置就可以訪問,我們需要將請求送到反向代理伺服器由反向代理伺服器選擇目標伺服器獲取數據後,在將響應返回給客戶端,此時反向代理伺服器和目標伺服器對外就是一個伺服器,暴露的是代理伺服器地址,隱藏了真實伺服器IP地址

兩者區別

  在知乎上找了2張圖,可以幫助我們更好的理解。

 

Nginx的特點

  • 高並發
  • 低消耗
  • 熱部署
  • 高擴展
  • 高可用

Nginx的web請求處理機制

  Nginx結合多進程機制和非同步機制對外提供服務非同步機制使用的是非同步非阻塞方式。Nginx的master進程會生成多個worker進程,master進程負責管理這些worker進程生命周期接受外部命令解析perl腳本等。而worker進程則用於接受和處理客戶端請求

  每個worker進程能夠使用非同步非阻塞方式處理多個客戶端請求。當某個worker進程接收到客戶端的請求後,會調用IO進程處理,如果不能立即得到結果,worker進程就去處理其他的請求。當IO返回結果後,就會通知worker進程,而worker進程得到通知後,就會掛起當前正在處理的事務,拿IO返回結果去響應客戶端請求,worker進程採用的是epoll事件驅動模型IO進行通訊的。epoll模型底層採用的是“回調callback”代替里輪詢,使效率高於select模型。

Nginx的下載與安裝

Nginx的下載

nginx的官網:http://nginx.org/

  註:主線版,是最新的版本;穩定版,推薦生產環境下使用;舊版,以前的版本。

百度雲盤地址

鏈接:https://pan.baidu.com/s/1kjQST_x1Sf_thg3XDmqx6w  密碼:18sc

將nginx上傳至linux

環境搭建

前期準備

  因為nginx是C語言寫的,而且是源碼安裝,安裝前需安裝C語言環境!!!

yum install -y gcc-c++ gcc

安裝依賴庫

  基本的Nginx功能依賴於一些基本的庫,在安裝Nginx之前需要提前安裝這些庫。

  pcre-devel:pcre,Perl Compatible Regular Expressions,Perl腳本語言兼容正則表達式,為Nginx提供正則表達式庫。

  openssl-devel:為Nginx提供SSL(安全套接字層)密碼庫,包含主要的密碼演算法,常用的密鑰和證書封裝管理功能及SSL協議,並提供豐富的應用程式供測試或其他目的使用。

  在安裝之前需要注意,很多庫具有devel庫與非devel庫兩種。devel庫表示development開發庫,比非devel庫會多出一些頭文件、靜態庫、源碼包等。而這些包在運行時不可能用到,但在開發時有可能用到。所以對於程式設計師來說,一般都是需要安裝devel庫的。不過在yum安裝devel庫時,由於其依賴於非devel庫,所以其會先自動安裝非devel庫,而後再安裝devel庫。所以真正安裝時,只需顯示的安裝devel庫即可。

 yum -y install pcre-devel openssl-devel

解壓Nginx包

tar -zxvf nginx-1.16.1.tar.gz -C /opt/apps

進入剛才解壓後的目錄

查看幫助(可忽略)

./configure --help

安裝模組

此時Nginx解壓路徑下會多出一個:Makefile

系統配置資訊

  • path prefix:Nginx安裝目錄
  • binary file:Nginx命令文件
  • modules path:Nginx模組存放路徑
  • configuration prefix:Nginx配置文件存放路徑
  • configuration file:Nginx配置文件名
  • pid file:Nginx的進程id文件
  • error log file:錯誤日誌文件
  • http access log file:http訪問日誌文件
  • http xxx:其他http請求相關的文件

  配置成功後,再次查看Nginx解壓目錄,發現其中多出一個文件Makefile。後面的編譯就是依靠該文件進行的。

編譯安裝

  這是兩個命令,make:為編譯命令;make install:為安裝命令,可以分別執行。這裡使用&&將兩個命令連接執行,會在前面命令執行成功的前提下才會執行第二個命令。

編譯安裝完成後,會在/usr/local下出現nginx目錄

進入安裝目錄

設置任務目錄可以使用sbin(可忽略)

ln -n /usr/local/nginx/sbin/nginx /usr/local/sbin    格式:  ln -n 源路徑 目標路徑

註:軟鏈接建立完成後就可以在任意路徑下使用nginx命令

Nginx命令

  • 查看命令選項:nginx -h
  • 啟動命令:nginx -c file
  • 停止命令:nginx -s stop/quit
  • 平滑重啟命令:nginx -s reload
  • 測試配置文件命令:nginx -tq

nginx -t:測試配置文件是否正確,默認只測試默認的配置文件conf/nginx.conf

nginx -T:測試配置文件是否正確,並顯示配置文件內容

nginx -tq:在配置文件測試過程中,禁止顯示非錯誤資訊,即只顯示錯誤資訊

啟動nginx

  啟動後,並查看,發現有2個執行緒,一個master,一個worker

查看nginx埠號

nginx頁面訪問測試

註:linux需關閉防火牆!!!!

Nginx性能調優

查看nginx配置文件

nginx進程

  worker_processes,工作進程,用於指定Nginx的工作進程數量。該值應該設置為多少合適呢?其數值一般設置為cpu內核數量,或內核數量的整數倍。注意,現代的cpu一般都是多核,即一塊cpu中包含多個內核。

  若當前系統具有2塊cpu,而每塊cpu中包含2個內核,那麼worker_processes的值一般可以設置為4或8個。當然也可以為2個。

  不過需要注意,該值不僅僅取決於cpu內核數量,還與硬碟數量及負載均衡模式相關,在不確定時還可以指定其值為auto

worker_cpu_affinity的設置

  為了進一步提高系統性能,我們會將worker進程與具體的內核進行綁定。該綁定操作是通過worker_cpu_affinity屬性進行設置的。affinity,密切關係。

  不過,若指定worker_processes的值為auto,則無法設置worker_cpu_affinity。該設置是通過二進位進行的。每個內核使用一個二進位表示,0代表內核關閉;1代表內核開啟。也就是說,有幾個內核,就需要使用幾個二進位位。

  下面通過幾個例子來增進對worker_processes與worker_cpu_affinity的理解  

Nginx核心功能

請求定位

探究歡迎頁面顯示原因

訪問資源

查看nginx.conf配置

使用perl語言自定義一個網站

檢測語法格式是否正確

重啟nginx

訪問成功

  註:字打錯了,應該是“歡迎來到陳彥斌的Nginx!!”

靜態代理

  Nginx靜態代理,將所有的靜態資源,如:css、js、html、jpg等資源放到Nginx伺服器,而不存在應用伺服器Tomcat中,當客戶端發出的請求是對這些靜態資源的請求時,Nginx直接將這些靜態資源響應給客戶端,而無需提交給應用伺服器處理。這樣就降低了應用伺服器的壓力

  同時,Nginx對於靜態資源的處理較Tomcat,性能更高效率更高。所以,在實際生產環境下,會使用Nginx作為靜態代理伺服器,專門處理靜態資源的響應。

  Nginx對於靜態資源請求的攔截方式,可以通過靜態資源名稱的擴展名攔截,也可以通過靜態資源所在的目錄名稱攔截

創建目錄存放文件

往images目錄下存放一些圖片

編輯nginx.conf配置文件

擴展名攔截

擴展名攔截測試

目錄名攔截

負載均衡

   負載均衡,Load Balancing,就是將對請求的處理分攤多個操作單元上進行。這個均衡是指在大批量訪問前提下的一種基本均衡,並非是絕對的平均。

  對於Web工程中的負載均衡,就是將相同的Web應用部署多個不同的Web伺服器上,形成多個Web應用伺服器。當請求到來時,由負載均衡伺服器負責請求事先設定好的比例向Web應用伺服器進行分發,從而增加系統的整體吞吐量

總體規劃

  該機群包含一台Nginx伺服器,兩台Tomat伺服器。

  首先開發一個web工程,將其打包。然後,在克隆出兩台Tomcat主機,前面的web工程分別部署到這兩台Tomcat主機上。然後,在Nginx伺服器上設置對這兩台Tomcat主機的均在均衡。 

配置說明

  1. tomcat伺服器1:ip地址192.168.31.213
  2. tomcat伺服器2:ip地址192.168.31.214
  3. nginx伺服器:ip地址192.168.31.201

創建一個Web工程

項目結構圖

配置一台Tomcat主機

具體配置,請參考另一篇部落格:點我直達

複製並配置另一台Tomcat主機

   克隆上面配置好的Tomcat主機

配置Nginx主機

配置nginx.conf

  註:weight權重

平滑重啟nginx

項目的啟動與訪問

項目下載源碼

jsp項目  百度雲盤  鏈接:https://pan.baidu.com/s/18z5c93jM6S-qvoT2cUZi7g  密碼:u08i

動靜分離

簡介

  動靜分離,就是JSP、Servlet等態資源交由Tomcat其他Web伺服器處理CSS、js、image等靜態資源交由Nginx或其他Http伺服器處理,充分發揮各自的優勢減輕其他伺服器壓力,搭建更為高效的系統架構。

Nginx動靜分析的實現

  下面要搭建Nginx,環境中有三台Nginx主機一台用於完成負載均衡兩台Nginx用於存放前面項目中的靜態資源。另外,還包含前面的兩台Tomcat主機

複製並配置一台Nginx伺服器

  將原來安裝有Nginx的主機作為母機,克隆一台Nginx主機,用於存放靜態資源:css、js、image。

修改nginx.conf

存放靜態資源

複製並配置一台Nginx伺服器

  重複上面,複製的那台Nginx操作!!!

修改原始那台nginx配置文件(負載均衡,重要!!!)

  設置靜態資源負載均衡代理,兩台nginx的ip分別為:192.168.31.212、192.168.31.213

 

web工程

 

測試

由於圖片太大,截成2段了

linux搭建相關配置

伺服器配置資訊

  1 #user  nobody;    2 worker_processes  1;    3    4 #error_log  logs/error.log;    5 #error_log  logs/error.log  notice;    6 #error_log  logs/error.log  info;    7    8 #pid        logs/nginx.pid;    9   10   11 events {   12     worker_connections  1024;   13 }   14   15   16 http {   17     include       mime.types;   18     default_type  application/octet-stream;   19   20     #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '   21     #                  '$status $body_bytes_sent "$http_referer" '   22     #                  '"$http_user_agent" "$http_x_forwarded_for"';   23   24     #access_log  logs/access.log  main;   25   26     sendfile        on;   27     #tcp_nopush     on;   28   29     #keepalive_timeout  0;   30     keepalive_timeout  65;   31   32     #gzip  on;   33     # 配置上傳流,用於負載均衡   34     upstream tomcat.cyb.com{   35     server 192.168.31.214:8080 weight=1;   36         server 192.168.31.215:8080 weight=1;   37     }   38     upstream static.cyb.com{   39     server 192.168.31.212:80 weight=1;   40         server 192.168.31.213:80 weight=1;   41     }   42     server {   43         listen       80;   44         server_name  localhost;   45   46         #charset koi8-r;   47   48         #access_log  logs/host.access.log  main;   49   50         location / {   51            # root   html;   52            # index  index.html index.htm;   53             proxy_pass http://tomcat.cyb.com;   54         }   55         location ~.*.(jpg|jpeg|js|css|html)$ {   56             proxy_pass http://static.cyb.com;   57        }   58         #error_page  404              /404.html;   59   60         # redirect server error pages to the static page /50x.html   61         #   62         error_page   500 502 503 504  /50x.html;   63         location = /50x.html {   64             root   html;   65         }   66   67         # proxy the PHP scripts to Apache listening on 127.0.0.1:80   68         #   69         #location ~ .php$ {   70         #    proxy_pass   http://127.0.0.1;   71         #}   72   73         # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000   74         #   75         #location ~ .php$ {   76         #    root           html;   77         #    fastcgi_pass   127.0.0.1:9000;   78         #    fastcgi_index  index.php;   79         #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;   80         #    include        fastcgi_params;   81         #}   82   83         # deny access to .htaccess files, if Apache's document root   84         # concurs with nginx's one   85         #   86         #location ~ /.ht {   87         #    deny  all;   88         #}   89     }   90   91   92     # another virtual host using mix of IP-, name-, and port-based configuration   93     #   94     #server {   95     #    listen       8000;   96     #    listen       somename:8080;   97     #    server_name  somename  alias  another.alias;   98   99     #    location / {  100     #        root   html;  101     #        index  index.html index.htm;  102     #    }  103     #}  104  105  106     # HTTPS server  107     #  108     #server {  109     #    listen       443 ssl;  110     #    server_name  localhost;  111  112     #    ssl_certificate      cert.pem;  113     #    ssl_certificate_key  cert.key;  114  115     #    ssl_session_cache    shared:SSL:1m;  116     #    ssl_session_timeout  5m;  117  118     #    ssl_ciphers  HIGH:!aNULL:!MD5;  119     #    ssl_prefer_server_ciphers  on;  120  121     #    location / {  122     #        root   html;  123     #        index  index.html index.htm;  124     #    }  125     #}  126  127 }

nginx-1

  1 #user  nobody;    2 worker_processes  1;    3    4 #error_log  logs/error.log;    5 #error_log  logs/error.log  notice;    6 #error_log  logs/error.log  info;    7    8 #pid        logs/nginx.pid;    9   10   11 events {   12     worker_connections  1024;   13 }   14   15   16 http {   17     include       mime.types;   18     default_type  application/octet-stream;   19   20     #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '   21     #                  '$status $body_bytes_sent "$http_referer" '   22     #                  '"$http_user_agent" "$http_x_forwarded_for"';   23   24     #access_log  logs/access.log  main;   25   26     sendfile        on;   27     #tcp_nopush     on;   28   29     #keepalive_timeout  0;   30     keepalive_timeout  65;   31   32     #gzip  on;   33   34     server {   35         listen       80;   36         server_name  localhost;   37   38         #charset koi8-r;   39   40         #access_log  logs/host.access.log  main;   41   42        # location / {   43        #     root   html;   44        #     index  index.html index.htm;   45        # }   46         # 通過擴展名方式攔截   47     location ~.*.(jpg|jpeg|js|css|html)$ {   48         root /opt;   49     }   50   51         #error_page  404              /404.html;   52   53         # redirect server error pages to the static page /50x.html   54         #   55         error_page   500 502 503 504  /50x.html;   56         location = /50x.html {   57             root   html;   58         }   59   60         # proxy the PHP scripts to Apache listening on 127.0.0.1:80   61         #   62         #location ~ .php$ {   63         #    proxy_pass   http://127.0.0.1;   64         #}   65   66         # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000   67         #   68         #location ~ .php$ {   69         #    root           html;   70         #    fastcgi_pass   127.0.0.1:9000;   71         #    fastcgi_index  index.php;   72         #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;   73         #    include        fastcgi_params;   74         #}   75   76         # deny access to .htaccess files, if Apache's document root   77         # concurs with nginx's one   78         #   79         #location ~ /.ht {   80         #    deny  all;   81         #}   82     }   83   84   85     # another virtual host using mix of IP-, name-, and port-based configuration   86     #   87     #server {   88     #    listen       8000;   89     #    listen       somename:8080;   90     #    server_name  somename  alias  another.alias;   91   92     #    location / {   93     #        root   html;   94     #        index  index.html index.htm;   95     #    }   96     #}   97   98   99     # HTTPS server  100     #  101     #server {  102     #    listen       443 ssl;  103     #    server_name  localhost;  104  105     #    ssl_certificate      cert.pem;  106     #    ssl_certificate_key  cert.key;  107  108     #    ssl_session_cache    shared:SSL:1m;  109     #    ssl_session_timeout  5m;  110  111     #    ssl_ciphers  HIGH:!aNULL:!MD5;  112     #    ssl_prefer_server_ciphers  on;  113  114     #    location / {  115     #        root   html;  116     #        index  index.html index.htm;  117     #    }  118     #}  119  120 }

nginx-2

  1 #user  nobody;    2 worker_processes  1;    3    4 #error_log  logs/error.log;    5 #error_log  logs/error.log  notice;    6 #error_log  logs/error.log  info;    7    8 #pid        logs/nginx.pid;    9   10   11 events {   12     worker_connections  1024;   13 }   14   15   16 http {   17     include       mime.types;   18     default_type  application/octet-stream;   19   20     #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '   21     #                  '$status $body_bytes_sent "$http_referer" '   22     #                  '"$http_user_agent" "$http_x_forwarded_for"';   23   24     #access_log  logs/access.log  main;   25   26     sendfile        on;   27     #tcp_nopush     on;   28   29     #keepalive_timeout  0;   30     keepalive_timeout  65;   31   32     #gzip  on;   33   34     server {   35         listen       80;   36         server_name  localhost;   37   38         #charset koi8-r;   39   40         #access_log  logs/host.access.log  main;   41   42        # location / {   43        #     root   html;   44        #     index  index.html index.htm;   45        # }   46         # 通過擴展名方式攔截   47     location ~.*.(jpg|jpeg|js|css|html)$ {   48         root /opt;   49     }   50   51         #error_page  404              /404.html;   52   53         # redirect server error pages to the static page /50x.html   54         #   55         error_page   500 502 503 504  /50x.html;   56         location = /50x.html {   57             root   html;   58         }   59   60         # proxy the PHP scripts to Apache listening on 127.0.0.1:80   61         #   62         #location ~ .php$ {   63         #    proxy_pass   http://127.0.0.1;   64         #}   65   66         # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000   67         #   68         #location ~ .php$ {   69         #    root           html;   70         #    fastcgi_pass   127.0.0.1:9000;   71         #    fastcgi_index  index.php;   72         #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;   73         #    include        fastcgi_params;   74         #}   75   76         # deny access to .htaccess files, if Apache's document root   77         # concurs with nginx's one   78         #   79         #location ~ /.ht {   80         #    deny  all;   81         #}   82     }   83   84   85     # another virtual host using mix of IP-, name-, and port-based configuration   86     #   87     #server {   88     #    listen       8000;   89     #    listen       somename:8080;   90     #    server_name  somename  alias  another.alias;   91   92     #    location / {   93     #        root   html;   94     #        index  index.html index.htm;   95     #    }   96     #}   97   98   99     # HTTPS server  100     #  101     #server {  102     #    listen       443 ssl;  103     #    server_name  localhost;  104  105     #    ssl_certificate      cert.pem;  106     #    ssl_certificate_key  cert.key;  107  108     #    ssl_session_cache    shared:SSL:1m;  109     #    ssl_session_timeout  5m;  110  111     #    ssl_ciphers  HIGH:!aNULL:!MD5;  112     #    ssl_prefer_server_ciphers  on;  113  114     #    location / {  115     #        root   html;  116     #        index  index.html index.htm;  117     #    }  118     #}  119  120 }

nginx-3

虛擬主機

簡介

  虛擬主機,就是將一台物理伺服器虛擬為多個伺服器來使用,從而實現一台伺服器上配置多個站點,即可以在一台物理主機上配置多個域名。Nginx中,一個server標籤是一台虛擬主機,配置多個server標籤就虛擬出了多台主機。

  Nginx虛擬主機實現方式有兩種域名虛擬方式埠虛擬方式。域名虛擬方式是指不同的虛擬機使用不同的域名,通過不同的域名虛擬出不同的主機;埠虛擬方式是指不同的虛擬機使用相同的域名不同的埠號,通過不同的埠號虛擬出不同的主機。基於埠的虛擬方式不常用。。。

規劃

  現在很多生活服務類網路平台都具有這樣的功能:不同城市的用戶可以打開不同城市專屬的站點。用戶首先打開的是平台總的站點,然後允許用戶切換到不同的城市。其實,不同的城市都是一個不同的站點。

  這裡我們要實現的功能是為平台總站點、北京、上海兩個城市站點分別創建一個虛擬主機。每個虛擬主機都具有兩台Tomcat的負載均衡主機。由於有三個站點,所以共需六台Tomcat主機。

  首先要創建一個web工程,其中就一個index.jsp頁面,頁面除了顯示當前城市外,還要顯示城市切換的超鏈接。為了能夠明細的區分出當前訪問的Tomcat,在頁面中顯示出客戶端ip和伺服器ip。

規劃圖

註:字打錯了,北京應該是:bj.cyb.com

創建web工程

  直接複製前面的web工程,只需要一個jsp即可。

war包

總站

北京

上海 

 

項目源碼下載 

百度雲盤  鏈接:https://pan.baidu.com/s/14n1tluHohe5Il_9vi1w9SA  密碼:n2sc

修改本機hosts文件

  修改hosts文件,域名綁定ip(綁定的是nginx負載均衡的ip地址!!),不能直接修改hosts文件,需要複製出來後,修改完畢後,在覆蓋回去

mac方式

操作步驟:訪達->shift+command+G->/private/etc

windows方式

文件位置:C:WindowsSystem32Driversetc

修改hosts文件

 

集群

結構圖

 

nginx負載均衡nginx.conf

 

nginx.conf

#user  nobody;  worker_processes  1;    #error_log  logs/error.log;  #error_log  logs/error.log  notice;  #error_log  logs/error.log  info;    #pid        logs/nginx.pid;      events {      worker_connections  1024;  }      http {      include       mime.types;      default_type  application/octet-stream;      sendfile        on;        keepalive_timeout  65;        #gzip  on;       # 總站      upstream entry.com{             server 192.168.1.111:8080 weight=1;           server 192.168.1.112:8080 weight=1;       }       #北京      upstream bj.com{             server 192.168.1.113:8080 weight=1;           server 192.168.1.114:8080 weight=1;       }       #上海      upstream sh.com{             server 192.168.1.115:8080 weight=1;           server 192.168.1.116:8080 weight=1;       }      server{          listen       80;          server_name  www.entry.com;             # 負載均衡          location / {          proxy_pass http://entry.com;      }       }      server{          listen       80;          server_name  bj.entry.com;             # 負載均衡          location / {          proxy_pass http://bj.com;      }       }      server{          listen       80;          server_name  sh.entry.com;             # 負載均衡          location / {          proxy_pass http://sh.com;      }       }  }

測試(虛擬主機&負載均衡)

搞定!!!!