Category: 小小草

IT 技术领域学海无涯。其实任何领域都学海无涯,无非 IT 发展太快了,让我有更多嘘唏。希望我掌握的技术有如小小草,虽然渺小,却有旺盛的生命力。

  • Magento not rebuilding image cache

    I changed a server for Magento sites. When I migrated the sites, they looked fine. However after I flushed Magento image cache, all sites stopped working. Web pages were not completed. The code stopped rendering after the first product image’s “src”. But there was no error message afterwards.

    At first I thought it was file permission problem. But it was not.

    Then I thought it was some rubbish left over after flushing cache. So I took the advice by removing the folder media/catalog/product/cache and clearing everything under var. But the problem was still there.

    Then I realised it was php not generating images for Magento. Magento requires php-gd to generate images. My new server did not have php-gd installed. If I was installing a Magento instance, I would not get through. But I migrated the sites. So they “looked” fine.

    After installed php-gd, product images came back.

    By the way, Magento requires some other PHP extensions to run. I took the chance to install them all.
    pdo_mysql
    simplexml
    mcrypt
    hash
    gd
    dom
    iconv
    curl
    soap

  • Ngnix 502 bad gateway error after a recent php-fpm update

    I recently updated php-fpm from 5.4.16 to 5.5.16. After the update, Nginx comes up with 502 bad gateway error. Googling the error pointed me to look into permission of php socket file.

    In php-fpm 5.4.16, if no value is given to listen.mode, php socket file is assumed to 0666.

    But in php-fpm 5.5.16, if no value is given to listen.mode, php socket file is assumed to 0660.

    That is why Nginx no longer has permission to php socket and occurs 502 error.

  • Be reponsible for own content

    今天有朋友分享了以下两个图片,不知她是哪里看来的,总之她是晕了。

    Forged Libai Poem predicting Germany would win FIFA 2014
    Forged Libai Poem predicting Germany would win FIFA 2014
    Forged Libai Poem predicting Argentina would win FIFA 2014
    Forged Libai Poem predicting Argentina would win FIFA 2014

    本来我是准备一笑了之的,因为今年以来李白的各种预言诗已经看多了。但回想起昨天跟公司新员工交流,我讲到互联网以讹传讹的东西很多,而各种社交媒体让各种无节操的博主、群主们更容易为博取眼球(转化为IP、PV、粉丝数)无底线地骚动,直接导致很多真正有用的信息、权威的网站被湮没。这是我个人潜意识里排斥社交媒体的一个原因,但是如果我们不占领这个平台,会被更多的别有用心的人占领,是另一种层面的不进则退,非常无奈。但是我们控制不了人家的内容,我们所能做的惟有对自己的内容负责。我们的网站仿佛处于淤泥里,要让初访的用户知道我们是纯洁的、我们是权威的(其实也不要期待初访的用户会把我们定位得那么高,只要让他们知道我们是有节操的),有一点必须要做到的:不要出现错别字、注意各种细节,包括全半角的标点符号。这是以小见大,也是值得恒久关注的一件事。

    恰逢此时出现李白的诗,我觉得是很好的反面教材。但我又怕真的是我孤陋寡闻,以我的已知盖未知,不是科学的态度,最后让对方博主笑话,所以我专门花了半小时,考证了李白诗词全集,有979首诗词,里面既没有《赏雪杂感》,也没有《观山》,然后我再来写这篇文章。

    最后,我还是感谢互联网,瑕不掩瑜,没有她,我不可能在半小时内完成考证。这也说明另一个问题,权威(这里指的是李白诗词全集)不来自于社交媒体。要做权威,不要指望社交媒体。对社交媒体的使用方针是,要它为我们所用,而不要被它摆布(我指有些社交媒体的规则太复杂)。

  • No-IP becomes no IP today

    今年是 DDNS(动态域名)的多事之秋。5月初最早最出名的 DDNS 服务商 DynDNS 中止免费服务,所有服务项目开始收费。我在想,DynDNS 自信过了头,凭什么用户要交钱而不是直接离开 DynDNS?!

    总之,我是选择离开 DynDNS 改投 No-IP 的环抱。

    No-IP domains seized by microsoft
    No-IP domains seized by microsoft

    经过几个月观察,No-IP 还是很稳定的,直到今天,No-IP 塌了半边天。今天,我的IPPBX监控程序不停在提醒我,我家的 IP 地址和 No-IP DDNS 解析出来的 IP 不一致,这通常是在路由器掉线重拨,IP 地址刚发生改变才会收到的邮件,我不停收到几百封这样邮件,我还以为是宽带出问题了,直到吃晚饭时,收到 No-IP 发来的一封邮件:

    We want to update all our loyal customers about the service outages that many of you are experiencing today. This is NOT A TECHINCAL ISSUE WITH NO-IP.
    This morning, Microsoft served a federal court order and seized 22 of our most commonly used domains because they claimed that some of the subdomains have been abused by creators of malware. We were very surprised by this. We have a long history of proactively working with other companies when cases of alleged malicious activity have been reported to us. Unfortunately, Microsoft never contacted us or asked us to block any subdomains, even though we have an open line of communication with Microsoft corporate executives.

    We have been in contact with Microsoft today. They claim that their intent is to only filter out the known bad hostnames in each seized domain, while continuing to allow the good hostnames to resolve. However, this is not happening. Apparently, the Microsoft infrastructure is not able to handle the billions of queries from our customers. Millions of innocent users are experiencing outages to their services because of Microsoft’s attempt to remediate hostnames associated with a few bad actors.

    Had Microsoft contacted us, we could and would have taken immediate action. Microsoft now claims that it just wants to get us to clean up our act, but its draconian actions have affected millions of innocent Internet users.

    回家一测,果然是 noip.me 不解析任何子域名了。我在上面有三个子域名,全部中了躺枪。我赶紧按照 No-IP 的提示,将 DDNS 换用还未中枪的 onthewifi.com 子域名来解析。

    我只是没想通,No-IP 的域名怎么归着微软管?但这个事件说明:为了域名的健康,远离微软。小庆幸一下:我奉行的“尽量不用微软产品”的方针大致是正确的。

  • Display icon for a link shared on Moments in WeChat

    WeChat Moment Sharing
    WeChat Moment Sharing

    尽管操作起来稍微麻烦一些,但我坚持把有意思的原创留在自己的域名上,意思不大的文字和图片直接才“水”到社交网络上。

  • Hands on GeoIP for Nginx on Fedora and CentOS

    最近研究了一下如何根据用户的 IP 获得他的地理位置(我只关心 country 级,不关心 city 级),区别性地在 Ngnix 层面做一些限制性访问。这里用到 GeoIP 软件包和 MaxMind 的数据库。

    在 Fedora 20 下,Nginx (目前 1.4.7) 依赖于 GeoIP。等于说,装好 Nginx,ngx_http_geoip_module 自然就启用了,只要在两个配置文件略作修改。

    Fedora nginx -V output
    Fedora nginx -V output

    1. 在/etc/nginx/nginx.conf 里添加

    
    http {
    
    ...
    
    geoip_country /usr/share/GeoIP/GeoIP.dat;
    
    ...
    
    }
    
    

    2. 在 /etc/nginx/fastcgi_params 里添加

    
    fastcgi_param GEOIP_COUNTRY_CODE $geoip_country_code;
     fastcgi_param GEOIP_COUNTRY_NAME $geoip_country_name;
    
    

    还有其他参数可用,请自行查手册。重启 Nginx 就可以使用 GeoIP 的信息了。

    在 CentOS 6.5 下,事情要复杂一些。网上说 CentOS 下的 Nginx 同样依赖于 GeoIP,可在我这里事实并非如此。同样是最新的 1.4.7 版,Nginx for CentOS 是不带 ngx_http_geoip_module 编译的。即使我用 yum install GeoIP 安装了 GeoIP 软件包,但 Nginx 不从源码编译就不能启用 geoip 模块。

    CentOS nginx -V output
    CentOS nginx -V output

    着重提一下,我说的 CentOS 6.5 是 VPS 版,Nginx 和 GeoIP 无依赖是不是这个版本特有的?不得而知。我不想为之专门装一次 CentOS 来探究。我也不想从源码编译 Nginx,因为我太喜欢 yum,就为一个 ngx_http_geoip_module 搞砸了其他功能就不值得了。

    退而求其次,CentOS 下不妨用 php 调用 GeoIP,只是感觉同样功能用 php 实现会消耗更多资源。另外,Nginx 能进行全面的限制,而 php 无法利用 GeoIP 信息限制对静态文件的访问。但是,Nginx 的全面限制也只能阻止低级用户,不可能阻止稍有点 IT 知识、一心要绕开地理位置限制来访问的用户,所以 php 对动态文件的限制其实也起到了相同的效果。

    CentOS 下,安装 GeoIP for php,首先要装有 GeoIP,前面已经说了,要单独装:

    
    yum install GeoIP
    
    

    然后,安装  php-pecl-geoip:

    
    yum install php-pecl-geoip
    
    

    哈哈,都是我喜欢的yum。然后重启一下 php-fpm,即可在 php 下获得 geoip 信息。函数有很多,geoip_country_code_by_name()、geoip_country_name_by_name() 等等,请自行查手册。

    顺便提一下,CentOS 6.5 VPS 版安装 GeoIP 后,带来的 country 数据库(GeoIP.dat, 6 Sep, 2011)有 1,183,408 字节,而 Fedora 20 的 GeoIP country(GeoLiteCountry.dat, 18 Jun, 2013) 数据库只有 581,110 字节,从 MaxMind 网站上下载最新的 GeoLite Country 数据库(GeoIP.dat, 每月第一个周二更新)也只有668,134 字节。考虑到 MaxMind 的数据库是分免费和收费的,那么,CentOS GeoIP.dat 这么大,是不是更接近于收费版?我不知道收费版是啥样的,因此无从考证。

  • Newly installed BT Infinity keeps dropping continued

    BT new Home Hub 5 replacement
    BT new Home Hub 5 replacement

    前文说到新装的 BT Infinity VDSL 经常掉线,我拿着 log 向 BT 反映,他们二话不说,给我寄来了第二个路由器。这里还是数据说话,否则 BT 总怀疑用户 IT 能力,肯定要磨叽半天才肯换一个路由器。

    但是,很失望,换了个路由器,仍然掉线频繁。

    我想,该不是 FreePBX 在使用带来的一些通讯流量造成的吧?我是基于这么个假设:BT Infinity 不会如此不稳定,否则怎么推广啊?应该是我使用的某种应用造成的不稳定。大部分用户不会组建 FreePBX,这个问题不会被触发。

    于是我把 FreePBX 服务器搬回家,接在了 ADSL 上。真遗憾,我是为 FreePBX 升级到 BT Infinity,结果还得搬回家继续用 ADSL。不过,两害取其轻,FreePBX 在我家的 ADSL 上并没有造成频繁掉线。

    现在再看没有了 FreePBX 的 BT Infinity,确实稳定多了,偶有掉线(一天一次)。这初步验证了上一个假设。

    然后,我再一次假设,FreePBX 造成 BT Infinity 频繁掉线,不会是 VDSL 方面的问题,而是 BT Home Hub 5 似乎跟 FreePBX 不对口。

    看来得买一个商业级的 VDSL 路由器了。我相中 DrayTek Vigor 2860n Plus,犹豫着要不要买,而且心里有点不爽——我不喜欢基于一堆假设去采购。

  • When to use Magento layered navigation?

    Rcah module for Magento
    Rcah module for Magento

    Although I released a Magento module “Root Category as Homepage“, which enables replacing the default CMS page with the root category as homepage, thus the users can start layered navigation from the very top level of category, the usage of this module should be limited, for the sake of usability.

    In short, use Magento layered navigation only to narrow down the choice of products. Do not use it for the purpose of grouping products by some filter attributes. There are many other ways to group products together.

    I will explain in details when I have some more time.

  • Fixed NextGenGallery 0 images were uploaded error

    Nggallery 0 images were uploaded
    Nggallery 0 images were uploaded

    不知从何版本起,NextGenGallery 插件在我的 WordPress 上就不工作了,主要症状是:

    • 后台无法在 Gallery 里上传图片,显示 “Upload complete. 0 images were uploaded.”(WordPress 自身的 Media 上传正常)。
    • 后台无法批量导入图片,服务器的文件夹根本就不显示。
    • 已有的 Gallery 在前台只能显示第一张图,点下一张图就是 404 错误。

    这个问题困扰了我约有半年。期间发现把 Permalinks 改为 Default 模式能让 NextGenGallery 恢复正常,但我不可能为了 NextGenGallery 修改 Permalinks 啊,只好任由这个问题存在。所幸迄今为止只有 5 galleries,而且都不怎么重要,所以这个问题不突出。

    上个周末突然犟了一下,我觉得不该卡在这个问题无从下手啊,调用 google N 多次,终于在一个角落里给我找到一点端倪,再做了 N 多次试验,得出的结论是此问题在 PHP installed as an Apache module 时不存在,我恰用的是 Nginx,罪魁祸首是 fastcgi_param 没弄好。

    出现此类问题是小概率事件,即使是一个不完善的 fastcgi_param 配置,我的 Nginx 也让大部分 PHP 跑了多年没出其他问题。NextGenGallery 也有一定责任,使用了一种不推荐的环境变量,在 PHP installed as an Apache module 下不会激发这个 bug,但在 Ngnix + 不完善的 fastcgi_param 会。而我用的不完善的 fastcgi_param,我相信很多人都在用,所以有一定的普遍性。

    言归正传,怎么改?

    有人说把 NextGenGallery 的 class.router.php 的 function get_request_uri 的 if (isset($_SERVER[‘PATH_INFO’])) 改为 if (empty($_SERVER[‘PATH_INFO’])),确实能奏效,但我认为不理想。因为:

    • NextGenGallery 虽有错,但大错不在它,而在 Nginx 没配好。
    • 这个问题被反应到 NextGenGallery 开发者很久了,期间 NextGenGallery 升级了无数次,也没见他修正此 bug,可能他认为此 bug 非 bug。

    我认为解决问题的根本办法是在 fastcgi_param 文件里,把通常人用的

    fastcgi_param  PATH_INFO          $fastcgi_path_info;
    

    改为

    fastcgi_param  PATH_INFO          $fastcgi_path_info if_not_empty;
    
  • Newly installed BT Infinity keeps dropping

    Is BT Infinity stable
    Is BT Infinity stable

    BT Infinity 装了四天。前两天每天都会有一两次断线再续上,这离我心目中一个月都不断一次的设想有很大距离,但说实话,这并不影响使用。

    昨天下午开始,我注意到 BT Infinity 频繁断线,一个小时内会断好几次,这下我受不了了。我写了一个检测脚本,从凌晨2点多开始运行,收集到以下数据:

    ip up_time down_time
    86.163.4.231 2014-03-28 02:26:27 2014-03-28 02:31:34
    86.155.231.26 2014-03-28 02:34:02 2014-03-28 03:02:35
    86.163.218.228 2014-03-28 03:05:01 2014-03-28 03:34:01
    86.144.50.27 2014-03-28 03:37:01 2014-03-28 04:03:19
    86.155.228.111 2014-03-28 04:06:01 2014-03-28 04:34:01
    86.163.218.154 2014-03-28 04:37:01 2014-03-28 05:04:03
    86.164.192.9 2014-03-28 05:07:01 2014-03-28 05:36:01
    31.52.209.24 2014-03-28 05:38:01 2014-03-28 06:05:35
    86.144.50.126 2014-03-28 06:08:01 2014-03-28 06:36:02
    86.164.194.59 2014-03-28 06:39:01 2014-03-28 07:06:03
    86.164.194.91 2014-03-28 07:09:01 2014-03-28 07:38:01
    86.144.51.127 2014-03-28 07:40:01 2014-03-28 08:09:01
    86.155.228.111 2014-03-28 08:10:02 2014-03-28 08:31:02
    86.155.230.112 2014-03-28 08:41:01 2014-03-28 09:08:05
    86.149.254.255 2014-03-28 09:11:01 NULL

    我注意到从今天早上 9:11 开始,一直到现在下午 3:55,没有掉过线。我猜是 BT 在大部分人的非工作时间远程更新 Home Hub 5 的韧件,但我也并不喜欢 BT 来操控已经属于我的路由器,更不喜欢 BT 决定更新韧件的时间,是时候考虑买一个正宗的路由器,彻底堵住 BT 的后门。如果这次频繁掉线不是 BT 更新韧件引起的,那更糟糕,BT Infinity 竟然如此不稳定吗?我更换宽带,等了一个多月,等来的是如此结果?我暂不想下这个结论。不管怎样,我已经向 BT 反映了频繁掉线的问题,正等待它的反馈。