• 总结几个这几天解决的问题(与PHP、IPF、日志轮转相关)

    post by Holmesian / 2010-8-19 21:40 Thursday

    首先是关于PHP在PHP 5.2以上启用safe_mode or an open_basedir会导致CURLOPT_FOLLOWLOCATION失败,再导致curl_setopt/curl_setopt_array失败。

    官方对此有声明如下:

    Starting in PHP 5.2.0, CURLOPT_FOLLOWLOCATION can't be set via curl_setopt_array() (or curl_setopt()) when either safe_mode is enabled or open_basedir is set. In these cases, the order of CURLOPT_* settings in the array can be important.


    1.CURLOPT_FOLLOWLOCATION
    Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set
    2.curl_setopt_array()
    如果curl_setopt_array中包含CURLOPT_FOLLOWLOCATION键值,会导致所有options设置失败,让你感觉curl_setopt_array有问题,其实这个函数本身是没问题的。

    对此我尝试用这种方法:

    在php.ini中设置open_basedir或者safe_mode,再在Apache(或者Nginx的FastCGI)中<Directory>、<VirtualHost>设置 php_admin_value open_basedir Off。结果是相应的虚拟主机整个PHP跑不了了,不知道为何。

    所以目前来看对于需要使用curl_setopt_array()的环境应该就不能打开safe_mode和设置open_basedir值了。

     

     

    第二个是关于ipf的IPF.conf设置的。

    网上看似有不少关于ipf的文档,包括man ipf看上去也把ipf的设置讲解得十分的详细,但是实际上有一些非常细节的内容让人相当纠结。可能是由于我从一开始在概念上的理解就存在问题,在此总结一下;首先看我之前一直在用的一个ipf.conf规则

     

     

     
    1. # allow 22
    2. pass in quick from any to 202.101.208.35 mask 255.255.255.255 port = 22
    3. # allow 80
    4. pass in quick from any to 202.101.208.35 mask 255.255.255.255 port = 80
    5. # Allow 443
    6. pass in quick from any to 202.101.208.35 mask 255.255.255.255 port = 443
    7. # Out going
    8. pass out all

     

    该规则的本意是开放主机的22端口、80端口、443端口的入站连接,允许主机的所有出站数据连接。乍看上去没有问题,ipf -Fa -f ipf.conf也提示没有语法错误,运行起来一段时间也没有问题。但是过了一段时间之后就会出现一些非常纠结的问题:间歇性地访问动态内容(比如经过rewrite的PHP文件访问,其他动态文件访问)的时候客户端反应奇慢,但是最终还是会访问成功,而如果是访问纯静态内容(html页面、css文件、图片文件等)就非常的快;在服务器上ping其他域名的时候时而可以成功,时而不能成功,同一个域名这一秒用nslookup可以查询到下一秒就不一定可以查询到了。
    后来将规则改成这样:

     

     
    1. # allow 22
    2. pass in quick from any to 202.101.208.35 mask 255.255.255.255 port = 22 keep state
    3. # allow 80
    4. pass in quick from any to 202.101.208.35 mask 255.255.255.255 port = 80 keep state
    5. # Allow 443
    6. pass in quick from any to 202.101.208.35 mask 255.255.255.255 port = 443 keep state
    7. # Out going
    8. pass out all keep state

     

    即在每条规则后面添加keep state问题就解决了…… 一开始老认为都pass out all了,干嘛还要特别在in的部分申明keep state……现在才终于知道为什么

     

    接下来这个是关于日志轮转的……用/etc/newsyslog.conf的设置来定期切割过大的日志,这个问题相当尴尬:由于需要轮转的日志有一定数量,所以添加的时候有些偷懒,基本上都是写好一条规则其他大部分都是照着一条复制只改前面的部分,/var/log/nginx/access-web_net.log 600 4 * $W0D23 JC,结果问题就出在这个$W0D23上,有些好多个几百MB上几GB的日志文件同时在一个时刻开始切割……导致的后果是硬盘I/O达到瓶颈,Kernel提示错误也就不用说了……。解决方法自然是岔开较大日志文件的切割轮转时间……

     

     

     

     

     

     

     

    发表评论: