海运的博客

CentOS编译安装libcurl/curl添加异步DNS解析c-ares

发布时间:January 30, 2015 // 分类: // No Comments

在使用curl异步并发请求时如果有大量域名解析会长时间阻塞程序IO,可以编译升级libcurl以支持异步DNS解析。
Centos7自带libcurl已支持异步DNS支持,不过是--enable-threaded-resolver,可以使用curl-config --configure查看curl编译参数。
查看Libcurl是否已支持异步DNS解析,包含AsynchDNS为支持:

curl --version
curl 7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.40.0 OpenSSL/1.0.1e zlib/1.2.3
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS IPv6 Largefile NTLM SSL libz 

首先安装异步DNS解析库c-ares:

yum install c-ares-devel openssl-devel

编译libcurl库:

wget http://curl.haxx.se/download/curl-7.40.0.tar.gz
tar zxvf curl-7.40.0.tar.gz 
cd curl-7.40.0/
./configure --enable-ares --prefix=/usr/local/curl --with-ssl
make && make install

查看编译安装的curl信息,已经支持了异步DNS解析库c-ares:

/usr/local/curl/bin/curl --version
curl 7.40.0 (x86_64-unknown-linux-gnu) libcurl/7.40.0 OpenSSL/1.0.1e zlib/1.2.7 c-ares/1.10.0
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS IPv6 Largefile NTLM NTLM_WB SSL libz UnixSockets 

将libcurl动态库添加到动态链接库:

echo '/usr/local/curl/lib' > /etc/ld.so.conf.d/libcurl.conf
ldconfig

使用libcurl库看是否支持c-ares:

#include <curl/curl.h>
int main()
{
 curl_version_info_data*info=curl_version_info(CURLVERSION_NOW);
 if (info->features&CURL_VERSION_ASYNCHDNS) {
   printf( "ares enabled\n");
 } else {
   printf( "ares NOT enabled\n");
 }
 return 0;
}

又一PHP libcurl封装异步并发HTTP客户端

发布时间:January 27, 2015 // 分类:PHP // No Comments

PHP标准库内置curl扩展,不过实现不完整,如multi_socket_action接口,无意中发现pecl http库同样基于libcurl封装,支持更多的libcurl特性,更新也比较快,底层通过libevent(epoll)实现multi_socket_action接口,不过pecl http版本1和版本2 api完全不兼容,使用过程中稳定性及性能并不如PHP内置的curl,好像还有内存泄露,以下为示例代码,基于pecl_http 2.20:

<?php
   function push($client, $url) {
      $req = new http\Client\Request("GET", $url, ["User-Agent"=>"My Client/0.1"]);
      $req->setOptions(array('connecttimeout'=>1, 'timeout'=>1));
      $client->enqueue($req, function($response) use ($client, $req, $url) {
         printf("%s returned '%s' (%d)\n", $response->getTransferInfo("effective_url"), $response->getInfo(), $response->getResponseCode());
         echo $client->count().PHP_EOL;
         global $urls;
         if ($urls) {
            while ($client->count() < 20) {
               $url = array_shift($urls);
               push($client, $url);
            }
            return true; // dequeue
         }
      });
   }

   $client = new http\Client;
   $client->enablePipelining(true);
   $client->enableEvents(true);

   for ($i = 0; $i < 10000; ++$i) {
      $urls[] = "http://192.168.1.3/";
   }
   for ($i = 0; $i < 20; ++$i) {
      $url = array_shift($urls);
      push($client, $url);
   }
   /*
   try{
      var_dump($client->send());
   }
   catch(http\Exception\RuntimeException  $e)
   {
      echo 'Message: ' .$e->getMessage().PHP_EOL;
   }
   */

   while ($client->once()) {
      $client->wait();
   }

Docker守护进程管理器s6/Supervisor

发布时间:January 25, 2015 // 分类:Docker // No Comments

安装s6及依赖,注意make版本一定要4.0以上.

wget http://skarnet.org/software/skalibs/skalibs-2.2.0.0.tar.gz
tar zxvf skalibs-2.2.0.0.tar.gz
cd skalibs-2.2.0.0
./configure && make && make install
wget http://skarnet.org/software/execline/execline-2.0.1.1.tar.gz
tar zxvf execline-2.0.1.1.tar.gz
cd execline-2.0.1.1
./configure && make && make install
wget http://skarnet.org/software/s6/s6-2.0.1.0.tar.gz
tar zxvf s6-2.0.1.0.tar.gz
cd s6-2.0.1.0
./configure && make && make install

s6启动时会依次执行目录下run命令:

mkdir -p /etc/s6/nginx/
mkdir -p /etc/s6/.s6-svscan
#启动命令
cat > /etc/s6/nginx/run << EOF
#!/bin/bash
nginx -c /etc/nginx/nginx.conf
EOF
chmod +x /etc/s6/nginx/run
#关闭命令
cat > /etc/s6/nginx/finish << EOF
#!/bin/bash
kill  `cat /var/run/nginx.pid`
EOF
chmod +x /etc/s6/nginx/finish

注意程序要以foreground非守护方式启动,如nginx要在配置文件添加:

daemon off;

当docker容器关闭时s6执行.s6-svscan/finish:

cat > /etc/s6/.s6-svscan/finish << EOF
#!/bin/bash
for file in /etc/s6/*/finish; do
   $file
done

for service in /etc/s6/* ; do
   s6-svwait -d $service
done
EOF
chmod +x /etc/s6/.s6-svscan/finish

docker容器启动时执行命令:

s6-svscan /etc/s6/
#-c 最大service数
#-t 重新扫描间隔,如果程序关闭会自动重启,毫秒,默认5秒

进程控制,重启:

s6-svc -t /etc/s6/nginx

关闭不重启:

s6-svc -d /etc/s6/nginx

更多:http://skarnet.org/software/s6/s6-svc.html
参考:
http://blog.tutum.co/2014/12/02/docker-and-s6-my-new-favorite-process-supervisor/
http://kfei.logdown.com/posts/245469-using-s6-as-the-init-process-for-muliple-service-docker-container

CentOS6升级安装GCC4.82

发布时间:January 24, 2015 // 分类: // No Comments

使用Centos官方源安装:

wget http://people.centos.org/tru/devtools-2/devtools-2.repo  -P /etc/yum.repos.d
yum install devtoolset-2-gcc
yum install devtoolset-2-gcc-c++
export CC=/opt/rh/devtoolset-2/root/usr/bin/gcc
export CPP=/opt/rh/devtoolset-2/root/usr/bin/cpp
export CXX=/opt/rh/devtoolset-2/root/usr/bin/g++

编译安装GCC:

yum install gmp-devel mpfr-devel  libmpc-devel
wget ftp://ftp.gnu.org/gnu/gcc/gcc-4.8.2/gcc-4.8.2.tar.gz
tar zxf gcc-4.8.2.tar.gz
cd gcc-4.8.2
./configure --enable-languages=c,c++ --disable-multilib
make && make install

全球各国家IP/ASN及BGP路由信息

发布时间:January 20, 2015 // 分类: // No Comments

全球IP/ASN由ICANN负责分配和管理,ICANN将部分IP地址分配给地区级的Internet注册机构 (RIR),然后由这些RIR负责该地区的登记注册服务。
全球一共有5个RIR,其分配的IP信息如下:
北美地区
ftp://ftp.arin.net/pub/stats/arin/delegated-arin-extended-latest
欧洲地区
ftp://ftp.ripe.net/ripe/stats/delegated-ripencc-latest
非洲地区
ftp://ftp.afrinic.net/pub/stats/afrinic/delegated-afrinic-latest
亚太地区
ftp://ftp.apnic.net/pub/stats/apnic/delegated-apnic-latest
拉丁美洲
ftp://ftp.lacnic.net/pub/stats/lacnic/delegated-lacnic-latest
ISO国家标准码:
http://www.iso.org/iso/home/standards/country_codes/country_names_and_code_elements_txt-temp.htm
全球BGP路由表信息:
http://routeviews.org/
http://bgp.potaroo.net/index-bgp.html
可telnet的主干网路由,查询全球路由表:
route-server.ip.att.net
route-views.routeviews.org

分类
最新文章
最近回复
  • opnfense: 谢谢博主!!!解决问题了!!!我之前一直以为内置的odhcp6就是唯一管理ipv6的方式
  • liyk: 这个方法获取的IPv6大概20分钟之后就会失效,默认路由先消失,然后Global IPV6再消失
  • 海运: 不好意思,没有。
  • zongboa: 您好,請問一下有immortalwrt設定guest Wi-Fi的GUI教學嗎?感謝您。
  • 海运: 恩山有很多。
  • swsend: 大佬可以分享一下固件吗,谢谢。
  • Jimmy: 方法一 nghtp3步骤需要改成如下才能编译成功: git clone https://git...
  • 海运: 地址格式和udpxy一样,udpxy和msd_lite能用这个就能用。
  • 1: 怎么用 编译后的程序在家里路由器内任意一台设备上运行就可以吗?比如笔记本电脑 m参数是笔记本的...
  • 孤狼: ups_status_set: seems that UPS [BK650M2-CH] is ...
归档