LimeSurvey 配置参数详解

LimeSurvey 7.7 配置参数详解:config.php/config-defaults.php/security.php/email.php 分层覆盖体系、数据库与 URL 路由参数、212 项默认值分组精讲、Docker 环境变量全表与会话/主题/插件实务,全部实测摘录。

LimeSurveyLimeSurvey问卷调查2026/10/28

LimeSurvey 配置参数详解

版本基线:LimeSurvey Community Edition 7.7.0(martialblog/limesurvey:7.7.0-261020-apache,2026-10-27 构建),参数均从该版本实际文件摘录 实测环境:按 《LimeSurvey 7.7 Docker Compose 部署实战》 完成部署的 7.7 实例,应用根目录 /var/www/html 读者前置:已完成部署安装;涉及数据库/URL/安全等运维主题

一、配置体系总览

LimeSurvey 的配置是「PHP 数组分层覆盖」体系:全部可调参数都有内置默认值,站点级覆盖写在 config.php,密钥类写在 security.php,邮件默认值单独放在 email.php。7.7.0 版本实际文件的布局如下(实测 application/config/ 目录清单):

文件角色是否可直接修改
config-defaults.php全量默认值(实测 884 行、约 212 个 $config 参数),升级时会被覆盖❌ 严禁直接编辑
config.php站点覆盖文件:数据库连接、URL 路由、站点级参数✅ 唯一的常规改动入口
security.php应用加密密钥(数据加密、令牌加密的根密钥)⚠️ 自动生成;一旦生成严禁更换
email.php邮件默认值(SMTP 参数组)⚠️ 只读参考,覆盖写进 config.php
ldap.php / tcpdf.php / routes.php / vendor.phpLDAP、PDF、路由、composer 依赖清单等专题配置按需
config-sample-*.phpmssql/sqlsrv/dblib/pgsql/mysql 五种数据库连接示例模板
version.php / updater_version.php版本号声明❌

覆盖规则写在 config-defaults.php 文件头(实测原文):copy the lines corresponding to the parameter you want to change from this file to the config.php file——要改哪个参数,就把那一行拷贝到 config.php 的 config 数组里改值,config.php 中的同名键优先生效,未覆盖的参数回落到默认值。邮件参数同理:把 email.php 中的行拷到 config.php 覆盖。

💡 技术拓展:这类「defaults 文件 + 站点覆盖文件」是 PHP 应用的经典配置分层,WordPress(wp-config.php)、Drupal(settings.php)、Nextcloud(config/config.php)同属此列。优点是升级不丢配置、默认值有单一事实源;代价是改参数必须理解「覆盖发生在哪一层」——在 config-defaults.php 里直接改,升级即失效,这是最常见的误操作。

二、config.php 结构解剖

config.php 返回一个两层 PHP 数组:components(框架组件配置:数据库/路由/会话)与 config(应用级参数)。以下是本文实测实例(Docker 静默安装由镜像 entrypoint 生成)的完整内容:

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
return array(
  'components' => array(
    'db' => array(
      'connectionString' => 'mysql:host=db;port=3306;dbname=limesurvey;',
      'emulatePrepare' => true,
      'username' => 'limesurvey',
      'password' => 'q1w2e3r4',
      'charset' => 'utf8mb4',
      'tablePrefix' => 'lime_',
    ),
    //'session' => array (
    //   'class' => 'application.core.web.DbHttpSession',
    //   'connectionID' => 'db',
    //   'sessionTableName' => '{{sessions}}',
    //),
    'urlManager' => array(
      'urlFormat' => 'path',
      'rules' => array(),
      'showScriptName' => true,
    ),
  ),
  'config'=>array(
    'publicurl'=>'',
    'debug'=>0,
    'debugsql'=>0,
    'mysqlEngine' => 'InnoDB',
  )
);

而走 Web 图形向导安装的第二实例生成的 config.php(实测)结构相同,但有两点差异:向导版保留了 Yii 标准注释头(数据库连接说明),且会话段生成随机 sessionName:

 'session' => array (
    'sessionName'=>'LS-ZPPJOIUAZOPENULW',
    // Uncomment the following lines if you need table-based sessions.
    // Note: Table-based sessions are currently not supported on MSSQL server.
    // 'class' => 'application.core.web.DbHttpSession',
    // 'connectionID' => 'db',

sessionName 前缀 LS- + 随机串用于多实例同域名下会话隔离;两份文件可直接对照出「自动化生成」与「向导生成」的差别。

三、数据库参数(components.db)

参数实测值说明
connectionStringmysql:host=db;port=3306;dbname=limesurvey;PDO DSN。驱动类型可选 mysql/pgsql/mssql(MSSQL 另有 dblib/sqlsrv 变体,见 config-sample-*.php);官方安装手册对数据库的最低版本要求:MariaDB 10.3.38+ 或 MySQL 8+ 或 PostgreSQL 14+
emulatePreparetruePDO 模拟预处理,MySQL 驱动下官方示例固定开启
username / passwordlimesurvey / q1w2e3r4数据库账号。官方手册建议的最小权限集:SELECT/CREATE/INSERT/UPDATE/DELETE/ALTER/DROP/INDEX
charsetutf8mb4MySQL 系用 utf8mb4(完整四字节 Unicode),PostgreSQL 用 utf8
tablePrefixlime_表前缀。多实例共用一个库时用前缀隔离

配套的表引擎由 config 层的 mysqlEngine 决定:

  • 默认 MyISAM(历史默认值);
  • 本文实例设为 InnoDB(事务、行锁、崩溃恢复)。官方文件对该开关有一句历史性警告:MyISAM 的表行数上限更高,「Using InnoDB instead of MyISAM will reduce the possible maximum number of questions in your surveys」(InnoDB 下单问卷可建题数会变少)——超大规模题库场景才需要权衡,一般部署选 InnoDB。

数据库连接类的排障手段:临时把 config.php 的 debug 设为 2(见第五章)后访问站点,PDO 连接异常会以完整堆栈展示;生产定位完务必改回 0。

四、URL 与路由参数(components.urlManager)

参数实测值说明
urlFormatpath7.x 只支持 path。官方安装手册原文:The URL format must be set to path (URLs like index.php/admin)。旧的 get 格式(index.php?r=admin)在 7.x 已不被支持。安装器与镜像 entrypoint 都会自动写 path;只有复用旧版 config.php 时需要人工检查
showScriptNametrueURL 中保留 index.php 前缀;配合 Web 服务器 rewrite 规则可隐藏入口脚本(隐藏后仍需保证 path 路由)
rulesarray()自定义路由规则表,一般留空
publicurl(config 层)''受访者侧公开 URL。默认值逻辑(实测 config-defaults):Web 上下文取 Yii::app()->baseUrl . '/',CLI 上下文取 /。反向代理/内外网域名分离场景才需要显式指定
homeurlpublicurl . 'admin'管理后台地址,随 publicurl 派生

反向代理场景(Docker 镜像的对应环境变量为 BASE_URL/HOST_INFO/PUBLIC_URL)会在 components 里额外生成 request 段(baseUrl + hostInfo),用于代理终止 TLS 或路径前缀转发时修正生成的链接。新实例登录后台后如果跳转域名不对,优先检查这三个值与代理的 X-Forwarded-* 头。

五、全局核心参数(config 层常用覆盖项)

以下参数全部实测摘录自 7.7.0 的 config-defaults.php(行号对应实际文件),按运维主题分组:

站点与展示

参数默认值说明
sitename'LimeSurvey'站点名称(窗口标题)
defaultlang'en'缺省语言,可取值对应 /locale 目录(如 zh-Hans)
displayTimezone''展示时区(如 Asia/Shanghai),空则 UTC
defaulttheme'fruity_twentythree'问卷公开列表默认主题
defaultfixedtheme'vanilla'默认主题缺失时的兜底主题(核心主题的父级)
memory_limit'256'应用内存上限(MB),PDF 导出场景官方建议提到 512
max_execution_time1200PHP 最大执行时间(秒)

安全与登录

参数默认值说明
maxLoginAttempt3管理员连续错密码次数上限
timeOutTime60 * 10触发锁定后的封禁时长(秒,默认 10 分钟)
maxLoginAttemptParticipants / timeOutParticipants3 / 60 * 10受访者令牌侧的同款锁定策略
force_ssl'off'强制 HTTPS。on 后若证书不可用站点直接不可访问,官方注释反复强调「DO NOT turn on unless you are sure」
ssl_emergency_overridefalseSSL 锁死时的紧急逃生开关(置 true 强制关 SSL,修完即回 false)
x_frame_options'sameorigin'iframe 嵌入策略;deny 不受支持(会破坏主题编辑器预览与文件上传)
passwordValidationRulesmin:8, upper:1, numeric:1密码策略数组(min/max/小写/大写/数字/符号各维度计数)
iSessionExpirationTime7200会话过期秒数(默认 2 小时)

调试与升级

参数默认值说明
debug00 关闭;1 显示错误;2 追加 PHP STRICT 与 SQL 日志。排障利器,用完即关
debugsql0SQL 日志开关,仅 debug=2 时生效
updatecheckperiod7联网检查新版本的天数间隔,0 为关闭
minimum_update_stability'rc'升级通知的稳定性门槛(alpha/beta/rc/stable)
hide_update_keyfalse隐藏 ComfortUpdate 升级密钥中段显示
showserverconfigurationchecktrue数据完整性检查页是否显示 PHP 配置体检

令牌与参与者黑名单

参数默认值说明
blacklistallsurveys / blacklistnewsurveys'N'全局拉黑后是否波及现有/未来问卷
blockaddingtosurveys'Y'被拉黑者不得加入新问卷
allowunblacklist'N'是否允许自解除拉黑

上传与附件白名单(主题/资源/插件三组)

参数默认值说明
allowedthemeimageformatsgif,ico,jpg,jpeg,png主题图片格式白名单(SVG 因 XSS 风险默认排除)
allowedthemeuploadscss,js,map,json,...,lss,lsa,lsq,lsg主题编辑器可上传的其余类型
allowedresourcesuploads7z,...,zip,css,js问卷资源与 HTML 编辑器的附件类型白名单
allowedpluginuploadsgif,...,php,html,po,mo,xsd,lss,...插件 ZIP 内容类型白名单

插件管控

参数默认值说明
usePluginWhitelistfalse开启后非白名单插件不可安装/加载
pluginWhitelist[]白名单数组(核心插件隐式放行)
corePluginBlacklist[]核心插件排除项
disablePluginUploadfalse关闭后台上传插件入口(安全收敛手段)

六、security.php:应用加密密钥

security.php 存放 LimeSurvey 数据加密体系的根密钥,7.7.0 实际文件包含五个键(默认值形态见 config-defaults):

$config['encryptionkeypair'] = '';
$config['encryptionpublickey'] = '';
$config['encryptionsecretkey'] = '';
$config['encryptionnonce'] = '';
$config['encryptionsecretboxkey'] = '';

应用首次运行时自动生成实际密钥并写入该文件(本文实例自动生成后含 encryptionnonce 与 encryptionsecretboxkey 等项)。文件头部的警告必须原文照录:

WARNING!!!
ONCE SET, ENCRYPTION KEYS SHOULD NEVER BE CHANGED, OTHERWISE ALL ENCRYPTED DATA COULD BE LOST !!!

即密钥一旦生成严禁更换:问卷令牌、SMTP 密码等加密字段的解密都系于这套密钥,丢失/更换等于密文报废。运维要求:

  1. security.php 必须纳入备份(与数据库成对,见运维实战篇);
  2. 容器形态下该文件默认落在可写层——重建容器前先拷出,或用镜像的 ENCRYPT_* 环境变量在首次启动时注入固定密钥(支持 ENCRYPT_KEYPAIR/ENCRYPT_PUBLIC_KEY/ENCRYPT_SECRET_KEY/ENCRYPT_NONCE/ENCRYPT_SECRET_BOX_KEY,且均提供 _FILE 形态从文件注入);
  3. 未提供密钥时 entrypoint 会打印三行 Warning 并交由应用自建,属预期行为。

七、Docker 形态的环境变量覆盖

容器形态下,config.php 不必手写——镜像 entrypoint 在首启时用环境变量拼装生成。7.7.0 镜像 README 与 entrypoint.sh 实测对照的完整变量表:

变量默认值作用
DB_TYPEmysql数据库类型(mysql/pgsql)
DB_HOSTmysql数据库主机(compose 服务名)
DB_PORT3306数据库端口
DB_SOCK(空)Unix socket 路径(设置了则替代 host/port 连接)
DB_NAMElimesurvey库名
DB_TABLE_PREFIXlime_表前缀(值中的空白会被剥除)
DB_USERNAME / DB_PASSWORDlimesurvey / (必填)连接账号;DB_PASSWORD 缺失时 entrypoint 直接报错退出
DB_CHARSETmysql→utf8mb4 / pgsql→utf8连接字符集
DB_MYSQL_ENGINEMyISAM表引擎(写入 mysqlEngine)
ADMIN_USER / ADMIN_NAME / ADMIN_EMAIL / ADMIN_PASSWORDadmin/admin/foobar@example.com/(必填)仅首次静默安装生效;装后修改无效(镜像 README 原文提示)
BASE_URL / HOST_INFO / PUBLIC_URL(空)反代场景的 request 修正与公开 URL
URL_FORMATpath写入 urlManager.urlFormat
SHOW_SCRIPT_NAMEtrue写入 urlManager.showScriptName
TABLE_SESSION(空)非空则把 config.php 中被注释的 DbHttpSession 段整体取消注释(会话入库)
DEBUG / DEBUG_SQL0 / 0写入 debug / debugsql
LISTEN_PORT8080Apache 监听端口(rootless 形态默认 8080)
ENCRYPT_* 五项(空)注入加密密钥生成 security.php(支持 _FILE 文件注入)

所有「普通值」变量都有对应的 <VAR>_FILE 文件注入形态(entrypoint 的 file_env 函数实现):同时给值与文件会报 exclusive 错误退出——密钥类变量建议统一走 _FILE。

环境变量与 config.php 的关系是「首启生成、此后不回写」:entrypoint 只在 config.php 不存在时生成;改环境变量后想让配置生效,需要删除容器内已生成的 config.php(或改用手写挂载),因此生产推荐直接挂载 config 目录做配置管理,环境变量只负责数据库连接这类引导参数。

八、邮件参数(email.php 专题)

7.7.0 把邮件默认值独立在 email.php(文件头同样标注 DO NOT EDIT,覆盖写 config.php)。实测全量参数:

参数默认值说明
siteadminemail / siteadminbounce / siteadminname'' / '' / 'Site admin'站点管理员邮箱/退信地址(Return-Path)/显示名;空值时后台全局设置里配置
emailmethod'mail'发信通道:mail(PHP Mailer 内置)/sendmail/smtp
emailsmtphost'localhost'SMTP 主机,带端口写 smtp.example.com:587
emailsmtpuser / emailsmtppassword'' / ''SMTP 认证(设了 user 必须设 password);密码在库中加密存储
emailsmtpssl'''ssl' 或 'tls'(StartTLS)
emailsmtpdebug0SMTP 会话日志级别 0~3(邀请/提醒发送排障时开 2)
maxemails50单批发信上限(防超时,队列分批发送)
emailcharsetutf-8出站邮件字符集

生产建议:emailmethod 置 smtp 并指向独立邮件网关;发不出信先在后台「全局设置→邮件」发测试邮件,仍失败再把 emailsmtpdebug 提到 2 看完整 SMTP 会话。

九、主题与插件配置实务

  • 主题查找路径:问卷主题安装目标为 upload/themes/survey/(admin 主题在 admintheme 参数,默认 Sea_Green)。部署时 upload 目录必须保留该骨架(实测:骨架缺失导致全站 500,见部署篇排障实录①);
  • 主题开发调试:force_xmlsettings_for_survey_rendering 置 true 后主题改动即时生效,免卸载重装(官方注释:仅开发场景用);
  • 主题可上传类型:受第五章三组白名单约束;允许 SVG 需同时扩 allowedthemeimageformats 与 imagemimetypes 映射(默认映射表实测含 gif/ico/jpg/jpeg/png 五类,官方注释明确警示 SVG 的 XSS 风险);
  • 插件安装:5.x 起 支持 ZIP 上传安装(依赖 disablePluginUpload=false);安全敏感环境开 usePluginWhitelist 只放行指定插件,pluginWhitelist 列名即可,核心插件隐式放行、可用 corePluginBlacklist 排除。

十、缓存、会话与资产

  • 会话存储:默认 PHP 文件会话;置 TABLE_SESSION 环境变量(或手工取消 config.php 中 session 段注释)切换到数据库表会话(DbHttpSession,表 {{sessions}})。官方注释的坑:大型问卷的参与者会话可增长到 15 MB 以上,表会话必须保证 MySQL max_allowed_packet 足够(建议 ≥64M),否则会话静默丢失不报错;
  • 资产缓存:前端合并产物在 tmp/assets/(customassetversionnumber 参与生成路径),twig_cache、cache、HTML 目录同在 tmp/runtime 下;改了主题/JS 却不生效时,清 tmp 资产目录或执行 console.php flushassets(见运维实战篇)即可;
  • 上传体积:maximum_unzipped_size(解压上限,默认 5 亿字节)之外,真实上限还受 PHP post_max_size/upload_max_filesize 约束——完整性检查页(showserverconfigurationcheck=true)会并列展示这四项。

十一、常见配置任务实例

任务 1:站点改中文 + 上海时区(在 config.php 的 config 数组追加):

  'config'=>array(
    'sitename'=>'青柠问卷平台',
    'defaultlang'=>'zh-Hans',
    'displayTimezone'=>'Asia/Shanghai',
    // ... 原有项
  )

任务 2:临时开排错模式:

    'debug'=>2,
    'debugsql'=>1,

排障完成后必须回 0——debug=2 会向受访者暴露堆栈与 SQL。

任务 3:强制 HTTPS(确认证书可用后再做,留好逃生开关):

    'force_ssl'=>'on',

锁死后的恢复路径:数据库直改全局设置,或临时置 ssl_emergency_override=>true。

任务 4:管理员登录防爆破收紧:

    'maxLoginAttempt'=>5,
    'timeOutTime'=>60*30,

任务 5:会话入库(config.php 取消注释 + 数据库参数核对):

    'session' => array (
       'class' => 'application.core.web.DbHttpSession',
       'connectionID' => 'db',
       'sessionTableName' => '{{sessions}}',
    ),

同时确认 MySQL max_allowed_packet ≥ 64M(官方口径,理由见第十章)。

十二、排障实录(实测沉淀)

  1. 「改了参数不生效」:先确认改动写的是 config.php 而不是 config-defaults.php(后者升级即被覆盖);主题/前端类改动还要清资产缓存(第十章)。
  2. config.php 语法错误导致整站白屏:config.php 是被 require 的 PHP 文件,语法错(漏逗号/引号)会让整个应用无法启动;改动前 php -l application/config/config.php 校验语法是零成本习惯。
  3. 7.x 实例复用旧 config.php 后 URL 全 404:旧文件里 'urlFormat'=>'get',7.x 已不支持 get 路由(官方安装手册明确),改回 'path' 即恢复。
  4. 容器重建后管理员被「重置」的错觉:ADMIN_* 只在首次安装生效(第七章),重建容器不会重跑安装、也不会改密码;以为密码丢失时先确认是不是连接到了另一套数据库(DB_NAME/DB_HOST 指向变化)。
  5. 加密字段解不开:security.php 与数据库不同步(恢复时只恢复了库没恢复密钥文件)。两者必须成对备份/恢复。

十三、参考链接