NGINX:正反向代理 負載均衡

一.環境準備html

 操做系統:CentOS 6.4 x86_64
nginx

   軟件版本:Nginx 1.4.5web

二.安裝NGINX
算法

  1. 解壓vim

tar xvf nginx-1.4.5.tar.gz 後端

2.新建nginx用戶和組瀏覽器

[root@xiao59 softs]# groupadd -g 108 -r nginx緩存

[root@xiao59 softs]# useradd -u 108 -r -g 108 nginx安全

[root@xiao59 softs]# id nginxbash

uid=108(nginx) gid=108(nginx) groups=108(nginx)

3.準備編譯配置文件

[root@xiao59 softs]# yum install -y pcre-devel openssl-devel

4.編譯並安裝

[root@xiao59 nginx-1.4.5]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module  --with-http_gzip_static_module --with-http_ssl_module

[root@xiao59 nginx-1.4.5]# make && make install

5.爲nginx提供啓動腳本

[root@xiao59 nginx-1.4.5]# vim /etc/init.d/nginx

===============================

#!/bin/bash

# nginx - this script starts and stops the nginx daemon 

# chkconfig:   - 85 15 

# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \ 

#               proxy and IMAP/POP3 proxy server 

# processname: nginx 

# config:      /usr/local/nginx/conf/nginx.conf

# config:      /usr/local/nginx/sbin/nginx

# pidfile:     /usr/local/nginx/logs/nginx.pid


#variables

opt=$1

NGINX_CONF=/usr/local/nginx/conf/nginx.conf

NGINX=/usr/local/nginx/sbin/nginx

NGINX_PID=/usr/local/nginx/logs/nginx.pid


# Source function library. 

. /etc/rc.d/init.d/functions

#function

function if_opt {

if [ $2 == 0 ]; then

   echo -n "nginx is $1 ok!" && success

else

   echo -n  "nginx is $1 error!" && failure

fi

}


##start nginx

case $opt in

start)

if [ -f ${NGINX_PID} ]; then

 echo "nginx is already start!"

else

  ${NGINX} -c ${NGINX_CONF}

  if_opt start $?

fi

;;

##stop nginx

stop)

if [ ! -f ${NGINX_PID} ] || [ `netstat -tnpl | grep nginx | wc -l` -lt 1 ]; then

   echo "nginx is already stopped!"

else

   cat ${NGINX_PID} | xargs kill -QUIT

   if_opt stop $?

fi

;;


##restart nginx

restart)

if [ `netstat -tnpl | grep nginx | wc -l` -ge 1 ]; then

    cat ${NGINX_PID} | xargs kill -HUP

    if_opt restart $?

else

   echo "nginx is not running..." && echo "start nginx"

   ${NGINX} -c ${NGINX_CONF}

   if_opt restart $?

fi

;;


##test nginx server

configtest)

${NGINX} -t ${NGINX_CONF}

  if_opt configtest $?

;;

*)

echo "usage:$1 {start|stop|restart|configtest}"

esac

=============================

//注意:

1)$2表明$?是否執行成功

 2)NGINX_PID不穩定,建議用`netstat -tnpl | grep nginx | wc -l` 

6.爲此腳本賦予執行權限

[root@xiao59 nginx-1.4.5]# chmod +x /etc/init.d/nginx 

7.添加至服務管理列表,使其開機自啓動

[root@xiao59 nginx-1.4.5]# chkconfig --add nginx

[root@xiao59 nginx-1.4.5]# chkconfig nginx on

三.NGINX反向代理(準備一臺測試服務器10.10.54.58)

  1. 安裝httpd

[root@xiao58 ~]# yum install -y httpd

2.提供測試頁面

[root@xiao58 ~]# echo "<h1> web.test.com</h1>" >/var/www/html/index.html

3.啓動httpd的服務

[root@xiao58 ~]# /etc/init.d/httpd start

4.測試

瀏覽器輸入:10.10.54.58

5.正反向代理

(1).正向代理的概念

       正向代理,也就是傳說中的代理,他的工做原理就像一個跳板,簡單的說,我是一個用戶,我訪問不了某網站,可是我能訪問一個代理服務器,這個代理服務器呢,他能訪問那個我不能訪問的網站,因而我先連上代理服務器,告訴他我須要那個沒法訪問網站的內容,代理服務器去取回來,而後返回給我。從網站的角度,只在代理服務器來取內容的時候有一次記錄,有時候並不知道是用戶的請求,也隱藏了用戶的資料,這取決於代理告不告訴網站。

       結論就是,正向代理 是一個位於客戶端和原始服務器(origin server)之間的服務器,爲了從原始服務器取得內容,客戶端向代理髮送一個請求並指定目標(原始服務器),而後代理向原始服務器轉交請求並將得到的內容返回給客戶端。客戶端必需要進行一些特別的設置才能使用正向代理。

(2).反向代理的概念

繼續舉例:    
       例用戶訪問 
http://www.test.com/readme,但www.test.com上並不存在readme頁面,他是偷偷從另一臺服務器上取回來,而後做爲本身的內容返回用戶,但用戶並不知情。這裏所提到的 www.test.com 這個域名對應的服務器就設置了反向代理功能。

       結論就是,反向代理正好相反,對於客戶端而言它就像是原始服務器,而且客戶端不須要進行任何特別的設置。客戶端向反向代理的命名空間(name-space)中的內容發送普通請求,接着反向代理將判斷向何處(原始服務器)轉交請求,並將得到的內容返回給客戶端,就像這些內容本來就是它本身的同樣。

(3).二者區別

用途上來說:

       正向代理的典型用途是爲在防火牆內的局域網客戶端提供訪問Internet的途徑。正向代理還可使用緩衝特性減小網絡使用率。反向代理的典型用途是將防火牆後面的服務器提供給Internet用戶訪問。反向代理還能夠爲後端的多臺服務器提供負載平衡,或爲後端較慢的服務器提供緩衝服務。另外,反向代理還能夠啓用高級URL策略和管理技術,從而使處於不一樣web服務器系統的web頁面同時存在於同一個URL空間下。

安全性來說:

       正向代理容許客戶端經過它訪問任意網站而且隱藏客戶端自身,所以你必須採起安全措施以確保僅爲通過受權的客戶端提供服務。反向代理對外都是透明的,訪問者並不知道本身訪問的是一個代理。

6.nginx代理模塊

說明:代理模塊的指令有不少我這裏只講解重要的proxy_pass,想了解更多代理指令請參考官方中文文檔。

這個模塊能夠轉發請求到其餘的服務器。HTTP/1.0沒法使用keepalive(後端服務器將爲每一個請求建立而且刪除鏈接)。nginx爲瀏覽器發送HTTP/1.1併爲後端服務器發送HTTP/1.0,這樣瀏覽器就能夠爲瀏覽器處理keepalive。    

以下例:

location / {
   proxy_pass        http: //localhost :8000;
   proxy_set_header  X-Real-IP  $remote_addr;
}

注意,當使用http proxy模塊(甚至FastCGI),全部的鏈接請求在發送到後端服務器以前nginx將緩存它們,所以,在測量從後端傳送的數據時,它的進度顯示可能不正確。

7.配置反向代理

[root@xiao59 ~]# cd  /usr/local/nginx/conf/

[root@xiao59 conf]# cp nginx.conf nginx.conf.bak

[root@xiao59 conf]# vim nginx.conf

====================

        location / {

          proxy_pass  http://10.10.54.58;

        }

=======================

指令說明:proxy_pass

語法:proxy_pass URL
默認值:no       
使用字段:location, location中的if字段       
這個指令設置被代理服務器的地址和被映射的URI,地址可使用主機名或IP加端口號的形式,例如:
proxy_pass      http://localhost:8000/uri/;

8.重啓服務

[root@xiao59 conf]# /etc/init.d/nginx restart

9.測試

瀏覽器輸入:10.10.54.59(當咱們訪問10.10.54.59時,被代理從新定向到10.10.54.58上)

10.查看WEB服務器日誌

[root@xiao58 ~]# tail -f /var/log/httpd/access_log 

注:能夠看到咱們這裏的客戶的IP全是,nginx代理服務器的IP,並非真實客戶端的IP。下面咱們修改一下,讓日誌的IP顯示真實的客戶端的IP。

11.修改nginx配置文件

[root@xiao59 ~]# vim /usr/local/nginx/conf/nginx.conf

==============================================

location / {
         proxy_pass      http: //192 .168.18.201;
         proxy_set_header  X-Real-IP  $remote_addr;  #加上這一行
}

===============================================

指令說明proxy_set_header

語法:proxy_set_header header value 
默認值: Host and Connection 
使用字段:http, server, location 

這個指令容許將發送到被代理服務器的請求頭從新定義或者增長一些字段。這個值能夠是一個文本,變量或者它們的組合。proxy_set_header在指定的字段中沒有定義時會從它的上級字段繼承。

12.重啓服務

[root@xiao59 conf]# /etc/init.d/nginx restart

13.測試並查看日誌

[root@xiao58 ~]# tail -f /var/log/httpd/access_log 

注,你們能夠看到日誌記錄的仍是代理的IP,沒有顯示真實客戶端的IP.

14.查看並修改httpd配置文件

[root@xiao58 ~]# vim /etc/httpd/conf/httpd.conf 

============================================================

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined#修改成以下

LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" 

combined

=============================================

15.重啓並測試

[root@xiao58 ~]# /etc/init.d/httpd restart

[root@xiao58 ~]# tail -f /var/log/httpd/access_log 

注,你們能夠看到如今的日誌裏記錄的IP地址就是真實的客戶端地址了

.Nginx之負載均衡

1.upstream 負載均衡模塊說明

案例:下面設定負載均衡的服務器列表。

upstream www.ssr.com {
server 10.10.54.54:80;
server 10.10.54.59:8090  max_fails=3  fail_timeout=20s;
server 10.10.54.56:8060;
}
server {
   location / {
     proxy_pass  http: //www.ssr .com;
   }
}

upstream是Nginx的HTTP Upstream模塊,這個模塊經過一個簡單的調度算法來實現客戶端IP到後端服務器的負載均衡。在上面的設定中,經過upstream指令指定了一個負載均衡器的名稱www.ssr.com。這個名稱能夠任意指定,在後面須要用到的地方直接調用便可。

2.upstream 支持的負載均衡算法

Nginx的負載均衡模塊目前支持4種調度算法,下面進行分別介紹,其中後兩項屬於第三方調度算法。  

  • 輪詢(默認)。每一個請求按時間順序逐一分配到不一樣的後端服務器,若是後端某臺服務器宕機,故障系統被自動剔除,使用戶訪問不受影響。Weight 指定輪詢權值,Weight值越大,分配到的訪問機率越高,主要用於後端每一個服務器性能不均的狀況下。

  • ip_hash。每一個請求按訪問IP的hash結果分配,這樣來自同一個IP的訪客固定訪問一個後端服務器,有效解決了動態網頁存在的session共享問題。

  • fair。這是比上面兩個更加智能的負載均衡算法。此種算法能夠依據頁面大小和加載時間長短智能地進行負載均衡,也就是根據後端服務器的響應時間來分配請求,響應時間短的優先分配。Nginx自己是不支持fair的,若是須要使用這種調度算法,必須下載Nginx的upstream_fair模塊。

  • url_hash。此方法按訪問url的hash結果來分配請求,使每一個url定向到同一個後端服務器,能夠進一步提升後端緩存服務器的效率。Nginx自己是不支持url_hash的,若是須要使用這種調度算法,必須安裝Nginx 的hash軟件包。

3.upstream 支持的狀態參數

在HTTP Upstream模塊中,能夠經過server指令指定後端服務器的IP地址和端口,同時還能夠設定每一個後端服務器在負載均衡調度中的狀態。經常使用的狀態有:      

  • down,表示當前的server暫時不參與負載均衡。

  • backup,預留的備份機器。當其餘全部的非backup機器出現故障或者忙的時候,纔會請求backup機器,所以這臺機器的壓力最輕。

  • max_fails,容許請求失敗的次數,默認爲1。當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤。

  • fail_timeout,在經歷了max_fails次失敗後,暫停服務的時間。max_fails能夠和fail_timeout一塊兒使用。

注,當負載調度算法爲ip_hash時,後端服務器在負載均衡調度中的狀態不能是weight和backup。

4.配置nginx負載均衡

[root@CentOS001 ~]# mkdir -p /usr/local/nginx/virtual/www.ssr.com.conf 

[root@CentOS001 ~]# vim /usr/local/nginx/virtual/www.ssr.com.conf 

======================================

upstream www.ssr.com {

    server 10.10.54.54:80 max_fails=3 weight=1 fail_timeout=60s;

    server 10.10.54.59:8090 max_fails=3 weight=2 fail_timeout=60s;

    server 10.10.54.56:8060;

    }

server {

    listen       80;

    server_name  www.ssr.com;

    charset utf-8;

    access_log  logs/www.access.log  main;

    index index.html;

    location /upload {

        autoindex on;

        }

    location /download {

        rewrite ^/download$ /upload last;

        }

    location / {

        proxy_pass http://www.ssr.com;

        proxy_set_header HOST $host;

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        }

    }

=======================================================================

[root@CentOS001 ~]# vim /usr/local/nginx/conf/nginx.conf

================================

##加到HTTP中

include /usr/local/nginx/virtual/www.ssr.com.conf;

================================

注,upstream是定義在server{ }以外的,不能定義在server{ }內部。定義好upstream以後,用proxy_pass引用一下便可。

5.從新加載一下配置文件

[root@CentOS001 ~]# /etc/init.d/nginx restart

6.修改web服務器的端口

[root@xiao56 ~]# vim /etc/httpd/conf/httpd.conf 

============================

Listen 8060

ServerName www.ssr.com:8060

NameVirtualHost *:8060

<VirtualHost  *:8060>

    ServerAdmin wangxq@ssr.com

    DocumentRoot /var/www/html

    ServerName www.ssr.com

    ErrorLog logs/www-error_log

    CustomLog logs/www-access_log common

</VirtualHost>

=============================

重啓服務:[root@xiao56 ~]# /etc/init.d/httpd restart

//10.10.54.59也作相應操做,端口號改成8090.

7.測試一下

瀏覽器輸入:10.10.54.54

注,你們能夠不斷的刷新瀏覽的內容,能夠發現56與59是交替出現的,達到了負載均衡的效果。

相關文章
相關標籤/搜索