wangshuping

Nginx简介

1、nignx介绍

Nginx (engine x) 是一个高性能的HTTP反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务

其特点是占有内存少,并且nginx处理高并发能力是非常强,中国大陆使用nginx网站用户有:百度、京东新浪网易腾讯淘宝等。

2、正向代理

需要在客户端配置代理服务器进行指定网站访问(如VPN)

3、反向代理

暴露的是代理服务器的地址,隐藏了真实服务器的IP地址

4、负载均衡

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

5、动静分离

动静分离是指在web服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口分开不同系统访问的架构设计方法,进而提升整个服务访问性能和可维护性。

Nginx 的安装(基于Centos7.x minimal)

1、准备工作

  1. Centos7.X服务器一台

  2. 使用xshell连接服务器

  3. 到nginx官网下载nginx软件

    http://nginx.org/

2、安装 pcre openssl、zlib、gcc依赖

yum -y install gcc-c++
yum -y install pcre pcre-devel
yum -y install zlib zlib-devel
yum -y install openssl openssl-devel libssl-dev

3、安装 Nginx

  1. 解压

    [root@bogon sbin]# tar -zxvf nginx-1.17.9.tar.gz
    
  2. 安装

    [root@bogon sbin]# cd nginx-1.17.9
    [root@bogon sbin]# ./configure
    [root@bogon sbin]# make && make install
    
  3. 如果没报错,查看是否安装成功

    whereis nginx
    
  4. 配置防火墙规则

    # 查看防火墙规则
    firewall-cmd --list-all    # 查看全部信息
    firewall-cmd --list-ports  # 只看端口信息
    
    # 开启端口
    开端口命令:firewall-cmd --zone=public --add-port=80/tcp --permanent
    重启防火墙:systemctl restart firewalld.service
    
    命令含义:
    --zone #作用域
    --add-port=80/tcp  #添加端口,格式为:端口/通讯协议
    --permanent   #永久生效,没有此参数重启后失效
    
  5. 进入目录/usr/local/nginx/sbin/ 启动nginx

    #进入目录
    cd /usr/local/nginx/sbin/
    #启动nginx
    ./nginx
    
  6. 浏览器输入ip地址访问(如果是服务器需要配置安全组)

Nginx 常用命令

# 进入nginx sbin目录下
[root@bogon sbin]# cd /usr/local/nginx/sbin/
# 查看nginx版本
[root@bogon sbin]# ./nginx -v
nginx version: nginx/1.17.9
# 启动nginx
[root@bogon sbin]# ./nginx 
# 重新加载nginx配置文件
[root@bogon sbin]# ./nginx -s reload
# 停止nginx
[root@bogon sbin]# ./nginx -s stop

Nginx 配置文件

1、主配置文件目录 :/user/local/nginx/conf/nginx.conf

去掉注释后,精简如下

参考:https://www.cnblogs.com/bluestorm/p/4574688.html

# 全局块
worker_processes  1;
# events块
events {
    worker_connections  1024;
}
#http块
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

2、nginx.conf配置文件中包含三部分内容

  1. 全局配置

    从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 workerprocess 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。

    比如:

    • woker_processes 2
      在配置文件的顶级main部分,worker角色的工作进程的个数,master进程是接收并分配请求给worker处理。这个数值简单一点可以设置为cpu的核数grep ^processor /proc/cpuinfo | wc -l,也是 auto 值,如果开启了ssl和gzip更应该设置成与逻辑CPU数量一样甚至为2倍,可以减少I/O操作。如果nginx服务器还有其它服务,可以考虑适当减少。
    • worker_cpu_affinity
      也是写在main部分。在高并发情况下,通过设置cpu粘性来降低由于多CPU核切换造成的寄存器等现场重建带来的性能损耗。如worker_cpu_affinity 0001 0010 0100 1000; (四核)。
    • worker_connections 2048
      写在events部分。每一个worker进程能并发处理(发起)的最大连接数(包含与客户端或后端被代理服务器间等所有连接数)。nginx作为反向代理服务器,计算公式 最大连接数 = worker_processes * worker_connections/4,所以这里客户端最大连接数是1024,这个可以增到到8192都没关系,看情况而定,但不能超过后面的worker_rlimit_nofile。当nginx作为http服务器时,计算公式里面是除以2。
    • worker_rlimit_nofile 10240
      写在main部分。默认是没有设置,可以限制为操作系统最大的限制65535。
    • use epoll
      写在events部分。在Linux操作系统下,nginx默认使用epoll事件模型,得益于此,nginx在Linux操作系统下效率相当高。同时Nginx在OpenBSD或FreeBSD操作系统上采用类似于epoll的高效事件模型kqueue。在操作系统不支持这些高效模型时才使用select。
  2. events快

    影响 Nginx 服务器与用户的网络连接

    比如 worker_connections 1024; 支持的最大连接数为 1024

  3. http块

    与提供http服务相关的一些配置参数。例如:是否使用keepalive啊,是否使用gzip进行压缩等。

    • sendfile on
      开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,减少用户空间到内核空间的上下文切换。对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。
    • keepalive_timeout 65 : 长连接超时时间,单位是秒,这个参数很敏感,涉及浏览器的种类、后端服务器的超时设置、操作系统的设置,可以另外起一片文章了。长连接请求大量小文件的时候,可以减少重建连接的开销,但假如有大文件上传,65s内没上传完成会导致失败。如果设置时间过长,用户又多,长时间保持连接会占用大量资源。
    • send_timeout : 用于指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。
    • client_max_body_size 10m
      允许客户端请求的最大单文件字节数。如果有上传较大文件,请设置它的限制值
    • client_body_buffer_size 128k
      缓冲区代理缓冲用户端请求的最大字节数

Nginx 配置反向代理单个Tomcat

1、没有使用反向代理之前的访问过程分析

image-20200404003924838

2、配置Nginx反向代理

  1. 在windows系统的host文件中配置域名与ip地址的对应关系

    如果不可编辑,就把原文件内容复制出来,保存到一个新文件中,编辑好后覆盖原来的文件。

  2. 在nginx.conf中配置请求转发(反向代理配置)

  3. 浏览器输入网址进行访问

3、使用反向代理之后的访问过程分析

Nginx 配置反向代理多个Tomcat

1、实现效果

使用nginx反向代理,根据访问的路径不同,跳转到不同端口的服务中

nginx监听的端口为8888

访问 http://192.168.17.129:9001/dev1/ 直接跳转到 127.0.0.1:8080

访问 http:// 192.168.17.129:9001/dev2/ 直接跳转到 127.0.0.1:8081

2、准备工作

(1)准备2个tomcat服务器,一个8080端口,一个8081端口

​ 注意,第二个tomcat最好重新解压,并且修改全部端口,否则冲突

(2)编写好测试页面

​ 在tomcat 8080 webapps中创建 dev1文件夹,并且在下面创建index.html

​ 在tomcat 8081 webapps中创建 dev2文件夹,并且在下面创建index.html

image-20200404170945611

​ 请注意这个目录,在webapps下创建dev2文件夹,在下面创建index.html

3、具体配置

1、编辑nginx.conf配置文件

​ 或者 (推荐第一种写法

2、浏览器访问

访问tomcat 8080

访问tomcat 8081

3、nginx location匹配规则

该指令用于匹配 URL。
语法如下:

location [ = | ~ | ~* | ^~ ] uri {

}

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

注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~ 标识。

Nginx 配置负载均衡

1、实现效果

浏览器地址栏输入http://192.168.119.130/

访问不同的tomcat服务器

2、准备工作

(1)准备2台tomcat服务器,一台8080,一台8081

(2)在两天tomcat的webapps/ROOT 里面创建index.html,用于测试

3、负载均衡配置

4、浏览器访问

5、nginx 负载均衡服务器分配策略

  1. 第一种 轮询(默认)

    每个请求按照时间顺序逐一分配到不同的后端服务器,如果某一台后台服务器down掉,会自动剔除

  2. 第二种 weight

    weight 代表权重,默认为1,权重越高分配的客户端越多

    特点:指定轮训几率,weight和访问比率成正比,用于后端服务器性能不均的情况

  3. 第三种 ip_hash

    每个请求按照访问ip的hash结果进行分配,这样每个访客固定访问一个后端服务器,可以解决session的问题

  4. 第四种 fair(第三方)

    upstream server_pool{
    	server 192.168.5.21:80;
    	server 192.168.5.22:80;
    	fair;
    }
    

Nginx 配置动静分离

1、什么是动静分离?

通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资源****设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用** Expires 来缓存),我这里设置 3d****,表示在这 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304****,如果有修改,则直接从服务器重新下载,返回状态码 200****。

2、实现效果

​ 不需要向tomcat发起请求即可访问静态资源

3、准备工作

(1)在根目录下创建 /data 目录,在data目录下创建 www 和image 2个目录

(2)在www下创建index.html

(3)在image下放入图片

4、nginx配置

(1)root :配置资源根目录

(2)autoindex on :访问根目录可以查看根目录中的文件和文件夹(不是必须)

4、浏览器访问

地址栏:http://192.168.119.130/image/a.jpg

地址栏:http://192.168.119.130/www/index.html

5、Expires缓存

可以看出来IE和火狐都走了缓存

测试IE

测试firefox

Nginx 的高可用集群

高可用简介

1、什么是高可用?

​ 高可用 HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。如果一个系统可以一直提供服务,那他这个可用性则是100%,但是这是很难的,我们必须去做好预防,尽可能的减少服务的故障

2、解决什么问题?

​ 在生产环境上很多时候都使用 Nginx 做反向代理提供服务,但是Nginx也难免会发生故障,如:服务器宕机,当Nginx宕机那么所有对外提供的服务接口都会无法访问。

3、双机热备方案

这种方案是国内企业中一种较为普遍的高可用方案,双机热备是应用于服务器的一种解决方案,其构造思想是主机和从机通过TCP/IP网络连接,正常情况下主机处于工作状态,从机处于监视状态,一旦从机发现主机异常,从机将会在很短的时间之内代替主机,完全实现主机的功能

3、keepalived介绍

Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP (Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件

4、故障转移机制

Keepalived的高可用服务直接的故障切换转移,是通过 VRRP来实现的。

Keepalived服务正常工作时,主 Master节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点自己还活着,当主 Master节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的 IP资源及服务。而当主 Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。

5、yum安装 Keepalived ,该方式会自动下载安装依赖

yum -y install keepalived

yum安装完成后,会在/etc/keepalived/下生产 keepalived 的配置文件

5、配置高可用以后的访问模式

Keepalived+Nginx高可用集群(主从模式)

1、实现效果

当主服务器宕机后,从服务器接管服务请求,并作出响应

2、准备工作

两台Centos 7虚拟机,安装好Nginxkeepalived

192.168.119.130(主)

192.168.119.131(从)

3、keepalived 配置

  1. 192.168.119.130 修改keepalived配置文件

    ! 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.119.130
       smtp_connect_timeout 30
       router_id LVS_DEVEL
       vrrp_skip_check_adv_addr
       vrrp_strict
       vrrp_garp_interval 0
       vrrp_gna_interval 0
    }
    
    #检测脚本
    vrrp_script chk_http_port {
        script "/usr/local/src/check_nginx_pid.sh" #心跳执行的脚本,检测nginx是否启动
        interval 2                          #(检测脚本执行的间隔)
        weight 2                            #权重
    }
    #vrrp 实例定义部分
    vrrp_instance VI_1 {
        state MASTER                 # 指定keepalived的角色,MASTER为主,BACKUP为备
        interface ens33               # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
        virtual_router_id 66           # 主、备机的 virtual_router_id 必须相同
        priority 99                     #主、备取不同的 优先级,主机值较大,备份机值较小
        advert_int 1                  # 检查间隔,默认为1s(vrrp组播周期秒数)
        #授权访问
        authentication {
            auth_type PASS 	#设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
            auth_pass 1111
        }
        track_script {
            chk_http_port                   #(调用检测脚本)
        }
        virtual_ipaddress {
            192.168.119.188                   # 定义虚拟ip(VIP),可多设,每行一个
        }
    }
    
    
    
  2. 192.168.119.131 修改keepalived配置文件

    ! 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.119.130
       smtp_connect_timeout 30
       router_id LVS_DEVEL
       vrrp_skip_check_adv_addr
       vrrp_strict
       vrrp_garp_interval 0
       vrrp_gna_interval 0
    }
    
    #检测脚本
    vrrp_script chk_http_port {
        script "/usr/local/src/check_nginx_pid.sh" #心跳执行的脚本,检测nginx是否启动
        interval 2                          #(检测脚本执行的间隔)
        weight 2                            #权重
    }
    #vrrp 实例定义部分
    vrrp_instance VI_1 {
        state BACKUP                 # 指定keepalived的角色,MASTER为主,BACKUP为备
        interface ens33               # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
        virtual_router_id 66           # 主、备机的 virtual_router_id 必须相同
        priority 90                     #主、备取不同的 优先级,主机值较大,备份机值较小
        advert_int 1                  # 检查间隔,默认为1s(vrrp组播周期秒数)
        #授权访问
        authentication {
            auth_type PASS 	#设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
            auth_pass 1111
        }
        track_script {
            chk_http_port                   #(调用检测脚本)
        }
        virtual_ipaddress {
            192.168.119.188                   # 定义虚拟ip(VIP),可多设,每行一个
        }
    }
    
    
    
  3. 心跳检测脚本 /usr/local/src/check_nginx_pid.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
    

4、启动服务

启动 192.168.119.130(主)

./nginx  # 启动nginx
systemctl start keepalived.service # 启动keepalived服务

192.168.119.131(从)

./nginx  # 启动nginx
systemctl start keepalived.service # 启动keepalived服务

5、测试

浏览器访问:http://192.168.119.188/

停止 192.168.119.130(主)nginx

./nginx -s stop # 停止nginx

浏览器访问:http://192.168.119.188/

完事

Keepalived+Nginx高可用集群(双主模式)

待补充……

Nginx 原理

1、master和worker

查看进程可以发现nginx有一个worker和一个master

2、worker工作机制

3、一个master和多个worker有哪些好处?

  1. 可以使用nginx -s reload热部署
  2. 每个worker是独立的进程,如果有其中一个worker出现问题,其他worker是独立的,继续进行争抢,实现请求过程,不会造成服务器中断

4、设置多少个worker合适

worker数和服务器的cpu数相等是最为适宜的

5、连接数worker_connection

问题1: 发送请求,占用了worker的几个连接数?

答:

​ 如果是普通的静态访问,不需要访问tomcat服务器是: 2个

​ 如果是 HTTP 作 为反向代理来说是: 4个

问题2:nginx有一个master,有四个worker,每个worker支持最大的连接数1024,支持的最大并发数是多少?

答:

一个worker支持的默认最大连接数

如果是普通的静态资源,最大并发数量是:worker_connection*worker_processes/2

如果是 HTTP 作 为反向代理来说,最大并发数量是:worker_connection*worker_processes/4

分类:

技术点:

相关文章: