Nginx反向代理/負(fù)載均衡

1. Nginx 介紹

在這里插入圖片描述
  • Nginx是一款輕量級(jí)的Web 服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,并在一個(gè)BSD-like 協(xié)議下發(fā)行。由俄羅斯的程序設(shè)計(jì)師Igor Sysoev所開發(fā),供俄國大型的入口網(wǎng)站及搜索引擎Rambler(俄文:Рамблер)使用。其特點(diǎn)是占有內(nèi)存少,并發(fā)能力強(qiáng),

  • Nginx 是一個(gè)高性能的 Web 和反向代理服務(wù)器, 它具有有很多非常優(yōu)越的特性:
    作為 Web 服務(wù)器:相比 Apache,Nginx 使用更少的資源,支持更多的并發(fā)連接,體現(xiàn)更高的效率,這點(diǎn)使 Nginx 尤其受到虛擬主機(jī)提供商的歡迎。能夠支持高達(dá) 50,000 個(gè)并發(fā)連接數(shù)的響應(yīng),感謝 Nginx 為我們選擇了 epoll and kqueue 作為開發(fā)模型.

  • 作為負(fù)載均衡服務(wù)器:Nginx 既可以在內(nèi)部直接支持 Rails 和 PHP,也可以支持作為 HTTP代理服務(wù)器 對(duì)外進(jìn)行服務(wù)。Nginx 用 C 編寫, 不論是系統(tǒng)資源開銷還是 CPU 使用效率都比 Perlbal 要好的多。

  • Nginx一般用戶七層負(fù)載均衡,其吞吐量有一定的限制。為了提高整體的吞吐量,會(huì)在DNS和Nginx之間引入LVS(軟件負(fù)載均衡器)、F5(硬負(fù)載均衡器) 可以做四層負(fù)載均衡,首先DNS解析到LVS(F5),讓后LVS(F5)轉(zhuǎn)發(fā)給Nginx,在有Nginx轉(zhuǎn)發(fā)給真實(shí)的服務(wù)器

2. Linux安裝Nginx

  1. 安裝依賴包
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
  1. 下載解壓nginx安裝包
//創(chuàng)建一個(gè)文件夾
cd /usr/local
mkdir nginx
cd nginx
//下載tar包
wget http://nginx.org/download/nginx-1.6.3.tar.gz
tar -xvf nginx-1.6.3.tar.gz
  1. 安裝nginx
//進(jìn)入nginx目錄
cd /usr/local/nginx
//進(jìn)入目錄
cd nginx-1.6.3
//執(zhí)行命令
./configure
//執(zhí)行make命令
make
//執(zhí)行make install命令
make install
  1. 啟動(dòng)nginx
/usr/local/nginx/sbin/nginx -s reload

如果出現(xiàn)報(bào)錯(cuò):nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed

則運(yùn)行: /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

在這里插入圖片描述

3. Nginx應(yīng)用場景

  1. http服務(wù)器。Nginx是一個(gè)http服務(wù)可以獨(dú)立提供http服務(wù)。可以做網(wǎng)頁靜態(tài)服務(wù)器。
  2. 虛擬主機(jī)??梢詫?shí)現(xiàn)在一臺(tái)服務(wù)器虛擬出多個(gè)網(wǎng)站,例如個(gè)人網(wǎng)站使用的虛擬機(jī)。
  3. 反向代理,負(fù)載均衡。當(dāng)網(wǎng)站的訪問量達(dá)到一定程度后,單臺(tái)服務(wù)器不能滿足用戶的請(qǐng)求時(shí),需要用多臺(tái)服務(wù)器集群可以使用nginx做反向代理。并且多臺(tái)服務(wù)器可以平均分擔(dān)負(fù)載,不會(huì)應(yīng)為某臺(tái)服務(wù)器負(fù)載高宕機(jī)而某臺(tái)服務(wù)器閑置的情況。
  4. nginz 中也可以配置安全管理、比如可以使用Nginx搭建API接口網(wǎng)關(guān),對(duì)每個(gè)接口服務(wù)進(jìn)行攔截。

4. Nginx目錄結(jié)構(gòu)

執(zhí)行命令 tree /application/nginx ;如果tree命令找不到就執(zhí)行 yum install tree -y安裝

 yum install tree -y
[root@vm10-0-0-128 local]# tree nginx/
nginx/
├── client_body_temp
├── conf    #這是Nginx所有配置文件的目錄,極其重要
│   ├── fastcgi.conf       #fastcgi相關(guān)參數(shù)的配置文件
│   ├── fastcgi.conf.default    #fastcgi.conf的原始備份
│   ├── fastcgi_params
│   ├── fastcgi_params.default
│   ├── koi-utf
│   ├── koi-win
│   ├── mime.types
│   ├── mime.types.default
│   ├── nginx.conf     #這是Nginx默認(rèn)的主配置文件
│   ├── nginx.conf.default
│   ├── scgi_params
│   ├── scgi_params.default
│   ├── uwsgi_params
│   ├── uwsgi_params.default
│   └── win-utf
├── fastcgi_temp        #fastcgi臨時(shí)數(shù)據(jù)目錄
├── html                #這是編譯安裝時(shí)Nginx的默認(rèn)站點(diǎn)目錄  nginx首頁與錯(cuò)誤頁面
│   ├── 50x.html
│   └── index.html
├── logs                #這是Nginx默認(rèn)的日志路徑,包括錯(cuò)誤日志及訪問日志
│   ├── access.log      #這是Nginx的默認(rèn)訪問日志文件,使用tail -f access.log,可以實(shí)時(shí)觀看網(wǎng)站用戶訪問情況信息
│   ├── error.log       #這是Nginx的錯(cuò)誤日志文件,如果Nginx出現(xiàn)啟動(dòng)故障等問題,一定要看看這個(gè)錯(cuò)誤日志
│   └── nginx.pid       #Nginx的pid文件,Nginx進(jìn)程啟動(dòng)后,會(huì)把所有進(jìn)程的ID號(hào)寫到此文件
├── proxy_temp          #臨時(shí)目錄
├── sbin                #這是Nginx命令的目錄,如Nginx的啟動(dòng)命令nginx
│   └── nginx
├── scgi_temp           #臨時(shí)目錄
└── uwsgi_temp          #臨時(shí)目錄


5. Nginx主配置文件nginx.conf

#user  nobody;                       #定義Nginx運(yùn)行的用戶和用戶組
worker_processes  1;                 #nginx進(jìn)程數(shù),建議設(shè)置為等于CPU總核心數(shù)。
#error_log  logs/error.log;          #全局錯(cuò)誤日志定義類型,
#error_log  logs/error.log  notice;  #進(jìn)程文件        
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;       #單個(gè)進(jìn)程最大連接數(shù)(最大連接數(shù)=連接數(shù)*進(jìn)程數(shù))
}

 #HTTP區(qū)塊開始 核心區(qū)域
http {
    include       mime.types;        #Nginx支持的媒體類型庫文件
    default_type  application/octet-stream;   #默認(rèn)媒體類型
    #client_header_buffer_size 32k;               #上傳文件大小限制
    large_client_header_buffers 4 64k;             #設(shè)定請(qǐng)求緩存值

    sendfile        on;   #開啟高效文件傳輸模式,s
    #tcp_nopush     on;   #防止網(wǎng)絡(luò)阻塞
    #tcp_nodelay on;              #防止網(wǎng)絡(luò)阻塞

    #keepalive_timeout  0;
    keepalive_timeout  65;    #連接超時(shí),單位是秒

    #FastCGI相關(guān)參數(shù)是為了改善網(wǎng)站的性能:減少資源占用,提高訪問速度。
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;

    #gzip模塊設(shè)置
    #gzip  on;    #開啟gzip壓縮輸出
 
    #虛擬主機(jī)的配置
    server {
        listen       8080;         #監(jiān)聽端口
        server_name  localhost;    #提供服務(wù)的域名主機(jī)名
        
  # location的作用
  # location指令的作用是根據(jù)用戶請(qǐng)求的URI來執(zhí)行不同的應(yīng)用,也就是根據(jù)用戶請(qǐng)求的網(wǎng)站URL進(jìn)行匹配,匹配成功即進(jìn)行相關(guān)的操作。
  # 1. =開頭表示精確匹配
  # 2. ^~ 開頭表示uri以某個(gè)常規(guī)字符串開頭
  # 3. ~ 開頭表示區(qū)分大小寫的正則匹配;
  # 4. ~* 開頭表示不區(qū)分大小寫的正則匹配
  # 5. / 通用匹配, 如果沒有其它匹配,任何請(qǐng)求都會(huì)匹配到

        location /{               # 對(duì) /進(jìn)行反向代理
            root   html;           #站點(diǎn)的根目錄
            index  index.html index.htm;       #默認(rèn)的首頁文件
            try_files $uri $uri/ /index.html;
            proxy_set_header X-Real-IP $remote_addr;  #后端的Web服務(wù)器可以通過X-Forwarded-For獲取用戶真實(shí)IP
            #以下是一些反向代理的配置,可選
            proxy_set_header Host $host;
            client_max_body_size 10m;      #允許客戶端請(qǐng)求的最大單文件字節(jié)數(shù)
            client_body_buffer_size 128k;    #緩沖區(qū)代理緩沖用戶端請(qǐng)求的最大字節(jié)數(shù),
            proxy_connect_timeout 90;      #nginx跟后端服務(wù)器連接超時(shí)時(shí)間(代理連接超時(shí))
            proxy_send_timeout 90;        #后端服務(wù)器數(shù)據(jù)回傳時(shí)間(代理發(fā)送超時(shí))
            proxy_read_timeout 90;        #連接成功后,后端服務(wù)器響應(yīng)時(shí)間(代理接收超時(shí))
            proxy_buffer_size 4k;         #設(shè)置代理服務(wù)器(nginx)保存用戶頭信息的緩沖區(qū)大小
            proxy_buffers 4 32k;         #proxy_buffers緩沖區(qū),網(wǎng)頁平均在32k以下的設(shè)置
            proxy_busy_buffers_size 64k;    #高負(fù)荷下緩沖大?。╬roxy_buffers*2)
            proxy_temp_file_write_size 64k;   #設(shè)定緩存文件夾大小,大于這個(gè)值,將從upstream服務(wù)器傳
        }
        location  /i5n/ {
            proxy_pass http://127.0.0.1:8080/i5n/;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        # 錯(cuò)誤頁面 可以自定義自己都頁面
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

}

6. 基于虛擬主機(jī)配置域名

    #當(dāng)客戶端訪問www.yanxiaolong.cn,監(jiān)聽端口號(hào)為80,直接跳轉(zhuǎn)到data/www目錄下文件
    server {
        listen       80;
        server_name  www.yanxiaolong.cn;
        location / {
            root   data/www;
            index  index.html index.htm;
        }
    }
    #當(dāng)客戶端訪問blog.yanxiaolong.cn,監(jiān)聽端口號(hào)為80,直接跳轉(zhuǎn)到data/blow目錄下文件
     server {
        listen       80;
        server_name  blog.itmayiedu.com;
        location / {
            root   data/blog;
            index  index.html index.htm;
        }
    }

7. 基于虛擬主機(jī)配置域名

#當(dāng)客戶端訪問www.yanxiaolong.cn,監(jiān)聽端口號(hào)為8080,直接跳轉(zhuǎn)到data/www目錄下文件
     server {
        listen       8080;
        server_name  www.yanxiaolong.cn;
        location / {
            root   data/www;
            index  index.html index.htm;
        }
    }
    
    #當(dāng)客戶端訪問blog.yanxiaolong.cn,監(jiān)聽端口號(hào)為8081,直接跳轉(zhuǎn)到data/blog目錄下文件
     server {
        listen       8081;
        server_name  blog.yanxiaolong.cn;
        location / {
            root   data/blog;
            index  index.html index.htm;
        }
    }

8. Nginx配置反向代理

  • 反向代理(Reverse Proxy)方式是指以代理服務(wù)器來接受internet上的連接請(qǐng)求,然后將請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給internet上請(qǐng)求連接的客戶端,此時(shí)代理服務(wù)器對(duì)外就表現(xiàn)為一個(gè)反向代理服務(wù)器。
  • 反向代理的好處隱藏真實(shí)內(nèi)部ip地址,請(qǐng)求先訪問nginx代理服務(wù)器(外網(wǎng)可以訪問到),在使用nginx服務(wù)器轉(zhuǎn)發(fā)到真實(shí)服務(wù)器中。

配置:

#當(dāng)客戶端訪問api.yanxiaolong.cn,監(jiān)聽端口號(hào)為80直接跳轉(zhuǎn)到真實(shí)ip服務(wù)器地址 127.0.0.1:8080
    server {
        listen       80;
        server_name  api.yanxiaolong.cn;
        location / {
           proxy_pass http://127.0.0.1:8080;  
        }
}
#當(dāng)客戶端訪問api2.yanxiaolong.cn,監(jiān)聽端口號(hào)為80直接跳轉(zhuǎn)到真實(shí)ip服務(wù)器地址 127.0.0.1:8081
    server {
        listen       80;
        server_name  api2.yanxiaolong.cn;
        location / {
            proxy_pass http://127.0.0.1:8081;
        }
    }


9. Nginx配置負(fù)載均衡

  • Nginx負(fù)載均衡提供上游服務(wù)器(真實(shí)業(yè)務(wù)邏輯訪問的服務(wù)器),負(fù)載均衡、故障轉(zhuǎn)移、失敗重試、容錯(cuò)、健康檢查等。
  • 當(dāng)上游服務(wù)器(真實(shí)業(yè)務(wù)邏輯訪問的服務(wù)器)發(fā)生故障時(shí),可以轉(zhuǎn)移到其他上游服務(wù)器(真實(shí)業(yè)務(wù)邏輯訪問的服務(wù)器)。

負(fù)載均衡算法

  1. 輪詢(默認(rèn))
    每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù),如果后端某臺(tái)服務(wù)器死機(jī),自動(dòng)剔除故障系統(tǒng),使用戶訪問不受影響。

  2. weight(輪詢權(quán)值)
    weight的值越大分配到的訪問概率越高,主要用于后端每臺(tái)服務(wù)器性能不均衡的情況下。或者僅僅為在主從的情況下設(shè)置不同的權(quán)值,達(dá)到合理有效的地利用主機(jī)資源。

  3. ip_hash
    每個(gè)請(qǐng)求按訪問IP的哈希結(jié)果分配,使來自同一個(gè)IP的訪客固定訪問一臺(tái)后端服務(wù)器,并且可以有效解決動(dòng)態(tài)網(wǎng)頁存在的session共享問題。俗稱IP綁定。

  4. fair(第三方) <font color ='red'>需要使用外部擴(kuò)展</font>
    比 weight、ip_hash更加智能的負(fù)載均衡算法,fair算法可以根據(jù)頁面大小和加載時(shí)間長短智能地進(jìn)行負(fù)載均衡,也就是根據(jù)后端服務(wù)器的響應(yīng)時(shí)間 來分配請(qǐng)求,響應(yīng)時(shí)間短的優(yōu)先分配。Nginx本身不支持fair,如果需要這種調(diào)度算法,則必須安裝upstream_fair模塊。

  5. url_hash(第三方) <font color ='red'>需要使用外部擴(kuò)展</font>
    按訪問的URL的哈希結(jié)果來分配請(qǐng)求,使每個(gè)URL定向到一臺(tái)后端服務(wù)器,可以進(jìn)一步提高后端緩存服務(wù)器的效率。Nginx本身不支持url_hash,如果需要這種調(diào)度算法,則必須安裝Nginx的hash軟件包。

輪詢 :

upstream  backServer{
    server 127.0.0.1:8080;  
    server 127.0.0.1:8081;
    }
    
    server {
        listen       80;
        server_name  api.yanxiaolong.cn;
        location / {
        # 指定上游服務(wù)器負(fù)載均衡服務(wù)器
         proxy_pass http://backServer;
        }
    }

加權(quán)輪詢 :

upstream  backServer{
    server 127.0.0.1:8080 wight = 1;  
    server 127.0.0.1:8081 wight = 2;
    }
    
    server {
        listen       80;
        server_name  api.yanxiaolong.cn;
        location / {
        # 指定上游服務(wù)器負(fù)載均衡服務(wù)器
         proxy_pass http://backServer;
        }
    }

IP綁定ip_hash

upstream  backServer{
        server 127.0.0.1:8080 ;
        server 192.168.10.225:8081 max_fails=3 fail_timeout=15;
        ip_hash; 
    }
    
    server {
        listen       80;
        server_name  api.yanxiaolong.cn;
        location / {
            # 指定上游服務(wù)器負(fù)載均衡服務(wù)器
            proxy_pass http://backServer;
        }
    }

10. Nginx配置故障轉(zhuǎn)移

  • 當(dāng)上游服務(wù)器(真實(shí)訪問服務(wù)器),一旦出現(xiàn)故障或者是沒有及時(shí)相應(yīng)的話,應(yīng)該直接輪訓(xùn)到下一臺(tái)服務(wù)器,保證服務(wù)器的高可用。
upstream  backServer{
    server 127.0.0.1:8080 wight = 1;  
    server 127.0.0.1:8081 wight = 2;
    }

server {
        listen       80;
        server_name  www.itmayiedu.com;
        location / {
            ### 指定上游服務(wù)器負(fù)載均衡服務(wù)器
            proxy_pass http://backServer;
            #nginx與上游服務(wù)器(真實(shí)訪問的服務(wù)器)超時(shí)時(shí)間 后端服務(wù)器連接的超時(shí)時(shí)間_發(fā)起握手等候響應(yīng)超時(shí)時(shí)間
            proxy_connect_timeout 20s;
            #nginx發(fā)送給上游服務(wù)器(真實(shí)訪問的服務(wù)器)超時(shí)時(shí)間
            proxy_send_timeout 20s;
            ### nginx接受上游服務(wù)器(真實(shí)訪問的服務(wù)器)超時(shí)時(shí)間
            proxy_read_timeout 20s;
        }
    }

補(bǔ)充:nginx rewrite

Nginx提供的全局變量或自己設(shè)置的變量,結(jié)合正則表達(dá)式和標(biāo)志位實(shí)現(xiàn)url重寫以及重定向。rewrite只能放在server{},location{},if{}中,并且只能對(duì)域名后邊的除去傳遞的參數(shù)外的字符串起作用。

Rewrite主要的功能就是實(shí)現(xiàn)URL的重寫,Nginx的Rewrite規(guī)則采用Pcre,perl兼容正則表達(dá)式的語法規(guī)則匹配,如果需要Nginx的Rewrite功能,在編譯Nginx之前,需要編譯安裝PCRE庫。
通過Rewrite規(guī)則,可以實(shí)現(xiàn)規(guī)范的URL、根據(jù)變量來做URL轉(zhuǎn)向及選擇配置。

Rewrite全局變量:

變量 說明
$args 存放了請(qǐng)求url中的請(qǐng)求指令。比如http://www.myweb.name/server/source?arg1=value1&arg2=value2中的arg1=value1&arg2=value2
$content_length 存放請(qǐng)求頭中的Content-length字段
$content_type 存放了請(qǐng)求頭中的Content-type字段
$document_root 存放了針對(duì)當(dāng)前請(qǐng)求的根路徑
$document_uri 請(qǐng)求中的uri,不包含請(qǐng)求指令 ,比如比如http://www.myweb.name/server/source?arg1=value1&arg2=value2中的/server/source$host $1
$host 存放了請(qǐng)求url中的主機(jī)字段,比如比如http://www.myweb.name/server/source?arg1=value1&arg2=value2中的www.myweb.name。如果請(qǐng)求中的主機(jī)部分字段不可用或者為空,則存放nginx配置中該server塊中server_name指令的配置值
$http_cookie cookie
$limit_rate nginx配置中l(wèi)imit_rate指令的配置值
$remote_addr 客戶端的地址
$remote_port 客戶端與服務(wù)器端建立連接的端口號(hào)
$remote_user 變量中存放了客戶端的用戶名
$request_body_file 存放了發(fā)給后端服務(wù)器的本地文件資源的名稱
$request_method 存放了客戶端的請(qǐng)求方式,如get,post等
$request_filename 存放當(dāng)前請(qǐng)求的資源文件的路徑名
$query_string $args含義相同
$scheme 客戶端請(qǐng)求使用的協(xié)議,如http,https,ftp等
$server_protocol 客戶端請(qǐng)求協(xié)議的版本,如”HTTP/1.0”,”HTTP/1.1”
$server_addr 服務(wù)器的地址
$server_name 客戶端請(qǐng)求到達(dá)的服務(wù)器的名稱

判斷IP地址來源


server {
      listen 80;
      server_name www.yanxiaolong,cn;
      location / {
        # 如果不是白名單則 顯示403 禁止訪問
       if  ($remote_addr = 192.168.5.166) {  
         return 403;  
     }  
      
}

限制瀏覽器訪問

server {
      listen 80;
      server_name www.yanxiaolong,cn;
      location / {
       ## 不允許谷歌瀏覽器訪問 如果是谷歌瀏覽器返回500
      if ($http_user_agent ~ Chrome) {   
         return 500;  
        } 
      
}

<h4>Nginx1.9開始支持tcp層的轉(zhuǎn)發(fā),通過stream實(shí)現(xiàn)的</h4>

### 修改為TCP模塊
tcp {
   
   ### 定義多個(gè)上游服務(wù)器
   upstream  backServer{
      ### 定義TCP模塊上游服務(wù)器
      server 192.168.5.165:80001;
      server 192.168.5.165:80002;
   }
    server {
        listen       9999;
        server_name  api.yanxiaolong.cn;
        ### 反向代理upstream
        proxy_pass backServer;
    }
}

個(gè)人博客地址:http://blog.yanxiaolong.cn/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容