最近開始研究Nginx配置,哎~現(xiàn)在出去面試機會都會問到,不學不行了,先從簡單的開始吧,這兩天研究張宴的博客,自己也做了一次配置,分享一下。

    概述:反向代理是指的,服務器代理網(wǎng)絡(luò)上的客戶機請求,將請求轉(zhuǎn)達給內(nèi)部真實服務器,然后在返回給Internet客戶端,代理服務器上面沒有任何網(wǎng)頁資料。反向代理和正向代理沒有沖突,可以在防火墻設(shè)備中同時使用這兩種結(jié)合,正向代理可以進行過濾,保護內(nèi)部網(wǎng)絡(luò)安全。

               軟件七層負載均衡大多是基于HTTP反向代理,Nginx反向代理能夠支持虛擬主機,可以按照輪詢,IP哈希,URL哈希,權(quán)重方式對后端服務器做負載均衡,還支持后端服務器健康檢查。

   常見的Web負載均衡方法:

                                                     1、 DNS輪詢:將同一個主機名添加多個A記錄,DNS將解析請求安裝A記錄的順序,隨即分配到不同的IP上,使用dig baidu.com 就可以看到不同的A記錄對應的IP地址。缺點:可靠性低,其中一臺出現(xiàn)故障,就不會給予回應,就算從DNS去掉該服務器IP,但是也會保存在各地區(qū)的ISP眾多的DNS緩存中。系統(tǒng)股災不均衡,使用簡單輪詢,不能計算出服務器的負載差異,所以有可能客戶集中請求到其中某一臺服務器。

                                                   2、F5、LVS、DNS只能解析這里不做講述

配置環(huán)境:

三臺CentOS5.3,一臺做nginx代理,2臺apache做頁面測試。apache端口改為:8080,nginx使用80口接收客戶請求

yum -y install pcre-devel openssl openssl-devel                   //安裝包,否則編譯時候出錯

#useradd  www

#groupadd  www

#usermod -g www www         //設(shè)置nginx的用戶和組

#tar  xzvf  pcre-7.8.tar.gz

#./configure

#make ; make install                //安裝pcre讓nginx支持rewrite重寫方便以后所需

[root@localhost tar]# cd nginx-0.7.16/

[root@localhost nginx-0.7.16]# ./configure  --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module

 --with-http_stub_status_module:這個模塊用于獲取nginx自上次啟動以來的工作狀態(tài),非核心模塊

--with-http_ssl_module               : 把ssl編譯進去, 僅僅指定openssl庫的源代碼路徑還是不夠的

[root@localhost nginx-0.7.16]#make  ; meke install

#cd   /usr/local/nginx/conf/nginx.conf

#vi  nginx.conf

user  www www;                       //設(shè)置用戶和組

worker_processes  4;             //生成進程數(shù),等于CPU總核數(shù)兩倍
 
error_log  /data1/logs/nginx_error.log crit;      //錯誤日志路徑,錯誤日志可選項為:【debug  info  notice  warn  error   crit】
 
pid        /usr/local/nginx/logs/nginx.pid;              //PID路徑
worker_rlimit_nofile 51200;                                 //指定文件描述符數(shù)量
 
events {
    use epoll;               //使用網(wǎng)絡(luò)I/O模型
    worker_connections  51200;            //允許連接數(shù),文件描述符
}
 
 
http
 {
    include       mime.types;           //文件類型
    default_type  application/octet-stream;         //默認文件類型
    charset  UTF-8                       //語言類型
    server_names_hash_bucket_size 128;               //根據(jù)CPU的cache來設(shè)定
    client_header_buffer_size 4;          //記錄緩存4k
    large_client_header_buffers 4 8k;      //如果4k不夠,用8k
 
    sendfile        on;         //指定nginx是否調(diào)用sendfile函數(shù)(zero copy方式)來輸出文件,普通應用必須設(shè)為on,對于普通文件用on。如果進行下載I/O負載應用,設(shè)置為off,以平衡磁盤磁盤和網(wǎng)絡(luò)I/O處理速度。
    #tcp_nopush     on;      //允許或禁止使用socket的TCP_NOPUSH(on freebsd或TCP_COR(on  linux),此選擇僅僅在使用sendfile時候可用,
 
    keepalive_timeout  65;            //長連接超時時間
    tcp_nodelay on;
    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ù)據(jù)流
    gzip on;                          //off關(guān)閉或者on開啟gzip功能
    gzip_min_length 1k;  //設(shè)置允許壓縮最小字節(jié)數(shù),0表示多大都壓,最好設(shè)置大于1k,小于1k越壓越大
    gzip_buffers 4 16k;        //系統(tǒng)獲取幾個單位的緩存,用于存儲gzip壓縮結(jié)果數(shù)據(jù)流。4 4k 代表以4k為單位,按照原始數(shù)據(jù)大小以4k為單位的4倍申請內(nèi)存。 4 8k 代表以8k為單位,按照原始數(shù)據(jù)大小以8k為單位的4倍申請內(nèi)存,如果沒有設(shè)置,默認值是申請跟原始數(shù)據(jù)相同大小的內(nèi)存空間去存儲gzip壓縮結(jié)果。
    gzip_http_version 1.1;    //判斷http協(xié)議版本,是否支持壓縮,否則用戶看到亂碼。默認即可,大部分都得支持
    gzip_comp_level 2;     //gzip壓縮比,1 壓縮比最小處理速度最快,9 壓縮比最大但處理最慢
    gzip_types text/plain application/x-javascript text/css application/xml;     //默認nginx是開啟gzip壓縮,但是只針對html文件押送  gzip_types       text/plain application/x-javascript text/css text/html application/xml text/javascript;  在nginx的gzip的gzip_types加上
    gzip_vary on;   //和http頭有關(guān)系,加個vary頭,給代理服務器用的,有的瀏覽器支持壓縮,有的不支持,所以避免浪費不支持的也壓縮,所以根據(jù)客戶端的HTTP頭來判斷,是否需要壓縮。
 
    client_max_body_size 50m;             //允許客戶端請求的最大單個文件字節(jié)數(shù)
    client_body_buffer_size 128k;        //緩沖區(qū)代理用戶端請求的最大字節(jié)數(shù),可以理解先保存到本地在穿給用戶
    proxy_connect_timeout 600;        //和后端服務器連接的超時時間,發(fā)起握手等候相應超時時間
    proxy_read_timeout 600;         //連接成功后,等待后端服務器相應時間,已經(jīng)進入后端的排隊之中等候處理
    proxy_send_timeout 600;        //后端服務器數(shù)據(jù)回傳時間,在規(guī)定時間內(nèi)服務器必須傳完所有數(shù)據(jù)
    proxy_buffer_size 16k;        //只保存用戶頭信息一共nginx進行規(guī)則處理,用于緩存代理請求
    proxy_buffers    4 32k;     //告訴nginx保存單個用的幾個Buffer最大用多大空間
    proxy_busy_buffers_size 64k;   //如果系統(tǒng)很忙可以申請更大的proxy_buffers,官方推薦 *2
    proxy_temp_file_write_size 64k;    //proxy緩存臨時文件大小
 
    upstream http_server_pool {
        server 192.168.1.2:8080 weight=4 max_fails=2 fail_timeout=30s;
        server 192.168.1.3:8080 weight=2 max_fails=2 fail_timeout=30s;
     }          //設(shè)置地址池,后端2臺服務器
 
    server          //第一個虛擬主機,反向代理http_server_pool這組服務器
      {
        listen       80;                                        //監(jiān)聽端口
        server_name  www.xiao.com;           //主機名稱
 
        location /
        {
                proxy_next_upstream error timeout invalid_header http_500 http_503 http_404; //http://www.2tutu.com/post/2008/631.html         //后端服務器返回500 503 404錯誤,自動請求轉(zhuǎn)發(fā)到upstream池中另一臺服務器
                proxy_pass http://http_server_pool;
                proxy_set_header Host www.xiao.com;
                proxy_set_header X-Forwarded-For  $remote_addr;
        }
        access_log  logs/www.xiao.com.access.log  combined;
       }
       }
proxy_set_header Host www.xiao.com
proxy_set_header  Host  $host 首先說明 proxy_set_header 指令在向反向代理的后端Web服務器發(fā)起請求時添加指定的 Header頭信息,后端web服務器有多個基于域名的虛擬主機時,通過頭信息Host,用于指定請求的域名,這樣后端web才能識別反向代理請求哪個虛擬主機處理。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for :聯(lián)系下面PS中所寫,在后端web中就算加上$http_x_Forwarded_for這條,也得不到用戶的IP,所以在nginx反向代理添加Header頭信息 X-Forwarded-For在配合后端服務器日志文件的$http_x_Forwarded_for這條就可以獲得用戶的IP地址了。

 PS:假設(shè)Nginx作為Web服務器,nginx或Squid作為反向代理后,就不能獲取客戶端的真實IP地址了,由于在客戶端和Web增加了中間層,web沒有真實的IP,通過$remote_addr變量拿到是反向代理的IP,Web代理可以增加$http_x_Forwarded_for信息,用于記錄客戶端IP和原來客戶請求的服務器地址,在日志格式中加上即可。

  log_format  main   '$http_x_Forwarded_for '
                       '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /tmp/Nginx.access.log  main;                                 //在后端Web里面加上這樣就可以了

upstream : nginx支持4種算法,下面一一介紹

1、 輪詢

每個請求按時間順序分配到不同的后端服務器了,后端服務器down掉,自動切除。

2、weight

設(shè)定服務器權(quán)值: weight=2

                                  weight=4          服務器性能不均時候使用

3、 ip_hash

每個請求按訪問ip的hash結(jié)果分配,每個訪客有固定的后端服務器,可以解決session問題

4、 fair(第三方)

按后端服務器的響應時間來分配,響應時間短的優(yōu)先分配

5、url_hash (第三方)

按訪問的url的hash結(jié)果分配,使每個url定向到同一個后端服務器,后端為緩存服務器比較有效。

以往的架構(gòu)lvs或者dns輪詢,這樣雖然squid里面的均衡的,但是忽略了一點就是數(shù)據(jù)量,雖然每臺squid是均勻但是都是滿載的,重復的請求,會占用很多空間,在前面換上nginx在配上 url_hash,根據(jù)url分流后,每一個url會只存在一個squid上,每臺squid數(shù)據(jù)完全不同。http://edu.codepub.com/2010/0202/20282.php

upstream http_server {             //定義負載均衡設(shè)備的Ip及設(shè)備狀態(tài)
  ip_hash;
   server 127.0.0.1:9090 down;
   server 127.0.0.1:8080 weight=2;
   server 127.0.0.1:6060;
   server 127.0.0.1:7070 backup;
  }

down : 當前的IP server暫時不參與負載,不進行反向代理

weight: 默認為1,weight越大,負載的權(quán)重越大

max_fails: 允許請求失敗的次數(shù)默認為1,當超過最大次數(shù)時,返回proxy_next_upstream模塊定義的錯誤。

fail_timeout : max_fails次失敗后,暫停的時間

backup:  其它所有非backup機器down或者忙時候,請求backup機器,這臺機器壓力最輕

PS: nginx支持同時設(shè)置多組負載均衡,給不同的server使用

location:設(shè)置對URL進行匹配,比如 location  /  ,  location  /data 這兩個設(shè)置優(yōu)先級,/ 下也可以,但是不如 /data下搜索更快,定位更準。