保康 · 共机部署资料

保康智慧餐厅与进销存共机运维手册

整理日期: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/#/loginzhct-nginx、php-fpm
AI API127.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具体程序名
原MySQL83306,/var/lib/mysqlmysqld
智慧餐厅MySQL5.63307,/usr/local/mysql/varmysql
进销存Redis6379,/var/lib/redis,DB10redis
智慧餐厅Redis本机6380,/var/lib/zhct-rediszhct-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、端口监听查网络过滤,不重导数据库
502Nginx日志upstream、ss、curl后端111拒绝连接先查后端未监听;13权限另查SELinux/权限;不一律改密码
portal进程RUNNING但无8670Java启动日志、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地址
图片本机404static.zip结构及目标文件、权限不重导业务库;真实缺图需补文件
root显示LNMP默认页访问端口、默认站点listen本项目4200,默认页仅本机18080
登录应用JSON404response及新异常日志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验收、重启结果、备份恢复路径和负责人。所有未完成事项写进《部署结果》验收表,不以“进程都启动了”结案。