Nginx的反向代理: 反向代理,即web服务器加速,它是一种通过在繁忙的web服务器和外部网络之间增加的一个高速web缓冲服务器,用来降低实际的web服务器的负载的一种技术。 反向代理是针对web服务器提高加速功能,所有外部网络要访问服务器时的所有请求都要通过它,这样反向代理服务器负责接收客户端的请求,然后到源服务器上获取内容,把内容返回给用户,并把内容保存在本地,以便日后再收到同样的信息请求时,它会将本地缓存里的内容直接发给用户,已减少后端web服务器的压力,提高响应速度。
因此Nginx还具有缓存功能。
(一)、调度算法
1、轮询(默认)
复制代码代码示例:
upstream web_poll {
server 172.23.136.148 weight=10; server 172.23.136.149 weight=5; }
3、ip_hash
复制代码代码示例:
upstream web_pool {
ip_hash; server 172.23.136.148:80; server 172.23.136.149:80; }
4、fair(第三方)
复制代码代码示例:
upstream web_pool {
server 172.23.136.148; server 172.23.136.149; fair; }
5、url_hash(第三方)
复制代码代码示例:
upstream web_pool {
server squid1:3128; server squid2:3128; hash $request_uri; hash_method crc32; }
每个设备的状态设置为:
复制代码代码示例:
upstream web_pool {
server coolinuz.9966.org weight=5; server 172.23.136.148:8080 max_fails=3 fail_timeout=30s; server unix:/tmp/backend3; }
2、server
3、proxy_pass
4、proxy_set_header
复制代码代码示例:
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
注意:$proxy_add_x_forwarded_for包含客户端请求头中的"X-Forwarded-For",与$remote_addr用逗号分开,如果没有"X-Forwarded-For" 请求头,则$proxy_add_x_forwarded_for等于$remote_addr
$args, 请求中的参数;
$is_args, 如果已经设置$args,则该变量的值为“?”,否则为“”。 $content_length, HTTP请求信息头里的"Content-Length"; $content_type, 请求信息头里的"Content-Type"; $document_root, 针对当前请求所属的root指令设置的根目录路径; $document_uri, 与$uri相同; $host, 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名; $limit_rate, 对连接速率的限制; $request_method, 请求的方法,比如"GET"、"POST"等; $remote_addr, 客户端地址; $remote_port, 客户端端口号; $remote_user, 客户端用户名,认证用; $request_filename, 当前请求的文件路径名 $request_body_file, 客户端请求主体的临时文件名。 $request_uri, 请求的URI,带参数; $query_string, 与$args相同; $scheme, 所用的协议,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect; $server_protocol, 请求的协议版本,"HTTP/1.0"或"HTTP/1.1"; $server_addr, 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费); $server_name, 请求到达的服务器名; $server_port, 请求到达的服务器端口号; $uri, 请求的URI,可能和最初的值有不同,比如经过重定向之类的。
5、proxy_read_timeout
(三)、功能完善
安装配置方法:
复制代码代码示例:
#tar -xvf cep21-healthcheck_nginx_upstreams-16d6ae7.tar.gz -C /tmp/healthcheck_nginx_upstreams
2、对nginx打补丁
复制代码代码示例:
# tar xf nginx-1.3.4.tar.gz
# cd nginx-1.0.11 # patch -p1 < /tmp/healthcheck_nginx_upstreams/nginx.patch
而后编译nginx,在执行configure时添加类似下面的选项:
复制代码代码示例:
# ./configure \
--prefix=/usr/local/nginx \ --sbin-path=/usr/sbin/nginx \ --conf-path=/etc/nginx/nginx.conf \ --lock-path=/var/lock/nginx.lock \ --user=nginx \ --group=nginx \ --with-http_ssl_module \ --with-http_flv_module \ --with-http_stub_status_module \ --with-http_gzip_static_module \ --http-proxy-temp-path=/var/tmp/nginx/proxy/ \ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \ --with-pcre \ --add-module=/tmp/healthcheck_nginx_upstreams # make && make install
ngx_http_healthcheck_module模块的使用方法:
复制代码代码示例:
healthcheck_enabled
##启用此模块 healthcheck_delay ##对同一台后端服务器两次检测之间的时间间隔,单位毫秒,默认为1000; healthcheck_timeout ##进行一次健康检测的超时时间,单位为毫秒,默认值2000; healthcheck_failcount ##对一台后端服务器检测成功或失败多少次之后方才确定其为成功或失败,并实现启用或禁用此服务器; healthcheck_send ##为了检测后端服务器的健康状态所发送的检测请求;如:healthcheck_send "GET /health HTTP/1.0" 'Host: coolinuz.9966.org'; healthcheck_expected ##期望从后端服务器收到的响应内容;如果未设置,则表示从后端服务器收到200状态码即为正确; healthcheck_buffer ##健康状态检查所使用的buffer空间大小; healthcheck_status 通过类似stub_status的方式输出检测信息,使用方法如下: location /stat { healthcheck_status; }
(四)、配置与实现
复制代码代码示例:
http { } 在这里设置“proxy_set_header”参数,是因为Nginx在做反向代理的时候,要代替客户端去访问服务器,所以,当请求包经过反向代理后,在代理服务器这里这个IP数据包的IP包头做了修改,最终后端web服务器得到的数据包的头部的源IP地址是代理服务器的IP地址,这样一来,后端服务器的程序给予IP的统计功能就没有任何意义,或者后端web服务器上有多个基于域名的虚拟主机时,就要通过添加Header头信息Host,用于指定请求的域名,这样后端web服务器才能识别该反向代理访问请求由哪个虚拟主机来处理。
(五)、小结 通过Nginx的反向代理已经支持灵活的正则表达式匹配,可以实现网站的动、静分离,让动态的php等程序网页去访问php web服务器,让缓存页、图片、javascript、css、flash去访问Squid等缓存服务器或文件服务器。 加之Nginx对静态内容的高性能,高并发量,Nginx作为前端代理负载均衡成为越来越多架构师的首先方案。 (责任编辑:IT) |