文章目錄
歡迎訪問筆者個人技術博客:http://rukihuang.xyz/
五、Nginx的配置實例1——反向代理1
5.1 實現效果
- 打開瀏覽器,在瀏覽器地址欄中輸入地址www.123.com,跳轉到Linux系統tomcat主頁面中
5.2 準備工作
- 在linux系統中安裝tomcat,使用默認端口8080
- 將tomcat壓縮包放到linux系統的
/usr/src
文件夾中,並tar -zxvf apache-tomcat-7.0.70.tar.gz
- 進入解壓後的文件夾的
bin
目錄中,./startup.sh
啓動服務器
- 將tomcat壓縮包放到linux系統的
- 對外開放訪問的端口(centos7)
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd -reload
- 在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對應關係的配置
C:\Windows\System32\drivers\etc
該路徑下找到HOSTS文件
- 用文本編輯共計,將修改信息寫入
5.4.2 請求轉發配置(反向代理配置)
- 在nginx進行請求轉發的配置(反向代理配置)
-
修改nginx配置文件,路徑爲:
/usr/local/nginx/conf/nginx.conf
-
在全局server塊中修改
server_name
爲linux主機IP10.66.120.37
-
修改location塊,加入
proxy_pass http://127.0.0.1:8080
- 進入
/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
- 準備兩個tomcat,在
/usr.src
目錄下新建兩個文件夾,分別拖入tomcat壓縮包
- 進入8080文件夾,不用改端口,解壓後直接進入
apache/bin/startup.sh
啓動 - 進入8081文件夾,解壓後進入
conf
文件夾,修改vim server.xml
文件,修改端口爲8081,其他默認的端口也需要修改,詳見下圖
- 開啓8081的tomcat,此時,已經開啓端口分別爲8080和8081的兩個服務器
5.2.2 創建文件夾和測試頁面
- 創建測試頁面a.html
- 在8080服務器的webapp目錄下,創建edu目錄,將a.html拖入
- 測試
- 同上面步驟,在8081服務器的webapp目錄下,創建vod目錄,將a.html拖入,內容改爲
<h1>8081</h1>
5.3 具體配置(nginx.conf)
- 進入
/usr/local/nginx/conf/
,修改該目錄下的nginx.conf
文件 - 補充一下代碼
-
開放8080、8081、9001的端口(我這裏是centos6,圖方便,將防火牆全部關閉了
service iptables stop
) -
啓動nginx,進入
/usr/local/nginx/sbin
,然後直接./nginx
啓動
- 測試
5.4 location塊的詳解
=
:用於不含正則表達式的uri
前,要求請求字符串與uri
嚴格匹配,如果匹配成功,就停止繼續向下搜索並立即處理該請求。~
:用於標識uri
包含正則表達式,並且區分大小寫~*
:用於標識uri
包含正則表達式,並且不區分大小寫^~
:用於不含正則表達式的uri
前,要求nginx服務器找到標識uri
和請求字符串匹配度最高的location
後,立即使用此location
處理請求,而不再使用location
塊中的正則uri
和請求字符串做匹配。- 注意:如果
uri
包含正則表達式,則必須要有~
或者~*
標識。
六、Nginx的配置實例——負載均衡
- 負載均衡:增加服務器的數量,然後將請求分發到各個服務器上,將原先請求集中在單個服務器上的情況改爲請求分發到多個服務器上,將負載分發到不同的服務器,也就是所謂的負載均衡。
6.1 實現效果
- 瀏覽器中輸入地址
http://10.66.93.167/edu/a.html
,實現負載均衡效果,將請求平均分配到8080和8081端口中
6.2 準備工作
- 準備兩個tomcat服務器(反向代理案例2中已完成)
- 在兩個tomcat中的webapps目錄中,創建名稱是edu的文件夾,在該文件夾中創建頁面a.html,用於測試
6.3 具體配置(nginx.conf)
-
進入
/usr/local/nginx/conf/
,修改該目錄下的nginx.conf
文件 -
具體修改如下:
-
重啓
nginx.conf
:進入nginx/sbin
目錄下,執行./nginx - s reload
命令。 -
用火狐瀏覽器測試成功,用谷歌瀏覽器可能因爲緩存的原因沒有成功
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
文件夾,在其中創建www
和image
文件夾
7.3 具體配置(nginx.conf)
- 進入
/usr/local/nginx/conf/
,修改該目錄下的nginx.conf
文件 - 具體修改如下:
autoindex on
:列出文件目錄
-
重啓
nginx.conf
:進入nginx/sbin
目錄下,執行./nginx - s reload
命令。 -
測試:輸入地址
http://10.66.93.167/image/01.jpg
和http://10.66.93.167/www/a.html
七、Nginx的配置實例——高可用
7.1 什麼是高可用
- 簡單理解高可用,就是nginx掛了,但是還能訪問,並提供服務
- 需要兩臺nginx服務器
- 需要keepalived
- 需要綁定虛擬ip
7.2 配置高可用的準備工作
-
需要兩臺虛擬機
-
在兩臺服務器上都安裝nginx
-
在兩臺服務器上都安裝keepalived:
yum install keepalived -y
rpm -q -a keepalived
:查詢安裝情況- 安裝完成後,會在
/etc
裏面生成目錄keepalived
,有文件keepalived.conf
-
完成高可用配置(主從配置)
-
修改
/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虛擬地址 } }
-
在
/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
-
把兩臺服務器上的Nginx和keepalived啓動
- 啓動nginx:
./nginx
- 啓動keepalived:
systemctl start keepalived.service
- 啓動nginx:
-
-
最終測試:
- 在地址欄中輸入虛擬ip地址 10.66.93.50
- 把主服務器的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