WEB应用

修改Apache的超时设置,解决长连接请求超时问题

某日,组内后台开发找到我,问我们的WEB服务器超时设置是多少。他反馈的问题是,有一个VLAN切换任务cgi接口经常返回504网关超时错误,要我分析解决下。 我问了一下,得知这个请求遇到网络设备对象较多的时候,需要小半个小时才能完成,也就是要用到长连接才行。 老规矩,从开发那拿到接口地址,得到接入层服务器IP,是一台Haproxy代理,看了一下Haproxy的超时设置: 各种1小时超时,所以排除Haproxy的影响,继续往下看。 Haproxy 代理的是2台Apache,也就是部署了cgi接口的服务器。第一时间查看了 httpd.conf 和 httpd-vhost.conf 中的配置,居然没找到超时设置。 于是,搜索了下相关教程,发现原来藏在了 httpd-default.conf 当中: 看了下,这些是Apache的默认配置,Apache也没有include到httpd.conf当中。因此,编辑 httpd.conf,找到如下参数: 去掉注释,保存文件。然后再编辑 /usr/local/apache2/conf/extra/httpd-default.conf 文件,将Timeout的值修改为符合生产环境要求的1800秒,最后执行Apache平滑重启命令即可: Ps:我之前一直以为只有Nginx有一个平滑reload命令,后面才知道Apache、Haproxy都支持平滑重启名称,这个非常棒! 重载之后,就不会出现504网关超时设置了。
阅读全文
操作系统

Linux系统 df 命令显示异常、分区丢失问题解决

本文记录2种因 /etc/mtab 文件异常导致 df 命令显示异常、分区丢失问题的解决过程,以备后用。 一、根目录丢失 前些日子,同事在RTX群里问大家,有台服务器执行 df -h 看不到根目录,该如何解决? 于是我帮忙解决了一把,看了下 /etc/fstab 内容,根目录挂载信息是正常的: 接着,看了下 /etc/mtab 文件内容,发现根目录缺失: 执行 grep -v rootfs /proc/mounts 命令进行修复: 可以看到,根目录已经出现了,再执行 df -h 就正常了: 二、df命令报错 帮同事解决问题后,不巧自己负责的服务器也出现类似问题,执行 df 命令报如下错误: df: cannot read table of mounted file systems: No such file or directory 想着应该可以上述问题原因一样,所以直接执行修复命令,发现报错: 看来是空间不足,找了下发现是 maildrop 目录把根目录撑爆了: 直接清空,在执行 grep -v rootfs /proc/mounts >/etc/mtab 命令进行修复: 已经正常了,maildrop 爆满的问题一般是 crontab 未屏蔽错误造成的,于是顺手将crontab 里面的条目都带上了 2>&1 屏蔽了,下次应该不会出现因为目录爆满导致 mtab 异常的情况了。 三、区别与联系 继续记录一下/etc/fstab和/etc/mtab的区别和联系。 /etc/fstab 文件记录了服务器上硬盘分区信息,启动 Linux 的时候,检查分区的 fsck 命令和挂载分区的 mount 命令都需要 fstab 中的信息,来检查和挂载分区。 /etc/mtab 文件记载的是现在系统已经装载的文件系统,包括操作系统建立的虚拟文件等,每当 mount 挂载分区、umount 卸载分区,都会动态更新 mtab,mtab总是保持着当前系统中已挂载的分区信息,fdisk、df 这类程序,必须要读取 mtab 文件,才能获得当前系统中的分区挂载情况。 当然我们自己还可以通过读取/proc/mount也可以来获取当前挂载信息(即使用文章中用到的修复命令 grep -v rootfs /proc/mounts)。 当 /etc/mtab 因为磁盘满或文件系统异常,导致该文件内缺失常或直接为空,就会出现上文记录的问题了。
阅读全文
数据库

MySQL主从、字典死锁、连接数的Python监控脚本

最近,公司的系统在天津增加了不少异地容灾,其中就有异地双主MySQL。由于容灾环境一般只会在出现较大的网络故障或故障演习的时候用到,所以,容灾系统的可用性就只能靠监控了。 对于互联网这种赶鸭式的发展模式,很多公司都没有完善的自动化运维系统。所以,很多时候还得靠自己写脚本。 脚本越写越多,就容易出现混乱、分散难管理的窘状。所以,这次就写了一个MySQL的集中监控脚本,后续有新的监控加入也可以非常方便的拓展。 Python 脚本: 用法很简单,只要在脚本同目录新增一个文本文件hosts.list,一行一个IP,然后需要在IP对应的MySQL身上新增一个 db_monitor账号,用于监控机远程登录MySQL(见脚本注释部分语句): 其他特性: ①、脚本支持 5.0 和 5.5+ MySQL版本的 Second behid master 监控,因为新老版本这个参数的位置不一样(鹅厂很多开源软件是非常陈旧的。。。); ②、支持MySQL连接失败的监控; ③、支持MySQL主从复制的延迟和错误监控 ④、支持MySQL的连接数和字典锁数监控 ⑤、更多监控可以参考继续添加..... 好了,就这么多了,算是给自己一个备忘。
阅读全文
数据库

MySQL错误修复记录:Table xx is marked as crashed and should be repaired

昨晚入睡后,收到松哥的QQ消息,说松松商城打开报错,于是手机QQ上打开了首页地址,发现有如下报错: 关键报错信息: Table 'ecs_users' is marked as crashed and should be repaired 提示这张表损坏了,必须修复,登陆服务器之后,开始修复,以下记录备忘。 1、尝试使用myisamchk命令对所有表索引文件进行修复: myisamchk --safe-recover /path/to/*.MYI 2、刷新首页依然报错,于是登陆MySQL,执行 REPAIR TABLE ecs_users; 3、提示无法修改拥有着属性,应该是上一步使用myisamchk命令时文件所属变成了root了,于是用chown更该拥有者: 4、然后继续登陆MySQL执行 REPAIR TABLE ecs_users;  成功: 在刷新网站,已经正常:   事后总结:一般这个报错都是因为数据库表索引文件损坏导致的,发现这类错误可以尝试使用phpMyAdmin的Repair自动修复功能。如果不行,先将数据库文件做好备份,然后按照本文的步骤尝试修复吧。
阅读全文
操作系统

升级CentOS6.5内核,开启Nginx的fastopen和reuseport特性

前面,张戈博客在折腾Nginx的SSL优化时,注意到前人在Nginx的listen配置中,添加了 fastopen=3 reuseport 这2个参数。 于是脑补了下,原来是启用Nginx对TCP_FASTOPEN和TCP_SO_REUSEPORT新特性的支持,至于有什么好处,请自行脑补下-->传送门 一、必要环境 当我依葫芦画瓢也添加这2个参数时,报错了: 继续脑补了下,发现系统必须支持 TCP_FASTOPEN和TCP_SO_REUSEPORT,然后重新编译Nginx加入如下参数: TCP_SO_REUSEPORT特性在kernel-2.6.32-431.29.2及kernel-3.9被启用,CentOS 6用户可以通过更新内核到2.6.32-431或更高版本来支持这项特性。 这个非常简单,直接yum -y update就行了。 关于TCP_FASTOPEN特性在kernel-3.6被客户端支持,在kernel-3.7被服务端支持,也就是说使用TCP_FASTOPEN需要CentOS 6更新内核至3.7或更高版本,以便支持这项特性。 ——摘自kn007的个人博客 二、升级内核 1、方式选择 看了下前人的分享,Centos内核升级一般有2种方式:编译安装或利用EPEL的yum源在线升级 在我看来,下载源码编译安装,不但步骤繁琐,而且容易出错,简直是小白的克星,而yum在线升级不易出错且步骤简单,简直是懒人必选良方,因此这里就只分享yum在升级方案,如果不是centos,就只能自己去找下源码编译的教程了。 在yum的ELRepo源中,有 mainline(3.13.1)、 long- term(3.10.28)这2个内核版本,考虑到long-term更稳定,会长期更新,所以选择这个版本。 2、导入public key 3、安装ELRepo到CentOS-6.5中 4、安装 kernel-lt(lt=long-term) Ps:如果是安装kernel-ml(ml=mainline版本),则把上述代码中的 kernel-lt 改为 kernel-ml。 5、确认Grub引导顺序 一般来说,新安装的内核映像会位于第一位,所以只要检查grub.conf中的default值是否指向新装内核即可,比如我的系统: 6、启用特性 编辑 /etc/sysctl.conf ,插入  net.ipv4.tcp_fastopen = 3,执行如下命令即可: 搞定一切之后,我们重启系统完成此次内核升级。 ——以上参考自 《使用yum快速升级CentOS 6.5内核到 3.10.28 | 原作者:健富的博客》 三、重新编译 接下来,我们需要重新编译我们的Nginx或Tengine,新增 --with-cc-opt=-DTCP_FASTOPEN=23 1、先查看当前Nginx的编译参数: 2、新增开启FASTOPEN参数,重新编译Nginx参数为: Ps:就是在原有的参数上新增  --with-cc-opt=-DTCP_FASTOPEN=23 ,重新编译前面已经分享过具体操作,这里就不赘述了,不会的朋友请参考:Nginx在线服务状态下平滑升级或新增模块的详细操作记录 3、重新编译,修改Nginx的listen配置: 编辑网站的配置文件,比如zhang.ge.conf,找到listen,然后再结尾分号前面新增 fastopen=3 reuseport参数,比如: 如果使用的是Tengine,这个配置就会报错: 最后了解到,Tengine关于reuserport的配置并不是在Listen,而是放到 events 模块。 所以,如果是Tengine,那么编辑nginx.conf主配置文件,找到events模块,如下新增 reuse_port on; 参数: 然后,在网站的listen处新增 fastopen=3 : 最后,reload重载Nginx即可,这样就不会报错了。 四、其他记录 升级内核,并启用了Nginx新特性之后,并没有进行深入的压力测试,所以本文无法给出优化后的各项性能数据,也不知道具体有多少提升,感兴趣的朋友可以自己开启,然后压测看看。 不过,升级内核后,系统多了200+rcuos和rcuob进程: 实际查看,也并没有占用系统内存或其他资源,看了一些老外论坛相关说明,也没得出一个所以然来,所以先视而不见吧!
阅读全文
WEB应用

WordPress启用memcached动态缓存以及报错解决

张戈博客目前用的是Nginx的fastcgi缓存方案,属于纯净态缓存模式,所以前台登录态什么的基本都没了。如果要兼顾前台登录态,又想速度快,有没有解决方案? 之前在分享张戈博客优化方案时提到,要实现网站轻度缓存,方案还是有的,比如 DB Cache Reloaded、Redis、memcached等。 最近恰好遇到一个数据缓存需求,因此尝试了下memcached方案,下面简单分享下我的环境部署以及报错解决过程。 一、d还是不d php有memcached和memcache两个类似组件,百度搜出来的文章,大部分是教你如何安装memcache(d),却步解释二者的区别。 比如这位博客仁兄的经验分享: 为什么他选第二个不行?其实php的这2个组件还是有点区别的: 简单来说: memcache 是 pecl 扩展库版本,原生支持php,出现更早,是老前辈; memcached 是 libmemcached 版本,出现较后,是新一代,因此也更加完善,推荐使用。 Ps:如果想更深入了解,可以搜索下 memcache vs memcached 其实,我们这种小网站的话,二选一即可,这点QPS还不至于纠结。不过一旦选择了,安装的时候就要注意区分,一对一配套安装,别搞的牛头不对马嘴,出现上面那位仁兄的困惑(后文有相关说明)。 这里,我果断选择了带d的,继续分享。 二、部署memcached 1、安装memcached Ps:这里的memcached是指Mencached的服务端,用来处理缓存数据,名字也是容易混淆。 下面2种安装方式任选其一: ①、在线安装 ②、编译安装 相比在线安装,很多时候编译安装更加灵活,非常类似Windows平台的自定义安装或绿色安装,推荐熟悉 Linux 系统的朋友使用: 至此memcached的服务端就安装好了。 2、集成php-memcached拓展 ①、先安装libmemcached 提前分享一个问题,如果直接按照网上的教程安装php-memcached可能会报如下错误: configure: error: no, sasl.h is not available. Run configure with --disable-memcached-sasl to disable this check 大部分教程会使用 --disable-memcached-sasl 参数来禁用这个功能,作为一个强迫症,我还是从国外的论坛扒到了解决方法,很简单,在编译libmemcached之前,先安装cyrus-sasl-devel即可解决 接着开始编译安装libmemcached: ②、安装php-memcached组件 下载和解压这步,我们要区分下是php7还是之前的版本: I、如果当前环境是php7 : II、如果是旧的的php版本: 接下来开始编译: 编辑php.ini文件,在最后插入如下参数 Ps:如果不知道php.ini在哪个位置 ? 执行命令:php --ini 即可找到。 保存后,执行如下命令看看是否加载成功: 如果输出memcached则表示成功。 最后,如果是Nginx就 service php-fpm reload ,如果是Apache就重启Apache完成安装。 ③、测试缓存 将上述代码保存为 test.php,然后执行 php -f test.php,如果能输出100表示安装成功。 三、WordPress缓存 做完上述所有步骤,系统环境就已经支持memcached缓存了。下面分享如何应用到WordPress 1、安装插件 访问github项目页面下载插件包: https://github.com/tollmanz/wordpress-pecl-memcached-object-cache 下载并解压得到的 object-cache.php,上传到 wp-content 目录即可开启memcached缓存。 值得说明的是,这里还有一个大坑等着你来踩: WordPress官网上的object-cache.php虽然也号称Memcached 插件,然而它只支持Memcache,不支持新版的,所以不能使用。如果错误地将object-cache.php和Memcached混用的话,则会出现WordPress打不开,前台后台页面一片空白的现象。 这也就是经常有站长反馈WordPress启用memcached功能后,页面空白的错误原因了。不巧,张戈在测试的时候也踩坑了,所以特别提出来,希望大家了解错误的原因,规避掉!   2、查看效果 做完第2步之后,你可以去网站前台刷新几次,产生缓存,然后从官方下载探针: http://pecl.php.net/get/memcache-3.0.8.tgz 解压后,里面有一个memcache.php文件,编辑并找到如下代码: 修改如下:...
阅读全文