nginx大全配置解析高可用集群负载均衡

1、安装

  • 安装依赖

    yum install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel

  • 创建临时目录

    mkdir /var/temp/nginx -p
    
  • 配置安装模块信息

    ./configure    --prefix=/usr/local/nginx    --pid-path=/var/run/nginx/nginx.pid    --lock-path=/var/lock/nginx.lock    --error-log-path=/var/log/nginx/error.log    --http-log-path=/var/log/nginx/access.log    --with-http_gzip_static_module    --http-client-body-temp-path=/var/temp/nginx/client    --http-proxy-temp-path=/var/temp/nginx/proxy    --http-fastcgi-temp-path=/var/temp/nginx/fastcgi    --http-uwsgi-temp-path=/var/temp/nginx/uwsgi    --http-scgi-temp-path=/var/temp/nginx/scgi
    
    
  • 编译并安装

    make && make install
    

2、进程模型

master 用来接收指令控制 worker ,worker 进程才是实际对外提供服务的进程

  • master 主进程

    接收指令,发送给 worker 由worker 执行如:nginx -s reload

  • worker 工作进程

    #user  nobody;
    #可调整工作进程数,worker_ processes的值通常不会大于服务器中cpu的核心数量,这样做的原因是为了尽力让每个worker进程都有一个cpu可以使用,尽量避免了多个worker进程抢占同一个cpu的情况
    worker_processes  2;
    

3、NGINX处理web请求解析机制

多个 worker工作进程通过【抢占机制】分配该【客户端】的处理权

3.1 工作线程的分配
  1. 主动激活1个 worker 来处理请求,配置方式:

    accept_mutex on
    
  2. 唤醒所有的 worker 线程通过互斥锁【accept_mutex】的方式抢夺该次请求

    accept_mutex off
    

    http://t.zoukankan.com/vinsent-p-12834838.html

3.2 epoll模型
3.3 工作线程链接数的配置
events {
	#默认每个工作进程都使用 epoll
	use epoll;
	#每个工作进程的最大连接数
    worker_connections  1024;
}

4、配置结构

4.1配置文件详解
4.2 pid文件丢失
  1. pid文件所在文件夹不存在:创建 /var/run/nginx/ 文件夹可解决

    nginx: [error] open() "/var/run/nginx/nginx.pid" failed (2: No such file or directory)

  2. pid文件存在问题:重新创建 pid文件

    执行:nginx -c /root/nginx/conf/nginx.conf 重新创建pid文件

5、常用命令

  1. nginx -s stop 快速关闭nginx。不友好,生产环境不建议使用
  2. nginx -s quit 等待所有已链接关闭后才关闭
  3. nginx -t 检查配置文件
  4. nginx -s reload 重启
  5. nginx -V 展示nginx的详细信息:安装的环境参数
  6. nginx -c 设置nginx的配置文件

6、日志切割

6.1 手动切割日志
  1. 创建切割脚本 cut_my_log.sh

    #!/bin/bash
    LOG_PATH="/var/log/nginx/"
    #切割格式,%Y-%m-%d+%H:%M 这个具体到分钟。不同的格式切割不同的时间单位
    RECORD_TIME=$(date -d "yesterday" +%Y-%m-%d+%H:%M)
    PID=/var/run/nginx/nginx.pid
    mv ${LOG_PATH}/access.log ${LOG_PATH}/access.${RECORD_TIME}.log
    mv ${LOG_PATH}/error.log ${LOG_PATH}/error.${RECORD_TIME}.log
    
    #向Nginx主进程发送信号,用于重新打开日志文件
    kill -USR1 `cat $PID`
    
    
  2. 添加文件的可执行权限

    chmod 777 cut_my_log.sh

  3. 手动执行切割脚本

6.2 定时切割日志
#安装定时任务软件
yum install crontabs
#查看定时任务
crontab -l
#添加定时任务
crontab -e
*/1 * * * * /usr/local/nginx/sbin/cut_my_log.sh
#重启定时任务
service crond restart

crontabs的常用命令

service crond start         //启动服务
service crond stop          //关闭服务
service crond restart       //重启服务
service crond reload        //重新载入配置
crontab -e                  // 编辑任务
crontab -l                  // 查看任务列表

7、 匹配规则

  • alias 别名

浏览器访问 /static 实际从 /home/test 下去访问文件

/static {
	alias /home/test;
}
  • 精确匹配 【=】 号开头

    访问路径必须是 【/lhy/index.html】,如下访问的文件路径是:/app/lhy/index.html

    location = /lhy/index.html {
                root   /app;
    }
    
  • 正则表达式 【~】 开头

    以下示例匹配以 .img、.png、.jpeg、.pdf结尾的访问路径(~必须与正则相邻中间不能有空格),访问的实际文件地址为:

    http://192.168.2.118:8080/wdfs.png-------->/app/img/wdfs.png

    • *区分大小写

      location ~*\.(img|png|jpeg|pdf){
                       root   /app/img;
      }
      
    • 不加*不区分大小写

      location ~\.(img|png|jpeg|pdf){
                       root   /app/img;
      }
      
  • 以某个字符开头 【^~】开头

    http://192.168.2.118:8080/lhy/img/文件-笔记本.png-------------->/app/lhy/img/文件-笔记本.png

      location ^~ /lhy/img{
          root   /app/;
      }
    
    

8、跨域解决方案

listen       8080;
server_name  localhost;

#charset koi8-r;
#允许跨域请求的域,*代表所有
add_header 'Access-Control-Allow-Origin' *;
##允许带上cookie请求
add_header 'Access-Control-Allow-Credentials' 'true';
##允许请求的方法,比如 GET/POST/PUT/DELETE
add_header 'Access-Control-Allow-Methods' *;
##允许请求的header
add_header 'Access-Control-Allow-Headers' *;
#access_log  logs/host.access.log  main;

9、防盗链配置

#对源站点验证
valid_referers *.imooc.com; 
#非法引入会进入下方判断
if ($invalid_referer) {
    return 404;
}

10、web应用集群

官方文档:http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive

#使用 upstream 配置上游服务器,这里的test_servers是集群名称,可以自命名
#默认使用轮询的方式进行分配
upstream test_servers{
   server 127.0.0.1:8081;
   server 127.0.0.1:8082;
   server 127.0.0.1:8083;
}
#通过 proxy_pass 将请求代理到上游的集群中, http://test_servers; 必须和upstream配置集群名称一直
server{
        listen 90;
        server_name  location;
        location / {
            proxy_pass http://test_servers;
        }
}

10.1负载均衡
  • 轮询 使用 weight关键字进行设置;

    upstream test_servers{
       server 127.0.0.1:8081 weight=1;
       server 127.0.0.1:8082 weight=2;
       server 127.0.0.1:8083 weight=5;
    }
    
  • ip_hash 根据客户端的ip进行分配到不同的节点上(iphash使用的是客户端ip的前面3位用来hash计算如:客户端92.168.2.118,用来计算的是192 ),使用iphash时某个节点需要下线时应使用down标记,而不是删除这个节点否则将导致iphash的重新计算,从而引发缓存失效、会话信息不正确等问题。2种不通的hash算法:

    upstream test_servers{
       ip_hash;
       server 127.0.0.1:8081 ;
       server 127.0.0.1:8082 ;
       server 127.0.0.1:8083 ;
    }
    
    • Hash(ip) % node_counts = index 服务器的增加或减少会导致所有的请求定位到不同的节点

    • 一致性hash:

      按照常用的hash算法来将对应的 ip 哈希到一个具有232次方个桶的空间中,即0~(232)-1的数字空间中。现在我们可以将这些数字头尾相连,想象成一个闭合的环形。

      将object1、object2、object3、object4四个对象(服务器节点)通过特定的Hash函数计算出对应的key值,然后散列到Hash环上。如下图:

      客户端发起请求时,ip将发送的就近的机器上,当机器节点增加或者删除时,只有少部分ip会收到影响

  • url_hash 将请求的url进行hash计算分发到不通的机器节点上

    upstream tomcats {
        # url hash
        hash $request_uri;
        server 192.168.1.173:8080;
        server 192.168.1.174:8080;
        server 192.168.1.175:8080;
    }
    
  • 最少连接数 转发到最新链接的机器节点上

    upstream tomcats {
        least_conn;
        server 192.168.1.173:8080;
        server 192.168.1.174:8080;
        server 192.168.1.175:8080;
    }
    
10.2 upstream 指令参数
  • max_conns 配置最大连接数

    改属性是用来限制同时连接到upstream负载上的单个服务器的最大连接数,作用是可以对单个服务器进行限流,防止服务器超负荷运转.默认值为0,则表示没有限制,超过限制的请求会返回502

    upstream test_servers{
       server 127.0.0.1:8081 max_conns=20;
       server 127.0.0.1:8082 max_conns=10;
       server 127.0.0.1:8083 max_conns=23;
    }
    
  • slow_start=time(商业版本)

    对配置了权重的某个节点,将权重在指定的时间内从0提升至配置的权重

    upstream test_servers{
       server 127.0.0.1:8081 weight=2;
       server 127.0.0.1:8082 weight=2;
       server 127.0.0.1:8083 weight=6 slow_start=60s;
    }
    
  • down

    标识某个节点的状态为不可用

    upstream test_servers{
       server 127.0.0.1:8081 down;
       server 127.0.0.1:8082;
       server 127.0.0.1:8083;
    }
    
  • backup

    指定该节点是备用机,当其他的正常节点全部挂了以后该节点才能被访问

    upstream test_servers{
       server 127.0.0.1:8081 backup;
       server 127.0.0.1:8082;
       server 127.0.0.1:8083;
    }
    
  • max_fails、fail_timeout

    fail_timeout 时间段内该节点失败次数达到指定数,这个时间段内节点会被标记为不可用。这个时间段后又会分配请求过来

    upstream test_servers{
       server 127.0.0.1:8081 max_fails=2 fail_timeout=15s;
       server 127.0.0.1:8082;
       server 127.0.0.1:8083;
    }
    
10.3 keepalive 提高吞吐量

keepalive 保存的是从 Nginx到上游服务器之间的连接数,避免每次请求都使用请求转发去打开新的链接

upstream tomcats {
   server 127.0.0.1:8082;
   server 127.0.0.1:8083;
   #设置长连接处理的数量
   keepalive 32;
}
server {
        listen       80;
        server_name  www.tomcats.com;
        location / {
            proxy_pass  http://tomcats;
            #设置长连接http版本为1.1
            proxy_http_version 1.1;
        	#清除connection header 信息
            proxy_set_header Connection "";
        }
}

10.4 缓存

  • 浏览器缓存 expires 指令进行配置

    #请求到资源后10s后缓存过期  
    location ^~ /lhy/img{
            root   /app/;
            expires 10s;
      }
    #指定某个时间后过期
    location ^~ /lhy/img{
            root   /app/;
            expires @22h10m;
      }
    
    
  • 反向代理缓存

    # proxy_cache_path 设置缓存目录
    #       keys_zone 设置共享内存以及占用空间大小
    #       max_size 设置缓存大小
    #       inactive 超过此时间则被清理
    #       use_temp_path 临时目录,使用后会影响nginx性能
    proxy_cache_path /usr/local/nginx/upstream_cache keys_zone=mycache:5m max_size=1g inactive=1m use_temp_path=off;
    
    location / {
        proxy_pass  http://tomcats;
        # 启用缓存,和keys_zone一致
        proxy_cache mycache;
        # 针对200和304状态码缓存时间为8小时
        proxy_cache_valid   200 304 8h;
    }
    
    

11、Nginx高可用集群(自建机房)

11.2 Keepalived

Keepalived 可以虚拟出一个网卡,虚拟一个VIP。多个节点中的Keepalived 可以选举出一个对外提供服务的ip,这个ip是Keepalived集群种唯一的。当 Keepalived 挂了以后,集群中会选举出一个新的master 主节点。

  • Keepalived-双机主备

    一主一备2台服务器,缺点是在主机没有挂时,备用机永远不会使用。存在资源浪费

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UyK8HzZW-1670837179729)(../../image/image-20221212162951767.png)]

  • Keepalived-双主热备

    设置2个虚拟ip,因为互为主备关系,某一个ip挂了以后都会转发到宁外一个ip节点上

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vJZI9tNx-1670837179730)(../../image\image-20221212170032990.png)]

12、Nginx高可用集群(云端服务器)

12.1 双机主备

由云服务厂商提供一个负载均衡ip(公网ip),再将云服务器绑定到负载均衡ip上。然后域名解析解析到负载均衡ip(公网ip)上

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XEMWbJIo-1670837179731)(../../image/image-20221209150419463.png)]

12.2 双主热备

将域名绑定2个负载均衡ip(公网ip),客户端进行请求时,DNS轮询(DNS转发可以进行权重配置)转发到某一个ip上。因为互为主备关系,某一个ip挂了以后都会转发到宁外一个ip节点上
在这里插入图片描述

DNS 域名解析绑定多个ip(这个ip是负载均衡服务器的ip)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值