Nginx配置高可用的集群

Nginx

1.Nginx反向代理

  • 既然是反向代理,那么什么是正向代理,当一个用户向访问谷歌浏览器,我通过在浏览器中配置代理服务器(比如www.zxdl.com)通过代理服务器去访问谷歌浏览器。

  • 而反向代理是,其实客户端对代理无感知,客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后再返回客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴漏的是代理服务器地址。隐藏真实服务器地址。

2.负载均衡

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

3.动静分离

  • 动态资源和静态资源分开部署,把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。

4.nginx安装

  • 安装nginx前需要安装一些依赖

    1.pcre依赖安装
    wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz
    
    tar -xvf pcre-8.37.tar.gz 
    cd pcre-8.37/
    # 检查,如果抱错:configure: error: You need a C++ compiler for C++ support. 请执行:yum install -y gcc gcc-c++
    ./configure 
    # 安装
    make && make install
    # 查看安装是否完成:pcre-config --version
    # yum 安装 openssl zlib 
    # yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
    
  • 安装nginx

    https://www.runoob.com/linux/nginx-install-setup.html
    

5.nginx常用命令

# 查看版本好
/usr/sbin/nginx -v
# 启动
/usr/sbin/nginx
# 停止
/usr/sbin/nginx -s stop
# 重新加载配置
/usr/sbin/nginx -s reload

6.nginx配置

  • 全局块:主要影响nginx服务器整体运行配置指令
  • events块:影响nginx与用户网络连接
  • http块:

6.1全局块

worker_processes 1; #它可以有效提高并发处理,根据CPU核心数,e.g:双核4线程可以设置为4
worker_connections #单个工作进程可以允许同时建立连接的数量。默认:1024。它与内存和操作系统级别的‘进程最大可打开文件数’

6.2events块

1.connections不是随便设置的,而是与两个指标有重要关联,一是内存,二是操作系统级别的“进程最大可打开文件数”。
2.内存:每个连接数分别对应一个read_event、一个write_event事件,一个连接数大概占用232字节,2个事件总占用96字节,那么一个连接总共占用328字节,通过数学公式可以算出100000个连接数大概会占用 31M = 100000 * 328 / 1024 / 1024,当然这只是nginx启动时,connections连接数所占用的nginx。
3.进程最大可打开文件数:进程最大可打开文件数受限于操作系统,可通过 ulimit -n 命令查询,以前是1024,现在是65535,
nginx提供了worker_rlimit_nofile指令,这是除了ulimit的一种设置可用的描述符的方式。 该指令与使用ulimit对用户的设置是同样的效果。此指令的值将覆盖ulimit的值,如:worker_rlimit_nofile 20960;
设置ulimits:ulimit -SHn 65535

6.3http块

  • http块,server块

7.Nginx配置实例-反向代理

server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  192.168.1.1;#访问ip
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
          proxy_pass http://127.0.0.1:8080
        }
  ...
}
# 当用户浏览器访问192.168.1.1 就会反向代理到 http://127.0.0.1:8080
  • 根据不同路径访问,当访问 127.0.0.1:9001/edu/将转发到http://127.0.0.1:8001,当访问 127.0.0.1:9001/vod/将转发到http://127.0.0.1:8002,
server {
        listen       9001;
        server_name  localhost;
  location ~/edu/ {
    proxy_pass http://127.0.0.1:8001;
  }
  location ~/vod/ {
    proxy_pass http://127.0.0.1:8002;
  }
}

  • 负载均衡。浏览器访问http://192.168.1.1/edu/a.html 负载均衡效果,平均分配8080和8081
# 负载均衡配置

![image-20200827231727170](/Users/xujunkai/Library/Application Support/typora-user-images/image-20200827231727170.png)

  • 动静分离
    • 静态资源放在独立服务器上。通过nginx转到静态服务器。通过expires可以设计浏览器缓存时间。它会对比服务器该文件最后更新时间的变化,如果没有变化,则不从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200。
location /www/ {
  root /data/; #访问data目录下静态文件
  autoindex on;# 它会列出当前文件下所有静态资源
}
# 当你输入   http://192.168.1.1/xxxx/a.html
location /xxx/ {
  root /data/; #访问data目录下静态文件
}
# 直接返回a.html

7.Nginx配置高可用的集群

  • 一台主服务器一台从服务器

  • 需要一个软件keepalived

对外暴漏一个虚拟ip,当主服务器挂了,会将虚拟IP转从服务器。
  • 准比工作
1.准备2台服务器
2.在两台服务器安装nginx
3.在两台服务器安装keepalived
	yum install keepalived
  • 编辑/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# 唯一值,服务器名字可在vi /etc/hosts中配置,如 127.0.0.1 LVS_DEVEL
}
# 检测脚本 和权重参数,判断nginx是否活着
vrrp_script chk_http_port {
  script "/usr/local/src/nginx_check.sh"
  interval 2 #检测脚本执行间隔
  weight 2 #设置当前服务器权重
}

// 虚拟ip配置
vrrp instance VI_1 {
  state MASTER # 主服务器为MASTER,备份服务器BACKUP
  interface ens33 # 要在哪个网卡绑定你虚拟主机名字
  virtual_router_id 51# 主,备机的virtual_router_id必须相同
  priority 100 #主,备机取不同的优先级,主机值较大,备份机较小
  advert_int 1# 每隔1秒,进行心跳
  # 权限校验
  authentication {
    auth_type PASS
    auth_pass 1111
  }
  virtual_ipaddress {
    192.168.11.50 # 虚拟ip地址绑定,当然可以绑定多个
  }
}
  • nginx_check.sh 检查nginx是否还活着
#! /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
  • 从服务器更改 虚拟ip配置即可
state BACKUP # 主服务器为MASTER,备份服务器 BACKUP
priority 90 # priority小于主服务器
  • 启动nginx 主服务器和备份服务器
  • 启动keepalived
systemctl start keepalived.service
  • 测试
1.在浏览器输入虚拟ip也就是上面设置的192.168.11.50
2.通过ip a 查看虚拟ip是否绑定

# 当把主服务器停止 再从浏览器访问虚拟ip,按理来说是可以访问的
./nginx -s stop #停止主服务器
# 浏览器也可以正常访问。说明切换了备份服务器。

8.nginx机制

![image-20200830110351231](/Users/xujunkai/Library/Application Support/typora-user-images/image-20200830110351231.png)

- 一个 master和多个woker工作的好处
- 可以使用nginx -s reload热部署,利用nginx进行热部署
- 每个work是独立进程,如果其中一个woker出现问题,其他woker独立的,继续进行争抢,实现请求过程,不会造成服务中断
- nginx使用io多路复用,Windows无这种机制。
  • 关于连接数
根据cpu数量设置worker
发送请求占用多少个woker连接数???要么2个,要么4个
  连接 + 返回
work支持最大连接数: cpu核数 乘以最大连接数:比如4个worker 每个worker支持1024连接数 那么就是4*1024
worker支持最大并发数???? 
	4*1024除以2 或 4, 但也不绝对,支持最大并发数,应该用如下公式

	- 普通静态访问最大并发数:worker_connections * worker_processes/2
	- 而如果是HTTP作为反向代理,最大并发数量是worker_connections * worker_processes/4

原文地址:https://www.cnblogs.com/xujunkai/p/13657978.html