保康智慧餐厅与进销存共机运维手册
整理日期:2026年10月16日。用于192.168.1.211当前双Nginx、双MySQL、双Redis布局。服务名与路径来自本次隔离记录;执行前先核对现场,不能套用到食安192.168.5.45。
一 使用原则
Windows PowerShell负责ssh、scp、Test-NetConnection、curl.exe。登录后出现[root@localhost ...]#才执行systemctl、iptables等Linux命令。口令不发聊天、不写普通文档;环境凭据文件仅在root本地使用。不要运行lnmp start/stop/restart、killall nginx、重跑原环境安装器、iptables -F;这些会跨系统影响共享资源。
本手册的只读检查可以按顺序执行。安装、重启、修改和恢复命令须在确定故障归属、备份及维护窗口后执行。不要用服务active代替业务成功。
二 入口与服务对应
| 系统或依赖 | 地址 | 管理命令对象 |
|---|---|---|
| 智慧餐厅登录 | http://192.168.1.211:4200/dist/#/login | zhct-nginx、php-fpm |
| AI API | 127.0.0.1:81,主站/aizhct/代理 | zhct-nginx、php-fpm7.4 |
| AI前端 | http://192.168.1.211:4200/store/,最终待验 | 静态文件及AI接口 |
| 进销存商户前端 | http://192.168.1.211:8000/ | nginx |
| 进销存供应商端 | http://192.168.1.211:9000/ | nginx |
| portal/merchant/admin | 本机8670/8682/8600,现场监听待验 | Supervisor具体程序名 |
| 原MySQL8 | 3306,/var/lib/mysql | mysqld |
| 智慧餐厅MySQL5.6 | 3307,/usr/local/mysql/var | mysql |
| 进销存Redis | 6379,/var/lib/redis,DB10 | redis |
| 智慧餐厅Redis | 本机6380,/var/lib/zhct-redis | zhct-redis |
| LNMP默认页 | 仅127.0.0.1:18080 | 不作为业务入口 |
服务名mysql与mysqld不可混淆。Redis程序同源不代表数据实例相同;端口、配置、数据目录和认证都要区分。
三 日常健康检查
服务器执行:
date
uptime
ip -br addr
findmnt -T /workspace
df -h / /home /workspace
systemctl --failed --no-pager
systemctl is-active nginx zhct-nginx mysqld mysql redis zhct-redis php-fpm php-fpm7.4 supervisor
systemctl is-enabled nginx zhct-nginx mysqld mysql redis zhct-redis php-fpm php-fpm7.4 supervisor
ss -lntp | grep -E ':(4200|8000|9000|81|3306|3307|6379|6380|8670|8682|8600)[[:space:]]'
curl -I --connect-timeout 3 --max-time 10 http://127.0.0.1:4200/dist/
curl -I --connect-timeout 3 --max-time 10 http://127.0.0.1:8000/
AI根路径404不一定故障,要使用应用实际存在的接口。网页200只证明静态入口,继续从电脑分别登录两套、打开关键业务、查图片、验证API及后台任务。
Windows PowerShell执行:
Test-NetConnection 192.168.1.211 -Port 4200
Test-NetConnection 192.168.1.211 -Port 8000
curl.exe --noproxy "*" -I --connect-timeout 5 --max-time 10 http://192.168.1.211:4200/dist/
四 按归属启动停止和重载
先systemctl status及ss检查,避免手工重复启动实例。正常使用systemd,不混用裸程序启动和服务管理。
# 我们的Nginx:改配置先检查,成功才重载
/usr/local/nginx/sbin/nginx -t && systemctl reload zhct-nginx
# 进销存Nginx
/usr/sbin/nginx -t && systemctl reload nginx
# 以下仅在需要且确认归属后执行;不是一次性全量重启脚本
systemctl start zhct-nginx
systemctl start nginx
systemctl start mysql
systemctl start mysqld
systemctl start zhct-redis
systemctl start redis
systemctl start php-fpm php-fpm7.4
进销存Java状态及单程序重启:
/usr/local/python3.9/bin/supervisorctl -c /etc/supervisor/supervisord.conf status
# 修改依赖并验证后,维护窗口内重启两个对应程序
/usr/local/python3.9/bin/supervisorctl -c /etc/supervisor/supervisord.conf restart hcgj-portal-1 hcgj-merchant-1
hcgj-admin是另一个已出现的程序,按业务需要单独处理,不用restart all。必须检查Supervisor实际使用的配置、程序autostart和应用监听。Java启动需要等待依赖或提供重试;配置autostart不代表其启动成功。
五 开机配置与重启验收
在已验证服务路径正确后,对需要自动启动的现有服务设置enable。不要以enable自动等同start。
systemctl enable nginx zhct-nginx mysqld mysql redis zhct-redis php-fpm php-fpm7.4 supervisor
检查zhct-nginx和需要/workspace的任务/日志服务的挂载依赖;建议为对应服务设置RequiresMountsFor=/workspace,并明确After关系。必须先读取systemctl cat和实际挂载,不把相同drop-in盲目加到所有服务。Supervisor中包含对方程序,修改全局排序需共同确认。
重启前:保存防火墙规则、确认备份、记录服务和端口、两套负责人约定验证窗口。重启后先检查启动失败项及挂载,再查两套入口、数据库/Redis认证、Supervisor端口,最后做远程电脑业务验证。未验收不能因enabled就宣称“重启没问题”。
六 防火墙导致网页超时
本次确定的故障模式:INPUT有SSH允许和末尾REJECT,iptables active,firewalld inactive。通过iptables管理其iptables-nft规则,不同时直接修改nft生成的同一表。
iptables -nvL INPUT --line-numbers
iptables-save
systemctl is-active iptables firewalld nftables
仅当仍是上述策略、访问网段仍为192.168.1.0/24、并确认业务端口后,可使用下面定向放行。没有在该网段的终端需按批准的源网段另加规则,不开放数据库或Redis给所有终端。
iptables-save > /root/iptables-before-web-fix.rules
iptables -C INPUT -s 192.168.1.0/24 -p tcp -m multiport --dports 4200,8000,9000 -j ACCEPT || iptables -I INPUT 4 -s 192.168.1.0/24 -p tcp -m multiport --dports 4200,8000,9000 -j ACCEPT
iptables -nvL INPUT --line-numbers
序号4来自本次已验证规则布局;现场规则改变时先确定插入位置,必须在拒绝之前。外部访问通过后保存:
# 文件应已存在;不存在则先查iptables服务实际加载位置
cp -p /etc/sysconfig/iptables /root/iptables-persistent-before-web-fix
# 只有备份成功且确认该文件为加载源后,才执行
iptables-save > /etc/sysconfig/iptables
systemctl enable iptables
回滚使用本次备份前先看差异,避免抹掉期间新增的其他规则;不要盲目restore旧规则。最后一次对话没有提供放行成功证据,首次运维先核验。
七 故障定位表
| 现象 | 检查 | 处置边界 |
|---|---|---|
| SSH也不能连 | IP、网卡、控制台、路由、22 | 先恢复网络,不重装业务 |
| 本机4200为200,电脑超时 | TCP测试、iptables、端口监听 | 查网络过滤,不重导数据库 |
| 502 | Nginx日志upstream、ss、curl后端 | 111拒绝连接先查后端未监听;13权限另查SELinux/权限;不一律改密码 |
| portal进程RUNNING但无8670 | Java启动日志、Redis/MySQL认证 | 不重复java -jar启动;用原Supervisor程序管理 |
| MySQL1045 | 实际host/port/实例/账号和配置口令 | 不因错误重置对方root;确认是3306还是3307 |
| Redis NOAUTH/invalid password | 端口、认证配置、使用DB | 不取消认证,不改另一实例密码 |
| 图片127.0.0.1或IIS404 | 图片完整URL、ossHost、文件路径 | 浏览器127指用户电脑;改资源入口,不全局替换Redis地址 |
| 图片本机404 | static.zip结构及目标文件、权限 | 不重导业务库;真实缺图需补文件 |
| root显示LNMP默认页 | 访问端口、默认站点listen | 本项目4200,默认页仅本机18080 |
| 登录应用JSON404 | response及新异常日志 | HTTP404可能包装数据库异常,不直接归因Nginx |
日志按当前日期读取,避免一直看20261014旧错误:
tail -n 60 /var/log/zhct-php73/error.log
tail -n 30 /workspace/wwwroot/log/zhct_bkzx/$(date +%Y%m%d)_exception.log
journalctl -u zhct-nginx -u mysql -u mysqld -u redis -u zhct-redis -b -n 100 --no-pager
tail -n 60 /var/log/nginx/error.log
find /home/hcgj/hcgj-portal-1/logs /home/hcgj/hcgj-merchant-1/logs -type f -printf '%T@ %p\n' | sort -nr | head -10
截图或日志需遮住密码、令牌、个人信息。前厅异常通知队列本身出错可能掩盖原异常,要结合PHP和应用两处日志。
八 配置核对清单
前厅env.php:prod/zhct_bkzx;database.php主库和ai_zhct均显式hostport3307,食安独立hostport3306不动。config.php的redis为127.0.0.1:6380,口令匹配;网站/微信地址单独调整4200。
AI env.php:prod/aizhct_bkzx。实际.env.prodaizhct_bkzx中DATABASE、DATABASE_ZHCT均HOSTPORT3307;REDIS为127.0.0.1、HOSTPORT6380、密码匹配。USER_API、回调和ai_store BASE_API需指向已验证的网站/代理入口。不要因为目录叫local就切换商户标识。
ydy_config.ossHost应使用http://192.168.1.211:4200或批准域名;OSS开关及外部资源模式按实际方案确认。只查询所需配置键,避免dump所有凭据。
进销存原配置在JAR内local profile,提取副本/root/hcgj-recovery/portal-local.yml只用于核对,编辑该副本不会改变JAR运行配置。redis/redis2密码需匹配6379;原密码在服务器本地核对,不发聊天。
九 备份与恢复
历史MySQL8备份:/home/workspace/mysql8-recovery-20261014-190015。历史Redis备份:/home/workspace/redis-recovery-20261014-192908。这两份恢复材料含数据库和密钥,只允许受控访问,不打包进本次文档。
同一服务器备份只能防误操作,不能抵御整机或磁盘故障;另做加密异机备份、留存周期和恢复演练。
MySQL5.6在线逻辑备份示例(先确认目标3307及磁盘空间):
# Bash;pipefail确保mysqldump失败不会因gzip成功而误判
set -o pipefail
DB_DUMP="/home/workspace/zhct-backups/$(date +%Y%m%d-%H%M%S)"
install -d -m 0700 "$DB_DUMP"
/usr/local/mysql/bin/mysqldump --defaults-extra-file=/opt/laidisen-env/secrets/mysql-root.cnf --protocol=TCP -h 127.0.0.1 -P 3307 --single-transaction --routines --events --triggers --databases zhct_bkzx aizhct_bkzx | gzip > "$DB_DUMP/zhct-mysql56.sql.gz"
# 先确认上一条成功,再做压缩包测试和哈希;压缩完整不等于SQL恢复成功
gzip -t "$DB_DUMP/zhct-mysql56.sql.gz"
sha256sum "$DB_DUMP/zhct-mysql56.sql.gz"
single-transaction只保证事务表一致性;含MyISAM或备份期间DDL需要另外冻结/锁定策略。MySQL8必须用8.0兼容工具和原授权账户,不使用5.6 mysqldump去备份8.0。不要把密码放在-p明文参数中。
Redis备份使用已验证RDB/AOF流程或停对应实例后复制;每个实例备份标明版本、port、dir、认证归属。不能把正在重写的AOF随手复制成“完整备份”。6380空实例启用前的旧队列仍待核对,不FLUSHALL,不跨实例直接搬整个目录。
恢复前核对备份版本和业务时间点、保留当前新增数据、停目标实例、验证目标路径,先恢复到隔离环境测试。绝不以本次252MB目录快照覆盖运行中的MySQL8。
十 下一次部署的运维交接
先完成《部署过程》第三节六道门禁。交接必须包含:服务/端口/目录清单、所有is-enabled回读、安装包SHA256和源码提交、SQL迁移记录、两系统登录及关键业务证据、图片/AI/队列/Cron验收、重启结果、备份恢复路径和负责人。所有未完成事项写进《部署结果》验收表,不以“进程都启动了”结案。