现象
客户反馈执行apachectl start后无报错信息,但是网站无法访问。
第一反应是防火墙屏蔽了httpd的端口或者SELinux问题。登录服务器查看:
[root@db ~]# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@db ~]# iptables -L -n -t nat Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination
[root@db ~]# grep -i selinux /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of three two values: SELINUXTYPE=targeted
发现防火墙和SELinux并未做限制,然后查看httpd的启动状况
[root@db ~]# ps -ef|grep httpd|grep -v grep|wc -l 0 [root@db ~]# ss -lnltp|grep 80
发现httpd未启动,这时尝试启动httpd,发现没有前台报错,并且服务无法启动,应该是Apache内部问题,这时查看Apache错误日志,发现有如下报错信息:
No space left on device : mod_rewrite : could not create rewrite_log_lock Configuration Failed
解决思路
看到报错,感觉是磁盘空间被耗尽导致的,于是查了一下inode和磁盘空间,发现磁盘空间和inode还有很多剩余。
由于Linux的磁盘空间由三部分组成:物理空间(block)、索引节点空间(inode)和信号量(Semaphore)组成。
Linux系统信号量
Linux信号量是一种锁机制,用于协调系统上的进程间互斥的访问临界资源,确保某种共享资源不被多个进程同时访问。有两种实现标准,system v和POSIX,大多数系统都是使用的这两种标准。这两种标准系统调用的方式如下:
- System v信号量通过系统调用semget创建,通过Linux命令ipcs即可显示进程间通信system v类型信号量和共享内存
- POSIX 信号量可用于线程和进程间通信,分为有名和无名两种。通过是否保存在磁盘上进行区分
- 有名的信号量 以文件的形式保存在/dev/shm,可用于不相关的进程间通信(曾经看到过客户将数据库的数据目录保存于此,牛逼!!)
- 无名信号量 只能永远忽线程间和父子进程间通信
解决问题
查看Linux系统默认信号量的值
[root@db ~]# cat /proc/sys/kernel/sem 250 32000 32 128
含义如下:
SEMMSL: 此参数用于控制每个信号集的最大信号数
SEMMNS: 此参数用于控制整个Linux系统中信号(不是信号集)的最大数量
SEMOPM:此参数用于控制每个semop系统调用可以执行的信号操作数
SEMMNI:此内核参数用于控制整个Linux系统中信号集的最大数量
通过ipcs查看httpd进程占用了多少信号量
[root@db ~]# ipcs -s|grep daemon