由于开启SELinux导致memcached能启动但无法用php连接的问题

本文记录了一次Memcached配置过程中遇到的问题及解决过程。作者在迁移博客网站至CentOS5.2后,发现Memcached服务在系统重启后无法正常工作。尽管能通过telnet连接,但监控脚本无法获取有效数据。最终通过禁用SELinux解决了该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天给我的博客托管网站搬家,搬到国外的一个VPS提供商处,系统为CentOS 5.2,在配置memcached的时候,出问题了,具体的表现是

  1. 刚开始编译、安装memcached并运行,和wordpress mu能够很好的进行配合,通过监控的php程序能够连接并显示memcached运行状态。编译的选项为

    ./configure --enable-64bit --enable-threads

  2. 但是由于什么原因,系统资源被耗尽了,于是系统被我暴力关闭并重新启动了。
  3. 系统被暴力重新启动后,memcached无法正常工作,具体表现为监控memcached的php程序无法连接到memcached,使用memcached主页标准的测试程序也显示无法连接。
  4. 但是可以通过 telnet localhost 11211或者telnet 127.0.0.1 11211来连接到memcached的服务器,并且可以使用version和stats命令获得memcached的状态,但是得到的结果是get set, hits, misses全部为0。

查阅了很多网上的文章,绝大部分的都是连接被拒绝,memcached无法启动这类错误,与我的表现均不相同,没办法,只能摸着石头解决问题了,做了如下尝试均无果(无果指memcached主页提供的php测试程序无法连接到memcached服务器)

  1. 考虑到可能是暴力关闭系统损坏了文件系统,尝试重新编译libenv和memcached并重新安装,重新启动,无效。
  2. 考虑到可能刚刚release的版本引入新的bug,故卸载了最新的memcached 1.2.8并编译安装1.2.7,重新启动,无效。
  3. 考虑到可能是因为防火墙禁止了11211端口,于是运行system-config-securitylevel-tui 程序,将11211端口的tcp连接启用,重新应用防火墙规则,重新启动,无效。
  4. 使用  netstat -ntlp | grep memcached 结果如下,在memcached的启动脚本中增加了 -l 127.0.0.1 的选项,重新启动,无效。

    tcp        0      0 0.0.0.0:11211            0.0.0.0:*                LISTEN      4959/memcached    
    tcp        0      0 :::11211                    :::*                        LISTEN      4959/memcached   

  5. 百思不得其解,最后想到会不会是因为开启了SELinux ,导致无法建立TCP连接呢,于是通过system-config-securitylevel-tui关闭了SELinux,重启,居然可以了!

 

说明

  1. 监控其运行的程序为memcache.php,来自http://livebookmark.net/journal/
  2. 启动和停止脚本来自 http://idcnews.net/html/edu/20080424/300253.html
要从日志中查看SELinux权限导致的网络无法使用问题,可以按照以下步骤进行操作: 1. 打开终端,以root用户身份登录系统。 2. 使用以下命令查看SELinux日志: ``` grep AVC /var/log/audit/audit.log ``` 这个命令将会输出所有包含 "AVC" 的日志记录,这些记录表示SELinux原子策略的决策。 3. 在输出中查找与网络相关的日志记录。例如,你可以搜索 "network"、"port"、"socket"、"httpd" 或 "ftp" 等关键词,以查找与网络相关的日志记录。 4. 了解SELinux的决策。在日志记录中,你会看到一些以 "AVC" 开头的记录,其中包含了SELinux的决策信息。例如: ``` type=AVC msg=audit(1436929977.620:289): avc: denied { name_connect } for pid=3211 comm="httpd" dest=80 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:http_port_t:s0 tclass=tcp_socket ``` 这条记录表示,一个进程(httpd)尝试连接到端口80,但是由于SELinux的策略,这个连接被拒绝了。在这个例子中,原因是 httpd 进程的安全上下文(scontext)是 "unconfined_u:system_r:httpd_t:s0",而目标端口的安全上下文(tcontext)是 "system_u:object_r:http_port_t:s0"。由于这两个安全上下文不匹配,SELinux拒绝了这个连接。 5. 修改SELinux的策略。如果你在日志中发现了与网络相关的SELinux拒绝记录,那么你需要针对这些记录来修改SELinux的策略。例如,在上面的例子中,你需要将 httpd 进程的安全上下文与目标端口的安全上下文进行匹配。你可以使用 `chcon` 命令来修改文件或目录的安全上下文,使用 `semanage` 命令来修改SELinux策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值