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

nginx反向代理

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

标签:proxy   nginx   

使用的模块:ngx_http_proxy_module

官方文档:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#example

示例:

location / {
    proxy_pass        //指定upstrem server地址,将请求报文发给哪台web服务器 
    proxy_set_header Host      $host;   //客户端请求时浏览器中输入的主机名,记录这个主机名是为了实现虚拟主机映射
    proxy_set_header X-Real-IP $remote_addr;//客户端经过代理服务器时源ip会封装为代理服务器的ip,使用X-Real-IP记录她原来的ip,用于日志
}

location  /uri {

        proxy_pass http://back_server:port/newuri;

        rewrite

}

1.这里的/uri会映射到newuri目录

2.但是如果是模式匹配,如~* /uri 那么这里的uri将补在newuri之后,back_server:port/后不能带任何路径

3.如果使用了url重写,那么后面的newurl将失效,会把重写后的结果直接补在back_server:port/后面进行响应

例子:

location / {
    #root   html;
    #proxy_pass http://192.168.3.139/;
    index  index.html index.htm;
        }

location /forum/ {
    proxy_pass http://192.168.3.139/bbs/;
    #proxy_pass http://192.168.3.139/; #将url的forum映射到根目录而不是补到后面
    index  index.html index.htm;
        }
#下面的例子中\.(jpg|png|gif)只是一种模式,不会像上面一样做url映射
    location ~* \.(jpg|png|gif)$ {
    proxy_pass http://192.168.3.139;
        }

记录客户端真实ip

location / {
    #root   html;
    proxy_pass http://192.168.3.139/;
    index  index.html index.htm;
    proxy_set_header Host $host;
    proxy_set_header x-Real-IP $remote_addr;
         }

编辑后端主机http.conf

技术分享

访问后查看后端主机日志:

技术分享

proxy_set_header Host $host;

当后端web服务器上也配置有多个虚拟主机时,需要用该Header来区分反向代理那个主机名。在每个server模块中设置,区分每个虚拟主机。

proxy_set_header X-Forwarded-For $remote_addr;

如果后端Web服务器上的程序需要获取用户IP,从该Header头中获取 


proxy_cache:缓存基于键值存储,存储格式由以下定义,键存储在内存中,值存储在文件系统上

proxy_cache_path    path    [levels=levels]    [use_temp_path=on|off]    keys_zone=name:size    [inactive=time]    [max_size=size]

max_size指定缓存最大多少空间

proxy_cache zone  指定用于缓存内存空间名称后,使用keys_zone=name:size调用这段空间

proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;
file names in a cache will look like this:
/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c

定义了缓存目录在文件系统上的路径,这个路径属主属组必须是允许nginx进程的用户的属主属组

level定义了层级数,后面表示每个一级子目录只能以1个字符命名,2表示每个二级子目录只能以2个字符命名。keys_zone定义在内存空间中存储的键占据的空间大小和这段空间的名字

proxy_cache_methods    GET |    HEAD |    POST    ...:

定义仅在客户端使用哪些方法时才缓存,默认是GET和HEAD


proxy_cache_min_uses 1;
定义响应了客户端多少次请求才缓存,默认为1


proxy_cache_purge string缓存修建,请求哪一个内容就删除哪一个内容,可以实现手动管理缓存

proxy_cache_bypass string: 设置在何种情形下nginx将不从cache取数据的;
例子:$cookie_nocache $arg_nocache  $http_authorization---->有cookie不缓存,参数中明显有nocache的不缓存,有http授权信息的不缓存

proxy_cache_path /data/nginx/cache keys_zone=cache_zone:10m;

map $request_method $purge_method {
    PURGE   1;
    default 0;
}

server {
    ...
    location / {
        proxy_pass http://backend;
        proxy_cache cache_zone;
        proxy_cache_key $uri;
        proxy_cache_purge $purge_method;
    }
}

proxy_cache_use_stale error |    timeout |    invalid_header |    updating |    http_500 |    http_502 |    http_503 |    http_504 |    http_403 |    http_404 |    off

是否使用过期缓存响应用户请求,后面的参数指定在什么场景中使用过期缓存

proxy_cache_valid [code ...] time;按照响应码定义缓存有效时长


proxy_cache_valid 200 302 10m;
proxy_cache_valid 404      1m;

开启缓存功能:

编辑nginx.conf
proxy_cache_path /cache/nginx/ levels=1:1 keys_zone=mycache:32m;
chown -R nginx.nginx /cache/nginx
调用:
location /forum/ {
    proxy_cache mycache;
    proxy_cache_valid 200 1h;
    proxy_cache_valid 301 302 10m;
    proxy_cache_use_stale error timeout invalid_header http_500;
    proxy_pass http://192.168.3.139/bbs/;
    index  index.html index.htm;
        }

请求后查看缓存目录发现出现了缓存内容

技术分享

roxy_http_version 1.0 | 1.1,默认1.0,1.1在长连接中使用

隐藏由proxy响应给客户端响应报文时指定的首部

proxy_read_timeout和proxy_connect_timeout不同,这个是等待响应报文的超时时间,proxy_connect_timeout是连接请求的超时时间

ngx_stream_upstream_module

官方文档:http://nginx.org/en/docs/http/ngx_http_upstream_module.htm

配置代理后端多个主机:

nginx.conf文件

upstream upservers {
    #ip_hash此处可以指定使用ip_hash负载均衡算法实现同一客户端访问时一直调度在同一服务器上
    server 192.168.3.139;  #注意地址后面使用weight可以指定调度时权重,还可以使用down参数,当做临时维护时令前端健康监测监测到此主机down
    server 192.168.3.140 max_fails=2 fail_timeout=1 backup;backup设置备用服务器,一旦有好的服务器上线,他就失效
    } 
location /forum/ {
    proxy_pass http://upservers/;
    index  index.html index.htm;
        }

重启nginx测试,发现轮询调度后端服务器

健康监测相关:

  • fail_timeout=time访问失败后多久后不再调度此服务器

  • max_fails=number 最多访问失败两次就不再调度此服务器

session使用ip地址绑定使用ip_hash会破坏负载均衡,大量做了SNAT的用户被识别为同一个而发送到后端同一台服务器。所以我们应该基于应用层做基于cookie的绑定

基于sticky实现session绑定:
    cookie:携带cookie信息作为自己的标识符
    route:客户端携带去往后端服务器的路由作为自己的标识符
    learn ():根据客户端和服务器的交互信息

least_conn: 调度方法,最少连接;相当于wlc中的wlc算法,根据后端服务器承载的请求连接数量作出调度决策

keepalive 5:激活nginx和后端upstream server之间使用持久连接的时长,一般后端是缓存服务器时应设置为长连接,但后面是http服务器时不建议开启长连接

health_check 参数:间断性向后端upstream server发送健康探测指令,可以通过应用层模拟做请求资源进行健康监测,使用healthcheck时建议关闭访问日志,否则会产生大量IO


本文出自 “明天过后” 博客,请务必保留此出处http://leeyan.blog.51cto.com/8379003/1702974

nginx反向代理

标签:proxy   nginx   

原文地址:http://leeyan.blog.51cto.com/8379003/1702974

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