加载中…
个人资料
绝世流浪汉
绝世流浪汉
  • 博客等级:
  • 博客积分:0
  • 博客访问:85,554
  • 关注人气:10
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

【互联网运维技术】apache配置中关于注释的使用问题

(2012-04-05 14:25:54)
标签:

httpd.conf配置

hostname反解

it

分类: 互联网运维技术

事情起因于今天一同事apache中日志格式错误问题

发现在某个线上的配置中尽管启用了HostnameLookups off 但是apache的日志文件中依然主机名示。

看完配置文件后,起初认为是配置文件中关于注#写方法有,而问题

 

Order Deny,Allow

Deny from All

Allow from 127.0.0.1

Allow from x.y.z.10  #nat

Allow from x.y.z.18  #office

 

 

 参看  httpd.conf文档

Directives in the configuration files are case-insensitive, but arguments to directives are often case sensitive. Lines that begin with the hash character “#” are considered comments, and are ignored. Comments may not be included on a line after a configuration directive.

 按照上文描述,httpd.conf的注#是不允跟在一个配置行的后面的。(和配置内容在同一行)

可是测试执./local/httpd/bin/apachectl -t 并没有出格式错误,可上面的配置是有效的

那么什么个配置是有效的呢? 是文档有么?

修改配置文件做如下实验测试

 

MaxRequestsPerChild 180  #测试

 

配置修改后行:

% ./local/httpd/bin/apachectl -t

Syntax error on line 12 of /Users/.../local/httpd/conf/httpd.conf:

MaxRequestsPerChild takes one argument, Maximum number of requests a particular child serves before dying.

 

 

实验证明,配置格式有问题apache并不能正常启。也就是,当#放在allow (deny) from x.x.x.x 后面是有效的,那么日志里面的主机名是不是跟里的配置有关(是不是因为这里的配置,apache#当成主机名来理了)?

一步看文档后,确实发现结论尽管配置了HostnameLookups off ,但是由于在allow里面配置了主机名(域名),同dns的反解生,会大量增加apache器的担。

那么上面的#是不是真的被解成主机名了?

进一步看源代modauthzhost.c 174

AP_INIT_ITERATE2("allow", allow_cmd, &its_an_allow, OR_LIMIT,

                "'from' followed by hostnames or IP-address wildcards"),

AP_INIT_ITERATE2("deny", allow_cmd, NULL, OR_LIMIT,

                "'from' followed by hostnames or IP-address wildcards"),

 

 

了【Allow】和【Deny】的配置,可AP_INIT_ITERATE2 是一个可以理无限制参数的宏定。他会对这些参数逐一理。

一步看函数【allow_cmd

static const char *allow_cmd(cmd_parms *cmd, void *dv, const char *from,

                         const char *where_c)

{

    char *where = apr_pstrdup(cmd->pool, where_c);

    .. 省略 ..

    else if (!strcasecmp(where, "all")) {

        a->type = T_ALL;

    }

    else if ((s = ap_strchr(where, '/'))) {

        *s++ = '\0';

        a->type = T_IP;

    }

    else if (!APR_STATUS_IS_EINVAL(rv = apr_ipsubnet_create(&a->x.ip, where,

                                                        NULL, cmd->pool))) {

        if (rv != APR_SUCCESS) {

            apr_strerror(rv, msgbuf, sizeof msgbuf);

            return apr_pstrdup(cmd->pool, msgbuf);

        }

        a->type = T_IP;

    }

    else {

        a->type = T_HOST;

    }

    return NULL;

}

 

 

由上面程序可以判断,因#nat】和【#office】既不是ip地址也不是包含/、所以被判断成了主机名。

一步看文档、httpd.conf文档

Hosts whose names match, or end in, this string are allowed access. Only complete components are matched, so the above example will match foo.apache.org but it will not match fooapache.org. This configuration will cause Apache to perform a double reverse DNS lookup on the client IP address, regardless of the setting of the HostnameLookups directive. It will do a reverse DNS lookup on the IP address to find the associated hostname, and then do a forward lookup on the hostname to assure that it matches the original IP address. Only if the forward and reverse DNS are consistent and the hostname matches will access be allowed.

如上文字解,在allow 或者 deny后面 配置了主机名(域名),会DNS反解求,而且不管你是否关HostnameLookups 

合由上面的分析可以得出,之所以在日志里面出现了主机名,是因allow后面的注#以及#之后的内容都被当成了主机名来解,从而dns反解(无谓DNS反解会对系统带来比较大的负担,一般线上环境都建议关闭HostnameLookups)HostnameLookups off的配置失效。所以,在写配置文件的候注释应该独立占用一行,不应该在配置内容的同一行后面出

 

趣的同学可以做如下实现,修改原文件,apacheallow后面出#,直接无

   char msgbuf[120];

     apr_status_t rv;

 

   if (cmd->info && !strncasecmp(cmd->info, "#",1))

       return NULL;

+

     if (strcasecmp(from, "from"))

         return "allow and deny must be followed by 'from'";

 

   if(!strncasecmp(where, "#", 1)) {

       cmd->info = where;

       return NULL;

   }

+

     a = (allowdeny *) apr_array_push(cmd->info ? d->allows : d->denys);

     a->x.from = where;

     a->limited = cmd->limited;

 

 如上修改后,allow后面的#以及#后面的内容就会被忽略了。

如此,下面的配置就不会有问题

Order deny,allow

Deny from all

Allow from 192.168.0.1 #foobar

Allow from 127.0.0.1

 

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有