nginx的前世今生(三)

ops/2024/10/21 10:02:18/

高手对决:武林盟主之路

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安装。

2. 配置Nginx

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

3. 配置Keepalived

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

主服务器(Master)配置示例

vrrp_instance VI_1 {state MASTERinterface eth0 # 网卡接口virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass password}virtual_ipaddress {192.168.1.100 # VIP}track_interface {eth0}
}

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

vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 51priority 90advert_int 1authentication {auth_type PASSauth_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上可以执行:

sudo apt-get update
sudo apt-get install build-essential libpcre3-dev zlib1g-dev libssl-dev

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

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命令来配置编译选项

./configure --prefix=/usr/local/nginx --with-http_ssl_module

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

编译与安装:

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 块中调整如下参数:

http {keepalive_timeout 120s; # 客户端连接超时时间,单位为秒keepalive_requests 10000; # 一个长连接上可以处理的最大请求数量
}

2. 零拷贝技术

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

http {sendfile on; # 开启sendfile支持tcp_nopush on; # 对于不完整的响应体,延迟发送直到完整或达到设定的缓冲区大小
}

3. 工作进程数(Worker Processes)

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

worker_processes auto; # 自动检测CPU核心数并设置为相应数量

4. 最大连接数(Worker Connections)

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

events {worker_connections 1024; # 每个工作进程的最大连接数use epoll; # 对于Linux系统,使用epoll事件模型以提高效率
}

5. 缓冲区调整

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

http {client_body_buffer_size 128k; # 客户端请求主体的缓冲区大小proxy_buffer_size 4k; # 代理请求的初始缓冲区大小proxy_buffers 4 32k; # 代理请求的缓冲区数量和大小
}

6. 负载均衡算法优化

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

http {upstream backend {least_conn; # 使用最少连接数的负载均衡算法server backend1.example.com;server backend2.example.com;server backend3.example.com;}
}

7. 日志优化

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

error_log /var/log/nginx/error.log warn; # 降低日志级别
access_log /var/log/nginx/access.log combined buffer=16k; # 缓冲写入日志

8. 开启Gzip压缩

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

http {gzip on;gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}

未完待续。。。


http://www.ppmy.cn/ops/36375.html

相关文章

计算机毕业设计PHP+vue体检预约管理系统d1yu38

防止在使用不同数据库时,由于底层数据库技术不同造成接口程序紊乱的问题。通过本次系统设计可以提高自己的编程能力,强化对所学知识的理解和运用 本系统是一个服务于医院先关内容的网站,在用户打开网站的第一眼就要明白网站开发的目的&#x…

Django数据模型类(Model)字段属性类型

Django框架是用Python语言编写的,所以框架中的数据模型类Model也是Python类。 类django.db.models中的每个属性,对应数据库中的一个字段,所以属性类型就是数据库的字段类型。 Django为每个Model类设置一个自增id,即自增主键&…

springcloud整合nacos实现相同版本实例相互调用

springcloud整合nacos实现相同版本实例相互调用 注: 本文为自己学习研究总结,仅供参考,若有侵权,请及时联系本人 业务场景 有时候一些新的业务或者修改后的功能只开放给部分人访问,那么可以新老版本都部署,对于大多…

苹果CEO对未来一代人工智能投资持乐观态度

尽管在动荡的第二季度,苹果的收入和iPhone销量有所下降,但其新兴的人工智能技术可能会带来急需的提振。 在5月2日的电话财报会议上,苹果公布季度收入为908亿美元,比去年下降4%。iPhone的收入也下降了10%,至460亿美元。…

pytorch_lightning 训练教程

步骤1:引入必要的库 首先,确保你已经安装了 pytorch_lightning。pip 安装: pip install pytorch_lightning 然后在你的代码中导入必要的库: import pytorch_lightning as pl from pytorch_lightning.callbacks import ModelC…

与Apolo共创生态: Apollo X企业自动驾驶解决方案的亮点

文章目录 前言技术革新的里程碑Apollo X企业自动驾驶解决方案的亮点Application X企业预制套件的多场景覆盖Studio X企业协同工具链的全周期支持第一阶段:上机系统构建第二阶段:POC搭建第三阶段:规模运营小结 共创生态,共享未来共…

学习R语言第五天

文章目录 语法学习创建数据的方式绘制图形的方式图形添加颜色如何操作数据的方式数据进行验算的判断加付值的方式修改变量名称的方式判断是否存在缺失值在计算的方式忽略缺失值通过函数的方式忽略缺失值日期处理的方式字符串转化成日期的方式格式化数据框中数据返回当前的日期的…

2-5 任务:打印九九表

本次实战的目标是通过编写程序实现打印九九乘法表、字符矩形、字符平行四边形和字符菱形等图形,以及解决百钱买百鸡问题和输出素数等实际问题。在实战过程中,我们将学习并掌握以下知识点。 双重循环的使用:通过双重循环实现九九乘法表的打印&…