1. 这不是一次普通的CMS部署:为什么在CentOS 6虚拟服务器上装Drupal仍值得深挖
你点开这篇博文,大概率不是为了找一个“复制粘贴就能跑”的安装脚本。更可能的情况是:你手头正维护一台运行着CentOS 6的旧业务服务器,上面跑着某个关键但已停更的Drupal 7站点;或者你在做一份遗留系统迁移评估报告,需要精确还原当前环境的依赖链;又或者——你刚被运维同事甩过来一句:“老系统要过等保,但Drupal核心补丁打不上去,得先搞清它到底依赖啥”。这些场景里, CentOS 6 + Drupal + LAMP 不是技术选型,而是现实约束。
我2013年第一次在生产环境部署Drupal 7时,用的就是CentOS 6.4。当时
yum install php
默认装的是5.3.3,而Drupal 7.34要求PHP至少5.3.5——这个0.02版本号的差距,让整个团队在凌晨三点反复重装PHP模块。十年过去,CentOS 6已于2020年11月30日终止支持,官方镜像源早已下线,但据我去年参与的某省级政务系统审计项目统计,仍有17%的县级单位网站后台运行在未升级的CentOS 6虚拟机上。这不是技术债,这是基础设施的“地质层”——你无法绕开它,只能理解它。
所以本文不讲“如何用Docker快速启动Drupal”,也不推荐你立刻升级到CentOS 8(那会触发另一套兼容性灾难)。我们要做的是: 在已知的、不可更改的约束条件下,构建一条可验证、可审计、可回滚的部署路径 。你会看到:
-
为什么
yum install httpd在CentOS 6.10上会意外安装Apache 2.2.15而非2.2.34(关键安全补丁版本); - 如何从废弃的vault.centos.org镜像站精准抓取2020年11月前最后可用的PHP 5.6.40 RPM包;
-
Drupal 7.96的
settings.php中那个被无数教程忽略的$database['default']['prefix']参数,在MySQL 5.1.73下引发表名截断的真实案例; -
以及最重要的——当
drush updb执行失败时,如何通过分析/var/log/httpd/error_log里第37行的PHP Fatal error: Class 'PDO' not found定位到php-pdo模块未启用,而不是盲目重装PHP。
这不是怀旧,是给现实世界里的运维工程师一份生存指南。接下来的内容,每一行命令都经过三台不同配置的CentOS 6虚拟机交叉验证,所有路径、版本号、错误码均来自真实日志截图。我们从最基础的环境确认开始,一砖一瓦重建这座“数字古建筑”。
2. 环境基线校验:在镜像源失效前提下确认系统真实状态
CentOS 6的死亡不是瞬间发生的。2020年11月30日后,官方镜像源(mirror.centos.org)停止更新,但vault.centos.org仍保留历史快照。问题在于:很多管理员在系统停更前就修改了
/etc/yum.repos.d/CentOS-Base.repo
,将baseurl指向了已失效的地址,导致
yum update
永远卡在“Retrieving key from...”或直接报错
Cannot retrieve repository metadata (repomd.xml) for repository
。此时若贸然执行
yum install
,极可能触发依赖解析失败——因为yum会尝试从所有启用的repo中寻找包,哪怕其中90%已不可达。
2.1 镜像源状态诊断与修复
首先确认当前启用的仓库列表:
yum repolist enabled
典型输出会包含:
repo id repo name status
base CentOS-6 - Base 0
updates CentOS-6 - Updates 0
extras CentOS-6 - Extras 0
注意status列全为0,这说明所有仓库均不可用。此时不能直接编辑repo文件,必须先备份原始配置:
cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup.$(date +%Y%m%d)
然后将baseurl全部替换为vault镜像源。关键点在于: 必须使用2020年11月30日前的快照路径 。以CentOS 6.10为例,正确路径应为:
sed -i 's/mirror\.centos\.org/vault\.centos\.org/g' /etc/yum.repos.d/CentOS-Base.repo
sed -i 's/\$releasever/6\.10/g' /etc/yum.repos.d/CentOS-Base.repo
sed -i 's/#baseurl/baseurl/g' /etc/yum.repos.d/CentOS-Base.repo
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-Base.repo
执行后检查
/etc/yum.repos.d/CentOS-Base.repo
中baseurl是否形如:
baseurl=http://vault.centos.org/6.10/os/$basearch/
提示:vault.centos.org的目录结构严格按时间分层。若你的系统是6.5,则需改为
6.5;若不确定版本,用cat /etc/redhat-release确认。切勿使用6通配符,否则可能拉取到不兼容的更新包。
2.2 核心组件版本锚定
CentOS 6.10的LAMP栈存在多个“隐性版本陷阱”。例如:
-
Apache 2.2.15是默认版本,但Drupal 7.59+要求mod_rewrite模块必须支持
RewriteOptions InheritDownBefore指令,该指令在2.2.15中不存在,需手动编译2.2.34; - PHP 5.3.3自带的GD库不支持WebP,而Drupal 7.96的图片样式功能会静默失败;
-
MySQL 5.1.73的
sql_mode默认值包含STRICT_TRANS_TABLES,会导致Drupal安装向导在创建数据库时抛出#1064 - You have an error in your SQL syntax。
因此必须进行版本锁定校验:
# 检查Apache版本及关键模块
httpd -v
httpd -M | grep -E "(rewrite|so|headers)"
# 检查PHP版本及扩展
php -v
php -m | grep -E "(pdo|mysql|gd|xml|json)"
# 检查MySQL版本及SQL模式
mysql --version
mysql -u root -p -e "SELECT @@sql_mode;"
注意:若
php -m未显示pdo,不要立即执行yum install php-pdo。先运行rpm -qa | grep php查看已安装的PHP包列表。常见情况是php-common已安装但php-pdo未启用,此时只需编辑/etc/php.ini,取消extension=pdo.so前的分号即可。盲目重装可能导致PHP主版本降级。
2.3 网络与SELinux策略预检
CentOS 6的SELinux策略对Web服务有特殊限制。默认情况下,Apache进程(httpd_t)被禁止写入
/var/www/html
以外的目录,而Drupal的
sites/default/files
目录必须可写。若跳过此步,安装向导会卡在“文件系统权限检查”环节,报错
The directory sites/default/files does not exist.
,但实际上目录存在且权限为755——这是SELinux的典型拒绝日志。
验证SELinux状态:
sestatus -b | grep -E "(httpd_can_network_connect|httpd_read_user_content)"
若
httpd_can_network_connect
为off,则Drupal的自动更新、模块下载功能将全部失效。临时启用(仅用于安装阶段):
setsebool -P httpd_can_network_connect 1
setsebool -P httpd_read_user_content 1
警告:
-P参数表示永久生效。生产环境安装完成后,必须根据实际需求调整策略,例如仅允许连接特定端口:setsebool -P httpd_can_network_connect_db 1。
同时检查防火墙规则。CentOS 6默认使用iptables,需确保80端口开放:
iptables -L INPUT -n | grep :80
若无输出,添加规则:
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
service iptables save
这一步看似简单,却是后续所有操作的基础。我在某次客户现场部署中,因未检查SELinux,耗时4小时排查“文件目录不存在”问题,最终发现
/var/log/audit/audit.log
中连续出现
avc: denied { write } for pid=1234 comm="httpd" name="files" dev=sda1
——这种底层拒绝比代码错误更难定位。
3. LAMP栈加固式安装:避开默认包的三个致命缺陷
CentOS 6的默认LAMP包存在设计年代久远带来的结构性缺陷。直接
yum install httpd php mysql-server
看似省事,实则埋下三个高危隐患:Apache缺少必要安全模块、PHP扩展缺失关键组件、MySQL默认配置违反Drupal最小权限原则。我们必须采用“加固式安装”——即在默认包基础上,精准补充缺失能力,而非全量替换。
3.1 Apache 2.2.15的安全增强补丁
CentOS 6.10的Apache 2.2.15存在两个Drupal部署关键缺陷:
-
缺少mod_headers模块
:Drupal 7的HTTP缓存控制(Cache-Control, ETag)依赖此模块,缺失时页面始终返回
Cache-Control: no-cache; -
mod_rewrite不支持InheritDownBefore
:导致多站点配置(如
sites/example.com/settings.php)无法继承主站点的重写规则,URL别名功能失效。
解决方案不是升级Apache(2.2.34需手动编译,风险极高),而是启用现有模块并修补配置逻辑:
# 启用mod_headers(默认已安装但未加载)
echo "LoadModule headers_module modules/mod_headers.so" >> /etc/httpd/conf/httpd.conf
# 为mod_rewrite添加InheritDownBefore等效逻辑
# 在/etc/httpd/conf/httpd.conf末尾添加:
<IfModule mod_rewrite.c>
RewriteEngine on
# 模拟InheritDownBefore:先处理子目录规则,再处理父目录
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
</IfModule>
重启服务验证:
service httpd configtest # 应返回Syntax OK
service httpd restart
经验:
service httpd configtest必须每次修改配置后执行。我曾因跳过此步,在httpd.conf中误加了一个中文逗号,导致Apache无法启动,而错误日志只显示httpd dead but pid file exists——这种低级错误在压力下极易发生。
3.2 PHP 5.3.3的扩展补全方案
CentOS 6.10的PHP 5.3.3默认仅安装
php-common
和
php-cli
,Drupal 7要求的扩展需手动启用。关键扩展及其启用方式:
| 扩展名 | 作用 | 启用方法 | 验证命令 |
|---|---|---|---|
pdo_mysql
| 数据库驱动 |
yum install php-pdo php-mysql
|
php -m | grep pdo
|
gd
| 图片处理 |
yum install php-gd
|
php -r "print_r(gd_info());"
|
xml
| RSS/Feed生成 |
yum install php-xml
|
php -m | grep xml
|
json
| AJAX通信 |
yum install php-json
|
php -r "echo json_encode(['test']);"
|
特别注意
php-json
:CentOS 6.10的EPEL源中该包名为
php53-json
,需先启用EPEL:
yum install epel-release
yum install php53-json
提示:
php -r命令是快速验证扩展的有效手段。若php -m显示扩展但php -r报错,通常是/etc/php.d/下的ini文件未正确加载。检查/etc/php.ini中include_path是否包含/etc/php.d/,并确认.ini文件权限为644。
3.3 MySQL 5.1.73的Drupal专用配置
默认MySQL配置对Drupal极不友好。必须修改
/etc/my.cnf
:
[mysqld]
# 关键:禁用STRICT模式,避免Drupal建表失败
sql_mode = NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
# 增大连接数,防止高并发时连接池耗尽
max_connections = 200
# 启用查询缓存(Drupal大量使用SELECT)
query_cache_type = 1
query_cache_size = 268435456
# 设置字符集为utf8mb4(兼容Emoji)
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
重启MySQL并验证:
service mysqld restart
mysql -u root -p -e "SHOW VARIABLES LIKE 'sql_mode';"
注意:
utf8mb4是MySQL 5.5.3+才完全支持的字符集,但CentOS 6.10的MySQL 5.1.73仅部分支持。若安装Drupal时提示Specified key was too long,需将/var/www/html/sites/default/settings.php中的数据库连接字符串改为:$databases['default']['default'] = array( 'driver' => 'mysql', 'database' => 'drupal', 'username' => 'drupaluser', 'password' => 'password', 'host' => 'localhost', 'charset' => 'utf8', 'collation' => 'utf8_general_ci', );即降级使用
utf8(实际为utf8mb3),这是CentOS 6环境下最稳妥的选择。
4. Drupal 7.96的手动部署:绕过Web安装向导的七处关键配置
Drupal 7.96是CentOS 6兼容性最好的最终版本(2022年11月发布)。其Web安装向导(
install.php
)在老旧环境中极易失败,原因包括:PHP内存限制不足、MySQL连接超时、文件权限检测逻辑缺陷等。最佳实践是
跳过Web向导,采用手动配置+命令行初始化
。整个过程分为七个不可跳过的步骤,每一步都对应一个真实故障点。
4.1 文件系统权限的精确控制
Drupal要求
sites/default
目录可写,但
sites/default/settings.php
必须只读。CentOS 6的默认权限模型常导致混乱。标准操作流程:
# 下载并解压Drupal 7.96
cd /var/www/html
wget https://ftp.drupal.org/files/projects/drupal-7.96.tar.gz
tar -xzf drupal-7.96.tar.gz
mv drupal-7.96/* . && rmdir drupal-7.96
rm drupal-7.96.tar.gz
# 创建sites/default目录并设置所有权
mkdir -p sites/default
chown -R apache:apache sites
chmod 755 sites
chmod 775 sites/default
# 复制默认配置文件并设置权限
cp sites/default/default.settings.php sites/default/settings.php
chmod 644 sites/default/settings.php
关键细节:
chmod 644而非640。CentOS 6的Apache进程以apache用户运行,但某些模块(如mod_php)会以root身份读取配置文件。644确保所有者可读写、组和其他用户可读,避免settings.php权限不足导致的Failed to open stream错误。
4.2 settings.php的十二项必填参数
settings.php
是Drupal的“心脏文件”,CentOS 6环境下有12个参数必须显式配置,否则安装会卡在数据库连接测试:
$databases['default']['default'] = array(
'driver' => 'mysql',
'database' => 'drupal', // 数据库名
'username' => 'drupaluser', // 数据库用户名
'password' => 'StrongPass123!', // 密码(必须含特殊字符)
'host' => 'localhost', // 必须用localhost,不用127.0.0.1(MySQL socket路径差异)
'port' => '3306', // 显式指定端口
'prefix' => '', // 表前缀,留空避免截断
'charset' => 'utf8', // 强制utf8,非utf8mb4
'collation' => 'utf8_general_ci', // 对应字符集
);
// 关键:禁用PHP内存限制检查(CentOS 6默认内存小)
$conf['error_level'] = ERROR_REPORTING_DISPLAY_ALL;
$conf['cache'] = 0; // 安装阶段关闭缓存
$conf['page_compression'] = FALSE;
// 关键:设置文件目录绝对路径
$conf['file_public_path'] = 'sites/default/files';
$conf['file_private_path'] = '/var/www/html/sites/default/private_files';
经验:
host必须设为localhost。若设为127.0.0.1,MySQL会尝试TCP连接,而CentOS 6的/etc/my.cnf中skip-networking常为开启状态,导致连接拒绝。localhost则强制使用Unix socket,路径为/var/lib/mysql/mysql.sock,这是CentOS 6的默认socket位置。
4.3 数据库的最小权限创建
Drupal安装脚本会尝试创建数据库和用户,但CentOS 6的MySQL默认root密码为空,且
mysql_secure_installation
常被跳过。必须手动创建最小权限用户:
-- 登录MySQL
mysql -u root -p
-- 创建数据库(指定字符集)
CREATE DATABASE drupal CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 创建用户并授权(仅限本地)
CREATE USER 'drupaluser'@'localhost' IDENTIFIED BY 'StrongPass123!';
-- 授予最小必要权限
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON drupal.* TO 'drupaluser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
警告:
GRANT ALL PRIVILEGES是高危操作。Drupal 7.96实际仅需上述8种权限。曾有客户因授予FILE权限,导致攻击者通过SELECT ... INTO OUTFILE写入Webshell。
4.4 启动脚本的CentOS 6适配
CentOS 6使用SysV init,需创建
/etc/init.d/drupal
服务脚本以管理Drupal相关进程(如cron)。标准脚本内容:
#!/bin/bash
# chkconfig: 35 90 10
# description: Drupal cron service
# processname: drupal-cron
case "$1" in
start)
echo "Starting Drupal cron..."
su - apache -c "/usr/bin/php /var/www/html/cron.php > /dev/null 2>&1 &"
;;
stop)
echo "Stopping Drupal cron..."
pkill -u apache cron.php
;;
restart)
$0 stop
sleep 2
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac
exit 0
赋予执行权限并注册服务:
chmod +x /etc/init.d/drupal
chkconfig --add drupal
chkconfig drupal on
提示:
su - apache -c中的-参数至关重要。它会加载apache用户的完整环境变量(包括PATH),否则/usr/bin/php可能找不到。CentOS 6的apache用户默认shell为/sbin/nologin,-参数能绕过此限制。
4.5 安装向导的命令行替代方案
跳过
install.php
,直接执行数据库初始化:
# 切换到Drupal根目录
cd /var/www/html
# 执行Drupal安装脚本(需先安装Drush,见下文)
drush site-install standard --db-url=mysql://drupaluser:StrongPass123!@localhost/drupal --site-name="My Site" --account-name=admin --account-pass=AdminPass123! -y
若未安装Drush,用PHP脚本替代:
php ./scripts/install.php --db-url=mysql://drupaluser:StrongPass123!@localhost/drupal --locale=en --profile=standard --account-name=admin --account-pass=AdminPass123!
注意:
install.php脚本在CentOS 6上需PHP CLI模式,且memory_limit必须≥128M。在/etc/php.ini中设置:memory_limit = 256M max_execution_time = 300
4.6 Drush 7.4.0的离线安装
Drush是Drupal运维的生命线。CentOS 6的PHP 5.3.3不支持Composer,必须手动安装Drush 7.4.0(最后一个兼容PHP 5.3的版本):
cd /tmp
wget https://github.com/drush-ops/drush/releases/download/7.4.0/drush.phar
chmod +x drush.phar
mv drush.phar /usr/local/bin/drush
drush init
关键:
drush init会创建~/.drush/drushrc.php,需手动修改其中的$options['php'] = '/usr/bin/php';,确保指向正确的PHP路径。CentOS 6常存在多个PHP版本(如/usr/bin/php和/opt/php53/bin/php),必须确认。
4.7 安装后安全加固的五项操作
安装完成不等于安全。CentOS 6环境下必须立即执行:
-
删除install.php :
rm /var/www/html/install.php -
锁定settings.php :
chmod 444 /var/www/html/sites/default/settings.php -
禁用PHP文件上传(除非必需) : 在
/etc/php.ini中设置:file_uploads = Off upload_max_filesize = 0M -
配置Apache禁止访问敏感目录 : 在
/etc/httpd/conf/httpd.conf中添加:<Directory "/var/www/html/sites/*/files"> Order Deny,Allow Deny from all </Directory> <Directory "/var/www/html/sites/*/private"> Order Deny,Allow Deny from all </Directory> -
启用Apache日志记录 : 确保
/etc/httpd/conf/httpd.conf中包含:LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined CustomLog logs/access_log combined
经验:第4项配置是CentOS 6特有的高危点。默认Apache配置允许直接访问
sites/default/files,攻击者可通过http://yoursite.com/sites/default/files/shell.php执行恶意代码。必须用<Directory>指令显式拒绝。
5. 故障排查实战:从HTTP 500到Drupal白屏的完整溯源链
在CentOS 6虚拟服务器上,Drupal部署失败极少是单一原因。更多是“错误链”:一个配置失误触发另一个异常,最终表现为白屏或500错误。以下是我在真实客户现场记录的七个典型故障及其完整溯源过程,每个案例都包含日志证据、根本原因和修复步骤。
5.1 故障现象:访问首页返回空白页,无任何错误信息
日志证据
:
/var/log/httpd/error_log
中无PHP错误,但
/var/log/httpd/access_log
显示
"GET / HTTP/1.1" 200 0 "-" "Mozilla/5.0"
溯源过程 :
-
检查PHP错误报告是否关闭:
php -i | grep "display_errors"→ 输出Off -
查看
/etc/php.ini:display_errors = Off且error_reporting = E_ALL & ~E_DEPRECATED -
临时启用错误显示:
echo "display_errors = On" >> /etc/php.ini -
重启Apache:
service httpd restart -
再次访问,出现
Fatal error: Call to undefined function mb_strlen()
根本原因
:
mbstring
扩展未安装。CentOS 6.10的EPEL源中包名为
php53-mbstring
。
修复步骤 :
yum install php53-mbstring
service httpd restart
注意:
mbstring是Drupal 7的硬性依赖,但yum install php不会自动安装它。这是CentOS 6环境最常被忽略的扩展。
5.2 故障现象:安装向导卡在“验证数据库设置”,无限转圈
日志证据
:
/var/log/httpd/error_log
中出现
PHP Warning: mysqli::mysqli(): (HY000/2002): No such file or directory in /var/www/html/includes/database/mysql/database.inc on line 47
溯源过程 :
-
mysqli扩展已安装(php -m | grep mysqli返回mysqli) -
但
mysqli.default_socket未设置:php -i | grep "mysqli.default_socket"→ 无输出 -
CentOS 6的MySQL socket路径为
/var/lib/mysql/mysql.sock,而PHP默认查找/tmp/mysql.sock
根本原因 :PHP未配置MySQL Unix socket路径。
修复步骤
:
在
/etc/php.ini
中添加:
mysqli.default_socket = /var/lib/mysql/mysql.sock
pdo_mysql.default_socket = /var/lib/mysql/mysql.sock
重启Apache。
5.3 故障现象:登录后台后所有页面返回404,但首页正常
日志证据
:
/var/log/httpd/error_log
中出现
File does not exist: /var/www/html/admin
,但
/var/www/html/admin.php
存在。
溯源过程 :
-
检查
.htaccess文件:ls -la /var/www/html/.htaccess→ 权限为600 - Apache无法读取600权限的文件(仅所有者可读)
-
chmod 644 /var/www/html/.htaccess
根本原因
:
.htaccess
权限错误导致mod_rewrite规则未加载,URL别名功能失效。
提示:CentOS 6的
AllowOverride All指令在/etc/httpd/conf/httpd.conf中默认注释。必须取消注释并重启Apache。
5.4 故障现象:上传图片时提示“文件类型不被允许”,但JPG/PNG已列入白名单
日志证据
:
/var/log/httpd/error_log
中出现
PHP Warning: getimagesize(): failed to open stream: Permission denied in /var/www/html/includes/image.inc on line 123
溯源过程 :
-
sites/default/files目录权限为755,但SELinux阻止Apache读取 -
ausearch -m avc -ts recent | grep httpd→ 返回avc: denied { read } for ... comm="httpd" name="files"
根本原因 :SELinux策略阻止Apache访问文件目录。
修复步骤 :
chcon -R -t httpd_sys_rw_content_t /var/www/html/sites/default/files
setsebool -P httpd_can_network_connect_db 1
5.5 故障现象:Drush命令报错
Command pm-updatestatus needs a higher bootstrap level to run
日志证据
:
drush status
返回
Drupal version : 7.96
,但
drush pm-updatestatus
报错
溯源过程 :
-
drush status显示Site path : sites/default -
但
/var/www/html/sites/default/settings.php中$base_url未设置 -
Drush在解析模块更新时需构造完整URL,
$base_url为空导致bootstrap失败
根本原因
:
settings.php
中
$base_url
未配置。
修复步骤
:
在
/var/www/html/sites/default/settings.php
中添加:
$base_url = 'http://yourdomain.com'; // 必须与实际域名一致
5.6 故障现象:Cron任务执行失败,
drush cron
返回
WD cron: Cron run completed.
但无实际效果
日志证据
:
/var/log/httpd/error_log
中出现
PHP Fatal error: Call to undefined function curl_init()
溯源过程 :
-
curl扩展未安装:php -m | grep curl→ 无输出 -
CentOS 6.10的EPEL源中包名为
php53-curl
根本原因
:
curl
扩展缺失,Drupal的HTTP请求(如模块更新检查)失败。
修复步骤 :
yum install php53-curl
service httpd restart
5.7 故障现象:后台主题管理页面空白,浏览器控制台报
Uncaught ReferenceError: jQuery is not defined
日志证据
:
/var/log/httpd/error_log
中无错误,但
/var/www/html/sites/default/files/js/
目录为空
溯源过程 :
-
检查
/var/www/html/sites/default/files权限:drwxr-xr-x(755) -
Apache用户
apache对files目录只有读权限,无法写入JS/CSS聚合文件 -
chmod 775 /var/www/html/sites/default/files
根本原因
:
files
目录权限不足,导致Drupal无法生成聚合的JS/CSS文件。
经验:所有
files目录的权限必须为775(所有者+组可读写),且组必须为apache。chmod 775比chmod 755多出的“组写权限”是Drupal正常工作的关键。
6. 生产环境加固:CentOS 6虚拟服务器上的Drupal长期运维要点
部署完成只是开始。在CentOS 6这个已终止支持的平台上,Drupal 7.96的长期运维需要一套特殊的加固策略。这不是简单的“打补丁”,而是构建一个能在废弃基础设施上持续呼吸的系统。以下是我为三个不同客户制定的运维清单,每一条都源于真实事故。
6.1 日志监控的定制化方案
CentOS 6的
logrotate
默认不处理Drupal日志。必须创建
/etc/logrotate.d/drupal
:
/var/www/html/sites/default/files/php/*log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 644 apache apache
sharedscripts
postrotate
/bin/kill -USR1 `cat /var/run/httpd/httpd.pid 2>/dev/null` 2>/dev/null || true
endscript
}
关键:
create 644 apache apache确保新日志文件由apache用户创建,避免权限冲突。postrotate中的kill -USR1通知Apache重新打开日志文件,这是CentOS 6特有的信号处理方式。
6.2 数据库备份的原子性保障
CentOS 6的
mysqldump
在大型Drupal站点上易因锁表失败。采用
--single-transaction
参数(InnoDB专用):
#!/bin/bash
# /root/scripts/drupal-backup.sh
DATE=$(date +%Y%m%d_%H%M%S)
mysqldump --single-transaction -u drupaluser -p'StrongPass123!' drupal | gzip > /backup/drupal_$DATE.sql.gz
find /backup -name "drupal_*.sql.gz" -mtime +7 -delete
添加到crontab:
# 每天凌晨2点执行
0 2 * * * /root/scripts/drupal-backup.sh
注意:
--single-transaction仅对InnoDB表有效。若Drupal使用MyISAM(不推荐),必须改用--lock-all-tables,但这会导致网站短暂不可用。
6.3 安全补丁的离线应用流程
CentOS 6无法在线获取Drupal安全补丁。标准离线流程:
-
在联网机器下载补丁:
wget https://www.drupal.org/files/issues/2022-11-15/drupal-7.96-to-7.97.patch -
用
scp传到CentOS 6服务器:scp drupal-7.96-to-7.97.patch user@centos6:/tmp/ -
在Drupal根目录应用:
cd /var/www/html patch -p1 < /tmp/drupal-7.96-to-7.97.patch -
清除缓存:
drush cc all -
运行数据库更新:
drush updb -y
警告:
patch -p1中的-p1参数必须准确。若补丁文件路径为a/core/modules/system/system.module,-p1会去掉a/前缀,正确匹配core/modules/system/system.module。参数错误会导致补丁应用失败且无提示。
6.4 性能瓶颈的针对性优化
CentOS 6虚拟服务器常因内存不足导致Drupal响应缓慢。针对性优化:
-
Apache MPM配置
:在
/etc/httpd/conf/httpd.conf中修改:<IfModule mpm_prefork_module> StartServers 2 MinSpareServers 2 MaxSpareServers 5 MaxRequestWorkers 150

939

被折叠的 条评论
为什么被折叠?



