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包

[[email protected] ~]# rpm -ivh nginx-1.6.2-1.el6.ngx.x86_64.rpm
[[email protected] ~]# 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服务即可

[[email protected] ~]# echo "WEB-01" >>/var/www/html/index.html
[[email protected] ~]# service httpd start

Nginx设置

设置前先备份配置文件

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

修改配置文件

[[email protected] 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服务器设置

[[email protected] ~]# mkdir /var/www/html/bbs
[[email protected] ~]# 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服务器响应

路径别名

将访问forum的URL,转发到后端的bbs。不一定要location的URL和后端一致。

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

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

使用正则表达式的匹配

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

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

[[email protected] ~]# 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服务器把图片放到指定目录即可

[[email protected] html]# mkdir images
[[email protected] html]# cp 1.jpg images/

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

处理日志问题

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

[[email protected] ~]# 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

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

[[email protected] 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|off:nginx收到客户端请求报文后,直接封装成新报文,发送给后端服务器

proxy_buffer:缓冲大小

Nginx代理缓存

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

[[email protected] ~]# 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级子目录有两个字符

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

设置缓存目录

[[email protected] ~]# mkdir -p /cache/nginx
[[email protected] ~]# chown -R nginx:nginx /cache/nginx/

定义server或location启用缓存

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;
    }

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

[[email protected] ~]# tree /cache/nginx/
/cache/nginx/
└── e
    └── d
        └── 29262f3ee6c380561111eba521f7cfde

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

负载均衡模块

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

配置负载均衡:

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

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

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

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

在http字段定义

[[email protected] ~]# 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;
    }

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

[[email protected] ~]# curl 172.16.4.100/forum/
web-01
[[email protected] ~]# curl 172.16.4.100/forum/
web-02
[[email protected] ~]# curl 172.16.4.100/forum/
web-01
[[email protected] ~]# curl 172.16.4.100/forum/
web-02

定义后端服务器权重

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

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

访问验证:

[[email protected] ~]# curl 172.16.4.100/forum/
web-01
[[email protected] ~]# curl 172.16.4.100/forum/
web-02
[[email protected] ~]# curl 172.16.4.100/forum/
web-01
[[email protected] ~]# curl 172.16.4.100/forum/
web-01
[[email protected] ~]# curl 172.16.4.100/forum/
web-02
[[email protected] ~]# curl 172.16.4.100/forum/
web-01
[[email protected] ~]# curl 172.16.4.100/forum/
web-01

基于ip地址哈希调度

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

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

[[email protected] ~]# curl 172.16.4.100/forum/
web-02
[[email protected] ~]# curl 172.16.4.100/forum/
web-02
[[email protected] ~]# 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就不会出现了

[[email protected] ~]# curl 172.16.4.100/forum/
web-01
[[email protected] ~]# curl 172.16.4.100/forum/
web-01
[[email protected] ~]# 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-01的httpd服务,web-02就可用了

访问验证

[[email protected] ~]# curl 172.16.4.100/forum/
web-02
[[email protected] ~]# curl 172.16.4.100/forum/
web-02
[[email protected] ~]# 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

时间: 2024-10-09 05:16:30

Nginx反向代理、缓存、负载均衡的相关文章

马哥学习笔记二十八——nginx反向代理,负载均衡,缓存,URL重写及读写分离

Nginx反向代理 Nginx通过proxy模块实现反向代理功能.在作为web反向代理服务器时,nginx负责接收客户请求,并能够根据URI.客户端参数或其它的处理逻辑将用户请求调度至上游服务器上(upstream server).nginx在实现反向代理功能时的最重要指令为proxy_pass,它能够将location定义的某URI代理至指定的上游服务器(组)上.如下面的示例中,location的/uri将被替换为上游服务器上的/newuri. location /uri { proxy_pa

[转载]Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统为 CentOS 6.4 x86_64 , Nginx 是版本是最新版的1.4.2,所以实验用到的软件请点击这里下载:http://yunpan.cn/QXIgqMmVmuZrm 一.前言 在前面的几篇博文中我们主要讲解了Nginx作为Web服务器知识点,主要的知识点有nginx的理论详解.ngin

Nginx反向代理,负载均衡,redis session共享,keepalived高可用

相关知识自行搜索,直接上干货... 使用的资源: nginx主服务器一台,nginx备服务器一台,使用keepalived进行宕机切换. tomcat服务器两台,由nginx进行反向代理和负载均衡,此处可搭建服务器集群. redis服务器一台,用于session的分离共享. nginx主服务器:192.168.50.133 nginx备服务器:192.168.50.135 tomcat项目服务器1:192.168.50.137 tomcat项目服务器2:192.168.50.139 redis服

Web服务之Nginx反向代理与负载均衡

一.代理 正向代理: 正向代理是一个位于客户端和目标服务器之间的服务器,为了从目标服务器取得内容,客户端向代理发送一个请求并指定目标服务器,然后代理向目标服务器转交请求并将获得的内容返回给客户端.客户端必须要进行一些特别的设置才能使用正向代理. 作用: 访问无法访问的服务器(翻墙,懂得) 加速访问目标服务器(链路加速) Cache缓存(访问加速) 实现客户端访问授权 隐藏访问者 反向代理: 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转

[转]Nginx反向代理和负载均衡部署指南

Nginx反向代理和负载均衡部署指南 1.        安装 1)         从Nginx官网下载页面(http://nginx.org/en/download.html)下载Nginx最新版本(目前是1.5.13版本)安装包: 2)         解压后复制到部署目录. 2.        启动和停止Nginx Nginx目前只支持命令行操作,操作前先进入Dos命令环境,并进入Nginx部署目录. 1)         启动Nginx:start nginx 2)         停

基于Nginx反向代理及负载均衡

基于Nginx反向代理及负载均衡 参考:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass 只要没有被启用,默认就是开启的,因为proxy属于nginx内置标准模块,通常实现代理的时候,最核心模块是proxy_pass,用于将用户请求的rui递交至上游服务器的某个URI但这个模块大部分用于location当中,因此要实现将某一URI的访问代理某个上游服务器大致的格式为: location /name/ { pro

Nginx反向代理、负载均衡, keepalived高可用

Nginx反向代理.负载均衡,  keepalived高可用 Nginx反向代理.负载均衡,  keepalived高可用 一.Nginx反向代理.负载均衡 1.什么是反向代理.负载均衡 严格的说,Nginx仅仅是作为Nginx Proxv反向代理使用的,因为这个反向代理功能表现的效果是负载均衡集群的效果,所以本文称之为Nginx负载均衡.那么,反向代理和负载均衡有什么区别呢? 普通负载均衡软件,例如大名鼎鼎的LVS,其实现的功能只是对请求数据包的转发(也可能会改写数据包).传递,其中DR模式明

Nginx系列-11.配置Nginx反向代理和负载均衡

Nginx系列-11.配置Nginx反向代理和负载均衡 目录 - Nginx系列 Nginx系列-1.Linux下安装Nginx Nginx系列-2.配置LNMP(Linux.Nginx.MySQL.PHP)架构 Nginx系列-3.配置Nginx虚拟主机 Nginx系列-4.Nginx日志配置及日志切割 Nginx系列-5.配置Nginx的防盗链 Nginx系列-6.配置Nginx的HTTPS Nginx系列-7.配置Nginx使用uwsgi支持web.py框架 Nginx系列-8.配置Ngi

nginx学习3:实现nginx反向代理和负载均衡

nginx学习3:实现nginx反向代理和负载均衡 正向代理和反向代理的区别(这里不赘述什么是正向代理和反向代理) 一句话概括:正向代理隐藏真实客户端,反向代理隐藏真实服务端:即正向代理服务器不知道客户端是谁,反向代理客户端不知道服务器是谁: 反向代理实例1 需求描述:输入nginx监听IP:8081,可以访问真实的IP:8088 tomcat服务 准备tomcat服务 1-准备tomcat服务(8088端口) 2-开放防火墙8088端口 ##添加8088端口[[email protected]

Nginx反向代理、负载均衡、页面缓存、URL重写及读写分离详解

大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统为 CentOS 6.4 x86_64 , Nginx 是版本是最新版的1.4.2,所以实验用到的软件请点击这里下载:http://yunpan.cn/QXIgqMmVmuZrm 一.前言 在前面的几篇博文中我们主要讲解了Nginx作为Web服务器知识点,主要的知识点有nginx的理论详解.ngin