02_Nginx配置示例

Nginx 服务器在实际生产中的集中常见用法示例

Posted by silhouette on June 14, 2020

前言

上回书我们详细的了解了 Nginx 配置文件的语法及Nginx 的原理,那么书接上回,Nginx在实际生产中有哪些实际用法呢?现在,就让我们去实操一下 nginx 在实际生产的一些常用案例。下面是本博客所参考链接:

一、Nginx 配置实例

1.1 反向代理

1.1.2 示例1

  • 需求分析:使用 nginx 反向代理,访问www.1234567.com 直接跳转到虚拟机的 tomcat 主页面中

  • 实现步骤

    1. 在 Linux 系统安装 tomcat ,使用默认端口 8080 启动 tomcat 服务器

    2. 查看对外访问的端口

      $ firewall-cmd --add-port=8080/tcp --permanent
      $ firewall-cmd -reload
      #查看已经开放的端口号
      $ firewall-cmd --list-all
      # 重启防火墙
      $ firewall-cmd –reload
      

      注意:如果防火墙服务已经关闭,则可以省略这一步

    3. 修改本地 host 文件,将 www.1234567.com 映射 到虚拟机tomcat主页中 192.168.0.109:8080

      $ sudo su
      $ vim /etc/hosts
      # 添加IP 和域名的映射
      192.168.0.109    www.1234567.com
      

      Tips:当我们在浏览器中输入一个域名时,它是先去我们本地的host文件中找配置域名映射的IP地址配置,如果没找到,就去网络找DNS域名解析服务器,找网络中IP。

    4. nginx.conf配置文件中添加如下配置

      $ vim /usr/local/nginx/nginx.conf
      # 添加代码如下
      server {
      	listen		80;
      	server_name	www.1234567.com;
           	
      	location /{
      		proxy_pass    http://192.168.0.109:8080;
      		index index.html index.htm. index.jsp;
      	}
      }
      
    5. 在浏览器中进行访问测试

1.1.2 实例二

  • 实现效果:

    • 使用 nginx 反向代理,根据访问的路径跳转到不同端口的服务中,nginx 监听端口为 9001
    • 访问 http://192.168.0.109/edu/ 直接跳转到 192.168.109:8081
    • 访问 http://192.168.0.109/vod/ 直接跳转到 192.168.109:8082
  • 实现步骤

    1. 准备两个tomcat ,一个 8081端口,一个8082 端口,并准备好测试页面

      $ cp -r apache-tomcat-8.5.38 tomcat1
      $ cp -r apache-tomcat-8.5.38 tomcat2
      $ vim /home/silhouette/tomcat1/conf/server.xml
      $ cd /home/silhouette/tomcat1/webapps/ROOT
      $ mkdir edu
      $ vim index.jsp
      $ vim /home/silhouette/tomcat2/conf/server.xml
      $ cd /home/silhouette/tomcat2/webapps/ROOT
      $ mkdir vod
      $ vim index.jsp
      
    2. 修改 nginx 的配置文件,进行反向代理设置

      $ vim /usr/local/nginx/nginx.conf
      # 添加代码如下
      server {
      	listen       9001;
      	server_name   192.168.0.109;
           	
      	location   ~/edu/ {
      		proxy_pass   http://192.168.0.109:8081;
      	}
      	location   ~/vod/ {
      		proxy_pass   http://192.168.0.109:8082;
      	}
      }
      
    3. 开放9001、8081、8082端口

      # 查看已经开放的端口号
      $ firewall-cmd --list-all
      # 对外开放访问的端口
      $ firewall-cmd --add-service=http --permanent
      $ firewall-cmd --add-port=9001/tcp --permannent
      

      Tips:如果防火墙服务已经关闭,该步操作可省

    4. 在浏览器中进行测试,效果如图

1.2 负载均衡

1.2.1 负载均衡概述

  • 负载均衡:增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。

  • 图解负载均衡

1.2.2 负载均衡的实现

  • 实现效果

    • 浏览器地址输入http://192.168.0.108/edu/index.jsp,负载均衡效果,平均8081和8082端口中
  • 实现步骤

    1. 准备两台 tomcat 服务器,一台 8081 ,一台8082

    2. 在两台 tomcat 里面的 webapps 目录中,创建名称为 edu文件夹,在 edu 文件夹中创建页面index.jsp,用于测试访问

    3. 在 nginx 的配置文件中进行负载均衡的配置

      $ vim /usr/local/nginx/nginx.conf
      # 添加代码如下
      upstream myserver {
      		server 192.168.0.108:8081;
      		server 192.168.0.108:8082; 
      }
           
      server {
      	listen       9002;
      	server_name   192.168.0.108;
           	
      	location   / {
      		proxy_pass   http://myserver;
      		proxy_connect_timeout     10;
      	}
      }
      
    4. 测试运行

  • 负载均衡的策略:

    • Nginx 提供了还集中分配策略,上例采用的是轮询(默认)的方式,其他用法请查看传送门

1.3 动静分离

1.3.1 动静分离概述

Nginx 动静分离简单来说就是把动态和静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说就是动态请求更静态请求分开,可以理解成使用 Nginx 处理静态页面, Tomcat 处理动态页面。动静分离从目前来看大致分为两种:

  • 一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案

  • 另一种是就是动态和静态文件混合在一起发布,通过 nginx 来分开。

通过location指定不同的后缀名实现不同的请求转发。通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之间的请求和流量。具体Expires定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用Expires来缓存)。

如:我们这里设置 3d,表示在这 3天之内访问这个 URL ,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304,如果有修改,则直接从服务器重新下载,返回状态码 200。

1.3.2 实现步骤

  1. 静态资源准备

  2. 进行 nginx 配置

    $ vim /usr/local/nginx/nginx.conf
    # 添加代码如下
    server {
    	listen	    9003;
    	server_name  192.168.0.108;
         	
       location /html/ {
       		root /home/silhouette/static-file/;
       		# 列出目录下的文件
       		autoindex  on;
       		index index.html index.htm;
       }
       location /image/{
       		root /home/silhouette/static-file/;
       		index index.html index.htm;
       }
    }
    
  3. 在浏览器器中输入地址,查看效果

1.4 Nginx搭建高可用集群

1.4.1 什么是负载均衡高可用

Nginx 作为负载均衡器,所有请求都到了ngxin ,可见nginx 处于非常重要的位置,如果 nginx 服务器宕机后端 web 服务将无法提供服务,影响严重。

为了屏蔽负载均衡服务器的宕机,需要建立一个备份机。主服务器和备份机都运行在高可用(High Availability)监控程序,通过传送诸如 “I am alive” 这样的信息来监控对方的运行状况。当备份机不能在一定的时间内收到这样的信息时,它就接管主服务器的IP 并继续提供负载均衡服务;当备份管理器又从主管理器收到“I am alive”这样的信息时,它就释放 IP地址,这样的主服务就开始再次提供负载均衡服务。

  • 高可用原理图

  • 搭建环境需求

    • 需要两台 nginx 服务器
    • 需要keepalived
    • 需要虚拟 IP

1.4.2 什么是 keepalived

  • 简介

    • keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障
    • Keepalived 的作用是检测 web 服务器的状态,如果有一台 web 服务器死机,或工作出现故障,Keepalived 将检测到,并将有故障的 web 服务器从系统中剔除,当 web 服务器工作正常后 Keepalived 自动将 web 服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的 web 服务器
  • Keepalived 工作原理

    • Keepalied 是以 VRRP(Virtual Router Redundancy Protocol,即虚拟路由冗余协议) 协议为实现基础的
    • 虚拟路由协议,可以认为是实现路由器高可用的协议,即将 N 台提供相同功能的路由器组成一个路由器组,这个组里面有一个 master 和多个 backup,master 上面有一个对外提供服务的 vip (Virtual IP Address,虚拟IP 地址,该路由器所在局域网内其他机器的默认路由为该 vip) ,master 会分组播,当backup 手不到 VRRP 包时就认为 master 宕 掉了,这时就需要根据 VRRP 的优先级来选举一个 backup 当master。这样的话就可以保证路由器的高可用了。
    • Keepalived 主要有三个模块,分别是 core、check和 VRRP。core 模块为keepalived 的核心,负责主进程的启动、维护以及全局配置文件的家在和解析。check 负责健康检查,包括常见的各种检查方式。VRRP 模块是用来实现 VRRP 协议的。
  • 安装步骤

    # 关闭防火墙
    $ systemctl stop firewalld
    # //关闭 selinux,重启生效
    $ sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/sysconfig/selinux
    # 关闭 selinux,临时生效
    $ setenforce 0
    # 时间同步
    $ ntpdate 0.centos.pool.ntp.org
    $  yum install -y keepalived
    # 查看安装版本
    $  rpm -q -a keepalived
    # 安装路径 
    $ vim /etc/keepalived/keepalived.conf
    
  • keepalived.conf详解

    # 全局定义
    global_defs {
       notification_email {    #指定keepalived在发生切换时需要发送email到的对象,一行一个
         acassen@firewall.loc
         failover@firewall.loc
         sysadmin@firewall.loc
       }
       notification_email_from Alexandre.Cassen@firewall.loc    #指定发件人
       smtp_server 192.168.200.1											#指定smtp服务器地址
       smtp_connect_timeout 30													 #指定smtp连接超时时间
       router_id LVS_DEVEL #运行keepalived机器的一个标识
    }
      
    vrrp_script chk_http_port {
    		script "/usr/local/src/nginx_check.sh"
    		interval 2    #(检测脚本执行的间隔)
    		weight 2
    }
      
    vrrp_instance VI_1 {
        state MASTER  		# 备份服务器上将 MASTER 改为 BACKUP
        interface enp0s3    # 网卡,使用 ip addr 指令查看
        virtual_router_id 51  # 主、备机的 virtual_router_id 必须相同
        priority 100					# 主、备机取不同的优先级,主机值较大,备份机值较小
        advert_int 1					#MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
        authentication {     #设置认证
            auth_type PASS   #主从服务器验证方式
            auth_pass 1111
        }
        virtual_ipaddress {    #设置vip
            192.168.0.200 # VRRP H 虚拟地址(虚拟IP),可以多个虚拟IP,换行即可
        }
    }
    
  • 检测 Nginx 的脚本文件nginx_check.sh

    #!/bin/bash 
    A=`ps -C nginx –no-header |wc -l` 
    if [ $A -eq 0 ];then 
    		/usr/local/nginx/sbin/nginx 
    		sleep 2 
    		if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then 
    				killall keepalived 
    		fi 
    fi
    

1.4.3 keepalived + nginx 实现主备过程(主从模式)

  1. 修改 /etc/keepalived/keepalived.conf

    global_defs {
       notification_email {
         acassen@firewall.loc
         failover@firewall.loc
         sysadmin@firewall.loc
       }
       notification_email_from Alexandre.Cassen@firewall.loc
       smtp_server 192.168.200.1
       smtp_connect_timeout 30
       router_id LVS_DEVEL  
    }
       
    vrrp_script chk_http_port {
                    script "/usr/local/src/nginx_check.sh"
                    interval 2    
                    weight 2
    }
       
    vrrp_instance VI_1 {
        state MASTER                
        interface enp0s3    
        virtual_router_id 51  
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.0.200    # 虚拟IP
        }
    }
    
  2. 在/usr/local/src/ 路径下添加一个监听 nginx脚本,脚本代码如上nginx_check.sh

  3. 把两台 服务器上的 nginx 和keepalived 启动

    $ cd /usr/local/nginx/sbin/
    $ ./nginx
    # 启动 keepalived
    $ systemctl start keepalived.service
    # 加入开机自启动
    $ systemctl enable keepalived
    

  4. 测试运行

    1. 在浏览器地址栏中输入 虚拟IP地址 192.168.0.200

      通过ip addr可以查看绑定的虚拟IP,vip绑定在主nginx的enp0s3

    2. 把主服务器(192.168.0.107)的 nginx 和 keepalived 停掉再访问 192.168.0.200,发现访问正常

      • 查看主备 IP,此时备节点不会有 VIP(只有当主挂了的时候,VIP 才会飘到备节点)

      • 将主nginx的keepalived和nginx都启动,再次查看主备 IP,发现vip漂移到主nginx

      注意:主 nginx 恢复时一定要将nginx 也启动(通常 nginx 启动要加在开机启动中),否则即使 vip漂移到主nginx也无法访问。

1.4.4 keepalived + nginx 实现高可用集群(双主模式)

上面我们实现了 keepalived + nginx 高可用的主从模式,这种模式的的优点是有一个备份机,当主机宕机时,备份机就自动接管主服务器的IP 并继续提供负载均衡服务。但是要是我主机没有发生故障,那么备份机就会被闲置,从而造成浪费。因此,为了避免备份机的闲置造成的浪费,从而推出了 keepalived +nginx 的双主模式,集群架构图如下:

由上图可知,只需要修改上述示例中keepalived 服务的配置文件即可。此时此时LB-01 节点即为 Keepalived 的主节点也为备节点,LB-02 节点同样即为 Keepalived 的主节点也为备节点。LB-01 节点默认的主节点 VIP(192.168.1.110),LB-02 节点默认的主节点 VIP(192.168.1.210)

  • 实现步骤

    1. 配置 LB-01 节点

      $ vim /etc/keepalived/keepalived.conf
      # /编辑配置文件,增加一段新的vrrp_instance 规则
      ! Configuration File for keepalived
           
      global_defs {
         notification_email {
           acassen@firewall.loc
           failover@firewall.loc
           sysadmin@firewall.loc
         }
         notification_email_from Alexandre.Cassen@firewall.loc
         smtp_server 192.168.200.1
         smtp_connect_timeout 30
         router_id LVS_DEVEL
      }
           
      vrrp_script chk_http_port {
                      script "/usr/local/src/nginx_check.sh"
                      interval 2
                      weight 2
      }
           
      vrrp_instance VI_1 {
          state MASTER
          interface enp0s3
          virtual_router_id 51
          priority 100
          advert_int 1
          authentication {
              auth_type PASS
              auth_pass 1111
          }
          virtual_ipaddress {
              192.168.0.200
          }
      }
           
      vrrp_instance VI_2 {
      	state BACKUP
      	interface enp0s3
      	virtual_router_id 52
      	priority 99
      	advert_int 1
      	authentication {
      			auth_type PASS
      			auth_pass 2222
      	}
      	virtual_ipaddress {
      			192.168.0.210
      	}
      }
      # 重新启动 keepalived
      $ systemctl restart keepalived
      
      • 查看 LB-01 节点的 IP 地址,发现 VIP(192.168.0.109)同样还是默认在该节点

    2. 配置 LB-02 节点

      $ vim /etc/keepalived/keepalived.conf
      # //编辑配置文件,增加一段新的 vrrp_instance 规则
      global_defs {
         notification_email {
           acassen@firewall.loc
           failover@firewall.loc
           sysadmin@firewall.loc
         }
         notification_email_from Alexandre.Cassen@firewall.loc
         smtp_server 192.168.200.1
         smtp_connect_timeout 30
         router_id LVS_DEVEL
      }
           
      vrrp_script chk_http_port {
                      script "/usr/local/src/nginx_check.sh"
                      interval 2
                      weight 2
      }
           
      vrrp_instance VI_1 {
          state BACKUP
          interface enp0s3
          virtual_router_id 51
          priority 99
          advert_int 1
          authentication {
              auth_type PASS
              auth_pass 1111
          }
          virtual_ipaddress {
              192.168.0.200
          }
      }
           
      vrrp_instance VI_2 {
      		state MASTER
      		interface enp0s3
      		virtual_router_id 52
      		priority 100
      		advert_int 1
      		authentication {
      			auth_type PASS
      			auth_pass 2222
      		}
      		virtual_ipaddress {
      				192.168.0.210
      		}
      }
      # 重新启动 keepalived
      $ systemctl restart keepalived
      
      • 查看 LB-02 节点 IP,会发现也多了一个 VIP(192.168.0.110),此时该节点也就是一个主了。

    3. 测试1

Tips: 测试可以发现我们访问 keepalived 中配置的两个 VIP 都可以正常调度等,当我们停止任意一台 keepalived节点,同样还是正常访问;到此,keepalived+nginx 高可用集群(双主模式)就搭建完成了。