最近在OpenBSD系统上成功搭建了一套Discuz!论坛环境,从系统安装到MySQL参数调优,整个过程经历了不少挑战,也积累了一些实用经验。本文将以Windows XP + VMware 5为虚拟化平台,详细介绍OpenBSD 4.1下Apache 2.0.55、MySQL 4.1.21、PHP 4.4.4以及Discuz! 6.0 UTF-8版的完整安装步骤与关键优化技巧,帮助您快速上手并避免常见陷阱。
一、环境搭建步骤
1. 基础设置
安装完OpenBSD 4.1系统后,第一步需要确认系统自带的Apache服务已停止运行。通过编辑/etc/rc.conf文件中的相关参数即可关闭默认服务。随后开启OpenBSD的FTP服务,方便后续上传所需的软件包。
2. 安装MySQL
# tar zxvf mysql-4.1.21.tar.gz
# cd mysql-4.1.21
# ./configure --prefix=/usr/local/mysql --with-charset=gb2312
# make
# make install
# ./scripts/mysql_install_db
# adduser mysql
# chown -R root /usr/local/mysql
# chown -R mysql /usr/local/mysql/var
# chgrp -R mysql /usr/local/mysql
# cp /usr/local/mysql/share/my-small.cnf /etc/my.cnf
# /usr/local/mysql/bin/safe_mysqld --user=mysql & (启动MySQL服务)
# /usr/local/mysql/bin/mysqladmin -u-root -p password 'new-password' (设置数据库管理员密码)
3. 安装Apache
# tar zxvf httpd-2.0.55.tar.gz
# cd httpd-2.0.55
# ./configure --enable-module=so //默认安装路径为/usr/local/apache2
# make
# make install
4. 安装PHP
# tar zxvf php-4.4.4.tar.gz
# cd php-4.4.4
# ./configure --with-mysql --with-apxs2=/usr/local/apache2/bin/apxs //因OpenBSD预装了Apache1.3,需使用--with-apxs2参数
# make
# make install
# cp php.ini-dist /usr/local/lib/php.ini
接下来编辑/usr/local/apache2/conf/httpd.conf配置文件,添加以下内容以支持PHP解析:
DirectoryIndex index.html index.htm index.php index.php3
AddType application/x-httpd-php .php .phtml
AddType application/x-httpd-php-source .phps
本PHP版本已默认集成Zend Optimizer,无需额外安装即可获得代码优化支持。
5. 设置开机自启动
编辑/etc/rc.local文件,加入以下命令实现开机自动启动Apache和MySQL服务:
/usr/local/apache2/bin/apachectl start
/usr/local/mysql/bin/safe_mysqld --user=mysql &
6. 测试环境
# cd /usr/local/apache2/htdocs
# vi info.php
在浏览器中访问https://localhost/info.php,若能正常显示PHP配置信息,即表示Web运行环境搭建成功。
7. 安装Discuz! 6.0
需要特别注意的是:UTF-8版本能够正常安装,而GBK版本在此环境中会出现兼容性问题。将Discuz! 6.0的upload目录上传至/usr/local/apache2/htdocs,按要求修改相关目录权限,随后编辑config.inc.php配置文件中的数据库连接信息。完成配置后,访问https://IP/upload/install.php即可进入安装向导。
安装过程中需要注意的几个常见问题:
1)数据库连接报错处理
如果安装程序在执行到数据库连接阶段卡住,并出现类似Warning: mysql_pconnect(): Client does not support authentication protocol requested by server...的提示,这是由于MySQL 4.1之后版本对认证协议进行了升级。以下是两种常用的解决方法:
- 确保使用的MySQL client端版本为4.1或更高版本。
- 在MySQL命令行中执行以下任一命令(二选一):
mysql> SET PASSWORD FOR 'some_user'@'some_host' = OLD_PASSWORD('newpwd');
或者
mysql> UPDATE mysql.user SET Password = OLD_PASSWORD('newpwd') WHERE Host = 'some_host' AND User = 'some_user';
mysql> FLUSH PRIVILEGES;
2)重新安装前的清理工作
若需要重新安装Discuz!,务必先删除对应的数据库,然后移除upload/forumdata/install.lock锁定文件,否则安装程序将拒绝执行重新安装操作。
3)内存资源不足的解决方案
最初虚拟机仅分配了128MB内存,访问论坛时频繁出现MySQL错误。将虚拟机内存提升至256MB后系统运行趋于稳定,因此建议为虚拟机分配足够的内存资源。
二、MySQL参数优化
通过命令# mysqladmin -uroot -p'xxxx' variables可以查看当前MySQL的运行参数。以下是在my.cnf配置文件中需要调整的关键参数,请根据实际业务负载情况进行合理配置。以下是需要重点关注的核心参数:
- key_buffer_size —— 该参数对MyISAM存储引擎的表性能影响极大。如果主要使用MyISAM表,建议设置为可用内存的30-40%。但需要结合索引大小和数据量进行合理分配,避免资源浪费。若很少使用MyISAM,保留16-32MB用于临时表索引即可。
- innodb_buffer_pool_size —— 这是InnoDB存储引擎最关键的参数。InnoDB对缓存高度敏感,默认的8MB值会导致数据库响应缓慢。如果系统完全使用InnoDB,可以大胆设置为内存总量的70-80%。若数据量较小且预计不会快速增长,则不宜设置过大。
- innodb_additional_pool_size —— 该参数对整体性能影响相对较小,通常配置20MB左右即可满足需求,主要用于存放数据目录信息等内部数据结构。
- innodb_log_file_size —— 在写入负载较高的场景下尤为重要。该值越大,写入性能就越高,但同时也会延长数据恢复时间。一般建议设置在64-512MB范围内,根据服务器规模灵活调整。
- innodb_log_buffer_size —— 默认值为1MB。如果系统存在写入峰值或较高负载,可以将其增加至8-16MB。注意不宜设置过大,因为该缓冲区每秒都会刷新到磁盘,够用即可。
- innodb_flush_log_at_trx_commit —— 默认值为1,表示每次事务提交都会同步刷入磁盘,这种模式性能较差。在许多应用场景下,设置为2即可(仅刷新到操作系统缓存),系统会每秒再将数据写入磁盘,最多可能丢失1秒钟的事务数据。设置为0可以获得更高性能,但同时也带来更大风险。
- table_cache —— 打开表操作的开销较大,尤其对于MyISAM引擎。如果数据库表数量超过200张,建议设置为1024。连接数越大,该值也应相应增加。
- thread_cache —— 线程的创建和销毁操作开销很大,建议至少设置为16。如果并发连接数较多且监控发现
Threads_Created值持续偏高,可进一步加大该值。 - query_cache —— 在读操作密集且没有应用层缓存机制的场景下比较有效。注意不宜设置过大(建议范围32-512MB),否则缓存维护开销反而会拖慢MySQL性能。建议配置完成后持续监控缓存命中率,以评估优化效果。
下面用表格汇总了常用参数及其推荐配置值,方便参考:
| 参数名称 | 定义 | 用途 | 设置方法 | 默认大小 |
| back_log | 指定到来的TCP/IP连接的侦听队列大小 | LINUX系统推荐小于512的整数,一般设置成300 | 50 | |
| key_buffer_size | 索引缓存大小 | 优化索引的缓冲区大小 | 根据*.MYI的文件大小进行设置,没有MYISAM表的情况下保留16-32M提供磁盘临时表索引用 | |
| max_connections | 最大连接数 | 优化MYSQL的最大连接数 | 500 | 100 |
| innodb_buffer_pool_size | INNODB缓冲池大小 | 用于缓存表的数据与索引 | 内存的80% | 8388608 (8M) |
| innodb_additional_mem_pool_size | INNODB附加内存缓存池大小 | 用于存放数据目录信息和其他内部数据结构 | 20M左右 | 1048576 (1M) |
| innodb_log_file_size | 每个日志文件大小 | 用于存放日志 | 64-512M | 5242880 (5M)32位机器小于4G |
| innodb_log_buffer_size | 每个日志文件缓存大小 | 优化高强度写入与短事务处理能力 | 8-16M | 1048576 (1M) |
| innodb_flush_log_at_trx_commit | 提交事务日志刷新方式 | 0.不刷新事务提交1.刷新到磁盘2.刷新到操作系统缓存 | 2.刷新到操作系统缓存。后果:除非操作系统崩溃或停电会损失1秒的事务提交记录 | |
| table_cache | 表缓存 | 缓存已打开的表 | 1024 | 64 |
| thread_cache_size | 线程缓存大小 | 它的目的是在通常的操作中无需创建新线程。 | 至少16 | 0 |
| query_cache_size | 查询缓存大小 | 提高缓存命中率 | 32-512M | 0 |
| sort_buffer_size | 查询排序缓存大小 | 优化排序缓存空间 | 6M | 2M |
| read_buffer_size | 读查询缓存大小 | 优化读查询操作缓存空间 | 4M | 130K |
| join_buffer_size | 联合查询操作缓存大小 | 优化联合查询操作缓存空间 | 8M | 130K |
