nginx在应用层实现反向代理,能实现动静分离

lvs是工作在传输层

 

 session保持的方法:

         session绑定:lvssh算法,实现原地址绑定,将来自同一个地址请求,统统定向至此前选定的RS

         session复制:做成集群,将session数据共享,通过多播的方式传递数据,保持数据同步

         session服务器:用memcached,redis(键值存储);做冗余,做负载均衡

key:用户请求的URL hash之后的结果

valueURL对应的资源

 

lvs其实还是ClientReal Server之间进行通信

 

nginxClientNginx反向代理通信,反向代理再去和Real Server通信,取得响应后返回给Client,并保存一份在缓存服务器,当下次用户请求时,直接去查询缓存服务器而不用去找Real Server,且缓存是以键值对形式保存,会更快速的查询到结果

 

架构图简单实例:

Nginx反向代理_Nginx反向代理

 

yum安装nginx,它的安装包在epel源中,安装后的默认页面文件在/usr/share/nginx/html/index.html

 

nginx配置:

main配置段:全局配置段

event{} 定义event模型工作特性

http {} : 定义http协议相关的配置

 

配置成反向代理需要在http段进行配置

ngx_http_proxy_module模块:

默认 server的配置在/etc/nginx/conf.d/default.conf

server{

listen 80;

server_name www.lxproxy.com;

# location / 可以换成任意你想要代理的URL,若为模式匹配会追加到proxy_passURL最后面,且location中存在rewirte的话,会把重写后的URL追加到

proxy_pass最后

location /{

# 表示访问www.lx.com的请求全部反向代理到proxy_pass指定的server

proxy_pass http://www.lxrs1.com;

# 向后端转交请求报文时,还可以添加/修改请求报文头部,如加入CIP [ $remote_addr表示CIP ] 让后端Real Sever记录日志

proxy_set_header HOST $host;

proxy_set_header X-Real-IP $remote_addr;

}

}

设置完报文首部后要编辑后端Real Serverweb服务器配置文件,例httpd

Nginx反向代理_Nginx反向代理_02

修改之后访问,日志中会记录Client IP而不是NginxIP

 

配置缓存机制:

vim /etc/nginx/nginx.conf

http{}中定义

#  /data/nginx/cahce 表示以/data/nginx/cache作为缓存目录,这个目录的属主属组必须是Nginx  用来存储值[ value ]

#  levels=1:2 :隔开有几段就表示有几级子目录,1级子目录的名字用1个字符表示,2级子目录用2个字符表示  

# keys_zone=one:10m 表示在内存中找10m大小取名叫one用来存储键[ key ]

proxy_cache_path /data/nginx/cahce levels=1:2 keys_zone=one:10m;

 

而调用则可以在httpserverlocation

proxy_cache one  表示启用名字为onecahce

proxy_cache_method GET|POST|HEAD 用什么方法请求时缓存,默认是GETHEAD,可以不用定义用默认即可

proxy_cache_min_uses # 请求几次后缓存这个资源,默认是1次,可以不用定义用默认即可

proxy_cache_revalidate on|off  表示当缓存到期时,是否向后端Real Server校验缓存是否修改过,若没修改则继续使用原缓存 默认是off可以开启

proxy_cache_use_stale error|timeout|http_404|off….   当缓存过期,且后端Real Server返回error404 用过期的缓存响应客户端,默认是off

proxy_cache_valid 200 302 10m   当后端Real Server返回了200302就缓存10min

proxy_connect_timeout  60s   等待代理服务器响应超时时长,默认60s,可以不用定义用默认即可

proxy_cache_bypass string:设置在什么情况下nginx将不从cache中取数据;例用户有cookie $cookie_nocache

 

 

Nginx反向代理_Nginx反向代理_03

 

配置负载均衡机制:

upstream只能定义在http{},即定义一个组

 

vim /etc/nginx/conf.d/default.conf

upstream 名字[ upservers ]{

# 在这里可以添加调度算法 默认是轮询 ip_hash表示sh算法,实现原地址绑定,把来自同一个地址请求,统统定向至此前选定的RS

server 172.16.37.20;  # server 172.16.37.20 weight 1;相当于权重

server 172.16.37.21;  # server 172.16.37.20 weight 2;

# max_fails= #; 做健康状态监测,当失败多少次就标记为fails,从server可用列表中移除

# fail_timeout =1 每一次检查失败的超时时长为多久

例: # server 172.16.37.20 max_fails= 2 fail_timeout =1

# 标记server下线更新 ,且当所有server下线时还可以当做sorry server;更新好之后就可以删除backup实现上线

例: # server 172.16.37.20 max_fails= 2 fail_timeout =1 backup

 

}

 

vim /etc/nginx/nginx.conf

server{

listen 80;

server_name www.lxproxy.com;

location /{

proxy_pass http://upservers/;

# 向后端转交请求报文时,还可以添加/修改请求报文头部,如加入CIP [ $remote_addr表示CIP ] 让后端Real Sever记录日志

proxy_set_header HOST $host;

proxy_set_header X-Real-IP $remote_addr;

}

 

}

 

基于sticky实现session绑定:

1.基于cookie,只有工作在应用层的才能实现

upstream upservers{

server 172.16.37.21;

sticky cookire srv_id expires=1h[有效期] domain=.lxproxy.com[ 用户访问的域名 ] path=/;

}

2.基于route

 

least_conn:调度方法,最少连接,相当于wlc算法;

keepalive #  表示和后端的Real Server保持长连接,能持续多久;在upstream中定义,只有在Real Sever是非httpd才用,因为会损坏并发性能;当后端是存储时,最好使用,如memcache

health_check 健康状态监测,在location中定义;建议关闭访问日志;使用默认即可

:location /{
            proxy_pass
http://upsevers;

            health_check;

      }

 

fastcgi-php

yum安装php-fpmnginx时要改编辑/etc/nginx/fastcgi_params,将其内容更改为如下内容:

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;

fastcgi_param  SERVER_SOFTWARE    nginx;

fastcgi_param  QUERY_STRING       $query_string;

fastcgi_param  REQUEST_METHOD     $request_method;

fastcgi_param  CONTENT_TYPE       $content_type;

fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;

fastcgi_param  REQUEST_URI        $request_uri;

fastcgi_param  DOCUMENT_URI       $document_uri;

fastcgi_param  DOCUMENT_ROOT      $document_root;

fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  REMOTE_ADDR        $remote_addr;

fastcgi_param  REMOTE_PORT        $remote_port;

fastcgi_param  SERVER_ADDR        $server_addr;

fastcgi_param  SERVER_PORT        $server_port;

fastcgi_param  SERVER_NAME        $server_name;

 

当后端Real ServerLAMP时不用设置fastcgi直接将所有请求全部代理到后端LAMP即可

例:location /{

   proxy_pass http://upservers/;

         }

而当后端是php-fpm时才会用到fastcgi

定义缓存在http{}中:

根据业务逻辑去判断是否要启用php的缓存

fastcig_cache_path /data/nginx/cahce levels=1:2 keys_zone=two:10m;

fastcgi_cache_valid 200 302 10m;

fastcgi_cache_valid any 1m;

phplocation{}中定义

fastcgi_cache two表示启用名字为twocahce