首先要知道nginx的代理相对于lvs不同是七层的代理,报文在流经PREROUTING时发现对方的目标IP是自己会将数据发往应用层,nginx的proxy模块会将数据解析然后以自己的ip地址为源地址发送给被代理的服务器。所以返回的响应数据也要流经nginx代理服务器。
配置nginx服务能够进行代理很简单
编辑配置文件
nginx]# cat conf.d/proxy.conf
server {
listen 80;
server_name node1.lvqing.com;
location / {
proxy_pass http://192.168.0.11;
}
}
这里也可以使用域名,这样就可以代理给一台服务器的不同虚拟主机
看,一个简单的nginx代理就这样完成了,非常简单。
注意:proxy_pass后面的路径不带url时,其会将location的url传递给后端主机;proxy_pass后面的路径是一个url时,其会将location的url替换为proxy_pass的
如果location定义其uri时使用了正则表达式的模式,或在if语句或limt_execept中使用proxy_pass指令,则proxy_pass之后必须不能使用url; 用户请求时传递的url将直接附加代理到的服务器的之后
nginx传递参数
但是这样依赖有一个问题,如果再服务器上想要查看客户端的信息或者用来做会话缓存的标识是无法完成的,因为所有的客户端都是通过proxy代理过来的,我们所看到的链接的ip都是prox代理服务器的。这样我们就需要proxy传递给我们一些参数以便标识不同主机访问的proxy_set_header field value;
设定发往后端主机的请求报文的请求首部的值;
有一些内部的变量可以使用:
- $remote_addr:代表了客户端的IP,可能是最后一个代理服务器的地址
-
proxy_add_x_forwarded_for ```
再http服务器上设置日志的格式
为了客户访问网站能有更好的体验,我们可以在proxy代理上做缓存,但如果缓存的内容太多放在磁盘上搜索起来费时费力,我们可以将用户的url做hash计算存放在内存中,数据分三级目录存放在磁盘上,
缓存功能必须定义在http块中proxy_cache_path /var/nginx/cache levels=1:1:1 keys_zone=pcache:10m max_size=2g;
然后我们需要在server中使用定义的缓存
proxy_cache pcache;
proxy_cache_key $request_uri;
proxy_cache_methods GET HEAD;
proxy_cache_vaild 200 302 10m;
proxy_cache_vaild 404 1m;
nginx的upstream模块
既然可以做代理那么nginx也可以为后端的服务器做负载均衡,而且nginx做反向代理的upstream模块自带检测后端服务器是否可用的功能。这需要用到nginx的http的upstream模块,注意这个模块只适用于http协议,upstream引入的新上下文和server没关系只能被定义在http块中。
在upstream的上下文中server是用来定义一个虚拟主机的
编辑nginx.conf添加一个虚拟组
upstream websrvs {
server 192.168.0.11:80;
server 192.168.0.12:80;
}
编辑虚拟主机文件
server {
listen 80;
server_name node1.lvqing.com;
location / {
root /var/nginx/www;
proxy_pass http://websrvs;
}
}
查看效果
在upstream中我们可以添加
hash $request_uri;
这就相当于lvs的sh算法,请求的uri相同就发往同一个服务器,可以提高缓存的命中率
consistent指的是一次性hash算法
相对于upstream的七层代理nginx还提供了由ngx_stream_core_module模块提供的伪四层代理功能
这里引入了新的stream上下文,所以stream不仅仅可以代理http还可以代理其他工作在四层以上的协议。
只需要在配置文件中配置一个stream的上下文,其他的都不需要,当然还是需要监听在一个套接字上,因为nginx能做四层代理,本身是工作在第七层的。
stream {
server {
listen 22000;
proxy_pass 192.168.0.11:22;
}
}
可以看到ssh服务被代理到了11主机上。