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

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.mzph.cn/bicheng/5934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

32.Docker认识

Docker介绍 Docker是一个快速交付应用,运行应用的技术。 1.可以将程序、依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统。 2.运行时利用沙箱机制行程隔离容器,各个应用互不干扰。 3.启动、移除都可以通过一行命令完成&am…

I2C接口18路LED呼吸灯驱动IS31FL3218互相替代SN3218替换HTR3218

I2C接口18路LED呼吸灯控制电路IC 该型号IC为QFN24接口,属于小众产品,IS31FL3218、SN3218、HTR3218S管脚兼容,需要注意的是HTR3218管脚与其他型号不兼容。 I2C接口可实现多个LED灯的呼吸灯控制,可实现单色控制18个LED灯&#xff0…

Kubernetes - Dashboard 配置用户名密码方式登录

Kubernetes - Dashboard 配置用户名密码方式登录 前言: 为了 K8s 集群安全,默认情况下 Dashboard 以 Token的形式登录的,那如果我们想以用户名/密码的方式登录该怎么操作呢?其实只需要我们创建用户并进行 ClusterRoleBinding绑定即…

Educational Codeforces Round 165 (Rated for Div. 2 ABCDE 题)视频讲解

A. Two Friends Problem Statement Monocarp wants to throw a party. He has n n n friends, and he wants to have at least 2 2 2 of them at his party. The i i i-th friend’s best friend is p i p_i pi​. All p i p_i pi​ are distinct, and for every i ∈…

并发编程之线程池的设计和原理

一、线程池 提前创建一系列的线程,保存在这个线程池中,有任务要执行的时候,从线程池中取出线程来执行。没有任务的时候,线程池放回去。 二、为什么要使用线程池 线程使用上的问题: 线程的频繁创建 和 销毁 线程的数量过多&…

政安晨:【Keras机器学习示例演绎】(二十六)—— 图像相似性搜索的度量学习

目录 概述 设置 数据集 嵌入模型 测试 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 本文…

基于Pytorch深度学习——多层感知机

本文章来源于对李沐动手深度学习代码以及原理的理解,并且由于李沐老师的代码能力很强,以及视频中讲解代码的部分较少,所以这里将代码进行尽量逐行详细解释 并且由于pytorch的语法有些小伙伴可能并不熟悉,所以我们会采用逐行解释小…

Word域代码学习(简单使用)-【SEQ】

Word域代码学习(简单使用)-【SEQ】 快捷键 序号快捷键操作1 Ctrl F9 插入域代码花括号2 F9 显示域代码结果3 Shift F9 切换为域代码4 Windows Alt F9 切换全部域代码 域代码说明 域代码不区分大小写在word中,依次选择插入➡文档部件➡域即可选择插入…

Linux 学习 --- 编辑 vi 命令

1、vi 基本概念(了解) 基本上 vi 可以分为三种状态,分别是命令模式 (command mode)、插入模式 (Insert mode) 和底行模式 (last line mode),各模式的功能区分如下: 命令行模式 command mode)  控制屏幕光标的移动&a…

PotatoPie 4.0 实验教程(31) —— FPGA实现摄像头图像高斯滤波

什么是高斯滤波 高斯滤波是一种常见的图像处理技术,用于去除图像中的噪声和平滑图像。它的原理基于统计学中的高斯分布(也称为正态分布)。 在高斯滤波中,一个二维的高斯核函数被用来对图像中的每个像素进行加权平均。这个高斯核…

jvm 马士兵 01

01.JVM是什么 JVM是一个跨平台的标准 JVM只识别class文件,符合JVM规范的class文件都可以被识别

AI智能名片商城小程序:引领企业迈向第三增长极

随着数字化浪潮的席卷,私域流量的重要性逐渐凸显,为企业增长提供了全新的动力。在这一背景下,AI智能名片商城系统崭露头角,以其独特的优势,引领企业迈向第三增长极。 私域流量的兴起,为企业打开了一扇新的销…

【codeforces】Immobile Knight

Immobile Knight 我感觉自己不太适合写codeforces,简单题也比较考验思维,当时这题看了半天以为是搜索,写了20分钟暴力交了,还好对的,20个人19个人5分钟不到速通第一题,唯留我一人在第一题凌乱。下来看看这…

深度学习中的归一化:BN,LN,IN,GN的优缺点

目录 深度学习中归一化的作用常见归一化的优缺点 深度学习中归一化的作用 加速训练过程 归一化可以加速深度学习模型的训练过程。通过调整输入数据的尺度,归一化有助于改善优化算法的收敛速度。这是因为归一化后的数据具有相似的尺度,使得梯度下降等优化…

密码学基础练习五道 RSA、elgamal、elgamal数字签名、DSA数字签名、有限域(GF)上的四则运算

1.RSA #include <stdlib.h>#include <stdio.h>#include <string.h>#include <math.h>#include <time.h>#define PRIME_MAX 200 //生成素数范围#define EXPONENT_MAX 200 //生成指数e范围#define Element_Max 127 //加密单元的…

dockerfile 搭建lamp 实验模拟

一 实验目的 二 实验 环境 1, 实验环境 192.168.217.88一台机器安装docker 并做mysql nginx php 三台容器 2&#xff0c; 大致框架 3&#xff0c; php php:Nginx服务器不能处理动态页面&#xff0c;需要由 Nginx 把动态请求交给 php-fpm 进程进行解析 php有三…

LT6911UXB HDMI2.0 至四端口 MIPI DSI/CSI,带音频 龙迅方案

1. 描述LT6911UXB 是一款高性能 HDMI2.0 至 MIPI DSI/CSI 转换器&#xff0c;适用于 VR、智能手机和显示应用。HDMI2.0 输入支持高达 6Gbps 的数据速率&#xff0c;可为4k60Hz视频提供足够的带宽。此外&#xff0c;数据解密还支持 HDCP2.2。对于 MIPI DSI / CSI 输出&#xff0…

van-cascader(vant2)异步加载的bug

问题描述&#xff1a;由于一次性返回所有的级联数据的话&#xff0c;数据量太大&#xff0c;接口响应时间太久&#xff0c;因此采用了异步加载的方案&#xff0c;看了vant的官方示例代码&#xff0c;照着改了下&#xff0c;很轻松地实现了功能。正当我感叹世界如此美好的时候&a…

【C++ —— 多态】

C —— 多态 多态的概念多态的定义和实现多态的构成条件虚函数虚函数的重写虚函数重写的两个例外协变&#xff1a;析构函数的重写 C11 override和final重载、覆盖(重写)、隐藏(重定义)的对比 抽象类概念接口继承和实现继承 多态的继承虚函数表多态的原理动态绑定和静态绑定 单继…

数据库(MySQL)基础:多表查询(一)

一、多表关系 概述 项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互关联&#xff0c;所以各个表结构之间也存在着各种联系&#xff0c;基本上分为三种&#xff1a;…