
— 特色专栏 —
大家好,我是民工哥!
前些时间,有一个读者被公司裁员后去面试,因面试官的一个问题直接挂掉了。
面试官:设计一个零宕机 Nginx 集群高可用架构都不会?你来面试什么运维工程师?

面试官直接丢了这两句话后让他回家等通知了。
今天,我们就来聊一聊这个问题。
构建零宕机的 Nginx 集群与高可用架构需结合负载均衡、主备切换、健康检查及监控告警等多重机制。
单台服务器运行整个 LNMP 架构会导致网站访问缓慢,当系统内存被吃满时,很容易导致系统出现oom,从而kill掉MySQL数据库,为了避免这种情况的发生,我们可以将数据库服务拆分到独立的服务器上部署。拆分数据库可以带来以下好处:
web网站的压力;
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服务器上的数据库,然后将备份的文件拷贝到新的数据库服务器上;
[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,然后导入数据
[root@db01 ~]# yum install mysql-server -y
[root@db01 ~]# systemctl enable mysqld --now
[root@db01 ~]# mysql -uroot < /tmp/app-database.sql
3、在新的MySQL服务上创建一个能通过远程访问的用户
CREATE USER 'app'@'%' IDENTIFIED BY 'newy.net';
grant all privileges ON *.* TO 'app'@'%';
flush privileges;
4、修改代码指向新的数据库
# 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节点如果故障,会导致业务整体down机;web节点能保证业务的持续稳定,扩展性高;web节点能有效的提升用户访问网站的速度;
image.png
系统环境 | 主机名称 | 应用环境 | 外网地址 | 内网地址 |
|---|---|---|---|---|
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 |
基于现有的web01节点,快速扩展一台web02的节点,数据库统一使用 db01 。
1、安装LNP环境(创建用户、安装软件)
[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 将 web01 的 nginx、php 配置文件拷贝到 web02
[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 服务器上
[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、启动 nginx 与 php-fpm 并加入开机自启
[root@web02 ~]# systemctl enable nginx php-fpm --now
当前后端有多台 web 节点,会导致用户上传的图片、视频附件等内容仅上传到了一台 web 服务器,那么其他的 web 服务器则无法访问到该图片。为了解决这个问题,我们可以使用NFS共享存储。这么做有几个好处:
web 节点静态资源一致。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 | 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
[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、将静态资源文件同步到共享存储中
[root@web01 ~]# scp -rp /code/wordpress/wp-content/uploads/* root@172.16.1.22:/data/blog
3、各个节点挂载对应的存储
[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应用服务器,如何能实现快速扩展?
现在有多个WEB服务器,该如何进行访问?
1、DNS轮询
2、负载均衡

wordpress的配置
[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的配置
[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;
}
}
当用户登陆一个网站服务器,网站服务器会将用户的登陆信息存储下来(存储下来的内容叫 Session ),以保证我们能够一直处于 ”登陆在线“ 状态。
由于我们使用的是负载均衡轮询机制,会导致用户请求分散在不同的节点,从而造成会话无法保持。
假设用户A,通过负载均衡登陆了网站,此时会话信息存储在A节点,那么当它一刷新,负载均衡会将请求分发给B节点,那么B节点没有用户A的登陆信息,就会提示用户A登陆,当A用户点击登陆时又会将请求分发给C节点,从而造成用户A无法实现会话保持。
1.首先安装并配置 phpmyadmin
[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 连接远程的数据库
[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 上准备 phpmyadmin 的 nginx 配置文件*
[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 节点
[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
[root@proxy01 conf.d]# nginx -t
[root@proxy01 conf.d]# systemctl restart nginx
1.安装 redis 内存数据库
[root@db01 ~]# yum install redis -y
2.配置 redis 监听在本地的内网网卡上
[root@db01 ~]# sed -i '/^bind/c bind 127.0.0.1 172.16.1.51' /etc/redis.conf
3.启动 redis
[root@db01 ~]# systemctl start redis
[root@db01 ~]# systemctl enable redis
1.修改 /etc/php.ini 文件,[所有节点都需要操作]。
[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 目录中,从而造成会话共享失败,[所有节点都需要操作]。
[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 服务,[所有节点都需要操作]。
[root@web ~]# php-fpm -t
[root@web ~]# systemctl restart php-fpm
自行测试
以上内容来源:https://blog.csdn.net/Sunfeiyanghtml/article/ details/140270815
零宕机Nginx集群的实现需综合负载均衡、高可用、监控及自动化运维等多方面策略,以下是具体实现策略:
轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,若后端某个服务器宕机,能自动剔除故障系统。例如配置如下:
upstream backserver {
server 192.168.0.12;
server 192.168.0.13;
}
权重(weight):weight值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况,也可在主从情况下设置不同权值,合理利用主机资源。示例配置:
upstream backserver {
server 192.168.0.12 weight=2;
server 192.168.0.13 weight=8;
}
ip_hash(IP绑定):每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,可有效解决动态网页存在的session共享问题。配置示例:
upstream backserver {
ip_hash;
server 192.168.0.12:88;
server 192.168.0.13:80;
}
fair(第三方插件):需安装upstream_fair模块,对比weight、ip_hash更加智能,可根据页面大小和加载时间长短智能地进行负载均衡,响应时间短的优先分配。配置示例:
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集群
👍 如果你喜欢这篇文章,请点赞并分享给你的朋友!