首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >面试官:连设计一个零宕机 Nginx 高可用集群架构都不会?你来面试什么运维工程师?

面试官:连设计一个零宕机 Nginx 高可用集群架构都不会?你来面试什么运维工程师?

作者头像
民工哥
发布2026-03-24 13:59:02
发布2026-03-24 13:59:02
950
举报

特色专栏

MySQL/PostgreSQL/MongoDB

ElasticSearch/Hadoop/Redis

Kubernetes/Docker/DevOps

Kafka/RabbitMQ/Zookeeper

监控平台/应用与服务/集群管理

Nginx/Git/Tools/OpenStack

‌大家好,我是民工哥!

前些时间,有一个读者被公司裁员后去面试,因面试官的一个问题直接挂掉了。

面试官:设计一个零宕机 Nginx 集群高可用架构都不会?你来面试什么运维工程师?

面试官直接丢了这两句话后让他回家等通知了。

今天,我们就来聊一聊这个问题。

构建零宕机的 Nginx 集群与高可用架构需结合负载均衡、主备切换、健康检查及监控告警等多重机制。

Nginx 架构拆分集群

拆分数据库至独立服务器
为何要拆分数据库

单台服务器运行整个 LNMP 架构会导致网站访问缓慢,当系统内存被吃满时,很容易导致系统出现oom,从而killMySQL数据库,为了避免这种情况的发生,我们可以将数据库服务拆分到独立的服务器上部署。拆分数据库可以带来以下好处:

  • 1.缓解web网站的压力;
  • 2.增强数据库读写性能;
  • 3.提高用户访问的速度;
数据库拆分架构
i
i

i

数据库拆分环境

系统环境

主机名称

应用环境

外网地址

内网地址

RockyLinux9

web01.newy.net

nginx+php

10.0.0.7

172.16.1.7

RockyLinux9

db01.newy.net

mysql

10.0.0.51

172.16.1.51

拆分数据库实践

要将数据库服务迁移到一个独立的服务器运行,可以按照如下步骤进行操作:

  • 1、首先,我们需要备份当前 Web 服务器上 MySQL 的数据。然后将备份的文件拷贝到新的数据库服务器。
  • 2、在新服务器上安装 MySQL ,并导入刚才备份的数据,确保数据库内容是最新的。
  • 3、在新的 MySQL 服务上创建一个远程可以访问数据库的用户,并赋予对应的权限。
  • 4、最后将应用程序数据库的连接地址,指向新的数据库服务器地址。

1、备份 web服务器上的数据库,然后将备份的文件拷贝到新的数据库服务器上;

代码语言:javascript
复制
[root@web01 ~]# mysqldump -uroot -p'newy.net' -B wordpress zh > app-database.sql
[root@web01 ~]# scp app-database.sql root@172.16.1.51:/tmp

2、在新的数据库服务器上安装MySQL,然后导入数据

代码语言:javascript
复制
[root@db01 ~]# yum install mysql-server -y
[root@db01 ~]# systemctl enable mysqld --now

[root@db01 ~]# mysql -uroot < /tmp/app-database.sql

3、在新的MySQL服务上创建一个能通过远程访问的用户

代码语言:javascript
复制
CREATE USER 'app'@'%' IDENTIFIED BY 'newy.net';
grant all privileges ON *.* TO 'app'@'%';
flush privileges;

4、修改代码指向新的数据库

代码语言:javascript
复制
# wordpress

[root@web01 ~]# vim /code/wordpress/wp-config.php
define('DB_NAME', 'wordpress');
define('DB_USER', 'app');
define('DB_PASSWORD', 'newy.net');
define('DB_HOST', '172.16.1.51');

# wecenter
[root@web01 zh]#  grep -iR "newy.net"|grep -v cache
system/config/database.php:  'password' => 'newy.net',
[root@web01 zh]# vim /code/zh/system/config/database.php
'host' => '172.16.1.51',
'username' => 'app',
'password' => 'newy.net',
'dbname' => 'zh',
扩展多台相同的Web应用
为何要扩展多台web节点

目前站点仅运行在一台服务器上,那么它能够同时处理的用户数量是有限的。为了让网站能够接收更多的用户请求,我们需要配置多台服务器,来共同提供支撑。这样做有几个好处:

  • 1、单台web节点如果故障,会导致业务整体down机;
  • 2、多台web节点能保证业务的持续稳定,扩展性高;
  • 3、多台web节点能有效的提升用户访问网站的速度;
扩展多web节点架构
image.png
image.png

image.png

2.3 扩展多web节点环境

系统环境

主机名称

应用环境

外网地址

内网地址

RockyLinux9

web01.newy.net

nginx+php

10.0.0.7

172.16.1.7

RockyLinux9

web02.newy.net

nginx+php

10.0.0.8

172.16.1.8

RockyLinux9

db01.newy.net

mysql

10.0.0.51

172.16.1.51

扩展多web节点实践

基于现有的web01节点,快速扩展一台web02的节点,数据库统一使用 db01

  • 1、安装LNP环境
  • 2、将web01节点的Nginx、PHP配置文件拷贝至web02节点
  • 3、将web01节点的代码拷贝至web02节点
  • 4、启动服务,而后使用客户端进行验证服务;

1、安装LNP环境(创建用户、安装软件)

代码语言:javascript
复制
[root@web02 ~]# groupadd -g666 www
[root@web02 ~]# useradd -u666 -g666 www

[root@web02 ~]# scp -rp root@172.16.1.7:/etc/yum.repos.d/nginx.repo /etc/yum.repos.d/
[root@web02 ~]# yum install -y nginx php php-fpm php-cli \
php-common php-devel php-embedded php-gd php-mcrypt php-bcmath php-mbstring php-pdo php-xml \
php-mysqlnd php-opcache php-pecl-zip php-pecl-redis php-pecl-mongodb

2、使用 scp 或 rsync 将 web01nginx、php 配置文件拷贝到 web02

代码语言:javascript
复制
[root@web02 ~]# scp -rp root@172.16.1.7:/etc/nginx /etc/
[root@web02 ~]# scp -rp root@172.16.1.7:/etc/php-fpm.d /etc/
[root@web02 ~]# scp -rp root@172.16.1.7:/etc/php.ini /etc/

3、使用 scp 或 rsync 将 web01 的代码拷贝到 web02 服务器上

代码语言:javascript
复制
[root@web01 ~]# tar czf code.tar.gz /code
[root@web01 ~]# scp code.tar.gz root@172.16.1.8:/tmp

[root@web02 ~]# tar xf /tmp/code.tar.gz -C /

4、启动 nginxphp-fpm 并加入开机自启

代码语言:javascript
复制
[root@web02 ~]# systemctl enable nginx php-fpm --now
拆分静态资源至独立服务器
为何要拆分静态资源

当前后端有多台 web 节点,会导致用户上传的图片、视频附件等内容仅上传到了一台 web 服务器,那么其他的 web 服务器则无法访问到该图片。为了解决这个问题,我们可以使用NFS共享存储。这么做有几个好处:

  • 1、保证了多台 web 节点静态资源一致。
  • 2、有效节省多台 web 节点的存储空间。
  • 3、后期通过自动化更新代码,只需要考虑更新代码的变动,而无需考虑静态资源。
拆分静态资源架构
增加共享存储环境

系统环境

主机名称

应用环境

外网地址

内网地址

RockyLinux9

web01.newy.net

nginx+php

10.0.0.7

172.16.1.7

RockyLinux9

web02.newy.net

nginx+php

10.0.0.8

172.16.1.8

RockyLinux9

nfs.newy.net

nfs

10.0.0.22

172.16.1.22

RockyLinux9

db01.newy.net

mysql

10.0.0.51

172.16.1.51

增加共享存储实践

配置共享存储实现思路;

  • 1、首先增加一台独立的服务器,然后安装好对应的NFS,并对外共享目录;
  • 2、找到应用存储静态资源的路径,而后将静态资源全部同步到NFS存储中;
  • 3、将应用站点的静态目录,挂载到NFS存储对应的目录上;

1、安装NFS

代码语言:javascript
复制
[root@nfs ~]# yum install nfs-utils -y

[root@nfs ~]# cat /etc/exports
/data/blog 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
/data/zh 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)

[root@nfs ~]# mkdir /data/{blog,zh} -p
[root@nfs ~]# chown -R www.www /data/
[root@nfs ~]# systemctl restart nfs-server

2、将静态资源文件同步到共享存储中

代码语言:javascript
复制
[root@web01 ~]# scp -rp /code/wordpress/wp-content/uploads/* root@172.16.1.22:/data/blog

3、各个节点挂载对应的存储

代码语言:javascript
复制
[root@web01 ~]# mount -t nfs 172.16.1.22:/data/blog /code/wordpress/wp-content/uploads/
[root@web02 ~]# mount -t nfs 172.16.1.22:/data/blog /code/wordpress/wp-content/uploads/
问题思考
如何快速扩展新节点

如果我们添加了一台C应用服务器,如何能实现快速扩展?

  • 1.准备LNP环境,(手动 | Ansible)
  • 2.拷贝任意A或B上的配置文件,代码
  • 3.挂载NFS存储
多节点该如何访问

现在有多个WEB服务器,该如何进行访问?

1、DNS轮询

  • (1)需要所有的web节点具备公网IP地址
  • (2)公网独立IP需要费用,而且不便宜。
  • (3)所有的web节点有公网IP,不安全。
  • (4)DNS只有轮询机制,没有 健康检查功能。

2、负载均衡

  • (1)所有的web节点不需要有公网IP,能节省成本、并保证安全
  • (2)能够对后端的web节点进行健康检查机制;
  • (3)负载均衡有多种调度算法来满足企业不同需求;

Nginx负载均衡配置

wordpress的配置

代码语言:javascript
复制
[root@proxy01 ~]# cat /etc/nginx/conf.d/proxy_blog.newy.net.conf 

upstream blog {
 server 172.16.1.7:80;
 server 172.16.1.8:80;
}

server {
 listen 80;
 server_name blog.newy.net;

 location / {
  proxy_pass http://blog;
  proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 }
}

zh的配置

代码语言:javascript
复制
[root@proxy01 ~]# cat /etc/nginx/conf.d/proxy_zh.newy.net.conf 

upstream zh {
 server 172.16.1.7:80;
 server 172.16.1.8:80;
}

server {
 listen 80;
 server_name zh.newy.net;

 location / {
  proxy_pass http://zh;
  proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 }

}

Nginx负载均衡会话共享

什么是会话保持

当用户登陆一个网站服务器,网站服务器会将用户的登陆信息存储下来(存储下来的内容叫 Session ),以保证我们能够一直处于 ”登陆在线“ 状态。

为什么需要会话保持

由于我们使用的是负载均衡轮询机制,会导致用户请求分散在不同的节点,从而造成会话无法保持。

假设用户A,通过负载均衡登陆了网站,此时会话信息存储在A节点,那么当它一刷新,负载均衡会将请求分发给B节点,那么B节点没有用户A的登陆信息,就会提示用户A登陆,当A用户点击登陆时又会将请求分发给C节点,从而造成用户A无法实现会话保持。

如何实现会话保持
  • 1、粘性session:指Ngnix每次都将同一用户的所有请求转发至同一台服务器上,及Nginx的 IP_hash。
  • 2、session复制:每次session发生变化,就广播给集群中的服务器,使所有的服务器上的session相同。
  • 3、session持久化:将session存储至数据库中,像操作数据一样操作session。
  • 4、session共享:将session至内存数据库中,使用redis,memcached实现。
  • 5、Cookies植入: 使用负载均衡来实现,例如Haproxy;(在nginx中暂不实现)
会话保持场景演示
配置web节点

1.首先安装并配置 phpmyadmin

代码语言:javascript
复制
[root@web01 ~]# wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.zip
[root@web01 ~]# unzip phpMyAdmin-5.2.1-all-languages.zip -d /code/
[root@web01 ~]# ln -s /code/phpMyAdmin-5.2.1-all-languages/ /code/phpmyadmin

2.修改 phpmyadmin 连接远程的数据库

代码语言:javascript
复制
[root@web01 code]# cd /code/phpmyadmin
[root@web01 phpmyadmin]# cp config.sample.inc.php config.inc.php
[root@web01 phpmyadmin]# vim config.inc.php
/* Server parameters */
$cfg['Servers'][$i]['host'] = '172.16.1.51';

3.在多台 web 上准备 phpmyadminnginx 配置文件*

代码语言:javascript
复制
[root@web01 phpmyadmin]# cat /etc/nginx/conf.d/phpmyadmin.newy.net.conf
server {
 listen 80;
 server_name admin.newy.net;
 root /code/phpmyadmin;

 location / {
  index index.php index.html;
 }

 location ~ \.php$ {
  fastcgi_pass 127.0.0.1:9000;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  include fastcgi_params;
 }
}

#重启Nginx服务
[root@web01 ~]# systemctl restart nginx
配置负载均衡

1.编写一份 proxy 负载均衡的配置文件,将请求调度到后端 web 节点

代码语言:javascript
复制
[root@proxy01 ~]# cat /etc/nginx/conf.d/proxy_php.com.conf 
upstream php {
        server 172.16.1.7:80;
        server 172.16.1.8:80;
}
server {
        listen 80;
        server_name php.newy.net;
        location / {
                proxy_pass http://php;
                proxy_set_header Host $http_host;
        }
}

2.检查语法并重载 nginx

代码语言:javascript
复制
[root@proxy01 conf.d]# nginx -t
[root@proxy01 conf.d]# systemctl restart nginx
配置Redis服务

1.安装 redis 内存数据库

代码语言:javascript
复制
[root@db01 ~]# yum install redis -y

2.配置 redis 监听在本地的内网网卡上

代码语言:javascript
复制
[root@db01 ~]# sed  -i '/^bind/c bind 127.0.0.1 172.16.1.51' /etc/redis.conf

3.启动 redis

代码语言:javascript
复制
[root@db01 ~]# systemctl start redis
[root@db01 ~]# systemctl enable redis
配置php连接Redis

1.修改 /etc/php.ini 文件,[所有节点都需要操作]。

代码语言:javascript
复制
[root@web ~]# vim /etc/php.ini
session.save_handler = redis
session.save_path = "tcp://172.16.1.41:6379"
;session.save_path = "tcp://172.16.1.41:6379?auth=123" #如果redis存在密码,则使用该方式

2.注释 php-fpm.d/www.conf 里面的两条内容,否则 session 内容会一直写入 /var/lib/php/session 目录中,从而造成会话共享失败,[所有节点都需要操作]。

代码语言:javascript
复制
[root@web ~]# vim /etc/php-fpm.d/www.conf
;php_value[session.save_handler] = files
;php_value[session.save_path]    = /var/lib/php/session

3.重启 php-fpm 服务,[所有节点都需要操作]。

代码语言:javascript
复制
[root@web ~]# php-fpm -t
[root@web ~]# systemctl  restart php-fpm
测试集群会话共享

自行测试

以上内容来源:https://blog.csdn.net/Sunfeiyanghtml/article/ details/140270815

总结

零宕机Nginx集群的实现需综合负载均衡、高可用、监控及自动化运维等多方面策略,以下是具体实现策略:

负载均衡策略

轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,若后端某个服务器宕机,能自动剔除故障系统。例如配置如下:

代码语言:javascript
复制
upstream backserver { 
    server 192.168.0.12; 
    server 192.168.0.13; 
}

权重(weight):weight值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况,也可在主从情况下设置不同权值,合理利用主机资源。示例配置:

代码语言:javascript
复制
upstream backserver { 
    server 192.168.0.12 weight=2; 
    server 192.168.0.13 weight=8; 
}

ip_hash(IP绑定):每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,可有效解决动态网页存在的session共享问题。配置示例:

代码语言:javascript
复制
upstream backserver { 
    ip_hash; 
    server 192.168.0.12:88; 
    server 192.168.0.13:80; 
}

fair(第三方插件):需安装upstream_fair模块,对比weight、ip_hash更加智能,可根据页面大小和加载时间长短智能地进行负载均衡,响应时间短的优先分配。配置示例:

代码语言:javascript
复制
upstream backserver { 
    server server1; 
    server server2; 
    fair; 
}

url_hash(第三方插件):需安装Nginx的hash软件包,按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可进一步提高后端缓存服务器的效率。

高可用架构

主从备份方案:利用Keepalived + Nginx实现双机热备。准备两台Nginx服务器,同时每台机器安装Keepalived,对外暴露虚拟IP(实际不存在,要与实际机器的IP段一样,可以多加几个虚拟IP)。通过Keepalived实现高可用,两台Nginx一台为master,一台为backup,master宕机时,自动切换到backup。

健康检查与自动切换:Keepalived可监控Nginx服务状态,检测到主节点故障时立即接管VIP和服务。还可编写Keepalived检测脚本,检测Nginx进程是否存在,若不存在则尝试启动,若启动失败则返回错误,触发故障转移。

监控与告警

实时监控:使用Prometheus + Grafana监控Nginx及后端服务状态,包括连接数、响应时间、错误率等指标;部署ELK日志分析系统,实时追踪请求日志和错误信息。

自动告警:集成邮件、短信或钉钉告警,当检测到服务异常时立即通知运维团队;设置告警阈值,如502错误率超过5%,触发自动恢复流程。

自动化运维

配置管理:使用Ansible、Puppet等工具自动化管理Nginx集群配置,确保配置一致性。

故障恢复:配置Nginx自动重启脚本,确保服务异常时快速恢复;定期演练故障转移流程,优化切换时间(目标<5秒),确保用户体验不受影响。

扩展性与安全性

水平扩展:根据流量增长动态添加Nginx节点,通过Keepalived动态调整VIP指向;使用DNS轮询或Anycast技术实现多地域负载均衡。

安全加固:启用HTTPS加密传输,保护用户数据安全;配置防火墙规则,限制非授权访问Nginx管理端口。

#Linux #服务器集群 #Nginx #高可用 #故障恢复 #Keepalived #架构 #IT运维 #Linux运维 #面试 #Nginx集群

👍 如果你喜欢这篇文章,请点赞并分享给你的朋友!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-07-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 民工哥技术之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Nginx 架构拆分集群
    • 拆分数据库至独立服务器
    • 扩展多台相同的Web应用
    • 2.3 扩展多web节点环境
    • 拆分静态资源至独立服务器
    • 问题思考
  • Nginx负载均衡配置
  • Nginx负载均衡会话共享
    • 什么是会话保持
    • 为什么需要会话保持
    • 如何实现会话保持
    • 会话保持场景演示
  • 总结
    • 负载均衡策略
    • 高可用架构
    • 监控与告警
    • 自动化运维
    • 扩展性与安全性
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档