1. 程式人生 > >Nginx反向代理及實踐應用

Nginx反向代理及實踐應用

叢集介紹

就是有很多臺計算機在幹同一件事,原來一臺的電腦壓力太大,幹不完一件事情的時候,讓多臺來幹同一件事,能分散壓力,組合在一起叫做叢集,那麼叢集能力組合絕對超過單一的 相加。

在這裡插入圖片描述

左邊是普通使用者 ,右邊是運維人員 ,使用者首先它通過Internet到了公司,這個時候它到公司的閘道器,通過防火牆跳轉到主的負載均衡上,旁邊是個備份的,根據演算法扔到web伺服器了,web伺服器lnmp,動態的網頁php會去找資料庫,找資料庫的主庫,(主庫也是單點),旁邊是備份的,寫找主伺服器,讀找從伺服器前面的從庫讀的負載均衡器(負載均衡器也是單點,所以旁邊也有一個備份),一般情況下我們搭建好主從複製之後,給開發一個讀和寫的賬號,開發自己寫程式碼來實現讀寫分離(這是開發寫的,開發寫一個指令碼指名寫的時候找那個ip地址,讀的時候找那個ip地址),這樣就能實現讀寫分離。
如果主庫寫資料的時候承受不住壓力的話,那麼資料庫快取(memcached快取),比如讀一個數據開發可以不先找負載均衡器先找memcached快取,如果在快取找不著,讀的資料找不到,開發再找LVS(寫一個if判斷),從mysql讀出來的資料,往寫一份到memcached快取裡,然後在交給nginx,nginx在返回給使用者,如果下一次使用者訪問的是同一個資料,那麼php先預設會找快取,不找後面了,然後就緩解資料庫的從壓力,一般memcached快取的是從庫的讀壓力。(memcached快取現在快用不到了)。
右邊得到備份的資料庫寫了一個定時全備及增量備份到備份伺服器(backup)
NFS伺服器實時同步。
運維人員通過vpn公網條過去,祕密通道的後面有個跳板機,然後跳到管理伺服器,通過管理伺服器能夠操作裡面的伺服器

叢集架構功能和結構可以分為以下幾類:
  • 負載均衡叢集,簡稱LBC或者LB
  • 高可用性叢集,簡稱HAC (預防單點)
  • 高效能運算叢集,簡稱HPC
  • 網格計算叢集

負載均衡器的作用:

使用者的請求去找負載均衡器,負載均衡器按照一定的機制,將使用者的請求分發給多臺web伺服器,使用者的訪問讓多臺web分擔壓力了(負載均衡器是單點的,所以我們要做個備份,做備份用keeplived軟體
在這裡插入圖片描述

網際網路企業常用的開源叢集軟體有:Nginx,LVS,Haproxy,Keepalived,heartbeat。
(後面倆個是高可用的)
網際網路企業常用的商業叢集硬體有

:F5,Netscaler,Radware,A10等(他們是收費的)

叢集硬體Netscaler
在這裡插入圖片描述

叢集硬體F5
在這裡插入圖片描述

叢集硬體Radware
在這裡插入圖片描述
叢集硬體A10
在這裡插入圖片描述

nginx反向代理

nginx是用反向代理來實現七層的負載均衡,所以一個是LVS和Nginx都有負載均衡的功能

在這裡插入圖片描述
nginx:通過http協議的http是OSI模型中七層的負載均衡,實現的功能多 nginx收到使用者請求就斷了,nginx代替使用者發起請求,發起一個全新請求的url,跟使用者沒啥關係url的源ip和源mac都是nginx自己,web的日誌記錄的ip都是nginx自己的解決web日誌記錄自己的ip如何讓顯示使用者的真實ip地址

nginx反向代理實現分業務,通過過濾location(static、upload、/)找不同的池子,池子與池子的內容是不一樣的

在這裡插入圖片描述
lvs:是OSI模型中4層的負載均衡,uri的請求通過轉發資料包(通過修改MAC頭部是速度最快的),tcp三次握手是和web伺服器握的,lvs但是效率好,實現功能小

注意:
一句話,LVS等的負載均衡是轉發使用者請求的資料包,而Nginx反向代理是接收使用者的請求然後重新發起請求去請求其後面的節點。

在這裡插入圖片描述

部署nginx服務

[[email protected] conf]# yum -y install openssl openssl-devel pcre pcre-devel
[[email protected] conf]# tar xf nginx-1.10.2.tar.gz -C /usr/src/
[[email protected] conf]# cd /usr/src/nginx-1.10.2/
[[email protected] conf]# useradd -M -s /sbin/nologin nginx
[[email protected] conf]# ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module && make && make install
[[email protected] conf]# ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
[[email protected] conf]# cd /usr/local/nginx/conf/
[[email protected] conf]# egrep -v "#|^$" nginx.conf.default > nginx.conf
-----------------------------------------------------
###########分別在web01 和 web02 做倆個一樣的模板
[[email protected] conf]# cat nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  bbs.yunjisuan.com;
        location / {
            root   html/bbs;
            index  index.html index.htm;
        }
        }
    server {
        listen       80;
        server_name  www.yunjisuan.com;Nginx負載均衡配置
        location / {
            root   html/www;
            index  index.html index.htm;
        }
        }
   } 
nginx負載均衡配置
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
        upstream www_server_pools {      ###這裡是伺服器池(伺服器池的名字www_server_pools) 前面是伺服器池的關鍵字
        
server 192.168.233.140 weight=1;    #伺服器的ip地址  ; weight:權重
負載均衡是按照權重比分配的		,upstream有自動健康檢測功能
server 192.168.233.141 weight=1;	#伺服器的IP地址;weight:權重

}
    server {
        listen       80;
        server_name  www.yunjisuan.com;
        location / {
                proxy_pass http://www_server_pools;  #proxy_pass:反向代理推送到上面的server。
        }
        }
    }

搭建的反向代理現在有倆個問題:
第一個是:訪問不到我想看的頁面,老是看第一個server
第二個是:日誌記錄的是反向代理的ip地址,記錄的不是使用者的真實ip地址,無法做分析
如果在工作中不解決這倆個問題,那麼你搭建的反向代理是失敗的,出問題無法做分析

引流:把nginx配置檔案匯入給更多的upstream

重點

問題一:解決nginx反向代理web日誌記錄的是反向代理的ip不記錄使用者的真實ip地址

在這裡插入圖片描述#上圖解釋
由於是負載均衡過來的,web伺服器的訪問日誌只能檢視來源ip是負載均衡伺服器的ip,這樣就獲取不了真正的使用者ip,在企業中要避免

在這裡插入圖片描述

#####在nginx反向代理伺服器中新增內容
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
        upstream www_server_pools {

server 192.168.233.140 weight=1;

server 192.168.233.141 weight=1;

}
    server {
        listen       80;
        server_name  www.yunjisuan.com;
        location / {
                proxy_pass http://www_server_pools;
                proxy_set_header x-Forwarded-For $remote_addr; #把客戶端的ip付給請求頭部中的-Forwarded-For,節點伺服器獲取使用者的真實ip地址的必要功能配置

        }
        }
    }
-----------------------------------------------------------------------------------
### 特別注意,雖然反向代理已經配好了,但是節點伺服器需要的訪問日誌如果要記錄使用者的真實IP,還必須進行日誌格式配置,這樣才能把代理傳過來的X-Forwarded-For頭資訊記錄下來

    #web01其中一臺伺服器的配置
    [[email protected] conf]# vim nginx.conf

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
  log_format main '"$http_x_forwarded_for"$remote_addr-$remote_user[$time_local]"$request"'
        '$status $body_bytes_sent "$http_referer"'		#日誌格式  main是日誌格式,寫日誌路徑的時候寫上
        '"$http_user_agent"';
        server {
        listen       80;
        server_name  bbs.yunjisuan.com;
        location / {
            root   html/bbs;
            index  index.html index.htm;
        }
         access_log logs/access_bbs.log main;		#這裡都的寫
        }
    server {
        listen       80;
        server_name  www.yunjisuan.com;
        location / {
            root   html/www;
            index  index.html index.htm;
        }
         access_log logs/access_www.log main;  ##這裡都的寫
        }
    }

問題二:nginx反向代理收到了使用者的請求之後,知道了使用者請求的域名,但是nginx沒有記錄這個域名到發起的請求中,而是直接發起一個全新的請求後去找後面的web節點伺服器,但是web伺服器不知道你要找那個server,於是預設第一個了

在這裡插入圖片描述
解決方式 只需要在請求頭部加入proxy_set_header host $host;
在這裡插入圖片描述vim /etc/hosts
在這裡插入圖片描述
在這裡插入圖片描述

下圖是反向代理總要引數
Nginx反向代理總要引數 解釋說明
proxy_pass http://www_server_pools; 通過proxy_pass功能把使用者的請求轉發到反向代理定義的upstream伺服器池
proxy_set_header host $host; 在代理向後端伺服器傳送的http請求頭部中加入host欄位資訊,用於當後端伺服器配置有多個虛擬主機的時候,可以識別代理的是哪個虛擬主機,這是節點伺服器多虛擬機器時的關鍵配置
proxy_set_header X-Forwarded-For $remote_addr; 在代理向後端伺服器傳送的http請求頭部中加入X-Forwarded-For欄位資訊,用於後端伺服器程式、日誌等接受記錄使用者的真實ip地址,而不是代理伺服器的ip,這個是反向代理時,節點伺服器獲取使用者的真實ip地址的重要配置
Nginx負載均衡核心元件

1 Nginx upstream模組
ngx_http_upstream_module模組允許Nginx定義一組或多組節點伺服器組,使用時可以通過proxy_pass代理方式把網站的請求傳送到事先定義好的對應Upstream組的名字上,具體寫法為“proxy_pass http:// www_server_pools”,其中www_server_pools就是一個Upstream節點伺服器組名字。ngx_http_upstream_module模組官方地址為:http://nginx.org/en/docs/http/ngx_http_upstream_module.html
在這裡插入圖片描述

在這裡插入圖片描述

upstream是按照什麼演算法來進行負載均衡的

權重輪詢
least_conn(最小連線):那臺連線的使用者最少,優先給誰