码迷,mamicode.com
首页 > 其他好文 > 详细

Nginx反向代理、缓存、负载均衡

时间:2015-06-10 01:16:15      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:nginx负载均衡   nginx反向代理   nginx缓存   

环境介绍


主机名

系统环境

Ip地址

Nginx

nginx

Centos 6.6 64

172.16.4.100

Web-01

Web-01

Centos 6.6 64

172.16.4.101

Web-02

Web-02

Centos 6.6 64

172.16.4.102

安装nginx

使用官网制作好的rpm

[root@nginx ~]# rpm -ivh nginx-1.6.2-1.el6.ngx.x86_64.rpm
[root@nginx ~]# service nginx start

访问测试,出现如下页面表示nginx安装正常         

技术分享

反向代理

功能:用户请求服务时请求nginx服务器,nginx根据用户请求的信息,和服务器的设置判断交给什么服务器进行处理。

配置示例:

       server{       #在server段中定义
           listen
           server_name
           location/ {   #当访问这个location的时候,转发到其他web服务器
              proxy_passhttp://172.16.4.100:80/;  #定义转发的服务器
           }
       }

两个例外:

1、模式匹配:如果使用正则表达式向后匹配,那么location给出的url就不是真正的URL而是一个模式,模式是无法向后映射成为URL的路径的,会在转发服务器的路径后添加这个模式对应的路径。

           location  /uri {  #这个url路径如果使用模式匹配
              proxy_passhttp://back_server:port/newuri/url;  #那么映射后的路径就不是newurl,而是在newurl后面补上匹配到的url路径
           }

2、设置了rewrite指令

           location  /uri {
              rewrite
              proxy_passhttp://back_server:port/重写后的路径;#会在请求页面后直接添加重写后的路径
           }

设置反向代理

代理所有请求到后端web server配置

后端web服务器设置

提供web页面,并启动web服务即可

[root@web-01 ~]# echo "WEB-01" >>/var/www/html/index.html
[root@web-01 ~]# service httpd start

Nginx设置

设置前先备份配置文件

[root@nginx ~]# cd /etc/nginx/conf.d/
[root@nginx conf.d]# cp default.conf{,.bak}

修改配置文件

[root@nginx conf.d]# vim default.conf
server {
   listen       80;
   server_name  localhost;
 
    location/ {
       #root   /usr/share/nginx/html;
       proxy_pass    #表示将用户请求转发到172.16.4.101服务器 
       index  index.html index.htm;
    }
}

访问nginx就跳转到了后端的web-01服务器

技术分享

只代理一个目录配置

将访问nginx服务器bbs的目录的请求转发给后端web服务器

Web服务器设置

[root@web-01 ~]# mkdir /var/www/html/bbs
[root@web-01 ~]# echo "WEB-01-bbs">> /var/www/html/bbs/index.html

Nginx设置

    location/ {
       root   /usr/share/nginx/html;
       #proxy_pass http://172.16.4.101/;
       index  index.html index.htm;
    }
    location/bbs/ {      
       proxy_pass http://172.16.4.101/bbs/;
    }

验证:

访问首页是nginx服务器响应

技术分享

访问bbs目录是后端web服务器响应

技术分享

路径别名

将访问forumURL,转发到后端的bbs。不一定要locationURL和后端一致。

    location/forum/ {  
       proxy_pass http://172.16.4.101/bbs/;
    }

访问forum目录,但是响应的内容确实bbs目录

技术分享

使用正则表达式的匹配

将所有图片定义到指定的后端服务器

Web服务器需要在指定目录放一张图片即可

[root@web-01 ~]# ll /var/www/html/
total 124
-rw-r--r-- 1 root root 104372 Mar  7  20101.jpg

Nginx配置

    location~* \.(jpg|png|gif)$ {
       proxy_pass http://172.16.4.101;
    }

验证,访问nginx服务器但是出现了web服务器提供的图片

技术分享

 

把图片放到指定的目录

nginx配置文件的设置方法和上面一样不需要改变

    location~* \.(jpg|png|gif)$ {
       proxy_pass http://172.16.4.101;
    }

只需要web服务器把图片放到指定目录即可

[root@web-01 html]# mkdir images
[root@web-01 html]# cp 1.jpg images/

验证,出现的图片还是后端web服务器的

技术分享

处理日志问题

查看httpd的访问日志,发现是nginx服务器访问的而不是客户端,这样不利于做日志的分析

[root@web-01 ~]# tail /var/log/httpd/access_log
172.16.4.100 - - [27/May/2015:10:00:14 +0800]"GET / HTTP/1.0" 200 7 "-" "curl/7.19.7(x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.15.3 zlib/1.2.3 libidn/1.18libssh2/1.4.2"

解决方法

Nginx服务器设置,将用户请求报文封装一份,发送给后端web服务器

  location/forum/ {
       proxy_pass http://172.16.4.101/bbs/;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
    }
    location~* \.(jpg|png|gif)$ {
       proxy_pass http://172.16.4.101;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
    }

Httpd服务器设置

修改日志记录方式

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

客户端访问一次,查看日志就是记录客户端的地址了

[root@web-01 html]# tail -1 /var/log/httpd/access_log
172.16.250.208 - - [27/May/2015:11:13:27 +0800]"GET /bbs/ HTTP/1.0" 304 - "-" "Mozilla/5.0 (WindowsNT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81Safari/537.36"

 

代理段其他参数说明:

proxy_connect_timeout:指定连接后端服务器超时时长

proxy_hide_header:设定发给客户端的报文隐藏首部

proxy_read_timeout:后端接受了nginx请求报文,但是没有响应的超时时间

proxy_pass_request_headers on|offnginx收到客户端请求报文后,直接封装成新报文,发送给后端服务器

proxy_buffer:缓冲大小


Nginx代理缓存

修改nginx配置文件,在httpd字段中设置缓存目录

[root@nginx ~]# vim /etc/nginx/nginx.conf
proxy_cache_path /cache/nginx/ levels=1:1keys_zone=mycache:32M

配置说明:

proxy_cache_path /cache/nginx/ #指定缓存目录

levels=1:1                   #指定目录级别

keys_zone=mycache:32M      #指定缓存在内存中的名称和大小(内存中只有键,没有值)

 

缓存目录级别说明:

levels=1:1          #标志缓存有2级子目录,一级子目录一个字符,二级子目录两个字符

levels=2:2          #表示缓存2级子目录,一级子目录有两个字符,2级子目录有两个字符

最多有三级目录,每个目录最多有三个字符

 

设置缓存目录

[root@nginx ~]# mkdir -p /cache/nginx
[root@nginx ~]# chown -R nginx:nginx /cache/nginx/

定义serverlocation启用缓存

location/forum/ {
       proxy_cache mycache;     #启用缓存,指明缓存所在的内存空间名称
       proxy_cache_valid 200 1d;  #200状态码内容缓存一天
       proxy_cache_valid 301 302 10m;  #301,302状态码缓存10分钟
       proxy_cache_valid any 1m;               #所有内容缓存1分钟
       proxy_cache_use_stale error timeout http_500 http_502 http_503; #后端服务器错误,响应超时,出现5xx类状态码的请求可以使用过期缓存
       proxy_pass http://172.16.4.101/bbs/;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
    }
    location~* \.(jpg|png|gif)$ {
       proxy_cache mycache;
       proxy_cache_valid 200 1d;
       proxy_cache_valid 301 302 10m;
       proxy_cache_valid any 1m;
       proxy_cache_use_stale error timeout http_500 http_502 http_503;
       proxy_pass http://172.16.4.101;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
    }

设置完成之后,使用客户端访问一次在缓存目录下就会产生缓存,用户再次访问相同内容就是在缓存中响应,效果和启用持久连接类似

[root@nginx ~]# tree /cache/nginx/
/cache/nginx/
└── e
    └── d
        └── 29262f3ee6c380561111eba521f7cfde

说明:如果将缓存目录的磁盘为固态硬盘,并且做成RAID1,那么性能就是非常牛逼的。

负载均衡模块

proxy_pass有一个缺点,就是只能代理一个主机,而负载均衡就是可以定义一个组,可以被proxy_pass代理,而且还可以根据调度算法代理。


配置负载均衡:

说明:配置之前关闭缓存功能,否则影响验证效果。

 

后端准备两台web服务器提供不同web页面以便验证负载均衡效果。

[root@web-01 ~]# echo "web-01" > /var/www/html/bbs/index.html
[root@web-02 ~]# echo "web-02" > /var/www/html/bbs/index.html

定义组,将后端web服务器01和02定义为一个组

http字段定义

[root@nginx ~]# vim /etc/nginx/nginx.conf
    upstreamup servers {
      server 172.16.4.101;
      server 172.16.4.102;
    }

转发时使用upstream定义的组

    location/forum/ {
       proxy_pass http://upservers/bbs/;  #将原本的转发地址设置为upstream组
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

验证负载均衡,默认为轮询

[root@nginx ~]# curl 172.16.4.100/forum/
web-01
[root@nginx ~]# curl 172.16.4.100/forum/
web-02
[root@nginx ~]# curl 172.16.4.100/forum/
web-01
[root@nginx ~]# curl 172.16.4.100/forum/
web-02

 

定义后端服务器权重

Server后根weight=number定义服务器权重

    upstreamupservers {
      server172.16.4.101 weight=2;
      server172.16.4.102;
    }

访问验证:

[root@nginx ~]# curl 172.16.4.100/forum/
web-01
[root@nginx ~]# curl 172.16.4.100/forum/
web-02
[root@nginx ~]# curl 172.16.4.100/forum/
web-01
[root@nginx ~]# curl 172.16.4.100/forum/
web-01
[root@nginx ~]# curl 172.16.4.100/forum/
web-02
[root@nginx ~]# curl 172.16.4.100/forum/
web-01
[root@nginx ~]# curl 172.16.4.100/forum/
web-01

基于ip地址哈希调度

    upstreamupservers {
     ip_hash;        #表示启用基于ip地址哈希调度的方法
      server172.16.4.101;
      server172.16.4.102;
    }

访问验证,相同的ip地址访问就始终定位到一台服务器响应

[root@nginx ~]# curl 172.16.4.100/forum/
web-02
[root@nginx ~]# curl 172.16.4.100/forum/
web-02
[root@nginx ~]# curl 172.16.4.100/forum/
web-02

后端服务器健康检测

max_fails=number  错误到达指定次数,标记为失败,在可用列表中移除

fail_timeout=time   超时时长

upstream定义

    upstreamupservers {
      server172.16.4.101 max_fails=2 fail_timeout=1;
      server172.16.4.102 max_fails=2 fail_timeout=1;
    }

当掉web-02服务器访问验证,web2就不会出现了

[root@nginx ~]# curl 172.16.4.100/forum/
web-01
[root@nginx ~]# curl 172.16.4.100/forum/
web-01
[root@nginx ~]# curl 172.16.4.100/forum/
web-01

 

手动下线服务器

down backup

 down一直不用

 backup所有主机不可用才使用

示例:标记web-02为备用,那么主要web-01可用就不会使用web-02

    upstreamupservers {
      server172.16.4.101 max_fails=2 fail_timeout=1;
      server172.16.4.102 max_fails=2 fail_timeout=1 backup;
    }

关闭web-01httpd服务,web-02就可用了

访问验证

[root@nginx ~]# curl 172.16.4.100/forum/
web-02
[root@nginx ~]# curl 172.16.4.100/forum/
web-02
[root@nginx ~]# curl 172.16.4.100/forum/
web-02


自定义响应首部:

示例:返回响应服务器地址

server {
   listen       80;
   server_name  localhost;
add_header X-via $server_addr;   #添加这一行内容即可
    ……
}

技术分享

缓存命中返回

修改配置文件

server {
   listen       80;
   server_name  localhost;
    add_header X-via $server_addr;
   add_header X-Cache $upstream_cache_status;   #返回命中信息
 
    location/forum/ {
       proxy_pass http://172.16.4.101/bbs/;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
        proxy_cachemycache;                  #返回响应时,需要开启缓存功能
       proxy_cache_valid 200 1d;
       proxy_cache_valid 301 302 10m;
       proxy_cache_valid any 1m;
       proxy_cache_use_stale error timeout http_500 http_502 http_503;
}
}

第一次访问未命中

技术分享

第二次访问命中

技术分享



官方配置资料:

代理和缓存:http://nginx.org/en/docs/http/ngx_http_proxy_module.html

负载均衡:http://nginx.org/en/docs/stream/ngx_stream_upstream_module.html


本文出自 “梅花香自苦寒来” 博客,请务必保留此出处http://ximenfeibing.blog.51cto.com/8809812/1660240

Nginx反向代理、缓存、负载均衡

标签:nginx负载均衡   nginx反向代理   nginx缓存   

原文地址:http://ximenfeibing.blog.51cto.com/8809812/1660240

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!