nginx中只支持三种请求转发方式: round-robin(轮流调度方式):它是把客户端流量请求依次按顺序分发给每个后端服务器。缺点是:会出现某个服务器已经在 处理很多的请求而再有新的请求进来,nginx代理服务器还是会给它分发流量进来,这会导致服务器down掉。 ip_hash ( ip哈希方式 ) : 它是把访问的客户端ip进行哈希加密计算后,存到hash表里。它的工作原理是当你访问过一次后,我会记住你访问的是哪个服务器,当你 再次发送请求过来我会自动连接你第一次连接过的服务器,除非你改变了ip.
least_conn ( 最少连接方式 ) :它解决了轮流方式的弊端,它是根据哪个服务器连接的客户端请求数最少去连接谁。缺点是:可能会发生突发性访问完后使其down掉。
nginx反向代理中的自检机制:
这种机制会随时不断的检查代理的后端服务器是否工作正常,相应的设置参数如下:
max_fails=3(最大失败连接次数,默认是1)
fail_timeout=2(失败连接的超时时长)
backup(加上它是只有当可用的服务器全部down掉,才会启用本服务器,一般用于提示客户端服务器在维护中...)
down(它是自定义停掉某一台服务器)
nginx代理服务器的权重设置:
weight=1 ;(数字越大权重越大)
加上它是让某个服务器多处理一些请求任务,多劳多得。谁的配置高谁就设置的权重大一些。
如何正确获取客户端的ip地址?
在代理服务器的子配置文件中的location 上下文中添加这句话
proxy_set_header X-client-IP $remote_addr ;
X-Real-IP(这个是自己定义的变量名字)
整句话的意思是把系统变量值传给自己定义的变量。
在后端服务器中的主配置文件中找到Format日志格式配置哪一行添加自己的变量 进去,按照人家给定的格式写。
LogFormat "%{X-client-IP}i %h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
5. 如何对某个网页内容进行设置访问用户名和密码?
生产场景描述: 当有些网页内容是公司内部的某些人才能访问时,我们可以这样 做。
在代理服务器的子配置文件中的location 上下文中添加这句话
auth_basic "这里写啥都可以,作用是提示用户输入啥信息"
auth_basic_user_file /data/auth.conf;
在代理服务器上执行如下操作:
[root@localhost ~]# htpasswd -cm /data/auth_conf user1
/data/auth_conf(文件名)user1(用户名)
如果是在增加一个新的对此网页的访问只需要把-c去掉即可
nginx 实现反向代理案例1: [root@www conf.d]# vim /etc/nginx/conf.d/web.conf
upstream webservers{ server 10.18.42.156:80; 这是后端服务器 server 10.18.42.153:80; 这是后端服务器 } webservers这个名字随便起。 在后端服务器上要提前设置好它们的网页内容。 server{ listen 8080; server_name _; location / { root /webdata; index index.html index.php; proxy_pass http://webservers; proxy_pass这个是代理的关键字 } } nginx 实现反向代理案例2: webservers{ server 10.18.42.156:80; 这个是php网页 server 10.18.42.153:80; 这个是html网页 }
server{ listen 8080; server_name _; location / { root /webdata; index index.html index.php; }
location ~* ".php$" {
proxy_pass http://webservers;
}
}
注意观察两次实验得出的结论是:location 是你访问时的匹配规则,你匹配到哪个就执行哪个里面的代码块。 nginx 实现反向代理案例3: [root@www conf.d]# vim /etc/nginx/conf.d/web.conf
upstream webservers{ ip_hash; server 10.18.42.156:80 max_fails=3 fail_timeout=2; server 10.18.42.153:80 max_fails=3 fail_timeout=2; server 10.18.42.157 backup; 这个是只有当上面的所有服务器都down掉后,它 才提供服务,一般只是显示一个友好提示:服务器维护中.......... }
server{ listen 8080; upstream webservers{ ip_hash; 这个是定义调度方式 server 10.18.42.156:80 max_fails=3 fail_timeout=2; 这个是自检规则 server 10.18.42.153:80 max_fails=3 fail_timeout=2 down; 这个是手动停掉本 台服务器。 }
server{ listen 8080; server_name _; location / { root /webdata; index index.html index.php; }
location ~* ".php$" {
proxy_pass http://webservers;
}
}
nginx 实现反向代理案例3: upstream webservers{ ip_hash; server 10.18.42.156 weight=1; 这是权重设置数字越大处理的请求数越多。 server 10.18.42.153 weight=2; }
server{ listen 8080; server_name _; location / { root /webdata; index index.html index.php; }
location ~* ".php$" {
proxy_pass http://webservers;
}
}
nginx 中的关于如何获取客户端ip地址信息的设置方法实例4: 第一步:在代理服务器的子配置文件中设置变量参数 upstream webservers{ ip_hash; server 10.18.42.156 weight=1; server 10.18.42.153 weight=2; }
server{ listen 8080; server_name _; location / { root /webdata; index index.html index.php; }
location ~* ".php$" {
proxy_pass http://webservers;
proxy_set_header X-client-IP $remote_addr ; 红字是关键字,中间是自 己定义的变量名
}
} 第二步: 在后端服务器中的主配置文件中找到Format日志格式配置哪一行添加自己的变量 进去,按照人家给定的格式写。 /etc/httpd/conf/httpd.conf LogFormat "%{X-client-IP}i %h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
关于反向代理中的访问路径的字符匹配问题详细说明: 第一种是没有匹配符的访问路径 location / { root /webdata; index index.html index.php; proxy_psaa http://10.18.42.10; } 这种情况下ip地址后面加上路径在访问的时候回自动把访问路径加到后面,为了避免这种错误。所以这种不加任何匹配符的情况下,ip地址后面必须写明网页的确切路径。
第二种情况是加了匹配符的访问路径 location ~* ".php$" {
proxy_pass http://webservers;
proxy_set_header X-client-IP $remote_addr ;
}
这种情况下添加了匹配符,那么访问ip地址后面绝对不能添加任何路径或其他东西。
nginx 实现反向代理关于访问权限案例5: 在代理服务器上输入下面命令: [root@localhost ~]# htpasswd -cm /passwd user1 /passwd 这个是存放密码和用户名的文件 user1 这个是要创建的用户名 进到字配置文件中设置如下: location ~* ".php$" { proxy_pass http://webservers; proxy_set_header X-client-IP $remote_addr ; auth_basic "请输入您的用户名及密码"; auth_basic_user_file /passwd; } 这样当我们在去访问.php的网页时,客户端会提示我们输入用户名和密码,否则看不得网页内容。