文章目录

  • 什么是nginx?
  • nginx应用场景
  • Windows环境下安装Nginx
  • nginx优缺点
  • nginx实现反向代理
  • 什么是负载均衡
  • 负载均衡策略
  • nginx实现负载均衡
  • nginx实现指定权重
  • nginx的宕机容错
  • nginx解决跨域问题
  • 什么是跨域问题
  • 解决方法
  • nginx 防盗链
  • 什么是防盗链
  • 解决方法
  • nginx整合Keepalived
  • 什么是Keepalived
  • 安装Keepalived
  • Keepalived的环境搭建
  • keepalived安装成Linux系统服务
  • 将keepalived的一些配置文件复制到临时文件夹中
  • 建立软连接
  • 设置开机自启
  • 配置nginx主备自动重启
  • 配置文件结构
  • 从机keepalived的配置
  • 测试
  • nginx整合keepalived实现负载均衡


什么是nginx?

nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师Igor Sysoev所开发,官方测试nginx能够支支撑5万并发链接,并且cpu、内存等资源消耗却非常低,运行非常稳定,所以现在很多知名的公司都在使用nginx。

nginx应用场景

1、http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。
2、虚拟主机。可以实现在一台服务器虚拟出多个网站。例如个人网站使用的虚拟主机。
3、反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。

Windows环境下安装Nginx

软件下载链接
链接:https://pan.baidu.com/s/1XN3oVTXXiUMFgwqUrRoilg
提取码:b6cy
复制这段内容后打开百度网盘手机App,操作更方便哦
解压:nginx-windows
双击: nginx.exe
打开浏览器输出localhost
能看到以下界面说明安装成功

nginx 配置cpu很低 nginx硬件配置_负载均衡

nginx优缺点

占内存小,可以实现高并发连接、处理响应快。
可以实现http服务器、虚拟主机、反向代理、负载均衡。
nginx配置简单
可以不暴露真实服务器IP地址

nginx实现反向代理

http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80; //监听端口号
        server_name  localhost; //这两个在一起的意思是,只要是通过localhost:80访问的,我统一进行拦截到location具体地址

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            proxy_pass   https://www.baidu.com; //注意 proxy_pass后面没有:
            index  index.html index.htm; 拦截到默认走的文件
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }

什么是负载均衡

负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

nginx 配置cpu很低 nginx硬件配置_服务器_02

负载均衡策略

1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
upstream backserver {
server 192.168.0.14;
server 192.168.0.15;
}
2、指定权重
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream backserver {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}
3、IP绑定 ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream backserver {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}

nginx实现负载均衡

upstream 是配置负载均衡服务器的地址;
实现访问localhost:80进行负载均衡访问8080,和8081服务器

upstream backserver { 
     server 127.0.0.1:8080; 
     server 127.0.0.1:8081; 
} 

    server {
        listen       80;
        server_name localhost;
        location / {
		    proxy_pass  http://backserver; //这个地址要和updatestream定义名字一样
			index  index.html index.htm;
        }
}

因为nginx默认是轮训的负载均衡策略,进行访问的时候,每次访问的时候,依次访问的是8080->8081-8080->… 的服务器

nginx实现指定权重

指定权重的优点:能者多劳

upstream backserver { 
         server 127.0.0.1:8080 weight=1; 
         server 127.0.0.1:8081 weight=3;
        } 
    
        server {
            listen       80;
            server_name  www.itmayiedu.com;
            location / {
    		    proxy_pass  http://backserver;
    			index  index.html index.htm;
            }
        }

相当于每次访问nginx 8080和8081的访问比例是1比3的

nginx的宕机容错

前面竟然我们配置了2个服务器,那么可能出现一种情况,就是当我们访问8080服务器的时候,此时服务器是宕机的,但是我们为了能够实现的服务器的可用性,我们此时可以让他访问8081去代替工作
就好比,架构师今天生病啦,结果所有的项目问题,全部都交你负责啦

upstream backserver { 
         server 127.0.0.1:8080 weight=1; 
         server 127.0.0.1:8081 weight=3;
        } 
    
        server {
            listen       80;
            server_name  www.itmayiedu.com;
            location / {
    		    proxy_pass  http://backserver;
    			index  index.html index.htm;
    			proxy_connect_timeout 1; //连接的超时时间
    			proxy_send_timeout 1; //发送的超时时间
    			proxy_read_timeout 1; // 读取的超时时间
            }
   }

此时在进行访问的时候,就会出现无论怎么访问,访问的服务器都是8081服务器

nginx解决跨域问题

什么是跨域问题

在公司工作的时候,我听见隔壁面试官问过这个问题,但是对面好像还不是很明白跨域的问题,反而让面试官给他解释了一波.先不说问题难易,光是这样结果可想而知;
简单的跨域:简单的说就是页面a想获取b页面资源,如果a、b页面的协议、域名、端口、子域名不同,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源。注意:跨域限制访问,其实是浏览器的限制。理解这一点很重要!!!
比如现在这两个网址 http://a.a.com:81/A 和 http://b.b.com:81/B 他们符合上面跨域的问题 — 如果a、b页面的协议、域名、端口、子域名不同,那么如何使用nginx解决跨域呢?

解决方法

比如一个请求是是 www.baidu.com/A 和 www.baidu.com/B

server {
        listen       80;
        server_name  www.baidu.com;
        location /A {  //注意这里有个/A
		    proxy_pass  http://a.a.com:81/A;
			index  index.html index.htm;
        }
		location /B {
		    proxy_pass  http://b.b.com:81/B;
			index  index.html index.htm;
        }
    }

在这里www.baidu.com/A可以访问 http://a.a.com:81/A;
www.baidu.com/B可以访问http://b.b.com:81/B;
如何让www.baidu.com/A访问http://b.b.com:81/B;呢?

答案很简单虽然http://a.a.com:81/A; 和 http://b.b.com:81/B; 存在跨域 但是 www.baidu.com/A 和 www.baidu.com/B 不存在

我 www.baidu.com/A 访问的时候,可以直接请求www.baidu.com/B 从而实现跨域问题的解决办法

nginx 配置cpu很低 nginx硬件配置_负载均衡_03

nginx 防盗链

什么是防盗链

为了保护网站的资源不被盗取, 比如网站的视频 和 图片,一般的解决方法是利用浏览器的F12 直接找出链接 进行盗用,如何解决这个问题就是防盗链的要做的

比如我在的项目里一个图片用标签 < img href=“wwww.baidu.com/iamg.jpg”> 可以直接实现盗用

解决方法

我们在nginx只需要配置这些就可以

location ~ .*\.(jpg|jpeg|JPG|png|gif|icon)$ { //主要就是当进访问这些后缀的时候世界给他们返回403
        valid_referers blocked http://www.baidu.com www.baidu.com;
        if ($invalid_referer) {
            return 403;
        }
}

nginx整合Keepalived

以下的环境是在linux中进行

什么是Keepalived

Keepalived是一个免费开源的,用C编写的类似于layer3, 4 & 7交换机制软件,具备我们平时说的第3层、第4层和第7层交换机的功能。主要提供loadbalancing(负载均衡)和 high-availability(高可用)功能,负载均衡实现需要依赖Linux的虚拟服务内核模块(ipvs),而高可用是通过VRRP协议实现多台机器之间的故障转移服务。

说人话就是:虽说nginx能帮我们解决服务器如果宕机,可以进行访问其他服务器的措施,但是如果nginx宕机啦,岂不是凉凉啦,而Keepalived就是帮们解决nginx宕机的问题的,他能我们自动检测nginx服务状态,重启nginx,重启mysql

大概的完整的nginx整合keepalived的架构图,如下

nginx 配置cpu很低 nginx硬件配置_负载均衡_04


从上图,我们可以知道,此时的nginx,类似上面讲过的哨兵的模式,主从机,当主机宕机的时候,服务自动访问备机

安装Keepalived

下载keepalived地址:http://www.keepalived.org/download.html

Keepalived的环境搭建

现在假设有两个nginx 地址分别为:192.168.110.152(主机) 和 192.168.110.153(备机)

首先我们先启动nginx

/usr/local/nginx/sbin/nginx

如果发现浏览器输出自己的服务器地址,无法出现nginx的界面,此时很有可能是防火墙的问题,关闭防火墙即可

service iptables stop

把下载好的keepalived进行解压

tar -zxvf keepalived-1.2.18.tar.gz

keepalived依赖一个插件,需要安装

yum install -y openssl openssl-devel

进行编译

./configure --prefix=/usr/local/keepalived

进行安装

make

keepalived安装成Linux系统服务

一般情况下,因为keepalived他是事实检测的,所以他就类似mysql服务端一样,需要时时刻刻都存在的,一开机就会有,所以我们更想把做成一个服务存在系统当中,这样的话,他就类似mysql的服务端一样,一开机就可以使用;

首先创建文件夹,将keepalived配置文件进行复制:

mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

然后复制keepalived脚本文件:

cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/sbin/keepalived /usr/sbin/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/
chkconfig keepalived on .  可以设置开机启动:,到此我们安装完毕!

将keepalived安装成Linux系统服务,因为没有使用keepalived的默认安装路径(默认路径:/usr/local),安装完成之后,需要做一些修改工作:

##创建一个临时的文件夹

mkdir /etc/keepalived

将keepalived的一些配置文件复制到临时文件夹中

cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

##然后复制keepalived脚本文件

cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

建立软连接

ln -s /usr/local/sbin/keepalived /usr/sbin/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/

设置开机自启

chkconfig keepalived on
## keepalived常用命令
service keepalived start 启动
service keepalived stop 关闭

配置nginx主备自动重启

对配置文件进行修改

vim /etc/keepalived/keepalived.conf

配置文件结构

nginx 配置cpu很低 nginx硬件配置_服务器_05

! Configuration File for keepalived

vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh" # 每过2秒自动检测,运行脚本(脚本内容:看是否宕机,宕机重启)
    interval 2 #检测时间间隔
    weight -20 #如果条件成立的话,则权重 -20
}
# 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
    state MASTER #来决定主从
    interface en0 # 绑定虚拟 IP 的网络接口,根据自己的机器填写,就是咱们ifconfig 你看是哪里的接口,我这里看的是en0的
    virtual_router_id 121 # 虚拟路由的 ID 号, 两个节点设置必须一样, 这个不用管
    mcast_src_ip 192.168.110.152 #填写本机ip
    priority 100 # 节点优先级,优先级越高越先执行  优先级配置(0-254的值)
    nopreempt # 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
    advert_int 1 # 组播信息发送间隔,两个节点设置必须一样,默认 1s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 将 track_script 块加入 instance 配置块
    track_script {
        chk_nginx #执行 Nginx 监控的服务
    }

    virtual_ipaddress {
        192.168.110.110 # 虚拟ip,也就是解决写死程序的ip怎么能切换的ip,也可扩展,用途广泛。可配置多个。 访问他,他能转到真正的nginx服务器
    }
}

上面的配置文件和nginx_check.sh在如下链接下载(附加中文注释哦)

链接:https://pan.baidu.com/s/1x4ypR3umpYyMMj5q7TMPuQ 
提取码:wun5 
复制这段内容后打开百度网盘手机App,操作更方便哦

从机keepalived的配置

! Configuration File for keepalived

vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh" # 每过2秒自动检测,运行脚本(脚本内容:看是否宕机,宕机重启)
    interval 2 #检测时间间隔
    weight -20 #如果条件成立的话,则权重 -20
}
# 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
    state BACKUP #来决定主从
    interface en0 # 绑定虚拟 IP 的网络接口,根据自己的机器填写,就是咱们ifconfig 你看是哪里的接口,我这里看的是en0的
    virtual_router_id 121 # 虚拟路由的 ID 号, 两个节点设置必须一样, 这个不用管
    mcast_src_ip 192.168.110.153 #填写本机ip
    priority 100 # 节点优先级,优先级越高越先执行  优先级配置(0-254的值)
    nopreempt # 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
    advert_int 1 # 组播信息发送间隔,两个节点设置必须一样,默认 1s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 将 track_script 块加入 instance 配置块
    track_script {
        chk_nginx #执行 Nginx 监控的服务
    }

    virtual_ipaddress {
        192.168.110.110 # 虚拟ip,也就是解决写死程序的ip怎么能切换的ip,也可扩展,用途广泛。可配置多个。 访问他,他能转到真正的nginx服务器
    }
}

这里就改了ip地址或者网卡地址,其实 virtual_ipaddress 没什么不好懂的,说人话就是,keepalived成了以前的nginx,而这里的nginx成了tomcat,我们可以通过访问一个virtual_ipaddress来实现不同nginx的跳转;

当然上面例子也有不同, 在这里keepalived他是主从都有,默认情况下,当访问 virtual_ipaddress 他会优先访问主机的地址,如下图,
当主机的keepalived的挂机的时候,此时再次访问virtual_ipaddress,他会跳转到备机的机器上

测试

现在我们访问配置virtual_ipaddress,n

nginx 配置cpu很低 nginx硬件配置_nginx_06

在这里如果nginx宕机的话,默认会触发脚本进行重启nginx,如果发现没有重启成功,很可能是sh没有权限的问题

chmod u+x nginx_check.sh

nginx整合keepalived实现负载均衡

nginx 配置cpu很低 nginx硬件配置_nginx_07