Nginx反向代理、负载均衡的实现

一、安装虚拟机

*** 环境:VM16、ubuntu16

1、给虚拟机配置静态IP

        安装完虚拟机设置root密码:sudo passwd root

vim /etc/network/interfaces (如果没有按照vim可以用vi哦)

# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback

auto ens33
iface ens33 inet static
#iface ens33 inet dhcp
address 192.168.186.10
netmask 255.255.255.0
gateway 192.168.186.2
dns-nameserver 192.168.186.2
dns-nameserver 202.106.0.20

Nginx反向代理、负载均衡的实现_第1张图片

重启网络:/etc/init.d/networking restart

这里需要说明一下:

        a. ens33 是虚拟机的网卡,执行ifconfig可以查看

        b. dhcp 是自动获取ip的意思,因为我哟啊配置静态IP,所以注释掉了,换成 static

        c. address,netmask自己配置就行

        d. gateway网管参数怎么配置:菜单栏》虚拟网络编辑器,如下图。

        Nginx反向代理、负载均衡的实现_第2张图片

        e. dns-nameserver 我配置的时候费了老鼻子劲了,一开始配置的8.8.8.8(谷歌dns)和202.106.0.20(联调dns),ping我的物理机和8.8可以同,但是百度不同,愁死我了,最后请教了以为运维大神,让我配置了网关的ip作为了dns通了,在此处给大神敬个礼。

*** 小总结:配置静态ip不管你用的是centenOS还是ubuntu都需要配置这些,核心不变。但是要学会找不通的原因。我走了不少弯路和大家分享一下,当时我配置的联调dns或者谷歌dns不通的原因大概是公司禁用了外网IP,我锁ping到的并非真实dns。读者配置的时候可以先试试8.8和0.20这两个dns通不通,不行配置自己的网关试试。只有自己踩过的坑才知道有多深。

当然如果想用xshell链接虚拟机还得自己安装一个ssh,自己链接就可以了

apt-get install openssh-server

/etc/init.d/ssh restart   #重启SSH服务

关闭防火墙自己百度吧,哈哈

*     *     *    *     *     *    到此静态IP就配置好了,如果有疑问请留言哈!!

2、如果是Ubuntu18有点不一样

会发现一个问题:ping ip是没有问题, ping 域名 死活不同。

解决问题:vim /etc/systemd/resolved.conf

[Resolve]
DNS= 114.114.114.114 223.5.5.5 202.97.224.68

 在这里配置下dns就可以了。

systemd-resolved服务: systemctl restart systemd-resolved

二、Nginx工作原理

nginx下载 Index of /nginx/

Nginx反向代理、负载均衡的实现_第3张图片

当Nginx启动的时候会校验nginx.conf配置文件是否正确,正确就加载配置信息,服务起来之后,会开启一个主进程master和多个子进程worker。

master进程:基本是不干活的,它负责读取配置文件,校验配置文件,如果配置文件没问题,会开启子进程,协调子进程的调度工作

worker子进程:所有的网络请求都是worker在工作

Nginx反向代理、负载均衡的实现_第4张图片

 工作原理解析:当一个请求打到Nginx后,Nginx会根据请求地址读取Nginx的配置文件,应该加载哪个域名下的哪个文件。

三、Nginx配置文件

# 启动Nginx以哪个用户启动

user www-data;

# worder进程的个数
worker_processes auto;
http {

        # include 加载文件 mime.types文件是服务端告诉浏览器应该以什么形式展示这个文件

        # 是下载呢还是展示成html呢,需要再这个文件里做配置。

        include /etc/nginx/mime.types;

        # 默认类型

        default_type application/octet-stream;

        

        server {
                listen 80 default_server;
                listen [::]:80 default_server;

                root /var/www/html;
                index index.html index.htm index.nginx-debian.html;

                server_name _;

                # 例如 http://localhost/index.php location会匹配域名后面所有的地址,也就是

                # 例子中的index.php

                location / {

                }
        }

}

 server_name 可以配置多个域名,中间用空格隔开,也可以用正则表达式写域名

server_name v1.test.com v2.test.com

# 用户只要输入xxx.test.com都会到这个域名下

server_name *.test.com

四、反向代理和负载均衡配置策略 

反向代理配置:proxy_pass是不支持https的

# 在上面配置文件的location里加proxy_pass后面跟网址(域名或者IP),记住不要多空格

#只要有一点错误服务器就启动不了

location / {

                        proxy_pass http://192.168.186.11;
                        # try_files $uri $uri/ =404; 这句话千万要注释掉
                }

负载均衡配置 :

upstream 注意下面的upstream配置是和server同一个级别的,fzjh是自己定义的,但是要和proxy_pass 里的变量对应起来。

weight 服务器的权重,例子里的三台机器的权重比例是1:5:8.

down 此服务器不参与负载均衡,请求也不会发给它

backup 负载均衡服务器列表中只要有一条服务器是正常的,请求就不给打到backup的机器上,如果机器全部挂了,才会把请求打到backup这台机器上,备用机器的设置。

 upstream fzjh {
                server 192.168.186.11 weight=1;
                server 192.168.186.12 weight=5 backup;

                server 192.168.186.13 weight=8 down;

}

server {
                listen 80 default_server;
                listen [::]:80 default_server;

                root /var/www/html;
                index index.html index.htm index.nginx-debian.html;

                server_name _;

                location / {

                        proxy_pass http://fzjh;
                        # try_files $uri $uri/ =404;
                }
        }

当然修改配置文件后都要重新加载配置文件:

service nginx start

nginx -s  reload

nginx -s  quit 优雅停止。在快速停止里会直接退出服务,而这行命令与快速停止不同的是,这种方式下停止服务会等待服务有条不紊地处理好退出前所有该处理的任务然后退出。

缺点:无法保持回话,比如在A服务器登录了,下次请求打到B服务器就会提示登录。

注意:ubuntu新安装的nginx有这句话(try_files $uri $uri/ =404;)配置负载均衡的时候一定要删掉,否则会出现,直接请求域名可以代理过去,但是域名后面加些路径就404了,404了,404了,重要的话说三遍,因为我卡住过。

五、利用反向代理配置---动静分离

把动态资源和静态资源分开放有利于前端和后端的工作配合。比如可以吧js\css\img前置到代理服务器可以少转发一次数据。这样的配置会对提供网站的性能代理很大帮助,事实上很多中小型公司也是这么干的

        location / {
                proxy_pass http://fzjh;
        }

        
        location ~*/(js|css|img) {
                root /var/www/html/;
        }

很明显就是复制一份location出来,加了个root目录指向。
location匹配规则:后面跟 / 的优先级比哥们跟正则表达式的优先级低,也就是如果location后面有正则表达式的话,会进行优先匹配。这也是为什么js文件能走到截图中下面那个配置路径的原因。

location语法:

= 开头表示精确匹配

^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。

~ 开头表示区分大小写的正则匹配

~* 开头表示不区分大小写的正则匹配

!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则

如果想了解更多可以百度哈

六、伪静态 rewrite

重写url,一般企业会用它来做伪静态,为了不让浏览者轻易知道访问的url结构或者参数,开发这回对参数做些隐藏,比如你看到的页面是1.html其实后端拿到的是一个参数a=1,这样避免的让浏览者轻而易举的破解。

location / {

        rewrite ^/api/([0-9]+).php     /index/$1.html break;
        proxy_pass http://fzjh;

http://www.nginx01.com/index/2.html
}

当你输入 http://www.nginx01.com/api/1.php 会自动转成 http://www.nginx01.com/index/1.html

 然后通过负载均衡达到对应的服务器上。

关于rewrite后面的flag可以有四种:

        last  #本条规则匹配完成后,继续向下匹配新的location URI规则

        break  #本条规则匹配完成即终止,不再匹配后面的任何规则

        redirect  #返回302临时重定向,浏览器地址会显示跳转后的URL地址

        permanent  #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

大家调试的时候可以用最后一种。

七、网关服务器

在真正的企业中,我们的负载服务器是可以被访问到的,upstream中的服务器是不对外提供服务的,所以要静止外网访问,这个功能的实现我们需要利用防火墙。

首先打开防火墙 ufw enable

添加被允许访问的地址 ufw allow from 192.168.186.10

这个时候我们在浏览器访问upstream中的服务器就失败了,但是可以通过负载均衡服务器来转发访问。这个时候负载均衡服务器就好像一个网关了。

八、防盗链

我们有些网站不想让别的网站来引用我们的资源,我们就得配置防盗链。主要是根据浏览器发出的http请求头里的Referer进行鉴别是否是本网站访问,具体配置是在不想让对方访问资源的location下进行配置。

location ~*/(js|css|img) {
                valid_referers none  www.nginx01.com;
                if ($invalid_referer){

                        # 或者再这里我们可以用rewrite把请求打到我们自定义的一个页面上

                        # rewrite ^/        /error/e.html break;
                        return 403;
                }
                root /var/www/html/;
        }

这个时候js等这些资源就只能www.nginx01.com访问了,其他网站倒链访问就会出现403.

none说明:如果请求头里没有referer是可以访问的,如果有referer但是不是被允许的网站还是访问不到。直接打开资源是可以的,如果再其他网站倒链配置的资源就会403。自己测试下就知道了。.

九、高可用keepalived

一般情况下网关服务器是可以提供正常服务的,但如果突然挂掉的话,负载均衡列表里的那几台机器就不能访问了,这个时候我们也不能给网关服务器上面再加一层网关服务。这个时候就该keepalived站出来了。

作用:是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。所以他是检查机器工作状态的,不单是只能引用于Nginx哦,它的扩展性很强。

安装:我试了直接apt不行,从网上找了一个帖子挺好用的,安装成功了:ubuntu16.04搭建keepalived-2.0.20环境 - 简书

 当然自己可以找别的帖子安装,这里就不啰嗦了。修改配置文件/etc/keepalived/keepalived.conf

# 目前就下面这几个有用,其他需求用到可以自己再新增

! Configuration File for keepalived

global_defs {

   # id可以自己定义,每个机器的id是不一样的,我配置成 lb01
   router_id lb01
}

# vrrp 是keepalived在内网的通讯协议

# nginxtest是自定义的实例名称

vrrp_instance nginxtest {
    state MASTER

    # ens33是网卡名称,ipconfig命令查看
    interface ens33
    virtual_router_id 51

    # 优先级 在主备竞选的时候用
    priority 100

    # 间隔检测试剂
    advert_int 1

    # 同一组的authentication一样,因为同一台机器有很多服务,不同的组就诞生了
    authentication {
        auth_type PASS
        auth_pass 1111
    }

   # 虚拟的ip地址
    virtual_ipaddress {
        192.168.186.100
    }
}

配置完毕重启 service keepalived restart,当然我们需要再2太机器上都配置好。如果一台挂掉,ip就会漂移到另一台上。保证了我们服务的高可用性。

大家可以用ip addr命令查看ip漂移,用ifconfig查看不了。

这个时候我们 对外提供服务的ip是192.168.186.100这个。

生成环境应用:我们可以开发一个脚本来监控Nginx的存活,如果发现Nginx不通,我们就kill掉keepalived的进程,这个时候ip就漂移到另一台机器上了。

感谢大家看完,如果有不足之处请留言,我会后台回复大家的,希望我们在技术的深渊里越走越黑,哈哈,,,,,

你可能感兴趣的:(Nginx从入门到放弃,nginx,linux,运维)