分类 PostgreSQL,MySQL,Nginx,PHP 下的文章

服务器不时出现的CPU使用率超高、内存几乎被吃光的现象。top查看之,发现php-fpm进程高挂不下,于是根据Google总结如下方案:

一、检查PHP配置及代码

#找出CPU使用率高的进程PID
top
#查看进程的内存使用情况
pmap PID
#跟踪进程执行的系统操作
strace -p PID
#查看该进程在处理的文件
ll /proc/PID/fd

a.结合系统的内存大小,配置php-fpm的进程数(max_children)
b.将有可疑的PHP代码修改之,如:file_get_contents没有设置超时时间

二、启用php-fpm慢日志
本来不想加此方法,但是@phpsir提出了,我也放上来。
此日志是dump出脚本执行的过程到文本文件,相对比较直观,只是我感觉有时候找不到自己想要东西,可能还是不习惯这么用吧。大家可以尝试下。

三、强制结束高消耗进程

php-fpm 进程占用的内存超过 %5 就把它kill掉

#!/bin/sh
fpms=`ps aux | grep php-fpm | grep -v grep | awk '{if($3>=5)print $2}'`
for fpm in $fpms; do
  kill -9 $fpm
  echo `date +'%F %T'` $fpm >>/var/log/php5/kill.log
done

维护着一个大型门户网站,数据量相当大,最近搬到云服务器环境,突然发现帖子无法打开。第一反应是想着是不是数据被破坏了,丢了一些数据,检查后发现并不是。

然后通过adminer查看forum_post表的时候提示:
Table 'forum_post' is marked as crashed and last (automatic) repair failed

这意味着该表被标记为跌宕了。于是想着修复:repair table forum_post,修复却失败了。

只好通过mysql命令行来执行了。

#停止mysql服务;
service mysqld stop
#切换到该表目录下(注意:不切换过来会总提示myisamchk一些错误导致失败)
cd /var/lib/mysql/tbl
#如果还是提示错误,就多加一个参数-f强制进行
myisamchk -r forum_post.MYI

Windows下使用php sendmail配置方法是否不太可能,但也不是绝路,现在告诉大家如何在WINDOWS平台下解决php sendmail配置问题.

大家非常好奇为什么别人大型公司的论坛注册后会系统自动发送一封注册信息的电子邮件到注册人的信箱里,而同样用的是一种内核的论坛程序,为什么自己架设的却没有这个功能,今天我来为大家解密这个原因。我们拿PHPBB来举例,这个论坛内核早已经写好了论坛邮件发送功能,只需要你本地有个SMTP转发的服务在就可以,由于大公司服务器大多数用的是UNIX或者是LIUNX,因为这些服务器本身具有本地SMTP服务的作用,所以可以直接发注册信息到注册人的邮箱里,而我们个人架设网站大部分都是WINDOWS的平台,由于ASP论坛非常不安全,而ASPX论坛又不好进行开源。

虽然这两种论坛架构非常容易运用些IIS的相关的SMTP服务器来解决问题,但都先天不足,很多网友都非常喜欢用PHP内核的论坛来架设,比如PHPBB、PHPWIND、等这些都是具备论坛发信功能,但由于PHP先天就是LIUNX的宠爱,所以WINDOWS下支持SMTP的东西不是很多.Windows下使用php sendmail配置方法是否不太可能,但也不是绝路,现在告诉大家如何在WINDOWS平台下解决php sendmail配置问题.

1.修改 sendmail.ini 文件,修改以下信息:

smtp_server = mail.anrip.com
auth_username = user@anrip.com
auth_password = passwd

2.修改 php.ini 文件,修改以下信息:

[mail function]
;smtp_port = 25
;sendmail_from =
sendmail_path = "E:\sendmail\sendmail.exe -t"
  1. 重新启动php进程,测试mail()功能:
<?php
    $now = date("Y-m-d h:i:s");
    $from_name = '寄件人';
    $from_email =
    $headers = 'From: $from_name <$from_email>';
    $body = '嗨, \n 這是一封测试信件来自 $from_name <$from_email>.';
    $subject = '[$now] 测试邮件发送';
    if (mail($to, $subject, $body, $headers)) {
        echo "success!";
    } else {
        echo "fail…";
    }
?>

这样,Windows下使用php-sendmail配置就顺利完成了!

配置完一台服务器后,并不是就可以高枕无忧了,前不久刚刚爆发的PHP 5.3.9版本的漏洞也搞得人心惶惶,所以说经常关注安全公告并及时升级服务器也是必要的。

一般来说,黑客攻击服务器的首要步骤就是收集信息,比如说你的软件版本,这些将成为下一步有针对性攻击的依据。所以说一定程度的隐藏这些信息就显得非常有必要了,本文将简单介绍如何在网络上隐藏Nginx版本号以及PHP的版本号。

1.隐藏Nginx版本号,Nginx的版本号主要在两个地方会有,一个是HTTP header,有个Server:nginx/1.x.x类似会暴露Web服务器所用软件名称以及版本号,这个也是大多数Web服务器最容易暴露版本号的地方,第二个地方是Nginx出错页面,比如404页面没有找到等,这是如果用户没有指定页面的话,那么Nginx自己的页面会有版本戳记。通过在配置文件的http节配置server_tokens off来达到我们目的。

2.隐藏PHP的版本号,将expose_php = On改为expose_php = Off就搞定了,当然,对于Apache服务器还有另外一个方法可以直接尝试在.htaccess文件中Header unset X-Powered-By,删除X-Powered-By节,不过我还是建议改动php.ini的expose_php。

Nginx下WordPress固定链接的伪静态规则其实特别简单。

  1. 打开nginx配置文件:
vim /etc/nginx/nginx.conf
  1. 在server容器中添加下面代码
location / {
  try_files $uri $uri/ /index.php?q=$uri&$args;
}
  1. 重新加载nginx配置文件
/etc/init.d/nginx reload

完成设置。