MAATRIX / Блог / LimeSurvey на сервере: частые ошибки и решения

LimeSurvey на сервере: частые ошибки и решения

MAATRIX

LimeSurvey — это не просто форма опроса, а полноценный движок с ветвящейся логикой, квотами, токенами участников и экспортом в SPSS. Именно поэтому он капризнее обычной визитки: любая мелочь в правах на файлы, лимитах PHP или настройках cron превращается в опрос, который не сохраняет ответы или падает на середине прохождения. Разберём конкретные ошибки, с которыми сталкиваются при развёртывании LimeSurvey на своём сервере, и как их закрыть без танцев с бубном.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Требования к серверу и типовая установка

LimeSurvey — PHP-приложение с базой MySQL/MariaDB или PostgreSQL, ничего экзотического. На конец августа 2026 актуальная ветка LimeSurvey 6.x требует PHP 8.1+ (лучше 8.2) и один из движков БД. Минимальный рабочий конфиг для опроса с несколькими сотнями одновременных участников — 2 CPU, 4 ГБ RAM, SSD от 40 ГБ (файлы загрузок и экспорт быстро съедают место).

Базовая установка на Ubuntu 24.04 с nginx + PHP-FPM + MySQL:

apt update && apt install -y nginx mysql-server php8.2-fpm php8.2-mysql \
  php8.2-mbstring php8.2-gd php8.2-xml php8.2-curl php8.2-zip php8.2-ldap \
  php8.2-imap php8.2-intl unzip

mysql -e "CREATE DATABASE limesurvey CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
mysql -e "CREATE USER 'lime'@'localhost' IDENTIFIED BY 'strong-password';"
mysql -e "GRANT ALL PRIVILEGES ON limesurvey.* TO 'lime'@'localhost';"

cd /var/www
wget https://github.com/LimeSurvey/LimeSurvey/releases/latest/download/limesurvey6xx.tar.gz
tar -xzf limesurvey6xx.tar.gz
chown -R www-data:www-data limesurvey

Дальше — установка через веб-мастер по адресу https://ваш-домен/. Если вместо мастера видите белый экран уже на этом шаге — смотрите раздел про PHP-лимиты ниже. Настройку nginx и PHP-FPM с нуля мы разбирали в статье про Apache с mod_php — принципы для nginx+FPM аналогичны, разница только в конфиге виртуального хоста.

Белый экран и ошибки PHP-лимитов

Самая частая жалоба — «после установки просто белая страница» или «Fatal error: Allowed memory size exhausted». LimeSurvey тянет за собой Yii-фреймворк с приличным количеством классов, и дефолтных настроек PHP на VPS обычно не хватает.

Правьте /etc/php/8.2/fpm/php.ini:

memory_limit = 256M
upload_max_filesize = 32M
post_max_size = 34M
max_execution_time = 120
max_input_vars = 5000

max_input_vars — отдельная засада: длинные опросы с десятками вопросов и вариантов ответа генерируют форму с тысячами полей. Дефолт PHP — 1000, чего хватает на короткую анкету, но не на серьёзный ветвящийся опрос. Если после сохранения теряется хвост вопросов — это оно.

После правки:

systemctl restart php8.2-fpm

Если белый экран остаётся, включите вывод ошибок временно в application/config/config.php (создаётся из config-sample.php при первой установке):

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

Не забудьте вернуть debug в 0 после диагностики — с включённой отладкой в проде видны пути на сервере и части SQL, это подсказка потенциальному атакующему.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Права на файлы: загрузка изображений и шаблонов не работает

LimeSurvey активно пишет на диск: загруженные файлы участников, кастомные темы, временные файлы экспорта. Каталоги, которые обязаны быть доступны на запись для www-data:

chown -R www-data:www-data /var/www/limesurvey/tmp
chown -R www-data:www-data /var/www/limesurvey/upload
chmod -R 755 /var/www/limesurvey/tmp
chmod -R 755 /var/www/limesurvey/upload

Если после этого всё ещё видите «Failed to move uploaded file» — проверьте два смежных момента:

  • open_basedir в php.ini не должен ограничивать доступ к этим путям (если он вообще задан);
  • в SELinux-дистрибутивах (на Ubuntu/Debian обычно неактуально, но если сервер на AlmaLinux) нужен chcon -R -t httpd_sys_rw_content_t /var/www/limesurvey/upload.

Отдельно — каталог upload/surveys/{ID}/files создаётся автоматически при активации опроса с вопросом типа «загрузка файла». Если опрос активирован, а каталог не появился, проверьте владельца родительской папки upload/surveys — если её создавали руками через mkdir от root, LimeSurvey не сможет писать внутрь.

Медленные опросы и таймауты при большом числе участников

Когда опрос собирает тысячи ответов или используется квота с сотнями одновременных заполнений, начинают вылезать 502/504 на середине прохождения. Причины обычно три:

  1. PHP-FPM не справляется с параллельными запросами. Проверьте пул в /etc/php/8.2/fpm/pool.d/www.conf:
pm = dynamic
pm.max_children = 40
pm.start_servers = 8
pm.min_spare_servers = 4
pm.max_spare_servers = 16

На 4 ГБ RAM 40 процессов — реалистичный потолок, если каждый процесс PHP держит 40-60 МБ. Считайте по формуле RAM / средний_расход_процесса, оставив запас под MySQL и систему.

  1. MySQL не тюнингован под нагрузку. Таблица ответов (survey_{ID}) растёт быстро, и без индексов на служебных полях запросы статистики замедляются. Общие грабли MySQL на VPS и их лечение разобраны в статье MySQL на сервере: частые ошибки и решения.
  1. nginx отдаёт 504 раньше, чем PHP успевает ответить — если у опроса тяжёлая логика условий (relevance equations) на большом числе вопросов, поднимите fastcgi_read_timeout в конфиге сайта:
location ~ \.php$ {
    fastcgi_pass unix:/run/php/php8.2-fpm.sock;
    fastcgi_read_timeout 90;
    include fastcgi_params;
}

Ориентировочно: конкретные цифры таймаутов зависят от сложности вашего опроса и мощности сервера, замерьте на своей нагрузке, а не берите значения из статьи как готовый рецепт.

Cron-задачи: напоминания и экспорт не срабатывают

LimeSurvey сам по себе не имеет демона — плагины вроде «напоминание по email незавершившим опрос» или запланированный экспорт результатов работают через системный cron, который дёргает встроенный консольный обработчик.

Типовая задача — отправка приглашений и напоминаний:

crontab -e -u www-data
*/15 * * * * /usr/bin/php8.2 /var/www/limesurvey/application/commands/console.php mail-invitation {SURVEY_ID} >> /var/log/limesurvey-cron.log 2>&1
30 3 * * * /usr/bin/php8.2 /var/www/limesurvey/application/commands/console.php mail-reminder {SURVEY_ID} >> /var/log/limesurvey-cron.log 2>&1

Частая ошибка — задача не срабатывает, потому что cron запускается от www-data, а у пользователя нет crontab по умолчанию в некоторых минимальных образах. Проверьте:

crontab -l -u www-data
systemctl status cron

Если письма не уходят даже при срабатывании задачи — проверьте настройки SMTP в самом LimeSurvey (Configuration → Email settings): опрос на сервере без настроенного relay через внешний SMTP часто попадает в спам или вовсе блокируется провайдером за прямую отправку с VPS-IP. Общие принципы диагностики cron-задач и логирования разобраны в статье Cron-задачи на сервере: частые ошибки и решения.

Ошибки при обновлении и миграции опросов

Обновление LimeSurvey между минорными версиями (например, 6.4 → 6.6) через встроенный ComfortUpdate или ручную замену файлов иногда падает с ошибкой миграции базы «Error: DB schema is not up to date».

Порядок действий при ручном обновлении:

# 1. Бэкап до любых действий — обязательно
mysqldump -u lime -p limesurvey > limesurvey_backup_$(date +%F).sql
tar -czf limesurvey_files_backup.tar.gz /var/www/limesurvey

# 2. Замена файлов ядра (upload/, application/config/config.php — не трогать)
rsync -a --exclude=upload --exclude=application/config/config.php \
  /path/to/new-limesurvey/ /var/www/limesurvey/

# 3. Прогон миграций через веб — открыть /admin/update

Если после замены файлов сайт выдаёт 500 — почти всегда дело в правах: новые файлы скопировались с правами вашего SSH-пользователя, а не www-data. Верните владельца после каждого обновления:

chown -R www-data:www-data /var/www/limesurvey

Про перенос опроса между серверами (экспорт .lss с ресурсами) — отдельная тема: .lss-файл содержит только структуру опроса, ответы участников экспортируются отдельно через VVexport/CSV в интерфейсе администратора. Перед миграцией на новый сервер сделайте полный дамп БД, а не только структуру — про подход к бэкапам MySQL в целом читайте в статье Бэкап MySQL на сервере: частые ошибки и решения.

SSL, домен и защита админки

Опрос с персональными данными участников (имена, email, а иногда и медицинские или финансовые ответы) без HTTPS — прямой риск и для респондентов, и для репутации заказчика исследования. Let's Encrypt на LimeSurvey ставится стандартно через certbot:

apt install certbot python3-certbot-nginx
certbot --nginx -d survey.ваш-домен.ru

Частая ошибка после выпуска сертификата — LimeSurvey продолжает генерировать ссылки на http:// в приглашениях участникам, если в Configuration → General settings прописан http в базовом URL, а не https. Проверьте Public URL в настройках опроса и, если сайт стоит за обратным прокси, добавьте в config.php:

'forceHTTPS' => true,

Отдельно закройте /admin/ от перебора паролей: минимум — fail2ban на 5xx/401 по этому пути, максимум — ограничение по IP через nginx для админки, если вход нужен только вам и паре коллег. Пошаговую настройку выпуска и продления сертификата разбирали в статье Let's Encrypt SSL на сервере: частые ошибки и решения.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

LimeSurvey тормозит на слабом VPS — сколько ресурсов реально нужно?

Для небольших опросов (до 50-100 участников одновременно) хватает 2 ГБ RAM и 1-2 vCPU. Для опросов с квотами, ветвлением и параллельным заполнением сотнями участников закладывайте от 4 ГБ RAM — узкое место обычно не CPU, а число одновременных PHP-FPM процессов.

Можно ли запустить несколько опросов LimeSurvey с разными доменами на одном сервере?

Да, один инстанл LimeSurvey отдаёт разные опросы по ID (/index.php/survey/index/sid/12345), а для отдельных доменов под каждый опрос настраивается редирект в nginx или отдельные server-блоки, указывающие на один и тот же application-каталог.

После установки не приходят письма-приглашения участникам — что проверить в первую очередь?

Настройки SMTP в Configuration → Email settings (не «Mail», а именно SMTP с логином/паролем внешнего почтового сервиса) и cron-задачу mail-invitation — сама LimeSurvey письма пачкой не рассылает без прогона консольной команды по расписанию.

Как защитить результаты опроса от накрутки одним и тем же человеком?

Включите «Use Token-based Authentication» — тогда участник заходит по уникальной ссылке-токену и не может пройти опрос повторно; для анонимных опросов есть более грубая защита через cookie/IP, но она обходится сменой браузера или VPN.

Экспорт результатов в SPSS выдаёт ошибку кодировки — почему?

Обычно база создана не в utf8mb4, а в latin1 или utf8 (без mb4), и кириллица в ответах повреждается при экспорте. Пересоздать базу с правильной кодировкой на уже заполненном опросе сложно — проще предотвратить проблему на этапе установки, как показано в разделе про требования к серверу.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →