五、Nginx的配置实例1——反向代理1

5.1 实现效果

  • 打开浏览器,在浏览器地址栏中输入地址www.123.com,跳转到Linux系统tomcat主页面中

5.2 准备工作

  1. 在linux系统中安装tomcat,使用默认端口8080

    1. 将tomcat压缩包放到linux系统的/usr/src文件夹中,并tar -zxvf apache-tomcat-7.0.70.tar.gz
    2. 进入解压后的文件夹的bin目录中,./startup.sh启动服务器
  2. 对外开放访问的端口(centos7)

    1. firewall-cmd --add-port=8080/tcp --permanent
    2. firewall-cmd -reload
  3. 在windows系统中通过浏览器访问tomcat服务器

5.2.1 问题解决

  • 使用命令./startup.sh开启tomcat服务后,进入tomcat文件夹下的logs文件夹,使用命令tail -f catalina.out,出现如下错误信息

  • 错误原因是JAVA_HOME环境变量设置错误,需要调整正确

    • 解决:

      • 输入命令:vim /etc/profile
      • JAVA_HOME修改为正确路径
      • 输入命令:source /etc/profile,<font color="red">使修改立即生效!!(这步别忘!)</font>

5.3 反向代理过程分析

5.4 具体配置(nginx.conf)

5.4.1 配置域名ip关系映射

  • 在windows系统的host文件进行域名和ip对应关系的配置
  1. C:\Windows\System32\drivers\etc该路径下找到HOSTS文件

  1. 用文本编辑共计,将修改信息写入

5.4.2 请求转发配置(反向代理配置)

  • 在nginx进行请求转发的配置(反向代理配置)
  1. 修改nginx配置文件,路径为:/usr/local/nginx/conf/nginx.conf
  2. 在全局server块中修改server_name为linux主机IP10.66.120.37
  3. 修改location块,加入

    proxy_pass http://127.0.0.1:8080

  1. 进入/usr/local/nginx/sbin,输入命令./nginx开启

5.4.3 测试

  • 在浏览器中输入www.123.com进行测试

五、Nginx配置实例2——反向代理2

5.1 实现效果

  • 使用nginx反向代理,根据访问的路径跳转到不同端口的服务中。nginx监听端口为9001
  • 访问http://127.0.0.1:9001/edu/,直接跳转到127.0.0.1:8080
  • 访问http://127.0.0.1:9001/vod/,直接跳转到127.0.0.1:8081

5.2 准备工作

5.2.1 准备两个tomcat

  1. 准备两个tomcat,在/usr.src目录下新建两个文件夹,分别拖入tomcat压缩包

  1. 进入8080文件夹,不用改端口,解压后直接进入apache/bin/startup.sh启动
  2. 进入8081文件夹,解压后进入conf文件夹,修改vim server.xml文件,修改端口为8081,其他默认的端口也需要修改,详见下图

3_修改位置2

4_修改位置3

  1. 开启8081的tomcat,此时,已经开启端口分别为8080和8081的两个服务器

6_8081开启成功

5.2.2 创建文件夹和测试页面

  1. 创建测试页面a.html

  1. 在8080服务器的webapp目录下,创建edu目录,将a.html拖入

  1. 测试

  1. 同上面步骤,在8081服务器的webapp目录下,创建vod目录,将a.html拖入,内容改为<h1>8081</h1>

5.3 具体配置(nginx.conf)

  1. 进入/usr/local/nginx/conf/,修改该目录下的nginx.conf文件
  2. 补充一下代码

  1. 开放8080、8081、9001的端口(我这里是centos6,图方便,将防火墙全部关闭了service iptables stop
  2. 启动nginx,进入/usr/local/nginx/sbin,然后直接./nginx启动

  1. 测试

16_9002vod测试成功

5.4 location块的详解

  1. =:用于不含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
  2. ~:用于标识uri包含正则表达式,并且区分大小写
  3. ~*:用于标识uri包含正则表达式,并且不区分大小写
  4. ^~:用于不含正则表达式的uri前,要求nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。
  5. 注意:如果uri包含正则表达式,则必须要有~或者~*标识。

六、Nginx的配置实例——负载均衡

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

6.1 实现效果

  • 浏览器中输入地址http://10.66.93.167/edu/a.html,实现负载均衡效果,将请求平均分配到8080和8081端口中

6.2 准备工作

  1. 准备两个tomcat服务器(反向代理案例2中已完成)
  2. 在两个tomcat中的webapps目录中,创建名称是edu的文件夹,在该文件夹中创建页面a.html,用于测试

6.3 具体配置(nginx.conf)

  1. 进入/usr/local/nginx/conf/,修改该目录下的nginx.conf文件
  2. 具体修改如下:

18_负载均衡2

  1. 重启nginx.conf:进入nginx/sbin目录下,执行./nginx - s reload命令。
  2. 用火狐浏览器测试成功,用谷歌浏览器可能因为缓存的原因没有成功

6.4 nginx常用分配方式

6.4.1 轮询(默认)

  • 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down了,会自动剔除该服务器。
upstream myserver{
    server 10.66.93.167:8080;
    server 10.66.93.167:8081;
}

6.4.2 weight

  • weight代表权重,默认为1,权重越高被分配的客户端请求越多。指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream myserver{
    server 10.66.93.167:8080 weight=10;
    server 10.66.93.167:8081 weight=10;
}

6.4.3 ip_hash

  • 每个请求按访问ip的hash结果分配,这样每个方可固定访问一个后端服务器,可以解决session问题。
upstream myserver{
    ip_hash;
    server 10.66.93.167:8080;
    server 10.66.93.167:8081;
}

6.4.4 fair(第三方)

  • 按后端服务器的响应时间分配请求,响应时间短的优先分配。
upstream myserver{
    server 10.66.93.167:8080;
    server 10.66.93.167:8081;
    fair;
}

七、Nginx的配置实例——动静分离

7.1 什么是动静分离

  • nginx动静分离简单来说就是把动态请求和静态请求分离开,不能理解成只是单纯的把动态页面和静态页面物理分离。可以理解成使用nginx处理静态页面,tomcat处理动态页面。
  • 动静分离从目前的实现角度大致分为两种:

    • 纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案。
    • 动态和静态文件混合在一起发布,通过nginx来分开。
  • 通过location指定不同的后缀名实现不同的请求转发。通过expire参数设置,可以使浏览器缓存过期时间,减少与服务器之间的请求和流量。
  • 具体expire定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所有不会产生额外的流量。这种方法非常适合不经常变动的资源,经常更新的文件不建议使用expire来缓存。

    • 举例:若将expire设定为3d,表示这三天内访问这个url,发送一个访问请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304;如果有修改,直接从服务器重新下载,返回状态码200

7.2 准备工作

  • /根目录下创建data文件夹,在其中创建wwwimage文件夹

7.3 具体配置(nginx.conf)

  1. 进入/usr/local/nginx/conf/,修改该目录下的nginx.conf文件
  2. 具体修改如下:

    1. autoindex on:列出文件目录

  1. 重启nginx.conf:进入nginx/sbin目录下,执行./nginx - s reload命令。
  2. 测试:输入地址http://10.66.93.167/image/01.jpghttp://10.66.93.167/www/a.html

七、Nginx的配置实例——高可用

7.1 什么是高可用

  • 简单理解高可用,就是nginx挂了,但是还能访问,并提供服务

  • 需要两台nginx服务器
  • 需要keepalived
  • 需要绑定虚拟ip

7.2 配置高可用的准备工作

  1. 需要两台虚拟机
  2. 在两台服务器上都安装nginx
  3. 在两台服务器上都安装keepalived:yum install keepalived -y

    1. rpm -q -a keepalived:查询安装情况
    2. 安装完成后,会在/etc里面生成目录keepalived,有文件keepalived.conf
  4. 完成高可用配置(主从配置)

    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 10.66.93.167
          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    #备份服务器上将MASTER改为BACKUP
          interface ens33    #网卡名 ifconfig查看
          virtual_router_id 51    #主、备机的virtual_router_id必需相同
          priority 90        #主、备机取不同的优先级,主机值较大,备份机值较小
          advert_int 1
          
          authentication{
              auth_type PASS
              auth_pass 1111
          }
          
          virtual_ipaddress{
              10.66.93.50 #VRRP H虚拟地址
          }
      }
    2. /usr/local/src添加检测脚本

      #!/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
    3. 把两台服务器上的Nginx和keepalived启动

      1. 启动nginx:./nginx
      2. 启动keepalived:systemctl start keepalived.service
  5. 最终测试:

    1. 在地址栏中输入虚拟ip地址 10.66.93.50
    2. 把主服务器的nginx和keepalived停止,再次输入虚拟地址

7.3 高可用配置文件详解

7.3.1 全局块(global_defs)

global_defs{
    notification_email{
        acassen@firewall.loc
        failover@firewall.loc
        sysadmin@firewall.loc
    }
    
    notification_email_from Alexandre.Cassen@firewall.loc
    smtp_server 10.66.93.167
    smtp_connect_timeout 30
    router_id LVS_DEVEL #访问到主机,这个在/etc/host中进行修改
}

7.3.2 脚本块(vrrp_script chk_http_port)

vrrp_script chk_http_port{
    script "/usr/local/src/nginx_check.sh" #执行该目录下的脚本
    interval 2  #(检测脚本执行的间隔为2s)
    weight 2    #权重
}

7.3.3 虚拟ip(vrrp_instance VI_1)

vrrp_instance VI_1{
    state MASTER    #备份服务器上将MASTER改为BACKUP
    interface ens33    #网卡名 ifconfig查看
    virtual_router_id 51    #主、备机的virtual_router_id必需相同
    priority 100        #主、备机取不同的优先级,主机值较大,备份机值较小
    advert_int 1        #每隔1s检测服务器是否还活着
    
    authentication{
        auth_type PASS
        auth_pass 1111
    }
    
    virtual_ipaddress{
        10.66.93.50 #VRRP H虚拟地址
    }
}

7.3.4 脚本详解(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

八、Nginx的原理

8.1 master&worker

  • master相当于小老板,将大老板管理员派下来的活分散给各个工人worker

8.2 worker是如何工作的

8.3 1个master和n个worker的好处

  • 可以使用nginx -s reload热部署,利用nginx进行热部署操作
  • 每隔worker是独立的进程,如果有其中的一个worker出现问题,其他worker独立的,继续进行争抢,实现请求过程,不会造成服务中断。
  • 首先,对于每个worker进程来说,独立的进程,不需要加锁,所以声嗲了锁带来的开销,同时在编程以及问题查找时,也会方便很多。
  • 其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其他进程还在工作,服务不会中断,master进程则很快启动的新的worker进程。
  • worker进程的异常退出,会导致当前worker上的所有请求失败,但不会影响到所有请求,降低了风险。

8.4 设置多少个worker合适

  • worker数量和服务器的cpu数相等时最好的。
  • nginx和redis类似都采用了io多路复用机制,每个worker都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式处理请求,即使是成千上万个请求也没问题。每个worker的线程可以把一个cpu的性能发挥到极致。所以worker数量和服务器的cpu数相等时最好的,少了浪费,多了增加损耗。

8.5 连接数worker_connection

8.5.1 发送一个请求,占用了worker的几个连接数

  • 2或4个

8.5.2 nginx有一个master,有4个worker,每个worker支持的最大连接数是1024,支持的最大并发数是多少?

  • 普通的静态访问最大并发数是:worker_connections*worker_processes/2
  • 如果是http作为反向代理来说,最大并发数量是

worker_connections*worker_processes/4

Last modification:November 11th, 2019 at 03:59 pm