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;
}

未完待续。。。

相关推荐
朝九晚五ฺ5 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
Kkooe6 小时前
GitLab|数据迁移
运维·服务器·git
久醉不在酒6 小时前
MySQL数据库运维及集群搭建
运维·数据库·mysql
虚拟网络工程师7 小时前
【网络系统管理】Centos7——配置主从mariadb服务器案例(下半部分)
运维·服务器·网络·数据库·mariadb
墨鸦_Cormorant8 小时前
使用docker快速部署Nginx、Redis、MySQL、Tomcat以及制作镜像
redis·nginx·docker
BLEACH-heiqiyihu8 小时前
RedHat7—Linux中kickstart自动安装脚本制作
linux·运维·服务器
一只爱撸猫的程序猿8 小时前
一个简单的Linux 服务器性能优化案例
linux·mysql·nginx
MXsoft6189 小时前
华为服务器(iBMC)硬件监控指标解读
大数据·运维·数据库
1900439 小时前
linux6:常见命令介绍
linux·运维·服务器
Camellia-Echo9 小时前
【Linux从青铜到王者】Linux进程间通信(一)——待完善
linux·运维·服务器