Nginx是一種高性能的HTTP和反向代理服務器,同時提供IMAP/POP3/SMTP服務。無代理不使用代理時,我們發送的請求直接發送給目標服務器。正向代理是客戶端設置的,將請求發送給代理服務器,再由代理服務器轉...
基本概念
1. Nginx介紹
Nginx是轉為性能優化而開發的,它是一個高性能的HTTP和反向代理web服務器,同時也提供了IMAP/POP3/SMTP服務,特點是占有內存少,并發處理能力強,以高性能低資源消耗而聞名,有大量網站都在使用Nginx
2. 無代理
不使用代理時,我們所發送的請求都是通過網絡直接傳達給目標服務器的
3. 正向代理
正向代理是由客戶端設置的,是指將請求發送給代理服務器,再由代理服務器轉發給目標服務器,舉個栗子:我們在玩游戲時,尤其是大型網絡游戲,都會選擇迅游或UU游戲加速器,其實開啟加速器就是在本地設置正向代理
4. 反向代理
反向代理是由目標服務器端設置的,指我們將請求發送給目標服務器時,請求會先到達代理服務器,再將其轉發給目標服務器,因為不是我們主動配置,這個過程我們是無從感知的,這種代理配置是最常見的功能之一,我們使用百度、京東、淘寶等,其實都有使用反向代理,只是我們不知道而已
4.1 負載均衡
負載均衡相關概念可以看一下此文章
Nginx提供了四種負載均衡策略,默認輪詢算法,除此之外還有第三方的策略:fair、url_hash
4.1.1 輪詢
假設有10個請求,負載均衡采用默認方式(即輪詢),請求結果會出現如下圖所示的情況,每個請求按時間順序逐一分配到不同的服務器,若服務器宕掉,會自動剔除
4.1.2 加權輪詢
假設有10個請求,負載均衡采用的是加權輪詢方式,請求結果會出現如下圖所示的情況,需要給每臺服務器配置權重,權重和訪問比率成正比,一般用于服務器性能不均的情況,權重越大越容易被訪問,權重數值只是代表機率,下圖示例中并非指訪問6次必定有3次請求是由②號服務器處理
4.1.3 least_conn
把請求轉發給連接數較少的服務器,輪詢策略把請求平均的轉發給各個服務器,使它們的負載大致相同,但是,有些請求占用的時間較長,會導致其所在的服務器負載較高,這種情況下,least_conn策略就可以達到更好的負載均衡效果,如下圖所示新請求會分給不太繁忙的服務器
4.1.4 ip_hash
假如有5個請求,負載均衡采用的是ip_hash方式,請求結果會出現如下圖所示的情況,每個請求按訪問IP的hash值進行分配,這樣每個訪客固定訪問一個服務器,可以解決Session不共享的問題,但是服務器重啟后,hash值會重新計算,不過這種策略已經很少用了,現在基本都是使用Redis做Session共享
4.1.5 fair(第三方)
fair策略是擴展策略,默認不被編譯進nginx內核,使用需先進行編譯安裝,它根據后端服務器的響應時間判斷負載情況,從中選出負載最輕的機器進行分流,這種策略具有很強的自適應性,但實際網絡環境往往沒那么簡單
4.1.6 url_hash(第三方)
和ip_hash策略相似,按訪問url的hash值進行分配,使每個url定向到同一個服務器,要配合緩存命中來使用,使用url_hash可以使同一個請求到達同一臺服務器,一旦緩存了資源,再此收到請求后就會直接從緩存中讀取
4.2 動靜分離
指動態請求跟靜態請求分開,可以理解成使用 Nginx處理靜態頁面,Tomcat 處理動態頁面。動靜分離大致分為兩種,一種是完全把靜態文件獨立成單獨的域名放在獨立的服務器上;另一種是動態跟靜態文件混在一起發布,通過Nginx進行拆分。可以通過location指定不同的后綴名實現不同的請求轉發。通過expires參數設置,可以使瀏覽器緩存過期時間,減少與服務器之前的請求和流量,加快網頁解析速度
4.3 高可用(HA)集群
高可用HA(High Availability)是分布式系統架構設計中必須考慮的因素之一,指通過設計減少系統的停工時間。為防止Nginx失效,需要建立一個備用Nginx,主Nginx和備用Nginx上都要運行HA監控程序,通過傳送諸如“I am alive”的信息來監控對方的運行狀況,當備用Nginx不能在一定的時間內收到這樣的信息時,它就接管主Nginx的服務IP并繼續提供服務;當備用Nginx又從主Nginx收到“I am alive”的信息時,它就釋放服務IP地址,由主Nginx接管工作并繼續提供服務
Nginx安裝
1. 安裝編譯工具及庫文件
dnf install make gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel -y
Nginx安裝需要進行編譯,編譯依賴gcc環境
Nginx的http模塊使用pcre來解析正則表達式,pcre-devel是pcre的一個二次開發庫
Nginx使用zlib對http包的內容進行gzip
Nginx支持http,也支持https(即在SSL協議上傳輸http),openssl包括SSL協議庫、應用程序以及密碼算法庫
2.安裝Nginx
Nginx下載地址:點擊進入下載頁(http://nginx.org/en/download.html),選擇所需版本
2.1 下載安裝包
wget http://nginx.org/download/nginx-1.18.0.tar.gz
2.2 解壓
tar -zxvf nginx-1.18.0.tar.gz
2.3 配置
# 先切到nginx-1.18.0目錄下
cd nginx-1.18.0
# 在Nginx根目錄下執行以下命令
./configure
make
make install
2.4 啟動Nginx
先查看Nginx安裝路徑,在sbin目錄下啟動Nginx
# 查看路徑
whereis nginx
# 進入Nginx安裝目錄下的sbin目錄
cd /usr/local/nginx/sbin
# 啟動Nginx
./nginx
Nginx啟動后無任何反饋,通過瀏覽器訪問IP:80,進行驗證
Nginx常用命令
# 在sbin目錄下執行,或者在命令前加上路徑
cd /usr/local/nginx/sbin
# 啟動
./nginx
# 查看配置文件是否正確
./nginx -t
# 重新加載配置文件
./nginx -s reload
# 查看nginx進程
ps aux|grep nginx
# 安全退出
./nginx -s quit
# 停止Nginx
./nginx -s stop
當執行命令出現如下報錯,
nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
首先判斷Nginx是否已啟動,ps -ef | grep nginx查看進程,若是Nginx未啟動,啟動后通常會恢復正常;若問題依然存在,則使用nginx -c參數指定nginx.conf文件的位置,執行以下命名即可解決
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
Nginx配置文件說明
配置文件是在conf目錄下nginx.conf文件
舉例:在三臺服務器上分別啟動一個項目
訪問三個項目如下
在192.166.66.21上安裝并運行Nginx
Nginx的配置文件核心區域
# 全局配置 # 作用域是全局
events # Nginx工作事件配置
http # HTTP配置
upstream # 負載均衡服務配置
server # 主機配置
location # URL匹配
全局配置:Nginx服務器整體運行的配置
主要包括配置運行Nginx服務器的用戶(組)、worker process數,進程PID及日志存放路徑,還有類型以及配置文件的引入等
events:Nginx服務器與用戶的網絡連接
主要包括是否開啟對多work process下的網絡連接進行序列化,是否允許同時接收多個網絡連接,選取哪種事件驅動模型來處理連接請求,每個 word process可以同時支持的最大連接數等
http:主要包括代理、緩存和日志定義等大部分功能以及第三方模塊的配置
upstream:負責均衡策略、服務器地址及權重配置等
server:配置虛擬主機的相關參數,一個http中可以有多個server
location:配置請求的路由,對特定的請求進行配置
編輯 /usr/local/nginx/conf/nginx.conf文件
1. 負載均衡配置
1.1 輪詢&加權輪詢
在http配置中添加如下配置
# upstream是配置負載均衡的,名稱是自定義的,server是指服務地址
# weight是指權重,默認輪詢策略的值是相同的,讓weight值出現差異就是在配置加權輪詢
upstream dyd{
server 192.166.66.21:8080 weight=1;
server 192.166.66.22:8081 weight=6;
server 192.166.66.23:8082 weight=3;
}
# 修改server配置,添加proxy_pass地址,地址是負載均衡名稱
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
proxy_pass http://dyd;
}
}
# 因為是三臺服務,需要新增兩個server,如果三臺服務器的名稱不一樣,則需要修改server_name
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
proxy_pass http://dyd;
}
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
proxy_pass http://dyd;
}
}
配置完成后,保存退出,重新加載配置./nginx -s reload
最后我們只訪問192.166.66.21,便可訪問到另外兩個項目,每次刷新頁面,根據權重不同Nginx會輪詢訪問三個項目。這就是我們每次發出請求,Nginx根據權重去訪問了不同的服務而得到的結果
# 若服務器名稱相同,重新加載配置文件時會出現如下警告,這個不影響項目運行,可以忽略,或者修改hostname
[root@localhost sbin]# ./nginx -s reload
nginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignored
nginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignored
1.2least_conn
# least_conn策略配置
upstream dyd{
least_conn;
server 192.166.66.21:8080;
server 192.166.66.22:8081;
}
least_conn策略可以實現在某些請求耗時較長才能完成的情況下,更公平地控制應用程序實例上的負載
1.3 ip_hash
# ip_hash策略配置
upstream dyd{
ip_hash;
server 192.166.66.22:8081;
server 192.166.66.23:8082;
}
配置后只能訪問到一個項目,因為一旦有服務接收到并處理了請求后,之后所有的請求都將由它負責,不會再分給其它服務器,除非或服務重啟
1.4 fair
# fair策略配置
upstream dyd{
fair;
server 192.166.66.22:8081;
server 192.166.66.23:8082;
}
按照服務器端的響應時間來分配請求,根據服務器的響應時間判斷負載情況,從中選出負載最輕的機器進行分流
1.5 url_hash
# url_hash策略配置
upstream dyd{
hash $request_URL;
server 192.166.66.22:8081;
server 192.166.66.23:8082;
}
同ip_hash相似,按訪問url的hash值進行分配,使每個url定向到同一個服務器,需配合緩存命中來使用,url_hash配置后只能一臺服務器,因為一旦在服務器中緩存了資源,再此收到來自此URL的請求后就會直接從緩存中讀取
2. 動靜分離
在系統中創建兩個目錄,路徑及名稱請自定義,如下圖,在根目錄創建test目錄,并在test目錄下分別創建images、dynamic目錄,在images中放置幾張圖片,在dynamic目錄中放置一個html文件
Nginx配置文件/usr/local/nginx/conf/nginx.conf修改為如下信息,請根據自建文件目錄做適當修改
#配置主機端口及地址,server_name可以是主機名也可以是IP地址
server{
listen 80;
server_name localhost;
# 配置靜態文件請求路徑
location /images/ {
root /test/;
index index.html index.htm;
# 設置目錄瀏覽
autoindex on;
}
# 配置動態文件請求路徑
location /dynamic/ {
root /test/;
index index.html index.htm;
}
配置Nginx文件后會啟動Nginx,通過瀏覽器訪問靜態文件,如下圖,可以成功訪問到
通過瀏覽器訪問html文件,如下圖也可以成功訪問到
3. 高可用(HA)集群
高可用集群解決的是保障應用程序持續對外提供服務的能力,高可用集群并不是保護用戶的業務數據,而是保護用戶的業務程序對外不間斷提供服務的能力,使用高可用集群的目的是把因軟件、硬件、人為因素等造成的故障對業務的影響降低到最低程度
3.1 準備工作
準備兩臺服務器
兩臺服務器都需要安裝上Nginx
兩臺服務器都要安裝Keepalived,安裝命令dnf install keepalived -y
安裝keepalived后會在/etc/keepalived目錄下生成一個配置keepalived.conf
在兩個服務器上個啟動一個項目
配置負載均衡,方法就不再具體介紹了,根據上文介紹稍作修改即可,兩個服務器都需要配置
upstream dyd{
server 192.166.66.21:8080;
server 192.166.66.22:8081;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
proxy_pass http://dyd;
}
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
proxy_pass http://dyd;
}
}
配置完成使用瀏覽器進行驗證,直接通過192.166.66.21和192.166.66.22都應該能夠訪問到兩個項目,每次刷新頁面項目會變更
3.2 配置keepalived
配置keepalived.conf文件,修改為以下內容
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
# 當前服務IP地址
smtp_server 192.166.66.21
smtp_connect_timeout 30
# 需要在/etc/hosts中添加本地解析127.0.0.1 duan
router_id duan
}
vrrp_script chk_http_port {
# 腳本路徑
scrip "/usr/local/src/nginx_check.sh"
# 檢查腳本執行間隔時間(s)和權重
interval 2
weight 2
}
vrrp_instance VI_1 {
# 備用服務器上需要將MASTER改為BACKUP
state MASTER
# 網卡名
interface ens33
# 主、備服務器的virtual_router_id必須相同
virtual_router_id 51
# 主、備服務器要有不同的優先級,主服務器的值應該大于備用服務器的值
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
# VIP(即虛擬IP地址),需要與當前網絡的網段保持一致
192.166.66.100
}
}
主、備服務器的腳本內容如下,腳本信息是負責監控主、備服務器是否正常,以便及時切換服務
#! /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 --noheader | WC -l` -eq 0 ];then
killall keepalived
fi
fi
腳本文件配置后,依次啟動nginx和keepalived,兩臺服務都要啟動
# 啟動nginx
cd /usr/local/nginx/sbin
./nginx
# 啟動keepalived
systemctl start keepalived
驗證
啟動主、備服務器后通過192.166.66.21、192.166.66.22以及192.166.66.100應該都能訪問到項目,即使任一服務器上的Nginx和keepalived停止運行了,通過VIP地址192.166.66.100始終都可以訪問到項目
當項目在主服務器192.166.66.21上啟動后ip中會出現虛擬IP地址,下圖是主服務器192.168.66.21上的IP信息
當把主服務器192.166.66.21上的Nginx和keepalived停止后虛擬IP會消失,下圖是主服務器192.168.66.21上的IP信息
查看備用服務器192.166.66.22上出現了虛擬IP,這是因為已成功切換為備用服務器,當啟動主服務器上的Nginx和keepalived后IP又會從備用服務器192.166.66.22上消失,在主服務器上顯示,下圖是備用服務器192.168.66.22上的IP信息
如果有些迷糊,實操一遍肯定就會理解啦!
總之,任一Nginx停止運行,另外一個都會自動接管虛擬IP地址(VIP),所以不管哪臺服務器上的Nginx停止運行,我們都可以通過虛擬IP(VIP)訪問到項目
來源:https://mp.weixin.qq.com/s/SLa1MQ5KxTNul5AuGJUNeQ
來源:本文內容搜集或轉自各大網絡平臺,并已注明來源、出處,如果轉載侵犯您的版權或非授權發布,請聯系小編,我們會及時審核處理。
聲明:江蘇教育黃頁對文中觀點保持中立,對所包含內容的準確性、可靠性或者完整性不提供任何明示或暗示的保證,不對文章觀點負責,僅作分享之用,文章版權及插圖屬于原作者。
Copyright?2013-2024 JSedu114 All Rights Reserved. 江蘇教育信息綜合發布查詢平臺保留所有權利
蘇公網安備32010402000125
蘇ICP備14051488號-3技術支持:南京博盛藍睿網絡科技有限公司
南京思必達教育科技有限公司版權所有 百度統計