Nginx — 配置實例(反向代理實例、負載均衡實例、動靜分離實例、高可用實例)


歡迎訪問筆者個人技術博客:http://rukihuang.xyz/

五、Nginx的配置實例1——反向代理1

5.1 實現效果

  • 打開瀏覽器,在瀏覽器地址欄中輸入地址www.123.com,跳轉到Linux系統tomcat主頁面中

5.2 準備工作

  1. 在linux系統中安裝tomcat,使用默認端口8080
    1. 將tomcat壓縮包放到linux系統的/usr/src文件夾中,並tar -zxvf apache-tomcat-7.0.70.tar.gz
    2. 進入解壓後的文件夾的bin目錄中,./startup.sh啓動服務器
  2. 對外開放訪問的端口(centos7)
    1. firewall-cmd --add-port=8080/tcp --permanent
    2. firewall-cmd -reload
  3. 在windows系統中通過瀏覽器訪問tomcat服務器

5.2.1 問題解決

  • 使用命令./startup.sh開啓tomcat服務後,進入tomcat文件夾下的logs文件夾,使用命令tail -f catalina.out,出現如下錯誤信息

  • 錯誤原因是JAVA_HOME環境變量設置錯誤,需要調整正確
    • 解決:
      • 輸入命令:vim /etc/profile
      • JAVA_HOME修改爲正確路徑
      • 輸入命令:source /etc/profile使修改立即生效!!(這步別忘!)

在這裏插入圖片描述

在這裏插入圖片描述

  • 解決鏈接: https://blog.csdn.net/zhouhaisunny/article/details/78029094

5.3 反向代理過程分析

在這裏插入圖片描述

5.4 具體配置(nginx.conf)

5.4.1 配置域名ip關係映射

  • 在windows系統的host文件進行域名和ip對應關係的配置
  1. C:\Windows\System32\drivers\etc該路徑下找到HOSTS文件

在這裏插入圖片描述

  1. 用文本編輯共計,將修改信息寫入

在這裏插入圖片描述

5.4.2 請求轉發配置(反向代理配置)

  • 在nginx進行請求轉發的配置(反向代理配置)
  1. 修改nginx配置文件,路徑爲:/usr/local/nginx/conf/nginx.conf

  2. 在全局server塊中修改server_name爲linux主機IP10.66.120.37

  3. 修改location塊,加入

    proxy_pass http://127.0.0.1:8080
    

在這裏插入圖片描述

  1. 進入/usr/local/nginx/sbin,輸入命令./nginx開啓

5.4.3 測試

  • 在瀏覽器中輸入www.123.com進行測試

五、Nginx配置實例2——反向代理2

5.1 實現效果

  • 使用nginx反向代理,根據訪問的路徑跳轉到不同端口的服務中。nginx監聽端口爲9001
  • 訪問http://127.0.0.1:9001/edu/,直接跳轉到127.0.0.1:8080
  • 訪問http://127.0.0.1:9001/vod/,直接跳轉到127.0.0.1:8081

5.2 準備工作

5.2.1 準備兩個tomcat

  1. 準備兩個tomcat,在/usr.src目錄下新建兩個文件夾,分別拖入tomcat壓縮包

在這裏插入圖片描述

  1. 進入8080文件夾,不用改端口,解壓後直接進入apache/bin/startup.sh啓動
  2. 進入8081文件夾,解壓後進入conf文件夾,修改vim server.xml文件,修改端口爲8081,其他默認的端口也需要修改,詳見下圖

在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

  1. 開啓8081的tomcat,此時,已經開啓端口分別爲8080和8081的兩個服務器

在這裏插入圖片描述
在這裏插入圖片描述

5.2.2 創建文件夾和測試頁面

  1. 創建測試頁面a.html

在這裏插入圖片描述

  1. 在8080服務器的webapp目錄下,創建edu目錄,將a.html拖入

在這裏插入圖片描述

  1. 測試

在這裏插入圖片描述

  1. 同上面步驟,在8081服務器的webapp目錄下,創建vod目錄,將a.html拖入,內容改爲<h1>8081</h1>

在這裏插入圖片描述

在這裏插入圖片描述

5.3 具體配置(nginx.conf)

  1. 進入/usr/local/nginx/conf/,修改該目錄下的nginx.conf文件
  2. 補充一下代碼

在這裏插入圖片描述

  1. 開放8080、8081、9001的端口(我這裏是centos6,圖方便,將防火牆全部關閉了service iptables stop

  2. 啓動nginx,進入/usr/local/nginx/sbin,然後直接./nginx啓動

在這裏插入圖片描述

  1. 測試

在這裏插入圖片描述

在這裏插入圖片描述

5.4 location塊的詳解

  1. =:用於不含正則表達式的uri前,要求請求字符串與uri嚴格匹配,如果匹配成功,就停止繼續向下搜索並立即處理該請求。
  2. ~:用於標識uri包含正則表達式,並且區分大小寫
  3. ~*:用於標識uri包含正則表達式,並且不區分大小寫
  4. ^~:用於不含正則表達式的uri前,要求nginx服務器找到標識uri和請求字符串匹配度最高的location後,立即使用此location處理請求,而不再使用location塊中的正則uri和請求字符串做匹配。
  5. 注意:如果uri包含正則表達式,則必須要有~或者~*標識。

六、Nginx的配置實例——負載均衡

  • 負載均衡:增加服務器的數量,然後將請求分發到各個服務器上,將原先請求集中在單個服務器上的情況改爲請求分發到多個服務器上,將負載分發到不同的服務器,也就是所謂的負載均衡。

6.1 實現效果

  • 瀏覽器中輸入地址http://10.66.93.167/edu/a.html,實現負載均衡效果,將請求平均分配到8080和8081端口中

6.2 準備工作

  1. 準備兩個tomcat服務器(反向代理案例2中已完成)
  2. 在兩個tomcat中的webapps目錄中,創建名稱是edu的文件夾,在該文件夾中創建頁面a.html,用於測試

6.3 具體配置(nginx.conf)

  1. 進入/usr/local/nginx/conf/,修改該目錄下的nginx.conf文件

  2. 具體修改如下:

在這裏插入圖片描述

在這裏插入圖片描述

  1. 重啓nginx.conf:進入nginx/sbin目錄下,執行./nginx - s reload命令。

  2. 用火狐瀏覽器測試成功,用谷歌瀏覽器可能因爲緩存的原因沒有成功

6.4 nginx常用分配方式

6.4.1 輪詢(默認)

  • 每個請求按時間順序逐一分配到不同的後端服務器,如果後端服務器down了,會自動剔除該服務器。
upstream myserver{
	server 10.66.93.167:8080;
	server 10.66.93.167:8081;
}

6.4.2 weight

  • weight代表權重,默認爲1,權重越高被分配的客戶端請求越多。指定輪詢機率,weight和訪問比率成正比,用於後端服務器性能不均的情況。
upstream myserver{
	server 10.66.93.167:8080 weight=10;
	server 10.66.93.167:8081 weight=10;
}

6.4.3 ip_hash

  • 每個請求按訪問ip的hash結果分配,這樣每個方可固定訪問一個後端服務器,可以解決session問題。
upstream myserver{
	ip_hash;
	server 10.66.93.167:8080;
	server 10.66.93.167:8081;
}

6.4.4 fair(第三方)

  • 按後端服務器的響應時間分配請求,響應時間短的優先分配。
upstream myserver{
	server 10.66.93.167:8080;
	server 10.66.93.167:8081;
	fair;
}

七、Nginx的配置實例——動靜分離

7.1 什麼是動靜分離

  • nginx動靜分離簡單來說就是把動態請求和靜態請求分離開,不能理解成只是單純的把動態頁面和靜態頁面物理分離。可以理解成使用nginx處理靜態頁面,tomcat處理動態頁面。
  • 動靜分離從目前的實現角度大致分爲兩種:
    • 純粹把靜態文件獨立成單獨的域名,放在獨立的服務器上,也是目前主流推崇的方案。
    • 動態和靜態文件混合在一起發佈,通過nginx來分開。
  • 通過location指定不同的後綴名實現不同的請求轉發。通過expire參數設置,可以使瀏覽器緩存過期時間,減少與服務器之間的請求和流量。
  • 具體expire定義:是給一個資源設定一個過期時間,也就是說無需去服務端驗證,直接通過瀏覽器自身確認是否過期即可,所有不會產生額外的流量。這種方法非常適合不經常變動的資源,經常更新的文件不建議使用expire來緩存。
    • 舉例:若將expire設定爲3d,表示這三天內訪問這個url,發送一個訪問請求,比對服務器該文件最後更新時間沒有變化,則不會從服務器抓取,返回狀態碼304;如果有修改,直接從服務器重新下載,返回狀態碼200

在這裏插入圖片描述

7.2 準備工作

  • /根目錄下創建data文件夾,在其中創建wwwimage文件夾

在這裏插入圖片描述

7.3 具體配置(nginx.conf)

  1. 進入/usr/local/nginx/conf/,修改該目錄下的nginx.conf文件
  2. 具體修改如下:
    1. autoindex on:列出文件目錄

在這裏插入圖片描述

  1. 重啓nginx.conf:進入nginx/sbin目錄下,執行./nginx - s reload命令。

  2. 測試:輸入地址http://10.66.93.167/image/01.jpghttp://10.66.93.167/www/a.html

在這裏插入圖片描述

在這裏插入圖片描述

七、Nginx的配置實例——高可用

7.1 什麼是高可用

  • 簡單理解高可用,就是nginx掛了,但是還能訪問,並提供服務

在這裏插入圖片描述

  • 需要兩臺nginx服務器
  • 需要keepalived
  • 需要綁定虛擬ip

7.2 配置高可用的準備工作

  1. 需要兩臺虛擬機

  2. 在兩臺服務器上都安裝nginx

  3. 在兩臺服務器上都安裝keepalived:yum install keepalived -y

    1. rpm -q -a keepalived:查詢安裝情況
    2. 安裝完成後,會在/etc裏面生成目錄keepalived,有文件keepalived.conf
  4. 完成高可用配置(主從配置)

    1. 修改/etc/keepalived/keepalived.conf

      global_defs{
      	notification_email{
      		[email protected]
      		[email protected]
      		[email protected]
      	}
      	
      	notification_email_from [email protected]
      	smtp_server 10.66.93.167
      	smtp_connect_timeout 30
      	router_id LVS_DEVEL
      }
      
      vrrp_script chk_http_port{
      	script "/usr/local/src/nginx_check.sh"
      	interval 2  #(檢測腳本執行的間隔)
      	weight 2
      }
      
      vrrp_instance VI_1{
      	state BACKUP	#備份服務器上將MASTER改爲BACKUP
      	interface ens33	#網卡名 ifconfig查看
      	virtual_router_id 51	#主、備機的virtual_router_id必需相同
      	priority 90		#主、備機取不同的優先級,主機值較大,備份機值較小
      	advert_int 1
      	
      	authentication{
      		auth_type PASS
      		auth_pass 1111
      	}
      	
      	virtual_ipaddress{
      		10.66.93.50 #VRRP H虛擬地址
      	}
      }
      
    2. /usr/local/src添加檢測腳本

      #!/bin/bash
      A=`ps -C nginx -no-header | wc-l`
      if [ $A -eq 0 ];then
      	/usr/local/nginx/sbin/nginx
      	sleep 2
      	if [ `ps -C nginx -no-header | wc -l` -eq 0 ];then
      		killall keepalived
      	fi
      fi
      
    3. 把兩臺服務器上的Nginx和keepalived啓動

      1. 啓動nginx:./nginx
      2. 啓動keepalived:systemctl start keepalived.service
  5. 最終測試:

    1. 在地址欄中輸入虛擬ip地址 10.66.93.50
    2. 把主服務器的nginx和keepalived停止,再次輸入虛擬地址

7.3 高可用配置文件詳解

7.3.1 全局塊(global_defs)

global_defs{
	notification_email{
		[email protected]
		[email protected]
		[email protected]
	}
	
	notification_email_from [email protected]
	smtp_server 10.66.93.167
	smtp_connect_timeout 30
	router_id LVS_DEVEL #訪問到主機,這個在/etc/host中進行修改
}

7.3.2 腳本塊(vrrp_script chk_http_port)

vrrp_script chk_http_port{
	script "/usr/local/src/nginx_check.sh" #執行該目錄下的腳本
	interval 2  #(檢測腳本執行的間隔爲2s)
	weight 2	#權重
}

7.3.3 虛擬ip(vrrp_instance VI_1)

vrrp_instance VI_1{
	state MASTER	#備份服務器上將MASTER改爲BACKUP
	interface ens33	#網卡名 ifconfig查看
	virtual_router_id 51	#主、備機的virtual_router_id必需相同
	priority 100		#主、備機取不同的優先級,主機值較大,備份機值較小
	advert_int 1		#每隔1s檢測服務器是否還活着
	
	authentication{
		auth_type PASS
		auth_pass 1111
	}
	
	virtual_ipaddress{
		10.66.93.50 #VRRP H虛擬地址
	}
}

7.3.4 腳本詳解(nginx_check.sh)

#!/bin/bash
A=`ps -C nginx -no-header | wc-l`
if [ $A -eq 0 ];then
	/usr/local/nginx/sbin/nginx
	sleep 2
	if [ `ps -C nginx -no-header | wc -l` -eq 0 ];then
		killall keepalived
	fi
fi

八、Nginx的原理

8.1 master&worker

在這裏插入圖片描述

在這裏插入圖片描述

  • master相當於小老闆,將大老闆管理員派下來的活分散給各個工人worker

8.2 worker是如何工作的

在這裏插入圖片描述

8.3 1個master和n個worker的好處

  • 可以使用nginx -s reload熱部署,利用nginx進行熱部署操作
  • 每隔worker是獨立的進程,如果有其中的一個worker出現問題,其他worker獨立的,繼續進行爭搶,實現請求過程,不會造成服務中斷。
  • 首先,對於每個worker進程來說,獨立的進程,不需要加鎖,所以聲嗲了鎖帶來的開銷,同時在編程以及問題查找時,也會方便很多。
  • 其次,採用獨立的進程,可以讓互相之間不會影響,一個進程退出後,其他進程還在工作,服務不會中斷,master進程則很快啓動的新的worker進程。
  • worker進程的異常退出,會導致當前worker上的所有請求失敗,但不會影響到所有請求,降低了風險。

8.4 設置多少個worker合適

  • worker數量和服務器的cpu數相等時最好的。
  • nginx和redis類似都採用了io多路複用機制,每個worker都是一個獨立的進程,但每個進程裏只有一個主線程,通過異步非阻塞的方式處理請求,即使是成千上萬個請求也沒問題。每個worker的線程可以把一個cpu的性能發揮到極致。所以worker數量和服務器的cpu數相等時最好的,少了浪費,多了增加損耗。

8.5 連接數worker_connection

8.5.1 發送一個請求,佔用了worker的幾個連接數

  • 2或4個

8.5.2 nginx有一個master,有4個worker,每個worker支持的最大連接數是1024,支持的最大併發數是多少?

  • 普通的靜態訪問最大併發數是:worker_connections*worker_processes/2
  • 如果是http作爲反向代理來說,最大併發數量是

worker_connections*worker_processes/4

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章