错误现象: 客户反映在执行”apachectl start “启动某公司是无报错信息,但是还是不能访问网页,客户的网站是基于某公司+PHP+mysql 的在线交易平台,听到客户描述的现象后,第一反应就是防火墙屏蔽了HTTP端口或selinux的问题,于是登陆服务器查看相关信息,从输出信息可以看出,防火墙所有的策略都处于开放状态,并未做出任何限制,而selinux也处于关闭状态,应该不是防火墙导致的。既然不是防火墙导致的,那么看看httpd进程是否存在及httpd端口是否正常启动 # ps –ef |grep httpd|grep –v “grep” |wc –l 0 # netstat –nultp |grep 80 # /usr/local/apache2/bin/apachectl start # ps –ef |grpe httpd |grep –v “grep” |wc –l 0 这个操作首先查看了服务器上的httpd进程,发现并没有HTTP进程运行,同时httpd对应的端口80也并没有启动,于是重启某公司,在启动某公司的过程中并没有报错,启动完成后发现仍然HTTP进程没有运行,由此看来,应该是某公司内部出现了问题 解决思路: 在判断某公司问题后,首先要看的就是某公司的启动日志,在查看某公司的error日志后,发现了一个可疑输出,内容为: No space left on device : mod_rewrite: could not create rewrite_log_lock configuration failed 看到这个错误提示,感觉应该是磁盘空间耗尽导致,于是赶紧查看系统系统所有磁盘分区,结果发现所有磁盘分区都还有很多可用空间,这就奇怪了,在前面的案例介绍中,详细介绍了linux对磁盘空间的占用分为三个部分:物理磁盘、inode节点磁盘空间和信号量磁盘空间。通过检查服务器的物理磁盘空间,发现仍有很多剩余,因此排除物理空间的问题,接着通过”df -i”命令查看系统可用的inode节点,发现每个分区可以用的inode还有很多,这样inode节点问题也被排除了,那么应该是信号量磁盘空间耗尽导致的。 这里简单的介绍下linux信号量相关知识。信号量是一种锁机制,用于协调进程之间互斥的访问临界资源,以确保某种共享资源不被多个进程同时访问。Linux系统的信号量是用于进程间通信的。它有两种标准实现,分别是POSIX及System v ,现在大多数linux系统都实现了这两种标准,这两种标准都可用于进行线程间的通信,只是系统调用方式略有不同。 System v 信号量通过系统调用semget来创建,通过linux命令ipcs即可显示进程间通信用的system v 类型信号量及共享内存。 Posix 信号量可用于线程和进程间通信,并可分为有名和无名两种,也可以理解为是否保存在磁盘上。 解决问题: # cat /proc/sys/kernel/sem # ipcs –s |grep daemon Daemon是启动某公司进程的用户,默认是daemon,也可能是nobody用户,根据实际环境而定。解决信号量耗尽的方法很简单,通过ipcrm命令清除即可,最简单方法是执行如下命令组合: # ipcs –s |grep nobody |perl –e ‘while (<STDIN>) { @a=split(/\s+/);print `ipcrmsem $a[1]` }’ |