nginx在应用层实现反向代理,能实现动静分离
lvs是工作在传输层
session保持的方法:
session绑定:lvs的sh算法,实现原地址绑定,将来自同一个地址请求,统统定向至此前选定的RS
session复制:做成集群,将session数据共享,通过多播的方式传递数据,保持数据同步
session服务器:用memcached,redis(键值存储);做冗余,做负载均衡
key:用户请求的URL hash之后的结果
value:URL对应的资源
lvs其实还是Client和Real Server之间进行通信
nginx是Client和Nginx反向代理通信,反向代理再去和Real Server通信,取得响应后返回给Client,并保存一份在缓存服务器,当下次用户请求时,直接去查询缓存服务器而不用去找Real Server,且缓存是以键值对形式保存,会更快速的查询到结果
架构图简单实例:
用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_pass的URL最后面,且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 Server的web服务器配置文件,例httpd
修改之后访问,日志中会记录Client IP而不是Nginx的IP了
配置缓存机制:
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;
而调用则可以在http,server,location中
proxy_cache one 表示启用名字为one的cahce
proxy_cache_method GET|POST|HEAD 用什么方法请求时缓存,默认是GET和HEAD,可以不用定义用默认即可
proxy_cache_min_uses # 请求几次后缓存这个资源,默认是1次,可以不用定义用默认即可
proxy_cache_revalidate on|off 表示当缓存到期时,是否向后端Real Server校验缓存是否修改过,若没修改则继续使用原缓存 默认是off可以开启
proxy_cache_use_stale error|timeout|http_404|off…. 当缓存过期,且后端Real Server返回error或404等 用过期的缓存响应客户端,默认是off
proxy_cache_valid 200 302 10m 当后端Real Server返回了200或302就缓存10min
proxy_connect_timeout 60s 等待代理服务器响应超时时长,默认60s,可以不用定义用默认即可
proxy_cache_bypass string:设置在什么情况下nginx将不从cache中取数据;例用户有cookie时 $cookie_nocache
配置负载均衡机制:
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-fpm和nginx时要改编辑/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 Server是LAMP时不用设置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;
在php的location{}中定义
fastcgi_cache two表示启用名字为two的cahce