Nginx 負載均衡和反向代理設(shè)置

本文介紹一些負載均衡和反向代理的一些基本概念,然后介紹如何基于nginx實現(xiàn)澄暮,包括兩種安裝nginx的方法:yum安裝和源碼安裝月帝,
以及ngix該如何配置等搅荞。

什么是負載均衡红氯?

概念

負載均衡是高可用網(wǎng)絡(luò)基礎(chǔ)架構(gòu)的關(guān)鍵組件,通常用于將工作負載分布到多個服務(wù)器來提高網(wǎng)站咕痛、應(yīng)用痢甘、數(shù)據(jù)庫或其他服務(wù)的性能和可靠性。

常用的負載均衡算法

負載均衡算法決定了后端的哪些健康服務(wù)器會被選中茉贡。幾個常用的算法:

  1. Round Robin(輪詢):為第一個請求選擇列表中的第一個服務(wù)器塞栅,然后按順序向下移動列表直到結(jié)尾,然后循環(huán)块仆。
  2. Least Connections(最小連接):優(yōu)先選擇連接數(shù)最少的服務(wù)器构蹬,在普遍會話較長的情況下推薦使用。
  3. Source:根據(jù)請求源的 IP 的散列(hash)來選擇要轉(zhuǎn)發(fā)的服務(wù)器悔据。這種方式可以一定程度上保證特定用戶能連接到相同的服務(wù)器庄敛。如果你的應(yīng)用需要處理狀態(tài)而要求用戶能連接到和之前相同的服務(wù)器】坪梗可以通過 Source 算法基于客戶端的 IP 信息創(chuàng)建關(guān)聯(lián)藻烤,或者使用粘性會話(sticky sessions)。

Nginx提供的負載均衡策略有2種:內(nèi)置策略和擴展策略头滔。
內(nèi)置策略為輪詢怖亭,加權(quán)輪詢,Ip hash坤检。
擴展策略兴猩,就天馬行空,只有你想不到的沒有他做不到的啦早歇,你可以參照所有的負載均衡算法倾芝,給他一一找出來做下實現(xiàn)讨勤。
擴展策略舉例: fair,根據(jù)服務(wù)器的響應(yīng)時間來分配請求晨另,響應(yīng)時間短的優(yōu)先分配潭千,即負載壓力小的優(yōu)先會分配。
fair源碼

參見:什么是負載均衡借尿?
Nginx負載均衡配置

什么是反向代理刨晴?

正向代理

正向代理是一個位于客戶端和目標(biāo)服務(wù)器之間的代理服務(wù)器(中間服務(wù)器)。
為了從原始服務(wù)器取得內(nèi)容路翻,客戶端向代理服務(wù)器發(fā)送一個請求狈癞,并且指定目標(biāo)服務(wù)器,之后代理向目標(biāo)服務(wù)器轉(zhuǎn)交并且將獲得的內(nèi)容返回給客戶端茂契。
正向代理的情況下客戶端必須要進行一些特別的設(shè)置才能使用亿驾。

反向代理

反向代理正好相反。對于客戶端來說账嚎,反向代理就好像目標(biāo)服務(wù)器。并且客戶端不需要進行任何設(shè)置儡蔓。
客戶端向反向代理發(fā)送請求郭蕉,接著反向代理判斷請求走向何處,并將請求轉(zhuǎn)交給客戶端喂江,使得這些內(nèi)容就好似他自己一樣召锈,
一次客戶端并不會感知到反向代理后面的服務(wù),也因此不需要客戶端做任何設(shè)置获询,只需要把反向代理服務(wù)器當(dāng)成真正的服務(wù)器就好了涨岁。

參照:正向代理與反向代理的區(qū)別

nginx 安裝

通過yum 源安裝

配置yum源

  1. 首先修改公司的yum源配置, cd /etc/yum.repos.d/ 吉嚣,修改CentOS-7.6-Base.repo 梢薪。

  2. 除此之外,在安裝epel 源尝哆。(extra package for enterprise linux秉撇, 為“紅帽系”的操作系統(tǒng)提供額外的軟件包,適用于RHEL秋泄、CentOS等琐馆,
    里面有1萬多個軟件,強烈建議安裝) yum install epel-release
    如果epel無法安裝恒序,請參見:yum安裝epel源

  3. 添加Nginx倉庫
    vim /etc/yum.repos.d/nginx.repo
    輸入下面內(nèi)容
    [nginx]
    name=nginx repo
    baseurl=http://nginx.org/packages/centos/7/$basearch/
    gpgcheck=0
    enabled=1

  4. 安裝:yum install nginx 瘦麸。 使用 yum 安裝是在線安裝,但是版本可能不是最新歧胁,如果需要最新版本的話滋饲,還是需要源碼安裝厉碟。

  5. 啟動Nginx
    systemctl start nginx
    或者 進入/usr/sbin,執(zhí)行
    ./nginx
    或者執(zhí)行
    service nginx start

  6. 測試頁面
    http://127.0.0.1/ 如果頁面沒有出來了赌,查看防火墻配置
    vi /etc/sysconfig/iptables 添加下面內(nèi)容
    -A INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT(允許80端口通過防火墻)
    -A INPUT -m state –state NEW -m tcp -p tcp –dport 3306 -j ACCEPT(mysql端口 允許3306端口通過防火墻)
    然后重啟防火墻:service iptables restart

  7. 把Nginx加到系統(tǒng)啟動項墨榄,這樣每次開機的時候就自動啟動了,使用下面的命令:
    systemctl enable nginx

參照:Linux(Centos7)yum安裝Nginx

通過源碼安裝

1. 安裝前工作首先更新系統(tǒng)軟件源勿她,使用以下命令更新系統(tǒng): yum update

有關(guān)兩個命令的一點解釋:

  1. yum -y update - 升級所有包袄秩,改變軟件設(shè)置和系統(tǒng)設(shè)置,系統(tǒng)版本內(nèi)核都升級。
  2. yum -y upgrade - 升級所有包逢并,不改變軟件設(shè)置和系統(tǒng)設(shè)置之剧,系統(tǒng)版本升級,內(nèi)核不改變砍聊。
2. 依賴包安裝

[root@localhost src]# yum -y install gcc gcc-c++ autoconf automake libtool make cmake
[root@localhost src]# yum -y install zlib zlib-devel openssl openssl-devel pcre-devel

3. 下載Nginx安裝源文件

http://nginx.org/en/download.html nginx-1.10.2.tar.gz

4. 新建nginx用戶及用戶組

用 root 用戶身份登錄系統(tǒng)背稼,執(zhí)行以下命令創(chuàng)建新的用戶。

[root@localhost src]# groupadd nginx
[root@localhost src]# useradd -g nginx -M nginx
  1. useradd命令的-M參數(shù)用于不為nginx建立home目錄
  1. 修改/etc/passwd玻蝌,使得nginx用戶無法bash登陸(nginx用戶后面由/bin/bash改為/sbin/nologin)
  2. vi /etc/passwd然后找到有 nginx 那一行蟹肘,把它修改為(后面由/bin/bash改為/sbin/nologin):
    例如:nginx..1002:1003::/home/nginx:/sbin/nologin
5. 配置、編譯俯树、安裝

下面我們進入解壓的nginx源碼目錄:/usr/local/src/ 執(zhí)行以下命令

[root@localhost ~]# cd /usr/local/src/nginx*
[root@localhost nginx-1.10.3]# pwd
/usr/local/src/nginx-1.10.3
[root@localhost nginx-1.10.3]#
[root@localhost nginx-1.10.3]# ./configure --prefix=/usr/local/nginx \
--pid-path=/usr/local/nginx/run/nginx.pid \
--with-http_ssl_module \
--user=nginx \
 --group=nginx \
--with-pcre \
--without-mail_pop3_module \
--without-mail_imap_module \
--without-mail_smtp_module

--prefix=/usr/local/nginx 指定安裝到 /usr/local/nginx 目錄下帘腹。
上面配置完成后,接下來執(zhí)行編譯 

[root@localhost nginx-1.10.3]# make
[root@localhost nginx-1.10.3]# make install

查看安裝后的程序版本:
[root@localhost nginx-1.10.3]# /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.10.3

注意:上面的反斜杠\ 表示換行繼續(xù)许饿。

6. 啟動阳欲、停止

nginx 管理的幾種方式:

6.1 啟動Nginx

/usr/local/nginx/sbin/nginx

6.2 從容停止Nginx:

kill -QUIT 主進程號 # 如上一步中的 ps 命令輸出的 29151,就是 Nginx的主進程號

6.3 快速停止Nginx:

kill -TERM 主進程號

6.4 強制停止Nginx:

pkill -9 nginx

6.5 平滑重啟nginx

/usr/nginx/sbin/nginx -s reload

參照:Nginx安裝

兩者安裝的不同

  1. yum 安裝是在線安裝陋率,好處是:安裝方式簡單球化,不易出錯;
    源碼包 安裝是先將 nginx 的源碼下載下來瓦糟,在自己的系統(tǒng)里編譯生成可執(zhí)行文件筒愚,然后執(zhí)行,
    好處是:因為是在自己的系統(tǒng)上編譯的狸页,更符合自己系統(tǒng)的性能锨能,也就是說在自己的系統(tǒng)上執(zhí)行 nginx 服務(wù)性能效率更好。
  2. 安裝路徑不同
    通過源碼包編譯安裝的軟件芍耘,通常都放在 /usr/local/包名 路徑下址遇。
    通過源碼安裝,可以自己指定安裝路徑斋竞。
  3. 啟動方式不同
    yum 安裝 nginx倔约,我們可以通過 系統(tǒng)服務(wù)命令 service 來啟動或停止
    service nginx start #啟動 nginx 服務(wù)
    service nginx stop #停止 nginx 服務(wù)
    service nginx restart #重啟 nginx 服務(wù)
    源碼包 安裝 nginx 啟動的時候不能使用 service 來啟動,需要執(zhí)行 nginx 安裝目錄下的 sbin 目錄下的 nginx 可執(zhí)行程序才行坝初,
    如下(我的 nginx 安裝在 /usr/local/webserver/ 目錄下)
    ? ~ /usr/local/webserver/nginx/sbin/nginx #啟動 nginx 服務(wù)
    ? ~ /usr/local/webserver/nginx/sbin/nginx -s stop #停止 nginx 服務(wù)

參照:nginx服務(wù)器詳細安裝過程(使用yum 和 源碼包兩種安裝方式浸剩,并說明其區(qū)別)

nginx 配置解析

nginx 配置結(jié)構(gòu)

...              #全局塊

events {         #events塊
   ...
}

http      #http塊
{
    ...   #http全局塊
    server        #server塊
    { 
        ...       #server全局塊
        location [PATTERN]   #location塊
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     #http全局塊
}

nginx 配置詳解


########### 每個指令必須有分號結(jié)束钾军。#################
#user administrator administrators;  #配置用戶或者組,默認為nobody nobody绢要。
#worker_processes 2;  #允許生成的進程數(shù)吏恭,默認為1
#pid /nginx/pid/nginx.pid;   #指定nginx進程運行文件存放地址
error_log log/error.log debug;  #制定日志路徑,級別重罪。這個設(shè)置可以放入全局塊樱哼,http塊,server塊剿配,級別以此為:debug|info|notice|warn|error|crit|alert|emerg
events {
    accept_mutex on;   #設(shè)置網(wǎng)路連接序列化搅幅,防止驚群現(xiàn)象發(fā)生,默認為on
    multi_accept on;  #設(shè)置一個進程是否同時接受多個網(wǎng)絡(luò)連接呼胚,默認為off
    #use epoll;      #事件驅(qū)動模型茄唐,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    #最大連接數(shù),默認為512
}
http {
    include       mime.types;   #文件擴展名與文件類型映射表
    default_type  application/octet-stream; #默認文件類型蝇更,默認為text/plain
    #access_log off; #取消服務(wù)日志    
    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定義格式
    access_log log/access.log myFormat;  #combined為日志格式的默認值
    sendfile on;   #允許sendfile方式傳輸文件沪编,默認為off,可以在http塊年扩,server塊漾抬,location塊。
    sendfile_max_chunk 100k;  #每個進程每次調(diào)用傳輸數(shù)量不能大于設(shè)定的值常遂,默認為0,即不設(shè)上限挽荠。
    keepalive_timeout 65;  #連接超時時間克胳,默認為75s,可以在http圈匆,server漠另,location塊。

    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #熱備
    }
    error_page 404 https://www.baidu.com; #錯誤頁
    server {
        keepalive_requests 120; #單連接請求上限次數(shù)跃赚。
        listen       4545;   #監(jiān)聽端口
        server_name  127.0.0.1;   #監(jiān)聽地址       
        location  ~*^.+$ {       #請求的url過濾笆搓,正則匹配,~為區(qū)分大小寫纬傲,~*為不區(qū)分大小寫满败。
           #root path;  #根目錄
           #index vv.txt;  #設(shè)置默認頁
           proxy_pass  http://mysvr;  #請求轉(zhuǎn)向mysvr 定義的服務(wù)器列表
           deny 127.0.0.1;  #拒絕的ip
           allow 172.18.5.54; #允許的ip           
        } 
    }
}

幾個常見配置項:

  1. remote_addr 與http_x_forwarded_for 用以記錄客戶端的ip地址;
  2. $remote_user :用來記錄客戶端用戶名稱叹括;
  3. $time_local : 用來記錄訪問時間與時區(qū)算墨;
  4. $request : 用來記錄請求的url與http協(xié)議;
  5. $status : 用來記錄請求狀態(tài)汁雷;成功是200净嘀;
  6. $body_bytes_s ent :記錄發(fā)送給客戶端文件主體內(nèi)容大斜取;
  7. $http_referer :用來記錄從那個頁面鏈接訪問過來的挖藏;
  8. $http_user_agent :記錄客戶端瀏覽器的相關(guān)信息暑刃;

其他說明

  1. 驚群現(xiàn)象:一個網(wǎng)路連接到來,多個睡眠的進程被同時叫醒膜眠,但只有一個進程能獲得鏈接岩臣,這樣會影響系統(tǒng)性能。
  2. 每個指令必須有分號結(jié)束柴底。

參見:

Nginx反向代理以及負載均衡配置
【nginx】配置Nginx實現(xiàn)負載均衡
Nginx 配置詳解

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末婿脸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子柄驻,更是在濱河造成了極大的恐慌狐树,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸿脓,死亡現(xiàn)場離奇詭異抑钟,居然都是意外死亡,警方通過查閱死者的電腦和手機野哭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門在塔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拨黔,你說我怎么就攤上這事蛔溃。” “怎么了篱蝇?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵贺待,是天一觀的道長。 經(jīng)常有香客問我零截,道長麸塞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任涧衙,我火速辦了婚禮哪工,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弧哎。我一直安慰自己雁比,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布撤嫩。 她就那樣靜靜地躺著章贞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸭限,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天蜕径,我揣著相機與錄音,去河邊找鬼败京。 笑死兜喻,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赡麦。 我是一名探鬼主播朴皆,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼泛粹!你這毒婦竟也來了遂铡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤晶姊,失蹤者是張志新(化名)和其女友劉穎扒接,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體们衙,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡钾怔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蒙挑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宗侦。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖忆蚀,靈堂內(nèi)的尸體忽然破棺而出矾利,到底是詐尸還是另有隱情,我是刑警寧澤馋袜,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布梦皮,位于F島的核電站,受9級特大地震影響桃焕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捧毛,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一观堂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧呀忧,春花似錦师痕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至泞辐,卻和暖如春笔横,著一層夾襖步出監(jiān)牢的瞬間竞滓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工吹缔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留商佑,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓厢塘,卻偏偏與公主長得像茶没,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子晚碾,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容