zoukankan      html  css  js  c++  java
  • 由于信号量apache启动问题

    现象

    客户反馈执行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 信号量可用于线程和进程间通信,分为有名和无名两种。通过是否保存在磁盘上进行区分
    1. 有名的信号量 以文件的形式保存在/dev/shm,可用于不相关的进程间通信(曾经看到过客户将数据库的数据目录保存于此,牛逼!!)
    2. 无名信号量  只能永远忽线程间和父子进程间通信

    解决问题

    查看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
  • 相关阅读:
    Web 开发基础之JavaScript
    WEB框架之-Django入门
    JQuery
    Web 开发基础之CSS
    Django simple_tag,filte,分页以及cookie和装饰器
    Django进阶之CSRF
    Django进阶之session
    继续Django
    VS Code快捷键
    前端:文件下载功能
  • 原文地址:https://www.cnblogs.com/zh-dream/p/13296264.html
Copyright © 2011-2022 走看看