codeigniter在lnmp下报500错误,主因是open_basedir跨目录限制或php错误未显示;应先查nginx错误日志定位open_basedir restriction in effect等线索,再通过删除或修改.project根目录下.user.ini、调整nginx root与script_filename、启用必要php扩展(mbstring/curl/json等)并开启display_errors来系统排查修复。

CodeIgniter 项目在 LNMP 环境下报 500 错误,大概率不是代码本身语法错误,而是环境限制或配置问题。重点先看 open_basedir 和 PHP 错误日志,再逐层验证。
查看 Nginx 错误日志定位具体原因
LNMP 默认不开启详细 PHP 错误输出,500 是“兜底错误”,必须靠日志找真实报错:
- 编辑你的站点配置文件:
/usr/local/nginx/conf/vhost/yourdomain.com.conf - 在
access_log行下方添加一行(路径可自定义,确保目录存在且有写权限):error_log /home/wwwlogs/yourdomain.com_error.log notice; - 保存后执行
lnmp nginx restart或nginx -s reload - 刷新网页触发一次 500,然后运行:
tail -f /home/wwwlogs/yourdomain.com_error.log - 常见关键线索:
open_basedir restriction in effect、failed to open stream、Class 'CI_Controller' not found
检查并解除 open_basedir 跨目录限制
CodeIgniter 的入口文件(如 index.php)通常放在 web 可访问目录(如 /public 或根目录),但会向上级目录加载系统核心文件(system/、application/)。LNMP 默认启用防跨站限制,会直接拦截这类调用。
- 确认你用的是 LNMP 1.2+:限制由网站根目录下的
.user.ini文件控制 - 进入你的项目根目录(比如
/home/wwwroot/yourdomain.com),执行:rm -f .user.ini - 如果删不掉(权限问题),可改用:
sed -i "s/open_basedir.*/open_basedir = \/home\/wwwroot\/yourdomain.com\//g" .user.ini(仅放开当前项目路径) - 修改后需重启 PHP:
lnmp php-fpm restart
确认入口文件路径和 Nginx root 配置匹配
CodeIgniter 推荐将 index.php 放在 Web 根目录(如 /home/wwwroot/yourdomain.com),而不是子目录。若你把它放到了 /public 下,Nginx 的 root 必须指向 /public,否则 index.php 找不到,也会 500。
- 打开站点 conf,检查
root指向是否正确:
✅ 正确:root /home/wwwroot/yourdomain.com;(index.php 在该目录下)
✅ 正确:root /home/wwwroot/yourdomain.com/public;(index.php 在 public 目录内) - 同时确认
location ~ \.php$块中fastcgi_param SCRIPT_FILENAME使用的是$document_root$fastcgi_script_name,不是硬编码路径 - 若用子目录部署(如
yourdomain.com/ci/),需额外配置location /ci/并调整alias和SCRIPT_FILENAME
验证 PHP 扩展与基础设置
CodeIgniter 3.x 需要 mbstring、curl、json;CI4 还依赖 xml 和 zip。LNMP 安装时可能没全选。
- 执行
php -m | grep -E "(mbstring|curl|json|xml|zip)"查看已启用模块 - 缺哪个就进 LNMP 安装目录(如
/root/lnmp1.6),运行:./addons.sh install mbstring - 检查
php.ini中:display_errors = Onerror_reporting = E_ALL
(临时开启,排查完记得关) - CI4 的
app/Config/Boot/production.php若设了ini_set('display_errors', '0'),也会屏蔽错误——注释掉它











