ci项目linux部署常见问题根源是apache重写未生效、base_url配置错误、php扩展缺失、selinux权限限制及mysql连接方式不当;需依次检查allowoverride、手动设base_url、启用mbstring等扩展、调整selinux上下文、强制mysql走tcp连接。

为什么 CI 项目在 Linux 上访问 404 或直接显示 index.php?
根本原因几乎都是 Apache 的 .htaccess 未生效或 PHP 没正确解析路由。CodeIgniter 默认依赖 URL 重写隐藏 index.php,而多数 Linux 生产环境(尤其 CentOS/RHEL)的 Apache 默认禁用 AllowOverride,导致重写规则被忽略。
实操建议:
- 确认 Apache 已启用
mod_rewrite:a2enmod rewrite(Debian/Ubuntu)或检查/etc/httpd/conf/httpd.conf中是否取消了LoadModule rewrite_module modules/mod_rewrite.so注释(CentOS) - 在虚拟主机配置中显式允许重写:
<Directory "/var/www/html/your-ci-app"><br> AllowOverride All<br> Require all granted<br></Directory>
别只改.htaccess却不放开AllowOverride - CI 的
index_page配置必须为空:$config['index_page'] = '';;否则即使重写生效,也会在 URL 中拼上index.php
如何让 CI 正确读取 base_url() 和 site_url()?
Linux 下路径分隔符、文档根目录与实际部署路径错位,常导致 base_url() 返回空或错误地址,比如生成 http://example.com//css/style.css(双斜杠)或漏掉子目录。
实操建议:
- 不要依赖自动检测:
$config['base_url']必须手动设为完整 URL,例如$config['base_url'] = 'https://example.com/';或带子目录$config['base_url'] = 'https://example.com/myapp/'; - 检查
FCPATH是否指向真实物理路径:CI 用它拼接日志、缓存等路径,若部署在非 DocumentRoot 根目录(如/var/www/html/myapp),需确认index.php中的define('FCPATH', __DIR__ . '/');无误 - 避免在 Nginx 下复用 Apache 的
.htaccess思路——Nginx 无.htaccess,必须在 server 块里配try_files $uri $uri/ /index.php?$query_string;
PHP 版本和扩展缺失导致 CI 启动报错
CI 3.x 要求 PHP ≥ 5.6,CI 4.x 要求 ≥ 7.4;但更常见的是扩展没开——比如 mbstring 缺失会直接白屏,curl 缺失让邮件或 HTTP 客户端失效,openssl 缺失则无法用 HTTPS 请求或加密函数。
实操建议:
- 运行
php -v和php -m | grep -E 'mbstring|curl|openssl|json'确认核心扩展已加载 - CI 4 的
composer install必须在服务器本地执行(不能只传 vendor 目录),否则 autoloader 路径可能因开发机与生产机差异失效 - Linux SELinux 启用时,
logs/和writable/目录需额外赋权:chcon -R -t httpd_sys_rw_content_t writable/ logs/,否则写入失败且无明确报错
数据库连接在 Linux 上超时或拒绝访问
不是账号密码错,而是 MySQL 默认绑定 127.0.0.1(IPv4 loopback),而 CI 在 Linux 中可能用 localhost 尝试走 socket 连接;若 socket 文件路径不对或权限不足,就卡住或报 Connection refused。
实操建议:
- CI 数据库配置中,把
hostname改成127.0.0.1(强制走 TCP),而非localhost;或者确认 MySQL 的skip-networking是关闭状态 - 检查 MySQL 用户权限是否限定来源:
GRANT ALL ON ci_db.* TO 'ci_user'@'localhost';在某些发行版下不等价于@'127.0.0.1',需分别授权 - CI 3 的
db_debug设为TRUE时,部分 Linux 环境会因错误输出格式触发 header 已发送异常,建议上线前关掉
CI 部署最麻烦的从来不是上传文件,而是 Apache/Nginx 配置细节、SELinux 策略、MySQL socket 路径、以及 PHP 扩展加载顺序这些看不见的链路。改完一个地方,记得清掉 writable/cache/ 和浏览器缓存再试——否则你看到的可能是旧错误。










