全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 8291|回复: 26

[nginx] 不好意思,上次的nginx 防webshell文章还是有问题的

[复制链接]
发表于 2010-1-11 19:55:08 | 显示全部楼层 |阅读模式
  真不好意思了,

http://www.hostloc.com/viewthrea ... p;page=1&extra=

这篇文章,以前写的时候不怎么认真,代码没仔细看。

前两天用到自己的站上(我的站流量还是有一些的,虽然不算大站,也不能算小站了),开始的时候一切正常,今天下午发现浏览全是502.504等。。。遂系统重启,故障依旧,再重启,还是老样子,想想可能是代码不对,重新仔细看了一下,写得马虎啊,有严重的内存泄漏问题,原来在站点正常运行的情况下,编译覆盖上去,重启nginx和php,可能缓存或者用户没有集中刷新压力小暂时正常,时间长了就出问题了。重启操作系统用户全都在拼命刷新,压力大,所以一重启问题也暴露出来了。

现在已经完全修正,我站点正在使用,完全正常,编译后重启完全OK,其实加上的代码流程很简单,马虎所致,现在没有内存泄漏了。请使用了的同学重新修改,重新编译。另附上freebsd port安装的办法。
freebsd port安装的软件,通常都会给七七八八的加上一些补丁,所以用make extract,然后修改源码,编译的方法可能会有问题,所以以前我一直没给自己服务器装上这个东西。我站点系统是 FreeBSD的。

make extract ==》你手工修改源码 ==》make ==> freebsd开始给你装补丁。//这样补丁起来也许会有问题,因为补丁的是你修改过的文件了。

tar vxfz php-5.2.10-fpm-0.5.13.tar.gz --directory /usr/ports/lang
cd /usr/ports/lang/php5-fpm
我的办法是 make ,不要make install,然后
ee /usr/ports/lang/php5-fpm/work/php-5.2.10/main/fopen_wrappers.c
把下面两个 // add by anxsoft.com 之间的代码加上.然后拷贝到其他位置。
cp /usr/ports/lang/php5-fpm/work/php-5.2.10/main/fopen_wrappers.c ~
make clean //这里一定要先清理,接下来make就能重新编译了
make install clean//上面清理掉work什么的目录了,这里在系统make的过程中,你要另开一个控制台。以迅雷不及掩耳之势,把修改过的 fopen_wrappers.c 覆盖回去。注意观察,/usr/ports/lang/php5-fpm/work/php-5.2.10/main/fopen_wrappers.c 文件扩展开来后,覆盖回去。
cp -f ~/fopen_wrappers.c /usr/ports/lang/php5-fpm/work/php-5.2.10/main/
等待编译完成,结束。

下面的是FreeBSD的。CentOS的请到 http://www.hostloc.com/viewthrea ... p;page=1&extra= 查看。
  1. /* {{{ php_check_open_basedir
  2. */
  3. PHPAPI int php_check_open_basedir_ex(const char *path, int warn TSRMLS_DC)
  4. {
  5.         /* Only check when open_basedir is available */
  6.         if (PG(open_basedir) && *PG(open_basedir)) {
  7.                 char *pathbuf;
  8.                 char *ptr;
  9.                 char *end;
  10.                 char path_copy[MAXPATHLEN];
  11.                 int path_len;

  12.                 /* Special case path ends with a trailing slash */
  13.                 path_len = strlen(path);
  14.                 if (path_len >= MAXPATHLEN) {
  15.                         errno = EPERM; /* we deny permission to open it */
  16.                         return -1;
  17.                 }
  18.                 if (path_len > 0 && path[path_len-1] == PHP_DIR_SEPARATOR) {
  19.                         memcpy(path_copy, path, path_len+1);
  20.                         while (path_len > 1 && path_copy[path_len-1] == PHP_DIR_SEPARATOR) path_len--;
  21.                         path_copy[path_len] = '\0';
  22.                         path = (const char *)&path_copy;
  23.                 }

  24.                 // add by anxsoft.com
  25.                 char *env_doc_root;
  26.                 if(PG(doc_root)){
  27.                         env_doc_root = estrdup(PG(doc_root));
  28.                 }else{
  29.                         env_doc_root = sapi_getenv("DOCUMENT_ROOT", sizeof("DOCUMENT_ROOT")-1 TSRMLS_CC);
  30.                 }
  31.                 if(env_doc_root){
  32.                         int        res_root = php_check_specific_open_basedir(env_doc_root, path TSRMLS_CC);
  33.                         efree(env_doc_root);
  34.                         if (res_root == 0) {
  35.                                 return 0;
  36.                         }
  37.                         if (res_root == -2) {
  38.                                 errno = EPERM;
  39.                                 return -1;
  40.                         }
  41.                 }
  42.                 // add by anxsoft.com

  43.                 pathbuf = estrdup(PG(open_basedir));

  44.                 ptr = pathbuf;

  45.                 while (ptr && *ptr) {
  46.                         int res;
  47.                         end = strchr(ptr, DEFAULT_DIR_SEPARATOR);
  48.                         if (end != NULL) {
  49.                                 *end = '\0';
  50.                                 end++;
  51.                         }

  52.                         res = php_check_specific_open_basedir(ptr, path TSRMLS_CC);
  53.                         if (res == 0) {
  54.                                 efree(pathbuf);
  55.                                 return 0;
  56.                         }
  57.                         if (res == -2) {
  58.                                 efree(pathbuf);
  59.                                 errno = EPERM;
  60.                                 return -1;
  61.                         }

  62.                         ptr = end;
  63.                 }
  64.                 if (warn) {
  65.                         php_error_docref(NULL TSRMLS_CC, E_WARNING, "open_basedir restriction in effect. File(%s) is not within the allowed path(s): (%s)", path, PG(open_basedir));
  66.                 }
  67.                 efree(pathbuf);
  68.                 errno = EPERM; /* we deny permission to open it */
  69.                 return -1;
  70.         }

  71.         /* Nothing to check... */
  72.         return 0;
  73. }
  74. /* }}} */
复制代码

[ 本帖最后由 freebsd 于 2010-1-13 21:32 编辑 ]

评分

参与人数 2威望 +32 收起 理由
诡谲 + 7 我已经更新至我的网站.谢谢楼主. ...
wzwen + 25 原创内容

查看全部评分

发表于 2010-1-11 20:00:54 | 显示全部楼层
我用你上次发的也没问题中,没有内存泄漏的问题,可能是因为我的访问量比较小吧
发表于 2010-1-11 20:03:00 | 显示全部楼层

回复 1# 的帖子

楼主实践能力很强
 楼主| 发表于 2010-1-11 20:09:09 | 显示全部楼层

回复 2# 的帖子

有可能,。。。这次我因为dz7.1 7.2漏洞,搞怕了,无论如何自己服务器上也要限制再加强,免得一倒霉全倒霉。。。

我用了两天,到今天下午才出问题的。开始也正常。

[ 本帖最后由 freebsd 于 2010-1-11 20:10 编辑 ]
发表于 2010-1-11 20:14:59 | 显示全部楼层

回复 4# 的帖子

我每天几千IP,连续运行了5天,未见异常,不过还是按照你现在的方法重新编译一次了
 楼主| 发表于 2010-1-11 20:19:44 | 显示全部楼层
原帖由 gdtv 于 2010-1-11 20:14 发表
我每天几千IP,连续运行了5天,未见异常,不过还是按照你现在的方法重新编译一次了


好像是释放内存错误

[ 本帖最后由 freebsd 于 2010-1-13 18:08 编辑 ]
发表于 2010-1-11 20:20:54 | 显示全部楼层
转行windows了,要用asp
 楼主| 发表于 2010-1-11 20:26:04 | 显示全部楼层
原帖由 gdtv 于 2010-1-11 20:14 发表
我每天几千IP,连续运行了5天,未见异常,不过还是按照你现在的方法重新编译一次了


你的应该不是论坛吧,我站点也6、7千左右IP,不过我的是论坛,PV大,大概十几万PV。这样可能容易暴露问题。
发表于 2010-1-11 20:30:24 | 显示全部楼层
原帖由 qiqi13245 于 2010-1-11 20:20 发表
转行windows了,要用asp


asp啊。。。
发表于 2010-1-11 20:44:54 | 显示全部楼层
原帖由 freebsd 于 2010-1-11 20:26 发表


你的应该不是论坛吧,我站点也6、7千左右IP,不过我的是论坛,PV大,大概十几万PV。这样可能容易暴露问题。

我这个VPS两个站,加起来一共几千IP,一个是wordpress,另一个是自己写的程序,PV极小
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2024-5-7 12:03 , Processed in 0.067650 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表