首先,我必须说我不是服务器管理方面的专家。我在多个平台上从事网络编程已有 10 多年,但大多数时候都是在 IT 专业人员或优秀的网络托管公司参与的情况下完成的。
现在我终于需要从头开始构建一个 LAMP 设置(仅使用原始 CentOS 安装)来为相当密集的 Wordpress 设置提供服务。
一切都进行得很顺利,因为我已经熟悉了基于 Linux 的服务器管理,使一切运行起来,但每周我都会遇到几次非常奇怪的系统冻结现象,而且由于我是唯一可以访问服务器和启动服务的人,所以这真的很烦人。
以下是一些关键数据:
服务器
- 384MB 内存
- CentOS 5.6
- PHP 5.2.10
- MySQL 5.0.77
- Apache 2.2.3
用法
- 约 300 篇 Wordpress 文章
- 每周约有 1 万名独立用户
- 每月页面浏览量约 10 万次
- 所有静态内容(jquery、样式、布局图像)均来自外部网络服务器。
- Wordpress 缓存尽可能多(W3 Total Cache)
已完成的事情:
我把问题缩小到内存管理 - 或者说缺乏内存管理。由于某种原因,服务器上禁用了交换,一旦内存消耗达到 100%,服务器就会陷入混乱,一切希望都破灭了。内存量(384MB)应该足以托管具有这些统计数据的网站,所以肯定出了问题。我只是不知道会是什么问题。
我显然尝试过调整 my.cnf、php.ini 和 httpd.conf 中的设置,但无济于事。这是我目前的关键设置:
我的cnf
skip-innodb
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
skip-locking
skip-ndbcluster
skip-bdb
skip-networking
safe-show-database
query_cache_limit=8M
query_cache_size=48M
query_cache_type=1
max_user_connections=200
max_connections=32
interactive_timeout=60
wait_timeout=60
connect_timeout=50
thread_cache_size=4
key_buffer= 96M
join_buffer=1M
max_connect_errors=20
max_allowed_packet=32M
table_cache=1024
record_buffer=1M
sort_buffer_size=6M
read_buffer_size=6M
read_rnd_buffer_size=6M
thread_concurrency=4
myisam_sort_buffer_size=32M
server-id=1
user=mysql
tmp_table_size=64M
max_heap_table_size=48M
php.ini
memory_limit = 128M
httpd配置文件
StartServers 2
MinSpareServers 3
MaxSpareServers 5
ServerLimit 16
MaxClients 16
MaxRequestsPerChild 1000
在这一部分,我可能很明显是在凭直觉行事。这些设置对于 384MB 的服务器设置来说是否合理?在唯一的解决方案是我登录以重新启动 mysqld 和 httpd 的情况下,还能做些什么来减少崩溃的次数?
我知道所有这些或多或少已经被讨论过一百万次了,相信我,我已经浏览了从 Server Fault 中找到的所有线程,尝试了所有的提示和指针,但都无济于事。
愚蠢的是,我们从一个非常可靠的网络托管设置转移到这种更昂贵的虚拟服务器设置,以减少对服务器稳定性和扩展性的担忧,但事实上它使事情变得更糟,毫无疑问 99% 是由于我作为管理员的缺点!
所以,各位大师们,请帮帮我吧。我保证,我绝不会向 IT 人员抱怨任何事情,并且只会编写易于部署的代码,不会在半夜崩溃,并且除了系统管理员日之外,在其他日子里通常会以积极的方式记住您。
答案1
- Apache 占用大量内存,主要是因为使用 mpm_worker 时,每个客户端请求都有自己的进程,而使用 mod_php 时,每个客户端进程都有自己的嵌入式 PHP VM。尝试减少或禁用 KeepAlive 间隔,这样可以更快地释放客户端进程(对于大多数用例来说,2 秒就足够了)。
如果你没有交换分区,你仍然可以像这样设置交换文件
dd if=/dev/zero of=/swapfile1 bs=1024 count=524288
mkswap /swapfile1
swapon /swapfile1
echo“/swapfile1 swap swap defaults 0 0”>> /etc/fstabWeb 服务器交换仍然会降低性能,但不会停止。
- 使用更轻量级的 Web 服务器(例如 Nginx)替换 Apache,以减少内存使用量。CentOS 上 nginx + php 的安装
- 如果发现内存仍然不足,请减少 MySQL 的查询缓存缓冲区大小。如果您没有使用 InnoDB 存储引擎,则可以将 skip-innodb 添加到 my.cnf 以减少内存使用量。
- 找出占用内存的内容(查看 htop/top,阅读日志)。