首页 > 系统相关 >nginx

nginx

时间:2023-05-07 22:22:42浏览次数:45  
标签:http 请求 lua server nginx Nginx

Nginx

安装+域名+location规则+rewrite

  • 官网:http://nginx.org/

  • 安装依赖

    • yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel

    • 解压 tar -zxf 安装包

    • ./configure

    • make & make install

      #启动
      /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

      #测试
      /usr/local/nginx/sbin/nginx -t

      #关闭
      /usr/local/nginx/sbin/nginx -s stop

      #重新加载配置
      /usr/local/nginx/sbin/nginx -s reload

       

  • 本地域名解析配置

    • C:\Windows\System32\drivers\etc\hosts

  • location规则

    ^ 以什么开始
    $ 以什么结尾
    ~ 区分大小写匹配
    ~* 不区分大小写匹配


    location = /uri 表示精确匹配,只要完全匹配上才能生效
    location /uri 表示前缀匹配
    location ^~/uri 表示任何以uri开头,优先级比上面一个高
  • rewrite规则和应用

    • 语法 rewrite regex repalcement[flag]

      rewrite ^/(.*) https://dzystudy.net/$1 permanent
      # 这是⼀个正则表达式,匹配完整的域名和后⾯的路径地址
      # replacement部分是https://dzystudy.net/$1,$1是取⾃regex部分()⾥的内容
    • regex

字符描述
^ 匹配输⼊字符串的起始位置
$ 匹配输⼊字符串的结束位置
* 匹配前⾯的字符零次或者多次
+ 匹配前⾯字符串⼀次或者多次
? 匹配前⾯字符串的零次或者⼀次
. 匹配除“\n”之外的所有单个字符
(pattern) 匹配括号内的pattern

flag

 

标记符号说明
last 本条规则匹配完成后继续向下匹配新的location URI规则
break 本条规则匹配完成后终⽌,不在匹配任何规 则
redirect 返回302临时重定向
permanent 返回301永久重定向
  • 应用场景

    • 非法访问跳转,防盗链

    • 网站更换域名

    • http跳转https

    • 不同地址访问同一个虚拟主机的资源

 

文件服务器

    server {
      listen       80;
      server_name xxxxx.cn;
      location /app/img{
          alias /usr/local/software/img/;
  }
      error_page   500 502 503 504 /50x.html;
      location = /50x.html {
          root   html;
      }
  }

访问路径:http://xxxxx.cn/app/img/1.jpg

  • 注意

    • 在location /中配置root目录

    • 在location /path中配置alias虚拟目录,目录后面的"/"符号一定要带上。

Nginx挖掘accessLog日志

  • access.log日志用处

    • 统计站点访问ip来源、某个时间段的访问频率

    • 查看访问最频的页面、Http响应状态码、接口性能

    • 接口秒级访问量、分钟访问量、小时和天访问量

  • 默认配置解析

        #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
      #                 '$status $body_bytes_sent "$http_referer" '
      #                 '"$http_user_agent" "$http_x_forwarded_for" $request_time';

     

  • 解析

    $remote_addr 对应的是真实⽇志⾥的ip,即客户端的IP。
    $remote_user 对应的是第⼆个中杠“-”,没有远程⽤户,所以⽤“-”填充。
    [$time_local]对应的是[04/May/2022 14:33:00+0100]。
    “$request”对应的是"GET /url?param=1"。
    $status对应的是200状态码,200表示正常访问。
    $body_bytes_sent对应的是48字节,即响应body的⼤⼩。
    “$http_referer” 对应的是”https://xxxxxx.net/“,若是直接打开域名浏览的时,referer就会没有值,为”-“。
    “$http_user_agent” 对应的是”xxxxxx”。
    “$http_x_forwarded_for” 对应的是”-“或者空。
    $request_time 从接受用户请求的第一个字节到发送完响应的时间,包含接受请求时间、程序响应时间、输出响应数据时间。
    $upstream_response_time :指从Nginx向后端建立连接开始到接受完数据然后关闭连接为止的时间
  • 查看访问最频繁的前100IP

    awk '{print $1}' access_temp.log|sort -n | uniq -c | sort -rn | head -n 100
  • 统计访问最多的url的前20

    cat access_temp.log|awk '{print $7}' | sort | uniq -c | sort -rn|head -n 20 | more
  • 统计耗时接口,列出传输时间大于2秒的接口,显示前五条

    cat dzystudy.access.log | awk '($NF>2){print $7}'|sort -n | uniq -c | sort -rn| head -5

     

负载均衡配置

  • 节点轮询

        upstream lbs{
          server 192.168.3.130:8080;
    server 192.168.3.130:8081;
      }

      server {
          listen       80;
          server_name xxxxx.cn;
          access_log logs/xxxxxx.access.log main;
          location / {
              proxy_pass http://lbs;
              proxy_redirect default;
          }
          error_page   500 502 503 504 /50x.html;
          location = /50x.html {
              root   html;
          }
      }

     

  • weight权重配置

        upstream lbs{
          server 192.168.3.130:8080 weight=5;
    server 192.168.3.130:8081 weight=10;
      }

     

  • 固定分发

    • 根据请求的ip的hash结果分配,这样每一个用户都可以固定访问一个后端服务器

    upstream lbs {
    ip_hash;
    server 192.168.159.133:8080;
    server 192.168.159.133:8081;
    }
    • upstream 还可以为某个节点设置状态值

      • down表示当前的server暂时不参与负载

    • server ip:port down;

    • backup 其他所有非backup机器down的时候,会请求backup机器,这台机器压力最轻。

    • server ip:port backup

  • Nginx探测后端节点可用性和配置实操

    • max_fails 允许请求失败的次数,默认1,当超过最大次数时就不会请求

    • fail_timeout: max_fails次失败后,暂停的时间,默认:fail_timeout为10s

    • 失败的尝试次数是1,如果设置为0,就会停止统计尝试次数,认为服务器一直是可用的。

  • Nginx配置失败的标准

    • 可以通过指令proxy_next_upstream来配置什么是失败的尝试

    • 注意默认配置时,http_404状态不认为是失败的尝试

        upstream lbs{
      server 192.168.3.130:8080 max_fails=2 fail_timeout=60s;
    server 192.168.3.130:8081 max_fails=2 fail_timeout=60s;
      }
      server {
          listen       80;
          server_name xxxxx.cn;
          access_log logs/xxxxx.access.log main;
          location / {
              proxy_pass http://lbs;
              proxy_redirect default;
              proxy_next_upstream error timeout http_500 http_503 http_404;
          }
          error_page   500 502 503 504 /50x.html;
          location = /50x.html {
              root   html;
          }
      }

全局异常拦截

    upstream lbs{
  server 192.168.3.130:8080 max_fails=2 fail_timeout=60s;
server 192.168.3.130:8081 max_fails=2 fail_timeout=60s;
  }
  server {
      listen       80;
      server_name xxxxx.cn;
      access_log logs/xxxxx.access.log main;
      location / {
          proxy_pass http://lbs;
          proxy_redirect default;
           #存放用户真实IP
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

          proxy_next_upstream error timeout http_500 http_503 http_404;
           #开启错误拦截
          proxy_intercept_errors on;
      }
      error_page  404 500 502 503 504 =200 /default_api;
      location = /default_api {
  default_type application/json;
          return 200 '{"code":"-1","msg":"invoke fail, not found "}';
      }
  }

Nginx封禁恶心IP+跨域

  • linux server层面封IP:iptables

  • nginx的层面封IP,方式多种多样(但req还是会打进来的,让nginx返回403,占用资源)

    • nginx作为网关可以有效封禁IP

      nginx配置如下:
      http{
      # ....
      include blacklist.conf;
      }

      #blacklist.conf⽬录下⽂件内容
      deny 192.168.159.2;
      deny 192.168.159.32;
  • Nginx解决跨域

    • JSONP

    • Http响应头配置允许跨域

      • nginx层配置

        location / {
        add_header 'Access-Control-Allow-Origin' $http_origin;
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Headers' 'DNT,web-token,app-token,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
        add_header Access-Control-Allow-Methods 'GET,POST,OPTIONS';
        #如果预检请求则返回成功,不需要转发到后端
        if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type'  'text/plain; charset=utf-8';
        add_header 'Content-Length' 0;
        return 200;
        }
        }

         

      • 程序代码中处理通过拦截器配置

 

Websocket+缓存+压缩

  • websocket

    • conf文件配置

      server{
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
      }

       

    • 处理后的报文

      HTTP/1.1 101 Switching Protocols
      Upgrade: websocket
      Connection: upgrade

       

  • 服务器端缓存

    • 参数解析

      • /root/cache 本地路径,用来存放Nginx缓存资源的存放地址

      • levels=1:2 默认所有缓存⽂件都放在上⾯指定的根路径中,可 能影响缓存的性能,推荐指定为 2 级⽬录来存储缓 存⽂件;1和2表示⽤1位和2位16进制来命名⽬录名 称。第⼀级⽬录⽤1位16进制命名,如a;第⼆级⽬ 录⽤2位16进制命名,如3a。所以此例中⼀级⽬录 有16个,⼆级⽬录有16*16=256个,总⽬录数为16 * 256=4096个;当levels=1:1:1时,表示是三级⽬录,且每级⽬录数 均为16个

      • key_zone 在共享内存中定义⼀块存储区域来存放缓存的 key 和 metadata

      • max_size 最⼤ 缓存空间, 如果不指定会使⽤掉所有磁盘空 间。当达到 disk 上限后,会删除最少使⽤的 cache

      • inactive 配置nginx cache中的缓存⽂件的缓存时 间,proxy_cache_valid 200 304 2m 对于状态为200 和304的缓存⽂件的缓存时间是2分钟

      • use_temp_path 建议为 off,则 nginx 会将缓存⽂件直接写⼊指定的 cache ⽂件中

      • proxy_cache 启⽤proxy cache,并指定key_zone,如果 proxy_cache off表示关闭掉缓存

      • add_header Nging-Cache "$upstream_cache_status" ⽤于前端判断是否是缓存,miss、hit、expired(缓 存过期)、updating(更新,使⽤旧的应答)

    • 具体配置

      proxy_cache_path /root/cache levels=1:2 keys_zone=xd_cache:10m max_size=1g  inactive=60m use_temp_path=off;
    • 配置实操

      • nginx 缓存过期影响的优先级进行排序为:inactive > 源服务器端Expires/max-age>proxy_cache_valid

      • 如果出现Permission denied 修改nginx.conf,将第一行修改为user root

      • 默认情况下GET请求及HEAD请求会被缓存,⽽POST请 求不会被缓存,并⾮全部都要缓存,可以过滤部分路径 不⽤缓存

    • 缓存清空

      • 直接rm删除

      • ngx_cache_purge

    • 缓存命中率统计

      • 前端打点日志上报

      • nginx日志模板增加信息

        • $upstream_cache_status

    •  

  • 压缩

    • 压缩配置

      #开启gzip,减少我们发送的数据量
      gzip on;
      gzip_min_length 1k;

      #4个单位为16k的内存作为压缩结果流缓存
      gzip_buffers 4 16k;

      #gzip压缩⽐,可在1~9中设置,1压缩⽐最⼩,速度最快,9压缩⽐最⼤,速度最慢,消耗CPU
      gzip_comp_level 4;

      #压缩的类型
      gzip_types application/javascript text/plain text/css application/json application/xml text/javascript;

      #给代理服务器⽤的,有的浏览器⽀持压缩,有的不⽀持,所以避免浪费不⽀持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩
      gzip_vary on;

      #禁⽤IE6以下的gzip压缩,IE某些版本对gzip的压缩⽀持很不好
      gzip_disable "MSIE [1-6].";

       

    • 压缩前后区别

      location /static {
      alias /usr/local/software/static;
      }

       

    • 面试题:压缩是时间换空间,还是空间换时间?

      • web层主要涉及浏览器和服务器的⽹络交互,⽽⽹络交 互显然是耗费时间的

      • 要尽量减少交互次数

      • 降低每次请求或响应数据量

      • 开启压缩

        • 在服务端是时间换空间的策略,服务端需要牺牲时 间进⾏压缩以减⼩响应数据⼤⼩

        • 压缩后的内容可以获得更快的⽹络传输速度,时间 是得到了优化

        • 所以是双向的

 

配置https+整合OpenResty

配置https

  • 流程

    • 秘钥交换使用非对称加密,内容传输使用对称加密

 

 

  • 阿里云证书申请

  • 配置https证书实操

    #增加ssl模块
    ./configure --prefix=/usr/local/nginx_ssl --with-http_stub_status_module --with-http_ssl_module
    make & make install
    #查看是否安装成功
    /usr/local/nginx/sbin/nginx_ssl -V
  • 配置文件

        server {
          listen       443 ssl;
          server_name localhost;

          ssl_certificate     cert.pem;
          ssl_certificate_key cert.key;

          ssl_session_cache   shared:SSL:1m;
          ssl_session_timeout 5m;

          ssl_ciphers HIGH:!aNULL:!MD5;
          ssl_prefer_server_ciphers on;

          location / {
              root   html;
              index index.html index.htm;
          }
      }
  • https访问实操

    • 杀掉原先的进程

    • 防火墙关闭或者开放443端口

OpenResty

介绍

由章亦春发起,是基于Ngnix和Lua的⾼性能web平台,内部集成精良的LUa库、第三⽅模块、依赖, 开发者可以⽅便搭建能够处理⾼并发、扩展性极⾼的动态web应⽤、web服务、动态⽹关。
OpenResty将Nginx核⼼、LuaJIT、许多有⽤的Lua库和Nginx第三⽅模块打包在⼀起
Nginx是C语⾔开发,如果要⼆次扩展是很麻烦的,⽽基于OpenResty,开发⼈员可以使⽤ Lua 编程语⾔对 Nginx核⼼模块进⾏⼆次开发拓展
性能强⼤,OpenResty可以快速构造出1万以上并发连接响应的超⾼性能Web应⽤系统
  • 官网:OpenResty® - Official Site

  • 拓展

    让Web 服务直接跑在 Nginx 服务内部,充分利⽤ Nginx的⾮阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚⾄于对远程后端诸如 MySQL, Memcaches 以及 Redis 等都进⾏⼀致的⾼性能响应。所以对于⼀些⾼性能的服务来说,可以直接使⽤ OpenResty 访问 Mysql或Redis等,⽽不需要通过第三⽅语⾔(PHP、Python、Ruby)等来访问数据库再返回,这⼤⼤提⾼了应⽤的性能

Lua脚本介绍

  • 官网:Lua: getting started

    Lua 由标准 C 编写⽽成,没有提供强⼤的库,但可以很容易的被 C/C++ 代码调⽤,也可以反过来调⽤ C/C++ 的函数。
    在应⽤程序中可以被⼴泛应⽤,不过Lua是⼀种脚本/动态语⾔,不适合业务逻辑⽐较重的场景,适合⼩巧的应⽤场景,代码⾏数保持在⼏⼗⾏到⼏千⾏。
    LuaJIT 是采⽤ C 和汇编语⾔编写的 Lua 解释器与即时编译器
  • ngx_lua

    ngx_lua是Nginx的⼀个模块,将Lua嵌⼊到Nginx中,从⽽可以使⽤Lua来编写脚本,部署到Nginx中运⾏,
    即Nginx变成了⼀个Web容器;开发⼈员就可以使⽤Lua语⾔开发⾼性能Web应⽤了。

OpenResty提供了常⽤的ngx_lua开发模块

  • lua-resty-memcached

  • lua-resty-mysql

  • lua-resty-redis

  • lua-resty-dns

  • lua-resty-limit-traffic

通过上述的模块,可以⽤来操作 mysql数据库、redis、memcached等,也可以⾃定义模块满⾜其他业务需求,很多经典的应⽤,⽐如开发缓存前置、数据过滤、API请求聚合、AB测试、灰度发布、降级、监控、限流、防⽕墙、⿊⽩名单等

 

OpenResty环境准备

wget https://openresty.org/package/centos/openresty.repo
mv openresty.repo /etc/yum.repos.d/
yum check-update

yum install openresty
yum install openresty-resty
yum --disablerepo="*" --enablerepo="openresty" list available

#查看版本号
resty -v
  • 开发案列

    #编辑:/usr/local/openresty/nginx/conf/nginx.conf
    http{
    server {
          listen       80;
          server_name localhost;
          location / {
              default_type text/html;
              content_by_lua_block{
                  ngx.say("hello world;");
              }
          }
      }
    }
    #使⽤其他⽅式
    #使⽤其他⽅式
    http{
       # 虚拟机主机块,还需要配置lua⽂件扫描路径
      lua_package_path "$prefix/lualib/?.lua;;";
      lua_package_cpath "$prefix/lualib/?.so;;";
      server{
           # 监听端⼝
          listen 80;
           # 配置请求的路由
          location /{
              default_type text/html;
              content_by_lua_file lua/xxxxx.lua;
          }
      }
    }

nginx内置变量

  • GitHub - openresty/lua-nginx-module: Embed the Power of Lua into NGINX HTTP servers

    名称说明
    $arg_name 请求中的name参数
    $args 请求中的参数
    $content_length HTTP请求信息⾥的"Content-Length"
    $content_type 请求信息⾥的"Content-Type"
    $host 请求信息中的"Host",如果请求中没有Host ⾏,则等于设置的服务器名
    $hostname 机器名使⽤ gethostname系统调⽤的值
    $http_cookie cookie 信息
    $http_referer 引⽤地址
    $http_user_agent 客户端代理信息
    $http_via 最后⼀个访问服务器的Ip地址。
    $http_x_forwarded_for 相当于⽹络访问路径
    $is_args 如果请求⾏带有参数,返回“?”,否则返回空字符串
    $limit_rate 对连接速率的限制
    $nginx_version 当前运⾏的nginx版本号
    $pid worker进程的PID
    $query_string 与$args相同
    $remote_addr 客户端IP地址
    $remote_port 客户端端⼝号
    $request 用户请求
    $request_method 请求的方法,比如"GET". "POST"等
    $request_uri 请求的URI,带参数
    $scheme 所用的协议,比如http或者https
    $server_name 请求到达的服务器名
    $server_port 请求到达的服务器端口号
    $server_protocol 请求的协议版本,"HTTP/1.0"或"HTTP/1.1"
    $uri 请求的URI,可能和最初的值有不同,比如经过重定向之类的。

nginx请求阶段

  • nginx对于请求的处理分多个阶段,Nginx , 从⽽让第三⽅模 块通过挂载⾏为在不同的阶段来控制, ⼤致如下

    • 初始化阶段(Initialization Phase)

      • init_by_lua_file

      • init_worker_by_lua_file

    • 重写与访问阶段(Rewrite / Access Phase)

      • rewrite_by_lua_file

      • access_by_lua_file

    • 内容⽣成阶段(Content Phase)

      • content_by_lua_file

    • ⽇志记录阶段(Log Phase)

开发网络访问限制

  • Nginx+OpenRestry+Lua开发

    http {
      include       mime.types;
      default_type application/octet-stream;
      sendfile       on;
      keepalive_timeout  65;

       # 这里设置为 off,是为了避免每次修改之后都要重新reload 的麻烦。
       # 在生产环境上需要 lua_code_cache 设置成 on。
      lua_code_cache off;

       # lua_package_path可以配置openresty的文件寻址路径,$PREFIX 为openresty安装路径
       # 文件名使用“?”作为通配符,多个路径使用“;”分隔,默认的查找路径用“;;”
       # 设置纯 Lua 扩展库的搜寻路径
      lua_package_path "$prefix/lualib/?.lua;;";

       # 设置 C 编写的 Lua 扩展模块的搜寻路径(也可以用 ';;')
      lua_package_cpath "$prefix/lualib/?.so;;";

      upstream lbs {
    server 192.168.3.130:8080;
      }
       
      server {
          listen       80;
          server_name localhost;

          location / {
      access_by_lua_file lua/black_ip_list.lua;
      proxy_pass http://lbs;
          }

          error_page   500 502 503 504 /50x.html;
          location = /50x.html {
              root   html;
          }
      }
    }
  • black_ip_list.lua

    local black_ips = {["127.0.0.1"]=true}

    local ip = ngx.var.remote_addr
    if true == black_ips[ip] then
    ngx.exit(ngx.HTTP_FORBIDDEN)
    return;
    end

开发下载限速

  • 限速限流场景

    • 下载限流:保护宽带及服务器的IO资源

    • 请求限流:防止恶意攻击,保护服务器及资源安全

      • 限制某个用户在给定时间段内能够产生的HTTP请求数

      • 限流用在保护上游服务器不被在同一时刻的大量用户访问

  • openResty下载限速案列实操

    • Nginx 有一个$limit_rate,这个反映的是当前请求每秒能响应的字节数,改字节数默认为配置文件中limit_rate指令的设值

      #当前请求的响应上限是 每秒 300K 字节
      location /download {
          access_by_lua_block {
          ngx.var.limit_rate = "300K"
          }
          alias /usr/local/software/app;
      }
  • 下载限速实现原理

    • 目的:限制下载速度

    • 常用的是漏桶原理和令牌桶原理

    • 漏桶原理

      • 备注:如果是请求限流,请求先进⼊到漏桶⾥,漏桶以 固定的速度出⽔,也就是处理请求,当⽔加的过快也就 是请求过多,桶就会直接溢出,也就是请求被丢弃拒绝 了,所以漏桶算法能强⾏限制数据的传输速率或请求数

         

    • 令牌桶原理

      • 备注:只要突发并发量不⾼于桶⾥⾯存储的令牌数据, 就可以充分利⽤好机器⽹络资源。 如果桶内令牌数量⼩于被消耗的量,则产⽣的令牌的速 度就是均匀处理请求的速度

         

Nginx高可用解决方案LVS+KeepAlive

  • Nginx高可用解决方案-基础

    国际标准化组织(ISO)制定的⼀个⽤于计算机或通信系统间互联的标准体系。
    从低到⾼分别是:
    物理层、数据链路层、⽹络层、传输层、会话层、表示层和应⽤层
    四层⼯作在OSI第四层 也就是传输层
    七层⼯作在最⾼层,也就是应⽤层
    • F5、LVS(四层负载tcp)

      • 用虚拟ip+port接受请求,在转发到对应的真实的机器

    • HAproxy、Nginx(七层负载)

      • ⽤虚拟的url或主机名接收请求,再转向相应的处理服务器

LVS

  • 官网:The Linux Virtual Server Project - Linux Server Cluster for Load Balancing

    LVS是Linux Virtual Server,Linux虚拟服务器,是⼀个虚拟的服务器集群系统
    项⽬是由章⽂嵩博⼠成⽴,是中国国内最早出现的⾃由软件项⽬之⼀
    Linux2.4 内核以后,LVS 已经是 Linux 标准内核的⼀部分
    软件负载解决的两个核⼼问题是:选谁、转发

     

  • 提供了10多种调度算法: 轮询、加权轮询、最⼩连接、⽬ 标地址散列、源地址散列等

  • 三种负载均衡转发技术

    • NAT:数据进出都通过 LVS, 前端的Master既要处理客户端发起的请求,⼜要处理后台RealServer的响应信 息,将RealServer响应的信息再转发给客户端, 容易成为整个集群系统性能的瓶颈; (⽀持任意系统且可以实现 端⼝映射)

    • DR: 移花接⽊,最⾼效的负载均衡规则,前端的Master只处理客户端的请求,将请求转发给RealServer,由后台 的RealServer直接响应客户端,不再经过Master, 性能 要优于LVS-NAT; 需要LVS和RS集群绑定同⼀个VIP(⽀持多数系统,不可以实现端⼝映射)

    • TUNL:隧道技术,前端的Master只处理客户端的请 求,将请求转发给RealServer,然后由后台的 RealServer直接响应客户端,不再经过Master;(⽀持少数系统,不可以实现端⼝映射))

KeepAlive

测试机器:centos7(130) 、centos8(128)

keepalived是⼀个类似于交换机制的软件,核⼼作⽤是检测服务器的状态,如果有⼀台web服务器⼯作出现故障,Keepalived将检测到并将有故障的服务器从系统中剔除,使⽤其他服务器代替该服务器的⼯作,当服务器⼯作正常后
Keepalived⾃动将服务器加⼊到服务器群中,这些⼯作全部⾃动完成。
后来加⼊了vrrp(虚拟路由器冗余协议),除了为lvs提供⾼可⽤还可以为其他服务器⽐如Mysql、Haproxy等软件提供⾼可⽤⽅案
  • 安装

    yum install -y keepalived
    #路径
    cd /etc/keepalived
  • 启动和查看

    #启动
    service keepalived start
    #停⽌
    service keepalived stop
    #查看状态
    service keepalived status
    #重启
    service keepalived restart
    #停⽌防⽕墙
    systemctl stop firewalld.service
  • 缺少的依赖

    yum install -y gcc
    yum install -y openssl-devel
    yum install -y libnl libnl-devel
    yum install -y libnfnetlink-devel
    yum install -y net-tools
    yum install -y vim wget
  • /etc/keepalived/keepalived.conf

    ! Configuration File for keepalived
    global_defs {
    router_id LVS_DEVEL # 设置lvs的id,在一个网络内应该是唯一的
    enable_script_security #允许执行外部脚本
    }

    #配置vrrp_script,主要用于健康检查及检查失败后执行的动作。
    vrrp_script chk_real_server {
    #健康检查脚本,当脚本返回值不为0时认为失败
    script "/usr/local/software/conf/chk_server.sh"
    #检查频率,以下配置每2秒检查1次
    interval 2
    #当检查失败后,将vrrp_instance的priority减小5
    weight -5
    #连续监测失败3次,才认为真的健康检查失败。并调整优先级
    fall 3
    #连续监测2次成功,就认为成功。但不调整优先级
    rise 2
    user root
    }

    #配置对外提供服务的VIP vrrp_instance配置
    vrrp_instance VI_1 {
    #指定vrrp_instance的状态,是MASTER还是BACKUP主要还是看优先级。
    state MASTER
    #指定vrrp_instance绑定的网卡,最终通过指定的网卡绑定VIP
    interface ens33
    #相当于VRID,用于在一个网内区区分组播,需要组播域内内唯一。
    virtual_router_id 51
    #本机的优先级,VRID相同的机器中,优先级最⾼的会被选举为MASTER
    priority 100
    #心跳间隔检查,默认为1s,MASTER会每隔1秒发送一个报文告知组内其他机器自己还活着。
    advert_int 1
    authentication {
      auth_type PASS
      auth_pass 1111
    }
    #定义虚拟IP(VIP)为192.168.159.100,可多设,每行一个
    virtual_ipaddress {
      192.168.159.100
    }
    #本vrrp_instance所引⽤的脚本配置,名称就是vrrp_script 定义的容器名
    track_script {
      chk_real_server
    }
    }

    # 定义对外提供服务的LVS的VIP以及port
    virtual_server 192.168.3.100 80 {
    # 设置健康检查时间,单位是秒
    delay_loop 6
    # 设置负载调度的算法为rr
    lb_algo rr
    # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式
    lb_kind NAT
    # 会话保持时间
    persistence_timeout 50
    #指定转发协议类型(TCP、UDP)
    protocol TCP
    # 指定real server1的IP地址
    real_server 192.168.3.130 80 {
      # 配置节点权值,数字越⼤权重越⾼
      weight 1
      # 健康检查⽅式
      TCP_CHECK { # 健康检查方式
        connect_timeout 10 # 连接超时
        retry 3 # 重试次数
        delay_before_retry 3 # 重试间隔
        connect_port 80 # 检查时连接的端口
      }
    }
    }
  • 配置注意

    router_id后⾯跟的⾃定义的ID在同⼀个⽹络下是⼀致的
    state后跟的MASTER和BACKUP必须是⼤写;否则会造成配置无法生效的问题
    interface ⽹卡ID;要根据自己的实际情况来看,可以使用以下方式查询 ip a 查询
    在BACKUP节点上,其keepalived.conf与Master上基本⼀致,修改state为BACKUP,priority值改⼩即可
    authentication主备之间的认证⽅式,⼀般使⽤PASS即可;主备的配置必须⼀致,不能超过8位
  • 检查脚本

    #!/bin/bash
    counter = $(ps -C nginx --no-heading | wc -l)
    if [ "${counter}" -eq "0" ];then
    service keepalived stop
    echo "nginx server is died...."
    fi
  •  

标签:http,请求,lua,server,nginx,Nginx
From: https://www.cnblogs.com/dzystudy/p/17380302.html

相关文章

  • Nginx反代理Halo
    nginx的基本设置nginx基本结构...#全局块events{#events块...}http#http块{...#http全局块server#server块{...#server全局块location[PATTERN]#location块{......
  • Nginx 入门实战(3)--Nginx 常用配置参数说明
    Nginx中包含众多的参数,这些参数影响Nginx的行为;本文主要介绍一些常用的参数。1、Nginx配置文件基本结构Nginx的配置文件为conf/nginx.conf,配置文件由配置指令/参数组成,有些指令/参数位于main的位置(如:events、http),有些指令/参数位于其他参数下(如:server位于http下);......
  • Nginx系列---【nginx可视化配置神器-nginxWebUI来了!】
    nginx可视化配置神器-nginxWebUI来了!官网地址:https://www.nginxwebui.cn/product.html实战教程1.下载安装包建议安装最新版下载链接:https://gitee.com/cym1102/nginxWebUI/tags下载完成后是一个jar包2.上传到linux服务器并放到ngxWebUI目录下这一步省略。。。3.启......
  • 搭建keepalived+LVS+nginx高可用集群负载均衡
    在LVS服务器上安装Keepalived,参考(https://www.cnblogs.com/xiaodunan/p/17374699.html)修改核心配置文件cd/etc/keepalived/vimkeepalived.confglobal_defs{router_idLVS_1}vrrp_instanceVI_1{stateMASTERinterfaceeth0virtual_router_id41......
  • WEB|[SUCTF 2019]Pythonginx
    源码@app.route('/getUrl',methods=['GET','POST'])defgetUrl():url=request.args.get("url")host=parse.urlparse(url).hostnameifhost=='suctf.cc':#解析主机名,不能是suctf.ccreturn......
  • Nginx 多个域名解析到同一个服务器
    域名证书绑定参照:nginx发布网站通过域名访问,后端接口反向代理-AutumnSilence-博客园(cnblogs.com)1、域名解析到服务器上 2、修改nginx配置文件定义两个server,监听443端口,修改server_name绑定的值  server{    listen   443ssl;  ......
  • Nginx(二):实现fastcgi协议代理
    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://xuding.blog.51cto.com/4890434/1743713一、LNMP架构搭建 1.LNMP实现方案     (1)LAMP架构支持三种httpd+php方案            1)......
  • nginx 发布网站通过域名访问,后端接口反向代理
    1、申请域名证书,申请好之后,下载Nginx域名部署包(包里一般会含义*.key和*.pem文件)2、把 *.key和*.pem文件放置到 Nginx程序 conf文件夹下,与nginx.conf文件路径保存一致3、修改Nginx的配置文件 server{    listen   443ssl;    #你的域......
  • Linux下查找Nginx配置文件位置
    1、查看Nginx进程ps-aux|grepnginx圈出的就是Nginx的二进制文件2、测试Nginx配置文件/usr/sbin/nginx-t可以看到nginx配置文件位置3、nginx的使用(启动、重启、关闭)首先利用配置文件启动nginx。nginx-c/usr/local/nginx/conf/nginx.conf重启服务:servicenginx......
  • 杀不死的nginx
    [root@xxxfsfg_nginx]#cd..[root@xxxfvar]#cd..[root@xxxfac]#lssfg_nginxvar[root@xxxfac]#cdsfg_nginx/[root@xxxfsfg_nginx]#lltotal12drwxr-xr-x.2rootroot4096Jul232019confdrwxr-xr-x.2rootroot4096Jul232019htmldrwxr-xr-x.2rootroo......