mosparo 1.5.13 配置参数详解

mosparo 1.5.13 配置四层体系(.env/env.mosparo.php/.env.local/项目级)逐项详解:MOSPARO_* 环境变量、数据库 TLS、清理保留期、健康检查白名单实测验证、安全特性默认值与调参路径。

mosparomosparoPHP 编程信息安全NAS 自托管2026/10/28

mosparo 1.5.13 配置参数详解

本文是 mosparo 专栏的配置篇。全部参数取值取自 2026-10-28 实测的 v1.5.13 实例(Debian 12 + Apache + MariaDB,部署过程见《mosparo 1.5.13 安装部署指南》),关键参数均做了"改动 → 清缓存 → 观察行为"的生效验证,验证过程在对应小节给出实测回显。命令行运维见《mosparo 1.5.13 常用 CLI 命令详解》。

一、配置体系:四层来源与优先级

mosparo 基于 Symfony 6.4,配置分散在四个位置,从低到高生效顺序如下(php bin/console debug:dotenv 实测输出的 Scanned Files 节):

Scanned Files (in descending priority)
--------------------------------------

 * ⨯ .env.local.php
 * ⨯ .env.prod.local
 * ⨯ .env.prod
 * ⨯ .env.local
 * ✓ .env

✓ 表示该文件存在并被加载,⨯ 表示不存在。结合实测,四层含义为:

层位置谁写入放什么
1. 发行默认<安装目录>/.env发行包自带全部环境变量默认值,升级不覆盖用户修改
2. 安装配置<安装目录>/config/env.mosparo.php安装向导 / 后台设置页数据库连接、加密密钥、邮件、Webcron 等
3. 手动覆盖<安装目录>/.env.local管理员手动创建覆盖 1、2 层的环境变量,优先级最高
4. 项目级参数数据库 mspr_project 表后台项目设置每个项目的安全/设计/高级参数

注意一个反直觉点:第 2 层(config/env.mosparo.php)在文件优先级上并不高于 .env.local 的同名变量,但数据库连接参数(database_* 键)由 mosparo 专用逻辑读取并拼装 DATABASE_URL,因此改数据库连接要么走后台设置页,要么直接改 env.mosparo.php,只写 .env.local 的 DATABASE_URL 不被安装配置逻辑采纳。手动覆盖系统类变量(如本文第三节那些 MOSPARO_*)用 .env.local 是正确姿势。

改完任何环境变量必须清缓存才生效:

root@mosparo-lab:/var/www/mosparo# php bin/console cache:clear
root@mosparo-lab:/var/www/mosparo#

(实测:命令成功时无输出,直接返回提示符。)

二、安装配置文件 env.mosparo.php 逐项

安装向导完成后生成 config/env.mosparo.php,实测全文(密码脱敏):

<?php

return array (
  'database_system' => 'mysql',
  'database_driver' => 'pdo_mysql',
  'database_host' => '127.0.0.1',
  'database_port' => '3306',
  'database_name' => 'mosparo',
  'database_user' => 'mosparo',
  'database_password' => '****',
  'database_version' => '10.11.19-MariaDB-0+deb12u1',
  'mosparo_name' => 'mosparo-lab',
  'encryption_key' => 'c50c348c21795be18d80ce62bacd3b9ff959d98011ea737eae05175a32ef83c7',
  'secret' => '10e790aa4d66a6afed9407f926851a44f2b4cdac2de15db45dfdfcf4c2c3b356',
  'mosparo_installed' => true,
  'mosparo_installed_version' => '1.5.13',
  'mosparo_initial_version' => '1.5.13',
  'mosparo_assets_version' => 'CmCHCGFBI0g',
);

逐项说明(键名均实测如上):

键语义运维要点
database_system / database_driver数据库类型与 PDO 驱动可选 mysql(pdo_mysql)、postgres(pdo_pgsql)、sqlite(pdo_sqlite)
database_host / database_port连接地址与端口数据库与 mosparo 不同机时改此两项
database_name / database_user / database_password库名与凭据密码明文存放,务必把文件权限锁到 Apache 运行用户可读
database_version安装时探测到的服务端版本mosparo 用它做方言适配,换库/升级数据库后需同步
mosparo_name实例显示名后台页面标题、邮件模板引用
encryption_key提交数据加密密钥加密存储的提交数据靠它解密;丢失后历史提交不可读。备份必须包含本文件
secretSymfony 应用密钥签名/CSRF 相关;泄露需连同会话作废处理
mosparo_installed / mosparo_installed_version / mosparo_initial_version安装状态与版本轨迹mosparo:health、升级器判断依据
mosparo_assets_version前端资源版本指纹静态资源缓存刷新用,无需手改

后台「Administration → Settings」修改邮件、代理等设置后,同样写入本文件,不改 .env。

三、环境变量逐项(.env 层)

以下清单取自 php bin/console debug:dotenv 实测输出的 Variables 节(值列 = 发行包默认值),按功能分组解读:

3.1 数据保留与清理(核心生产参数)

变量默认语义
MOSPARO_SUBMISSION_RETENTION_PERIOD14提交数据保留天数,到期由清理任务删除。官方 README 声称"14 天后删除所有数据"即由此实现
MOSPARO_SUBMIT_TOKEN_RETENTION_PERIOD24提交令牌(submit token)保留小时数。令牌是前端领取的"提交资格",过期未用即清
MOSPARO_CLEANUP_GRACE_PERIOD_ENABLED0清缓宽限开关。开 1 后,到期数据不立即删,给统计页面一个缓冲期
MOSPARO_CLEANUP_PROCESS_INTERVAL6清理任务处理间隔(分钟)
MOSPARO_CLEANUP_UNFINISHED_INTERVAL10未完成提交(领了令牌没提交)的清理间隔(分钟)

清理任务靠计划任务驱动(后台 Webcron 或系统 crontab 调 CLI),不配置计划任务这些参数不会生效,见《mosparo 1.5.13 常用 CLI 命令详解》计划任务一节。

3.2 健康检查(实测验证)

变量默认语义
MOSPARO_HEALTH_ALLOW_LIST127.0.0.1,::1允许访问 /api/v1/health/check 的 IP 白名单,逗号分隔
MOSPARO_BYPASS_HEALTH_CHECK0置 1 可绕过部分健康检查逻辑(如无项目时的告警),一般不动

生效验证实录(2026-10-28 实测):默认白名单下,从另一台内网机器(10.89.67.1)访问健康端点,得到的不是 403 而是 404——mosparo 对白名单外来源直接隐藏端点存在性:

monitor@10.89.67.1:~$ curl -s -m 5 -w '\nHTTP %{http_code}\n' http://10.89.67.2/api/v1/health/check

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
...
        <title>Not found - mosparo-lab</title>
...
HTTP 404

在服务器上创建 .env.local 把监控机加入白名单并清缓存:

root@mosparo-lab:~# cd /var/www/mosparo
root@mosparo-lab:/var/www/mosparo# printf 'MOSPARO_HEALTH_ALLOW_LIST=127.0.0.1,::1,10.89.67.1\n' > .env.local
root@mosparo-lab:/var/www/mosparo# php bin/console cache:clear

再从同一台监控机访问,实测立刻放行:

monitor@10.89.67.1:~$ curl -s -m 8 -w '\nHTTP %{http_code}\n' http://10.89.67.2/api/v1/health/check
{"service":"mosparo","healthy":true,"databaseStatus":"connected","error":null,"statusCode":200}
HTTP 200

结论:MOSPARO_HEALTH_ALLOW_LIST 走 .env.local + cache:clear 链路即刻生效,无需重启服务;监控接入时别忘把监控机 IP 加进来,否则会被 404 迷惑。

3.3 更新检查

变量默认语义
MOSPARO_UPDATES_ENABLED1允许在后台执行在线更新(mosparo:self-update 的 UI 侧开关)
MOSPARO_AUTOMATIC_UPDATE_CHECK_ENABLED1后台自动检查新版本(只检查提示,不自动升级)

3.4 规则包

变量默认语义
MOSPARO_RULE_PACKAGE_MINIMUM_REFRESH_INTERVAL3600规则包最小刷新间隔(秒),后台配更短也按此兜底
MOSPARO_RULE_PACKAGE_ALLOW_REDIRECTS0拉取规则包是否跟随 HTTP 重定向
MOSPARO_RULE_PACKAGE_ALLOW_PRIVATE_NETWORKS0是否允许规则包 URL 指向私网地址(自建规则源需置 1,否则会被 SSRF 防护拦截)
MOSPARO_RULE_ITEMS_CACHE_TTL3600规则条目缓存 TTL(秒),影响规则匹配的查库频率
MOSPARO_USE_SHARED_CACHE_FOR_RULE_ITEMS0多实例部署时规则条目缓存改用共享缓存(配合 Redis/Memcached)

3.5 缓存与锁

变量默认语义
MOSPARO_CACHE_ADAPTER空缓存适配器;留空用文件系统缓存,可切 Redis/Memcached
REDIS_URLredis://localhostRedis 连接地址(切 Redis 缓存时用)
MEMCACHED_URLmemcached://localhostMemcached 连接地址
FILESYSTEM_CACHE_PATH空文件缓存目录,空则用默认 var/cache
LOCK_DSNflock锁实现;单机 flock 够用,多实例换 semaphore 或基于 Redis 的 DSN
MOSPARO_PREPARE_CSS_FILES_IN_SHARED_CACHE0多实例下把 CSS 预处理产物放共享缓存

3.6 数据库 TLS(MySQL 专用)

变量默认语义
DATABASE_MYSQL_SSL0数据库连接启用 TLS
DATABASE_MYSQL_SSL_CA空CA 证书路径
DATABASE_MYSQL_SSL_CERT / DATABASE_MYSQL_SSL_KEY空客户端证书/私钥(双向 TLS 才需要)
DATABASE_MYSQL_SSL_VERIFY_SERVER_CERT0是否校验服务端证书

3.7 框架级

变量默认语义
APP_ENVprod运行环境,发行包已预设 prod,不要改成 dev 上生产
APP_SECRETsecret发行包占位值;安装向导已在 env.mosparo.php 写入随机 secret 覆盖它
TRUSTED_PROXIES%default_trusted_proxies%反向代理场景声明可信代理 IP 段,否则 mosparo 记录到的客户端 IP 全是代理 IP,频率/锁定类防护会误伤
MOSPARO_ENV_SUFFIX空同机多实例时给环境配置文件加后缀(如 env.mosparo.db1.php)
MOSPARO_CONFIG_FILE_PATH空自定义 env.mosparo.php 的存放路径(如放到安装目录外统一管理)

四、Webcron 相关配置键

后台「Administration → Cron jobs」配置的值同样落在 config/env.mosparo.php,相关键(自源码与实测确认):

键语义
webCronJobActive是否启用 Web Cron(默认未写入,即禁用)
webCronJobSecretKeyWeb Cron 调用密钥
webCronJobInterval执行间隔(分钟,默认 10)
web_cron_job_access_ip_allow_list允许调用 Web Cron 端点的 IP 白名单

实测:未启用时访问 Web Cron 端点被拒:

root@mosparo-lab:~# curl -s http://localhost/cron-jobs/execute
400 Bad Request

运维建议:Web Cron 依赖"有人来访问"才触发,裸机生产更稳的做法是系统 crontab 直接调 CLI(每 5 分钟跑 mosparo:cleanup-database),命令与实测回显见《mosparo 1.5.13 常用 CLI 命令详解》。

五、项目级参数(后台 / 数据库层)

mosparo 以项目(Project)为防护单元,每个项目独立一套参数。以下默认值取自实测执行 php bin/console mosparo:export 1 导出的 JSON(项目刚按向导默认创建,未做任何人工调整):

5.1 通用与高级

参数默认语义
spamScore5垃圾分阈值:各规则命中累计分数 ≥ 该值判为垃圾
hosts[]允许挂载该项目验证框的业务站点来源;生产必须填,否则任意站点可消耗你的资源
statisticStorageLimitFOREVER统计数据保留时长
silentModeEnabledfalse静默模式:垃圾提交不返回原因,增加机器方试探成本
spamDataReturnedfalse验证响应是否附带垃圾详情
metadataAllowed / metadataReturnedfalse是否允许/返回浏览器元数据
apiDebugModefalseAPI 调试模式(响应带详细信息),生产关闭
verificationSimulationModefalse验证模拟模式:只验证不落库,测试环境用

5.2 安全特性默认值

参数默认语义
minimumTimeActive / minimumTimeSecondstrue / 10表单展示到提交不足 10 秒判机器
honeypotFieldActivetrue蜜罐字段开启
delayActivetrue延迟机制:delayNumberOfRequests=30 次 / delayDetectionTimeFrame=30 秒 触发,初始 delayTime=60 秒,delayMultiplicator=1.5 递增
lockoutActivetrue锁定机制:60 秒内 60 次触发,锁 300 秒,倍率 1.2
proofOfWorkActive / proofOfWorkComplexitytrue / 5前端工作量证明,复杂度 5(动态上限 7,基于 IP,300 秒窗口 30 次后升档)
equalSubmissionsActivetrue300 秒窗口内 3 次相同提交判垃圾(基于 IP)
ipAllowList空项目级 IP 白名单,填入的 IP 跳过检测

调参经验:这些默认值对普通联系表单够用;minimumTimeSeconds 若误伤快速填写者可降到 5;延迟/锁定的触发阈值按业务峰值流量调整,别把正常秒杀活动用户锁掉。

六、配置变更的操作路径速查

要改什么在哪改生效动作
数据库连接后台设置页或直接编辑 config/env.mosparo.php清缓存(cache:clear)
系统环境变量新建/编辑 .env.local清缓存
项目安全/设计/高级参数后台项目设置页立即生效(写库)
规则包源后台项目 → Rule packages刷新后生效
Webcron后台 Administration → Cron jobs写入 env.mosparo.php

七、参考