HCIP-OpenEuler:Nginx、LVS与Ansible自动化运维 简介这份题库面向准备参加 HCIP-OpenEulerV1.0 认证的学习者以及具备一定 Linux 系统管理与网络基础、负责企业站点建设和运维的 IT 工程师。内容围绕 Nginx 负载均衡、LVS 与 Keepalived 高可用、自动化运维工具展开同时覆盖 HTTP 工作机制、DNS 解析、SELinux 与 firewalld 策略、Zabbix 监控、源码编译等常见考点题干多取材于真实生产场景如多台服务器组成 Web 集群时如何按权重调度、如何借助 Ansible、SaltStack、Puppet 高效完成批量部署。资源包共 1 个 pdf 文件约 1.03MB内含单选、多选、判断、填空等 96 道题目难度适中便于按知识点顺序复盘。已有 311 人学习读者可借助它检验配置思路、梳理排错方向系统补齐负载均衡与自动化运维两块短板为顺利通过认证打好基础。1. HCIP-OpenEuler 题库里的 Nginx、LVS 与自动化运维在考什么刷 HCIP-OpenEuler 题库的人常有错觉Nginx 的题就是默写 upstreamLVS 的题就是背 ipvsadm 参数自动化运维的题就是填 Ansible 模块名。做过生产环境的知道这三块是同一条链路的不同层——Nginx 管七层流量和站点配置LVS 管四层入口分发自动化运维负责把前两件事在几十台 openEuler 节点上重复且不出错地执行一遍。题干通常只给一个症状某台后端 502、VIP 不通、批量部署后配置漂移答案却要同时落到配置文件、内核参数和任务编排上。下面按可复现的顺序串起这三条线。2. openEuler 上把 Nginx 反向代理与多站点配置跑通2.1 openEuler 装 Nginx 的两条路径与开机自启联网节点最省事直接走发行版仓库。openEuler 22.03 LTS 的软件源里已经带了 nginx 包版本可能比上游落后一两个小版本但配置路径和 systemd 单元是规整的适合考试环境和内网环境。# 在线安装一次性装好依赖 dnf install -y nginx # 离线场景拷贝 rpm 包后本地安装跳过 GPG 校验仅用于内网可信介质 dnf install -y --nogpgcheck ./nginx-*.rpm ./*.rpm # 或用 ISO 做本地源避免逐个解决依赖 mkdir -p /mnt/iso mount -o loop openEuler-22.03-LTS.iso /mnt/iso cat /etc/yum.repos.d/local.repo EOF [local] namelocal iso baseurlfile:///mnt/iso enabled1 gpgcheck0 EOF dnf clean all dnf makecache dnf install -y nginx第一条命令走的是仓库元数据能自动补齐 pcre、openssl、zlib 这类依赖第二条适合只有 rpm 包的内网--nogpgcheck是为了绕过离线包没有导入公钥的问题正式环境应当导入公钥而不是长期关校验第三条把 ISO 挂成 file:// 源好处是后续装 keepalived、ansible 时不用再折腾依赖。装完确认监听状态并做开机自启systemctl enable --now nginx ss -lntp | grep -E :80|:443 firewall-cmd --permanent --add-port80/tcp --add-port443/tcp firewall-cmd --reloadenable --now一步完成设开机自启与立刻启动比start再enable少一次状态切换。ss -lntp里如果看到0.0.0.0:80才算监听正常只绑定127.0.0.1:80说明配置里被改过 listen 指令。firewalld 那两条在 openEuler 默认开启防火墙时是必需的否则本机 curl 通、外部 curl 不通这是考试环境里最常见的假故障。2.2 nginx.conf 结构拆解与部署多个 web 项目的 server 块Nginx 的主配置分四段全局块、events 块、http 块、以及 http 内的 server 块。真正需要天天改的只有 http 里的内容所以规范做法是主配置保持干净业务站点全部拆到/etc/nginx/conf.d/下按项目建文件include conf.d/*.conf一行负责汇总。# /etc/nginx/nginx.conf 关键片段 user nginx; worker_processes auto; # 按 CPU 核数自动匹配 events { worker_connections 10240; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; include /etc/nginx/conf.d/*.conf; # 业务配置统一入口 }worker_processes auto让 worker 数等于逻辑核数IO 密集场景这条基本不用调worker_connections决定单 worker 并发上限配合ulimit -n一起看才有意义。下面用同一台机器部署两个 web 项目一个走 8081 端口一个走域名区分# /etc/nginx/conf.d/app-order.conf server { listen 8081; server_name _; root /data/www/order; index index.html; access_log /var/log/nginx/order.access.log main; location /api/ { proxy_pass http://127.0.0.1:9001/; # 末尾斜杠会替换掉 /api/ } } # /etc/nginx/conf.d/app-portal.conf server { listen 80; server_name portal.lab.local; root /data/www/portal; # 与 order 共用 80 时靠 server_name 分流 location / { try_files $uri $uri/ /index.html; } }listen与server_name的组合决定请求落到哪个 server端口不同直接分开端口相同则按 Host 头匹配都不匹配时落到第一个 server。proxy_pass末尾带不带斜杠是高频失分点——带斜杠会把 location 匹配到的前缀剥掉再转发不带则原样透传。改完不要直接 reload先让配置自检nginx -t # 语法检查先过这一关 nginx -s reload # 平滑重载老 worker 处理完存量连接再退 curl -I -H Host: portal.lab.local http://127.0.0.1/ curl -s http://127.0.0.1:8081/api/healthnginx -t会同时校验主配置与被 include 的文件报错行号直接指向出错文件。nginx -s reload是平滑的不会断掉正在处理的请求比restart更适合生产。用-H Host: ...造请求头可以在不改 hosts 的情况下验证虚拟主机分流这是排查「域名解析没问题但页面串站」的最快手段。2.3 反向代理 upstream 与自签名证书的参数怎么设单机反向代理只是起点题库和实际场景更关心一组后端怎么分发。upstream 块定义后端池proxy_pass 指向池名upstream web_backend { least_conn; # 连接数最少者优先 server 192.168.1.21:8080 weight3 max_fails2 fail_timeout10s; server 192.168.1.22:8080 weight1; keepalive 32; # 与后端保持长连接 } server { listen 443 ssl; server_name web.lab.local; ssl_certificate /etc/nginx/ssl/web.crt; ssl_certificate_key /etc/nginx/ssl/web.key; ssl_protocols TLSv1.2 TLSv1.3; location / { proxy_pass http://web_backend; proxy_http_version 1.1; proxy_set_header Connection ; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_next_upstream error timeout http_502; proxy_connect_timeout 3s; } }least_conn在请求耗时差异大的服务上比默认轮询更均衡max_fails2 fail_timeout10s表示 10 秒内失败两次就摘除节点10 秒后再试探weight用于新旧机器混布时的流量配比。proxy_set_header Connection 配合proxy_http_version 1.1才能真正复用长连接漏掉这两行keepalive 32等于没写。proxy_next_upstream决定什么情况下换下一台重试http_502加进去能挡住后端进程半死的情况但不要盲目加non_idempotent否则 POST 可能被重复提交。自签名证书在实验环境常用非交互写法能直接脚本化mkdir -p /etc/nginx/ssl openssl req -x509 -nodes -days 825 -newkey rsa:2048 \ -keyout /etc/nginx/ssl/web.key \ -out /etc/nginx/ssl/web.crt \ -subj /CCN/STGuangdong/LShenzhen/OLab/CNweb.lab.local chmod 600 /etc/nginx/ssl/web.key-nodes表示私钥不加密便于 systemd 直接启动-subj一次传完所有交互项适合批量下发CN必须与访问域名一致否则浏览器仍然报证书不匹配。key 权限设 600 是硬要求Nginx 以 nginx 用户运行时读不到会直接启动失败。参数作用常见取值建议worker_processesworker 进程数autokeepalive_timeout客户端长连接保持60~75sproxy_connect_timeout与后端建连超时1~3smax_fails/fail_timeout节点摘除阈值与恢复窗口2 / 10sproxy_next_upstream触发换机重试的条件error timeout http_5023. LVS 三种模式与 ipvsadm 配置 DR 的最小闭环3.1 LVS 转发模式与调度算法怎么选LVS 工作在内核 netfilter 的 INPUT 链之前靠 ip_vs 模块直接改包转发所以吞吐比 Nginx 高一个量级代价是它只看四层信息理解不了 HTTP 头。三种模式差别集中在「回包怎么走」模式请求路径回包路径后端网关要求典型适用NATDirector 改写目的 IP 转发必须回 Director 做源地址转换后端网关指向 Director小规模、跨网段DRDirector 只改目的 MAC 转发后端直接回客户端后端网关指向真实网关大流量、同二层TUN加 IP 隧道封装转发后端直接回客户端后端需支持隧道跨机房DR 模式是考卷和实际部署里的默认答案因为 Director 只处理入向流量出向流量不经过它扩容瓶颈小。调度算法的选择要看业务特征rr轮询适合后端性能一致的静态站点wrr加权轮询用于新旧机器混布lc和wlc按活动连接数分配适合请求耗时差异大的接口服务sh源地址哈希能让同一客户端固定落到同一后端用在有本地会话缓存的服务上但节点增减时会大面积重定向。# 载入 ip_vs 模块并设置连接跟踪表规模 modprobe ip_vs echo options ip_vs conn_tab_bits20 /etc/modprobe.d/ipvs.conf # 查看当前规则与算法 ipvsadm -Ln ipvsadm -Lnc | headconn_tab_bits20把连接哈希表扩到约百万级长连接服务在高并发下如果不调这个值会看到ip_vs丢包计数上涨。ipvsadm -Lnc看的是当前连接表能快速确认请求有没有真正落到后端。3.2 ipvsadm 配置 DR 模式的完整命令序列DR 模式有两个地址概念要分清VIP 是客户端访问的地址只在 Director 和 RealServer 的 lo 接口上出现RIP 是后端真实地址。Director 侧命令# Director绑定 VIP 到网卡并添加虚拟服务 ip addr add 192.168.1.100/24 dev ens33 ipvsadm -A -t 192.168.1.100:80 -s wrr ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.21:80 -g -w 3 ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.22:80 -g -w 1 ipvsadm -Ln --stats-A建虚拟服务-s wrr指定加权轮询-a加后端-g就是 DR 模式的标志-w是权重要与后端实际性能成比例。--stats输出每个后端的连接数和字节数是验证负载是否真的分发出去的依据。每个 RealServer 上必须做两件事否则回包会绕过 Director 直接用自己的 IP 应答客户端看到的地址就不对了# RealServer抑制 ARP 响应 在 lo 上配 VIP cat /etc/sysctl.conf EOF net.ipv4.conf.all.arp_ignore 1 net.ipv4.conf.all.arp_announce 2 net.ipv4.conf.lo.arp_ignore 1 net.ipv4.conf.lo.arp_announce 2 EOF sysctl -p ip addr add 192.168.1.100/32 dev loarp_ignore1表示只回答目标 IP 是本接口地址的 ARP 请求arp_announce2表示对外通告时总是使用最佳本地地址。这两项配合把 VIP 配在 lo 上且掩码写 /32才能让后端拥有 VIP 却不抢 Director 的 ARP 应答。漏掉这步时典型现象是ipvsadm -Ln规则正常但客户端随机连到某台后端后就再也回不到池子里。3.3 LVS 与 Nginx 分层谁在前健康检查放在哪LVS 不做七层健康检查后端进程挂了它照样转发这是它最大的短板。常见做法是分层LVS 在最前面扛四层入口中间一层 Nginx 做七层路由和健康检查最后是应用。这样 LVS 的高吞吐解决入口问题Nginx 的proxy_next_upstream和后端摘除解决故障转移。# 用 keepalived 给 LVS 补健康检查和 VIP 漂移核心是 virtual_server 段 vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 51 priority 100 virtual_ipaddress { 192.168.1.100/24 } } virtual_server 192.168.1.100 80 { delay_loop 6 lb_algo wrr lb_kind DR protocol TCP real_server 192.168.1.21 80 { weight 3 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }delay_loop 6表示每 6 秒探一次TCP_CHECK只探端口存活探不到就把节点权重置零恢复后自动加回。VIP 漂移由 VRRP 完成两台的virtual_router_id必须一致、priority要有高低差否则会双主。验证分三层做ipvsadm -Ln看规则curl -H Host: web.lab.local http://192.168.1.100/看端到端ipvsadm -Ln --stats看连接是否真的落到多个后端。4. Ansible 与 Python 把 Nginx、LVS 的重复操作自动化4.1 inventory 与批量安装 Nginx 的 playbook手工在十台机器上装 Nginx 改配置不出三天配置就会长歪。Ansible 免 agent、走 SSH最适合这种已有 openEuler 节点、不想额外装客户端的场景。先定义清单# /etc/ansible/hosts [webservers] 192.168.1.21 ansible_userroot 192.168.1.22 ansible_userroot [director] 192.168.1.100 ansible_userroot [all:vars] ansible_python_interpreter/usr/bin/python3ansible_python_interpreter在 openEuler 上建议显式指定避免解释器探测走到 python2 导致模块报错。清单建好后先用 ping 模块验证连通性再跑 playbook# install_nginx.yml - name: 部署并启动 Nginx hosts: webservers become: yes tasks: - name: 安装 nginx dnf: name: nginx state: present notify: restart nginx - name: 放行 80/443 firewalld: service: {{ item }} permanent: yes state: enabled loop: - http - https notify: reload firewalld handlers: - name: restart nginx systemd: name: nginx state: restarted enabled: yes - name: reload firewalld systemd: name: firewalld state: reloadeddnf模块是幂等的已装过的节点不会重复执行notify只在任务真正产生变更时触发 handler避免每次跑都重启服务。loop把两个 firewall 服务名循环展开比写两条任务清爽。执行时加-C可以空跑一遍看会改哪些机器这是上生产前的必做动作ansible all -m ping ansible-playbook -C install_nginx.yml ansible-playbook install_nginx.yml ansible webservers -m command -a nginx -v4.2 template 下发配置并在变更后触发 reload把配置直接写死在 playbook 里无法应对不同节点不同权重正确做法是用 Jinja2 模板加变量。模板里保留占位符每个主机在host_vars里给不同的 upstream 权重# templates/upstream.conf.j2 upstream web_backend { least_conn; {% for s in upstream_servers %} server {{ s.ip }}:{{ s.port }} weight{{ s.weight }} max_fails2 fail_timeout10s; {% endfor %} keepalive 32; }# host_vars/192.168.1.21.yml upstream_servers: - { ip: 192.168.1.21, port: 8080, weight: 3 } - { ip: 192.168.1.22, port: 8080, weight: 1 }- name: 下发 upstream 配置 template: src: upstream.conf.j2 dest: /etc/nginx/conf.d/upstream.conf owner: root group: root mode: 0644 validate: nginx -t -c /etc/nginx/nginx.conf notify: reload nginxvalidate是最容易被忽略但最值钱的参数Ansible 会先把文件写到临时路径并用这条命令校验不通过就不覆盖线上文件直接把错误抛出来。配合 handler 里的systemctl reload nginx一次批量变更可以在不中断连接的前提下完成。4.3 Python 写一个 Nginx 与 LVS 状态巡检脚本Ansible 负责变更日常巡检更适合一个短脚本输出能直接进监控。下面这个只依赖标准库在 openEuler 自带的 python3 上直接跑。#!/usr/bin/env python3 # 巡检 Nginx 后端与 LVS 虚拟服务状态异常时返回非零退出码 import subprocess import sys import urllib.request import urllib.error BACKENDS [http://192.168.1.21:8080/health, http://192.168.1.22:8080/health] THRESHOLD 3 # 端口探测超时秒数 def check_http(url: str) - bool: try: # 用 HEAD 请求降低后端压力只关心状态码 req urllib.request.Request(url, methodHEAD) with urllib.request.urlopen(req, timeoutTHRESHOLD) as resp: return resp.status 200 except (urllib.error.URLError, urllib.error.HTTPError): return False def check_ipvs() - str: # -Ln 输出规则--stats 输出连接数合并后交给上层判断 return subprocess.run( [ipvsadm, -Ln, --stats], capture_outputTrue, textTrue, checkFalse ).stdout def main() - int: bad [u for u in BACKENDS if not check_http(u)] for u in bad: print(f[FAIL] backend unreachable: {u}) print(---- ipvsadm ----) print(check_ipvs()) return 1 if bad else 0 if __name__ __main__: sys.exit(main())methodHEAD让后端只返回响应头比 GET 更适合高频探活timeout必须设否则一个僵死后端会拖住整个巡检。checkFalse是为了让 ipvsadm 权限不足时也不抛异常脚本仍能输出可读信息。退出码交给 cron 或监控系统判断0 正常、1 异常配合set -e风格的判断逻辑可以直接联动告警。巡检项命令或接口异常判据Nginx 进程systemctl is-active nginx非 active配置语法nginx -t退出码非 0后端探活HTTP HEAD/health状态码非 200LVS 规则ipvsadm -Ln后端条目缺失连接分布ipvsadm -Ln --stats某后端 Conns 长期为 05. 排错与验证密码恢复、离线安装与流量核对openEuler 忘记 root 密码是最常见的现场问题热词里的rd.break和单用户模式就是两条路。开机进 GRUB 菜单按e编辑启动项在以linux开头那行末尾加rd.breakCtrlX启动后进入 initramfsmount -o remount,rw /sysroot # 以读写方式重挂真实根 chroot /sysroot passwd root # 交互式改密 touch /.autorelabel # 必须否则 SELinux 上下文错乱会拒绝登录 exit rebootrd.break在挂载 pivot root 之前打断此时/sysroot默认只读必须先 remount 成 rw 才能改文件。/.autorelabel触发下次启动重打所有文件标签漏掉这步的表现是改完密码仍然进不去日志里出现 avc denied。如果是配置了 SELinux 且不想全盘重打标签也可以临时在启动参数里加selinux0验证。配置没生效时的排查顺序固定为四步nginx -t看语法、systemctl status nginx看启动状态、journalctl -u nginx -n 50看崩溃原因、tail -f /var/log/nginx/error.log看运行期错误。这四个比反复 reload 有效得多。四层侧的核对靠ipvsadm -Ln --stats重点看两列Conns是否为 0、InActConns是否持续增长。某后端Conns长期为 0说明健康检查把它摘了或者权重被置零InActConns只增不减通常是后端响应慢导致连接堆积。离线环境的坑集中在依赖顺序。银河麒麟、内网 openEuler 上装 Nginx 时缺pcre2、openssl-libs、zlib会报Failed to resolve。做法是先dnf install --downloadonly在联网同版本机器上把依赖拉全再拷进内网做本地源如果连 dnf 都用不了就按rpm -ivh的报错顺序逐个补包最后用rpm -qa | grep nginx和nginx -v双重确认避免出现装了但 PATH 里找不到命令的情况。把ipvsadm -Ln --stats的Conns与InActConns两列加入日常巡检比事后翻 access.log 更早发现后端掉线。本文还有配套的精品资源点击获取