NGINX实现反向代理
概述:反向代理是指的,服务器代理网络上的客户机请求,将请求转达给内部真实服务器,然后在返回给Internet客户端,代理服务器上面没有任何网页资料。反向代理和正向代理没有冲突,可以在防火墙设备中同时使用这两种结合,正向代理可以进行过滤,保护内部网络安全。
软件七层负载均衡大多是基于HTTP反向代理,Nginx反向代理能够支持虚拟主机,可以按照轮询,IP哈希,URL哈希,权重方式对后端服务器做负载均衡,还支持后端服务器健康检查。
常见的Web负载均衡方法:
1、 DNS轮询:将同一个主机名添加多个A记录,DNS将解析请求安装A记录的顺序,随即分配到不同的IP上,使用dig baidu.com 就可以看到不同的A记录对应的IP地址。缺点:可靠性低,其中一台出现故障,就不会给予回应,就算从DNS去掉该服务器IP,但是也会保存在各地区的ISP众多的DNS缓存中。系统股灾不均衡,使用简单轮询,不能计算出服务器的负载差异,所以有可能客户集中请求到其中某一台服务器。
2、F5、LVS、DNS只能解析这里不做讲述
配置环境:
三台CentOS5.3,一台做nginx代理,2台apache做页面测试。apache端口改为:8080,nginx使用80口接收客户请求
yum -y install pcre-devel openssl openssl-devel //安装包,否则编译时候出错
#useradd www
#groupadd www
#usermod -g www www //设置nginx的用户和组
#tar xzvf pcre-7.8.tar.gz
#./configure
#make ; make install //安装pcre让nginx支持rewrite重写方便以后所需
[root@localhost tar]# cd nginx-0.7.16/
[root@localhost nginx-0.7.16]# ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
--with-http_stub_status_module:这个模块用于获取nginx自上次启动以来的工作状态,非核心模块
--with-http_ssl_module : 把ssl编译进去, 仅仅指定openssl库的源代码路径还是不够的
[root@localhost nginx-0.7.16]#make ; meke install
#cd /usr/local/nginx/conf/nginx.conf
#vi nginx.conf
user www www; //设置用户和组
PS:假设Nginx作为Web服务器,nginx或Squid作为反向代理后,就不能获取客户端的真实IP地址了,由于在客户端和Web增加了中间层,web没有真实的IP,通过$remote_addr变量拿到是反向代理的IP,Web代理可以增加$http_x_Forwarded_for信息,用于记录客户端IP和原来客户请求的服务器地址,在日志格式中加上即可。
log_format main '$http_x_Forwarded_for '
'$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /tmp/Nginx.access.log main; //在后端Web里面加上这样就可以了
upstream : nginx支持4种算法,下面一一介绍
1、 轮询
每个请求按时间顺序分配到不同的后端服务器了,后端服务器down掉,自动切除。
2、weight
设定服务器权值: weight=2
weight=4 服务器性能不均时候使用
3、 ip_hash
每个请求按访问ip的hash结果分配,每个访客有固定的后端服务器,可以解决session问题
4、 fair(第三方)
按后端服务器的响应时间来分配,响应时间短的优先分配
5、url_hash (第三方)
按访问的url的hash结果分配,使每个url定向到同一个后端服务器,后端为缓存服务器比较有效。
以往的架构lvs或者dns轮询,这样虽然squid里面的均衡的,但是忽略了一点就是数据量,虽然每台squid是均匀但是都是满载的,重复的请求,会占用很多空间,在前面换上nginx在配上 url_hash,根据url分流后,每一个url会只存在一个squid上,每台squid数据完全不同。http://edu.codepub.com/2010/0202/20282.php
upstream http_server { //定义负载均衡设备的Ip及设备状态
ip_hash;
server 127.0.0.1:9090 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup;
}
down : 当前的IP server暂时不参与负载,不进行反向代理
weight: 默认为1,weight越大,负载的权重越大
max_fails: 允许请求失败的次数默认为1,当超过最大次数时,返回proxy_next_upstream模块定义的错误。
fail_timeout : max_fails次失败后,暂停的时间
backup: 其它所有非backup机器down或者忙时候,请求backup机器,这台机器压力最轻
PS: nginx支持同时设置多组负载均衡,给不同的server使用
location:设置对URL进行匹配,比如 location / , location /data 这两个设置优先级,/ 下也可以,但是不如 /data下搜索更快,定位更准。
(转发请注明转自:学PHP)
- 三大WEB服务器对比分析(apache ,lighttpd,nginx) (2012-12-03 23:22:53)
- Nginx配置文件详细说明 转载的 (2012-12-14 21:49:01)
- php-fpm启动不起来,php-fpm无法启动的一种情况 (2012-12-15 20:40:25)
- Discuz!X2.5论坛在IIS和Apache环境配置实现伪静态 (2013-05-10 18:54:15)
- 实时查看php-fpm的状态 (2013-10-23 00:24:57)
- windows+Apache+mysql+php5 搭建 (2012-11-13 23:22:11)
- apache两种工作模式详解 (2012-11-12 13:12:51)
- Apache Lucene 4.0 正式版发布 (2012-10-13 10:54:16)
- Nginx 的多站点配置 (2012-10-05 23:47:36)
- 新一篇Apache2与Tomcat7整合 (2012-09-29 21:21:52)
- 1楼 Lore说: 2016-12-21 20:05:54
-
This shows real extirpese. Thanks for the answer.
- 2楼 Eliza说: 2016-12-21 20:07:35
-
I think you hit a buellsye there fellas!