var
来源:景安IDC资讯作者:server发布时间:2015-10-15点击:2543
1、错误现象
这是一个使用景安服务器的客户案例,客户反映在执行“apache start”启动Apache时无报错信息,但是网页还是不能访问。客户的网站是基于Apache+PHP+Mysql的在线交易平台,听到客户描述的现象后,第一反应应是防火墙屏蔽了HTTP端口或SELinux的问题,于是登录服务器查看相关信息,如下图。
从输出可知,防火墙所有策略都处于开放状态,并未所任何限制,而SELinux也处于关闭状态,应该不是防火墙问题导致的。
既然不是防火墙拦截的问题,那么看看httpd进程是否存在及httpd端口是否正常启动,操作过程如下图。
这个操作首先查看了服务器上的httpd进程,发现并没有httpd进程运行,同时httpd对应的端口80也并无启动,于是重新启动Apahce,在启动Apache的过程中并没有报错,启动完成后发现仍然没有httpd进程运行,由此看来,应该是Apache内容出现了问题。
2、解决思路
在判断是Apache的问题后,首先要看的就是Apache的启动日志,在查看Apache的error日志后,发现了一个可疑输出,内容为:
No space left device:mod_rewrite:could not create rewrite_log_lock Configuration Failed
看到这个错误提示,感觉应该是磁盘空间耗尽导致的,于是赶紧查看系统所有磁盘分区,结果发现所有磁盘分区都还有很多可用空间,这就有些奇怪了。
Linux下对磁盘空间的占用分为三个部分:物理磁盘、inode节点磁盘空间和信号磁盘空间。通过检查服务器的物理磁盘空间,发现仍有很多剩余,因此就被排除了物理磁盘空间的问题。接着通过“df -i”命令查看系统可用的inode节点,发现每个分区可用的inode还有很多,这样inode节点问题也被排除了,那么应该是信号量磁盘空间耗尽导致的。
这里简单介绍了Linux信号量相关的知识,信号量是一种锁机制用于协调进程之间互斥的访问临界资源,以确保某种共享资源不被多个进程同时访问。Linux系统的信号量是用于进程间通信的。它有两种标准实现,分别是POSIX及System v,现在大多数Linux系统都实现了这两种标准。这两种标准都可用于进行线程间的通信,只是系统调用方式略有不同。
Syetem v信号量通过系统调用semget来创建,通过linux命令ipcs即可显示进程间通信用的System v类型信号量及共享内存。
POSIX信号量可用于线程和线程间通信,并可分为有名和无名两种。也可简单理解为是否保存在磁盘上。有名的信号量会以文件形式保存在/dev/shm下,因此可用于不相关的进程间通信,而无名信号量只能用于线程间和父子进程间通过。
在对信号量有了简单了解后,可以发现Apaceh使用的进程间通信方式应该是Syqtem v,因此就可以通过ipcs命令查看和解决这个问题了。
3、解决问题
在解决这个问题之前,首先查看下Linux系统默认信号量的设置值是多少,执行如下命令:
[root@localhost ~]#cat /proc/sys/kemel/sem
250 32000 32 128
这四个输出值的含义如下:
SEMMSL,此参数用于控制每个信号集的最大信号数。
SEMMNS,此参数用于控制整个Linux系统中信号的最大数量。
SEMOM,此参数用于控制每个semop系统调用可以执行的信号操作数。
SEMMNI,此内核参数用于控制整个Linux系统中信号集的最大数量。
接着通过ipcs命令查看httpd进程占用了多少信号量,执行如下命令:
[root@localhost ~]#ipcs -s|grep daemon
其中“daemon”是启动Apahce进程的用户,默认是daemon,也可能是nobody用户,根据实际环境而定。执行完此命令后,发现很多基于daemon的信号量输出,问题终于找到了。解决信息量耗尽的方法很简单,通过ipcrm命令消除即可,最简单方法是执行如下命令组合:
[root@localhost ~]#ipcs -s | grep nobody|perl -e'while(<STDIN>)'{@=split(^s+/)};print'ipcrm sem $a[1]'
执行完上面这个命令后,再次启动Apache,然后查看是否有httpd进程启动,可以看到,此时httpd进程启动了,那么Apache也工作正常了。
版权声明:本文系技术人员研究整理的智慧结晶,转载勿用于商业用途,并保留本文链接,侵权必究!