反向代理和负载均衡
反向代理环境准备
1.环境准备
两台web
ip分别为:
10.0.0.7 10.0.0.8
两台负载
ip是:
10.0.0.5 10.0.0.6
第一步:首先,两台负载服务器下载好nginx 一定要保证nginx的版本一致。
如何下载
[root@lb01 ~]# vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
[root@lb01 ~]# yum install -y nginx
第二步:配置web01和web02的环境,他们两个的环境是一致的
[root@web01 /etc/nginx/conf.d]# cat 01-www.conf
server {
listen 80;
server_name www.oldboy.com;
access_log /var/log/nginx/access_www.log main;
root /app/www;
location / {
index index.html index.html;
}
}
[root@web01 /etc/nginx/conf.d]# cat 02-blog.conf
server {
listen 80;
server_name blog.oldboy.com;
access_log /var/log/nginx/access_blog.log main;
root /app/blog;
location / {
index index.php index.html index.htm;
}
location ~* \.(php|php5)$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_buffers 16 16k;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
1.根据配置文件在两台web服务器上进行创建目录个配置文件。
[root@web01 /etc/nginx/conf.d]# mkdir -p /app/{www,blog}
2.将这条命令输入在命令行,稍后操作更好的区分。
for n in www blog ; do echo `hostname` $n.oldboy.com >/app/$n/index.html ;done
3.检查语法,重启,在负载上面进行测试
[root@web01 /etc/nginx/conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web01 /etc/nginx/conf.d]# systemctl restart nginx
4.在lb负载服务器上到达如下效果即可。
[root@lb01 ~]# curl -H Host:blog.oldboy.com 10.0.0.[7-8]
[1/2]: 10.0.0.7 --> <stdout>
--_curl_--10.0.0.7
web01 blog.oldboy.com
[2/2]: 10.0.0.8 --> <stdout>
--_curl_--10.0.0.8
web02 blog.oldboy.com
[root@lb01 ~]# curl -H Host:www.oldboy.com 10.0.0.[7-8]
[1/2]: 10.0.0.7 --> <stdout>
--_curl_--10.0.0.7
web01 www.oldboy.com
[2/2]: 10.0.0.8 --> <stdout>
--_curl_--10.0.0.8
web02 www.oldboy.com
5.在负载服务器上修改nginx主配置文件
#gzip on; (创建代理源虚拟服务池,指定需要代理的源主机)
upstream web_pools {
server 10.0.0.7:80;
server 10.0.0.8:80;
}
#include /etc/nginx/conf.d/*.conf; (在配置文件中这行要注释掉)
#指定转发地址到虚拟服务池
server {
listen 80;
server_name www.oldboy.com;
location / {
proxy_pass http://web_pools;
}
}
[root@lb01 ~]# curl 10.0.0.5
web01 www.oldboy.com
[root@lb01 ~]# curl 10.0.0.5
web02 www.oldboy.com
6.最后在转包软件中进行抓包测试,来了解反向代理的原理,及过程。到这里反向代理就完成了。
负载均衡部署
一、upstream模块server标签参数说明
1.权重weight (指定那个web服务器处理更多的请求,默认是1)
#gzip on;
upstream web_pools {
server 10.0.0.7:80 weight=2; (这得server指的就是server标签)
server 10.0.0.8:80 weight=1;
}
#include /etc/nginx/conf.d/*.conf;
server {
listen 80;
server_name www.oldboy.com;
location / {
proxy_pass http://web_pools;
}
}
效果
[root@lb01 ~]# curl 10.0.0.5
web01 www.oldboy.com
[root@lb01 ~]# curl 10.0.0.5
web01 www.oldboy.com
[root@lb01 ~]# curl 10.0.0.5
web02 www.oldboy.com
2. max_fails (健康检查,也是失败的次数,通俗的就是用户请求时,负载将请求交给web服务器时,被拒绝,失败了几次以后,认为服务器挂了,就将请求分配给其他服务器。)
建议设置次数,2-3次
#gzip on;
upstream web_pools {
server 10.0.0.7:80 weight=2 max_fails=3 fail_timeout=10s;
server 10.0.0.8:80 weight=1 max_fails=3 fail_timeout=10s;
}
#include /etc/nginx/conf.d/*.conf;
server {
listen 80;
server_name www.oldboy.com;
location / {
proxy_pass http://web_pools;
}
}
3.fail_timeout:在 max_fails 定义请求nginx的失败次数后,距离下次检查的间隔时间,默认是10s,与max_fails配合使用。
2,3配合使用的效果,先执行以下命令,然后停掉其中一台web服务器,我这里停掉的是web01
[root@lb01 ~]# for n in {1..1000};do curl 10.0.0.5/index.html ; sleep 1 ;done
1\.没停掉之前是这样
web01 www.oldboy.com
web01 www.oldboy.com
web02 www.oldboy.com
2\.停掉之后一直走的web02
web02 www.oldboy.com
web02 www.oldboy.com
web02 www.oldboy.com
web02 www.oldboy.com
web02 www.oldboy.com
web02 www.oldboy.com
web02 www.oldboy.com
web02 www.oldboy.com
web02 www.oldboy.com
web02 www.oldboy.com
web02 www.oldboy.com
web02 www.oldboy.com
3\.恢复之后就像1一样恢复正常
4、backup:如果加上backup 会在虚拟代理服务池中其他付服务器宕机的时候启
二、多个域名访问
1.在本地hosts做好解析
10.0.0.5(这里的ip是负载均衡服务器的ip) www.oldboy.com status.oldboy.com blog.oldboy.com
2.在主配置文件中在多配置一个server区域
#include /etc/nginx/conf.d/*.conf;
server {
listen 80;
server_name www.oldboy.com;
location / {
proxy_pass http://web_pools;
proxy_set_header Host $host;
}
}
server {
listen 80;
server_name blog.oldboy.com;
location / {
proxy_pass http://web_pools;
proxy_set_header Host $host;(添加这条命令)下面的图片就是此参数的详解。
}
}
然后在浏览器分别用 www.oldboy.com ,blog.oldboy.com进行测试,blog.oldboy.com测试的时候访问的是www.oldboy.com。
如何解决,使用proxy
模块的proxy_set_header参数,修改如上

三、如何让web服务器的访问日志记录用户真实的ip
1、在配置文件中添加
#include /etc/nginx/conf.d/*.conf;
server {
listen 80;
server_name www.oldboy.com;
location / {
proxy_pass http://web_pools;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;(添加此条命令,使web服务器的访问日志记录用户的真实ip)
}
}
server {
listen 80;
server_name blog.oldboy.com;
location / {
proxy_pass http://web_pools;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;(添加此条命令,使web服务器的访问日志记录用户的真实ip)
}
}
然后在浏览器刷新,查看日志是否记录ip,我自己测试的如下,(拿域名访问)已记录,如果没有记录,请仔细检查配置文件是否错误。(我因为写错一个单词,但是检查语法的时候没有报错,而一直没有记录用户真实的ip地址)
(10.0.0.1为我测试的用户真实ip)
[root@web01 /etc/nginx/conf.d]# tail -f /var/log/nginx/access_blog.log
10.0.0.5 - - [13/Jun/2019:19:18:33 +0800] "GET / HTTP/1.0" 200 22 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36" "10.0.0.1"
2、简单的安全机制(if)禁止192.168.22.这个网段的访问
[root@lb01 ~]# vim /etc/nginx/nginx.conf
#include /etc/nginx/conf.d/*.conf;
server {
listen 80;
server_name www.oldboy.com;
location / {
if ( $remote_addr ~ "^192.168.22.") {
return 403 "biedaoluan\n";
}
proxy_pass http://web_pools;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
这个简单的机制虽然可以阻挡他访问页面,但是阻挡不了他进入服务器。
所以,为了更安全,可以使用防火墙
1.下载,启动
[root@lb01 ~]# yum install -y iptables
[root@lb01 ~]# systemctl restart iptables
2.添加防火墙规则
禁止所任人访问这台主机的22端口,慎用,有可能把自己拒之门外。
[root@lb01 ~]# iptables -A INPUT -p tcp --dport 22 -j DROP
禁止这个网段的人访问,这样就可以禁止这个网段的人访问服务器。
[root@lb01 ~]# #iptables -A INPUT -p tcp -s 192.168.22.0/24 -j DROP(禁止这个网段的人访问服务器)
[root@lb01 ~]# iptables -L -n (查看已经添加的规则)
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
测试完以后清空路由规则,防止以后坑自己
清楚路由规则三步骤(啊哈哈哈哈哈)
[root@lb01 ~]# iptables -F
[root@lb01 ~]# iptables -X
[root@lb01 ~]# iptables -Z