nginx的前世今生(三)

高手对决:武林盟主之路

1.不败之地,高可用江湖

技术角度讲,高可用(High Availability, HA)是指系统或服务能够在预定的时间内,以极高的概率持续提供服务的能力。具体来说,这通常涉及到系统的架构设计、容错处理、备份与恢复机制等,以确保即便在部分组件发生故障的情况下,整体服务依然能够不间断运行。衡量高可用性的常见指标包括平均无故障时间(MTBF)和平均修复时间(MTTR),以及系统的故障切换速度。

通俗来讲,高可用就像是一个永远不会累的超级员工,无论遇到什么问题,比如生病(系统故障)、休假(维护)或者临时有事(升级),都能迅速找到替班同事(备用系统)顶上,保证工作(服务)一刻不停,客户(用户)完全感受不到任何中断。

主备双剑合璧,集群如影随形

在线部署Nginx时,如果采用单个节点的方式,可能会遇到各种意外情况,如系统异常、程序崩溃、服务器断电等。这些问题会导致Nginx无法正常工作,从而影响整个系统的稳定性和可用性。为了保障系统的正常运行,我们需要考虑实现Nginx的高可用性。

为了提高Nginx的高可用性,可以采取以下措施:

  1. 使用负载均衡器:通过在Nginx前面添加负载均衡器,可以将流量均衡地分发到多个Nginx节点上,从而实现高可用性。
  2. 使用集群部署:将多个Nginx节点组成一个集群,通过集群管理软件实现自动故障转移和负载均衡,确保即使某个节点宕机,系统仍然可以正常工作。
  3. 使用监控和告警系统:及时监控Nginx节点的运行状态,当发现异常时及时报警并进行处理,以保障系统的稳定性和可用性。
  4. 定期备份和恢复:定期对Nginx配置文件和数据进行备份,以防止数据丢失或损坏,确保系统可以快速恢复。
心跳不止,Keepalived护航,江湖永续

实现高可用的方案实例:

  • Keepalived + Nginx 双机热备:使用 Keepalived 实现虚拟IP(VIP)漂移,主Nginx服务器故障时,VIP自动转移到备用Nginx服务器,实现无缝切换。
  • Nginx + Upstream 模块:配置 Upstream 模块,定义后端服务器池,并使用健康检查机制监控各服务器状态,自动剔除故障节点。
  • 分布式部署:在多个地理位置部署Nginx服务器,通过DNS轮询或全局负载均衡器(GSLB)实现跨地域的高可用性。
  • 自动化运维工具:集成Ansible、Terraform等工具自动化部署、配置更新和监控,确保快速响应故障和配置变更。

本尊今日重点描述一下通过keepalived的VIP机制来实现Nginx的高可用性。在这里,VIP并不是指会员,而是指Virtual IP,即虚拟IP。通过keepalived的VIP机制,可以实现在多个Nginx节点之间自动切换虚拟IP,确保即使某个节点发生故障,其他节点可以接管虚拟IP,从而保证系统的持续可用性。这种方式可以有效地提高Nginx的高可用性,让系统更加稳定可靠。

Keepalived + Nginx 双机热备概念

  • Keepalived:一款常用的高可用性(HA)软件,通过VRRP (Virtual Router Redundancy Protocol) 协议来实现虚拟IP地址的管理与故障转移。
  • Nginx:一个高性能的HTTP和反向代理服务器,常用于负载均衡和静态内容服务。
  1. 安装Keepalived 和 Nginx

在两台服务器上(假设为主服务器Master和备用服务器Backup)安装Nginx和Keepalived。通常使用包管理器如apt-getyum安装。

  1. 配置Nginx

在两台服务器上配置Nginx以提供相同的服务。确保两台服务器上的Nginx配置相同,包括网站内容、日志配置等。

  1. 配置Keepalived

在两台服务器上分别配置Keepalived,主要修改/etc/keepalived/keepalived.conf文件。

主服务器(Master)配置示例

复制代码
vrrp_instance VI_1 {
    state MASTER
    interface eth0 # 网卡接口
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass password
    }
    virtual_ipaddress {
        192.168.1.100 # VIP
    }
    track_interface {
        eth0
    }
}

备用服务器(Backup)配置示例:

复制代码
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass password
    }
    virtual_ipaddress {
        192.168.1.x
    }
    track_interface {
        eth0
    }
}

注意,两台服务器的virtual_router_id必须相同,且Master的priority高于Backup。

健康检查脚本(可选)

如果需要更精细的健康检查,可以在Keepalived配置中加入自定义脚本检查Nginx状态。例如,创建一个check_nginx_alive.sh脚本,并在Keepalived配置中引用。

启动服务并测试

  • 在两台服务器上启动Keepalived和Nginx服务。
  • 使用systemctl start keepalivedsystemctl start nginx命令。
  • 测试故障转移:关闭主服务器上的Nginx或整个系统,观察VIP是否自动转移到备用服务器,以及流量是否随之切换。

2.洞察秋毫,调优问天

监控如眼,洞悉性能命脉

Nginx 是一款开源的、高性能的 Web 服务器和反向代理服务器软件,它像是一位"轻量级拳王",在资源效率和处理能力上找到了完美的平衡点,以其敏捷和强大的并发处理能力驰骋于互联网的高速路上。

正所谓"工欲善其事,必先利其器",虽然Nginx本身具备优秀的性能和稳定性,但为了确保其持续高效运行,最大化利用其潜能,并及时发现和解决问题,实施有效的监控措施是必不可少的。通过监控,不仅可以实时了解Nginx的运行状态、资源占用、请求处理能力等关键指标,还能在遇到性能瓶颈或异常情况时迅速响应,进行调优或故障排除。因此,为Nginx配备一套完善的监控系统,就如同为高性能赛车装备了精准的仪表盘和预警系统,使其在复杂多变的网络环境中更加游刃有余,进一步彰显其作为高性能Web服务器的卓越风范。Nginx 的性能监控是确保其高效运行和及时发现潜在问题的关键。Nginx 提供了多种监控方式和指标,主要可以通过以下几个方面进行:

1.自身模块配置:ngx_http_stub_status_module

Nginx 自带的 ngx_http_stub_status_module 是最基础也是最直接的性能监控模块。它能提供一些核心的活跃状态指标,包括但不限于:

  • Accepts:服务器总的接收连接数。

  • Handled:成功处理的连接数。

  • Requests:总的请求数。

  • Active:当前活动的连接数。

  • Reading:正在读取请求头的连接数。

  • Writing:正在向客户端写回响应的连接数。

  • Waiting:正在等待服务器处理的连接数。

    server {
    listen 80;
    server_name example.com;

    复制代码
      location /nginx_status {
          stub_status on;
          access_log off;
          allow 127.0.0.1; # 允许本地访问监控页面
          deny all; # 拒绝其他所有IP访问
      }

PS:

这里需要注意一下, ngx_http_stub_status_module,如果想要应用,其实是需要在编译中指定该模块的。

ngx_http_stub_status_module 是 Nginx 的一个内置模块,用于提供关于 Nginx 服务器状态的基本信息。这个模块并非默认启用,需要在编译 Nginx 时通过配置选项指定加载。关于该模块的版本限制:

  • 一般情况下ngx_http_stub_status_module 随 Nginx 主版本一同发布和更新,意味着只要使用的是 Nginx 的官方稳定版本,都应当支持该模块的配置和使用。

  • 特定版本要求:虽然大多数现代 Nginx 版本都包含此模块,但在非常老的 Nginx 版本中可能没有该模块,或者模块的功能相比新版本有所差异。因此,对于非常特定的旧版本需求,最好查阅对应版本的 Nginx 文档或源代码确认。

  • 编译时启用 :无论哪个支持此模块的 Nginx 版本,都需要在编译安装时通过 --with-http_stub_status_module 选项来明确启用它。如果你使用的是预编译的二进制包(如某些Linux发行版的软件仓库提供的),则需要确认该包是否已包含此模块。

那么提到编译,其实近期有小伙伴就面临这个问题,因为开发环境是国产化环境,面临部署的问题,这就需要源码包进行编译了,凯叔呢也贴心的送上编译相关的信息,还是那样,其实不管哪一块,深挖的话都是值得考究的,我呢也就是抛砖引玉,纯纯科普,还请各位大侠见谅本人的知识浅薄。

Linux,龙芯平台编译Nginx

安装依赖:首先,确保系统中安装了必要的依赖包,如GCC、PCRE、zlib和OpenSSL。这可以通过包管理器完成,例如在Ubuntu上可以执行:

bash 复制代码
sudo apt-get update
sudo apt-get install build-essential libpcre3-dev zlib1g-dev libssl-dev

下载Nginx源码 :从Nginx官方网站下载最新稳定版源码压缩包,或使用wget命令直接下载。

bash 复制代码
wget http://nginx.org/download/nginx-1.18.0.tar.gz
tar xzf nginx-1.18.0.tar.gz
cd nginx-1.18.0

配置编译 :使用./configure命令来配置编译选项

bash 复制代码
./configure --prefix=/usr/local/nginx --with-http_ssl_module

这里--prefix指定安装路径,--with-http_ssl_module表示启用SSL支持。

编译与安装:

bash 复制代码
make
sudo make instal

最后找到你编译后的路径,启动就可以了

不过这里需要注意一下,龙芯编译的时候,其实面临着"交叉编译工具链"的安装,其实主要跟他的架构有关,这些软件的编译,其实还应该找具体的运维操作,毕竟术业有专攻,五根手指头还都不一样长呢,你说是不?

2.日志监控

Nginx 的访问日志和错误日志同样是非常重要的性能和问题排查来源。通过分析日志,可以发现请求模式、错误频率等问题。

复制代码
http {
   access_log /var/log/nginx/access.log combined;
    error_log /var/log/nginx/error.log warn;
}

3.第三方工具和系统

  • Zabbix、Prometheus、Grafana:这些工具可以集成 Nginx 的监控指标,提供图形化界面展示和报警机制。

  • Nginx Amplify:Nginx 官方提供的监控和分析平台,提供详尽的性能报告和建议。

  • Telegraf + InfluxDB + Grafana:收集日志和指标,存储在数据库中,并通过图表展示。

    scrape_configs:
    - job_name: 'nginx_exporter'
    static_configs:
    - targets: ['localhost:9113'] # 假设 Nginx Exporter 监听在此端口

4.性能测试工具

使用如 ab(Apache Benchmark)、wrkJMeter 等工具模拟高并发请求,对 Nginx 服务器进行压力测试,以评估其性能极限和稳定性。

5. 系统层面监控

监控服务器的CPU、内存、磁盘I/O、网络等资源使用情况,因为这些都会直接影响到 Nginx 的性能表现。可以使用 tophtopvmstatiostat 等命令或集成监控系统(如 Nagios、Zabbix)进行监控。

调优似剑,削铁如泥,精益求精

说到性能监控,就不得不提到性能的调优。

1.开启长连接(Keepalive)

长连接可以减少客户端与服务器之间的TCP握手次数,提高响应速度和减少资源消耗。

在 Nginx 的 http 块中调整如下参数:

bash 复制代码
http {
    keepalive_timeout 120s; # 客户端连接超时时间,单位为秒
    keepalive_requests 10000; # 一个长连接上可以处理的最大请求数量
}
  1. 零拷贝技术

Nginx 支持使用 sendfile 和 tcp_nopush 选项来启用零拷贝技术,直接将文件从磁盘复制到网络套接字,减少数据复制,提高文件传输效率。

bash 复制代码
http {
    sendfile on; # 开启sendfile支持
    tcp_nopush on; # 对于不完整的响应体,延迟发送直到完整或达到设定的缓冲区大小
}
  1. 工作进程数(Worker Processes)

合理设置工作进程数可以充分利用多核CPU资源。一般建议设置为CPU核心数。

bash 复制代码
worker_processes auto; # 自动检测CPU核心数并设置为相应数量
  1. 最大连接数(Worker Connections)

调整每个工作进程能够同时处理的最大连接数,依据服务器资源状况调整。

bash 复制代码
events {
    worker_connections 1024; # 每个工作进程的最大连接数
    use epoll; # 对于Linux系统,使用epoll事件模型以提高效率
}
  1. 缓冲区调整

优化缓冲区大小可以减少IO操作,提高性能。

bash 复制代码
http {
    client_body_buffer_size 128k; # 客户端请求主体的缓冲区大小
    proxy_buffer_size 4k; # 代理请求的初始缓冲区大小
    proxy_buffers 4 32k; # 代理请求的缓冲区数量和大小
}
  1. 负载均衡算法优化

选择合适的负载均衡算法(如轮询、最少连接等),并适当配置后端服务器的健康检查。

bash 复制代码
http {
    upstream backend {
        least_conn; # 使用最少连接数的负载均衡算法
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;
    }
}
  1. 日志优化

减少日志级别或使用缓冲写入可以减少磁盘IO负担。

bash 复制代码
error_log /var/log/nginx/error.log warn; # 降低日志级别
access_log /var/log/nginx/access.log combined buffer=16k; # 缓冲写入日志
  1. 开启Gzip压缩

压缩响应体可以减少网络传输的数据量,加快页面加载速度。

bash 复制代码
http {
    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}

未完待续。。。

相关推荐
七夜zippoe5 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
Fcy6486 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满6 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠7 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Harvey9037 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技8 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
释怀不想释怀8 小时前
Linux环境变量
linux·运维·服务器
zzzsde8 小时前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器
聆风吟º10 小时前
CANN开源项目实战指南:使用oam-tools构建自动化故障诊断与运维可观测性体系
运维·开源·自动化·cann
NPE~10 小时前
自动化工具Drissonpage 保姆级教程(含xpath语法)
运维·后端·爬虫·自动化·网络爬虫·xpath·浏览器自动化