PHP重新动态编译Curl扩展添加异步DNS支持c-ares
发布时间:January 30, 2015 // 分类: // No Comments
和pycurl支持异步DNS支持c-ares类似,请先确定Libcurl是否已支持异步DNS解析c-ares,如不支持可升级libcurl支持异步DNS解析c-ares。
理论上的libcurl更新添加支持异步DNS解析后,将库文件通过ldconfig添加到系统动态库,如果大版本号和之前版本相同,可以不用重新编译Php curl扩展已支持异步DNS,因为PHP curl依赖libcurl会自动选择版本较高的lib。
如查看系统共享库中的Libcurl:
ldconfig -p|grep curl
libcurl.so.4 (libc6,x86-64) => /usr/local/curl/lib/libcurl.so.4
libcurl.so.4 (libc6,x86-64) => /usr/lib64/libcurl.so.4
libcurl.so (libc6,x86-64) => /usr/local/curl/lib/libcurl.so
libcurl.so (libc6,x86-64) => /usr/lib64/libcurl.so
然后查看php curl扩展的共享库依赖,可见已自动选择新编译的libcurl.so.4:
ldd /usr/lib64/php/modules/curl.so|grep curl
libcurl.so.4 => /usr/local/curl/lib/libcurl.so.4 (0x00007f406f0f9000)
不过为了稳定可以重新编译下php curl扩展,本文PHP为yum安装,如果是源码安装的可参考:PHP动态编译添加IMAP模块支持。
查看已安装的PHP版本,并下
php -v
PHP 5.5.21 (cli) (built: Jan 21 2015 15:35:14)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
下载相应版本的源码并重新编译curl扩展:
yum install php-devel
wget https://github.com/php/php-src/archive/php-5.5.21.tar.gz
tar zxvf php-5.5.21.tar.gz
cd php-src-php-5.5.21/ext/curl/
phpize
./configure --with-curl=/usr/local/curl
查看当前PHP CURL是否已支持异步DNS支持:
php -i|grep AsynchDNS
AsynchDNS => Yes
Python Curl/Pycurl添加DNS解析支持
发布时间:January 30, 2015 // 分类:Python // No Comments
Pycurl底层使用libcurl,请先确定Libcurl是否已支持异步DNS解析c-ares,如不支持可升级libcurl支持异步DNS解析c-ares。
其实Libcurl更新支持为异步DNS如果已安装pycurl不用重新安装Pycurl,见https://www.haiyun.me/archives/1070.html
通过pip安装:
export PATH=/usr/local/curl/bin/:$PATH
export LD_LIBRARY_PATH="/usr/local/curl/lib/"
export PYCURL_SSL_LIBRARY=openssl
pip install pycurl
下载pycurl源码包安装:
wget http://pycurl.sourceforge.net/download/pycurl-7.19.5.1.tar.gz
tar zxvf pycurl-7.19.5.1.tar.gz
cd pycurl-7.19.5.1
export LD_LIBRARY_PATH="/usr/local/curl/lib/"
python setup.py install --curl-config=/usr/local/curl/bin/curl-config --with-ssl
检查pycurl是否已支持异步DNS解析c-ares:
>>> import pycurl
>>> pycurl.version
'PycURL/7.19.5.1 libcurl/7.40.0 OpenSSL/1.0.1e zlib/1.2.7 c-ares/1.10.0'
安装pycurl后使用时遇到的一些错误:
pycurl.so: undefined symbol: CRYPTO_num_locks
原因:libcurl安装时--with-ssl支持
libcurl link-time ssl backend (openssl) is different from compile-time ssl backend (none/other)
原因:libcurl和pycurl编译时ssl后端不一致,调整见上和libcurl安装
pycurl: libcurl link-time version (7.19.7) is older than compile-time version (7.4.0)
原因:编译pycurl时使用的编译的libcurl动态库,不过现在pycurl现在加载的是系统自带的版本较旧的动态库,解决将编译的libcurl动态库添加到系统动态库,见ldconfig
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;
}
PowerDNS使用
发布时间:February 1, 2014 // 分类:DNS // No Comments
使用EPEL源可直接安装:
yum install pdns pdns-backend-mysql
添加MySQL数据库:
create database powerdns;
grant all privileges on powerdns.* to 'powerdns'@'localhost' identified by 'password';
use powerdns;
create table domains (
id INT auto_increment,
name VARCHAR(255) NOT NULL,
master VARCHAR(128) DEFAULT NULL,
last_check INT DEFAULT NULL,
type VARCHAR(6) NOT NULL,
notified_serial INT DEFAULT NULL,
account VARCHAR(40) DEFAULT NULL,
primary key (id)
) Engine=InnoDB;
CREATE UNIQUE INDEX name_index ON domains(name);
CREATE TABLE records (
id INT auto_increment,
domain_id INT DEFAULT NULL,
name VARCHAR(255) DEFAULT NULL,
type VARCHAR(10) DEFAULT NULL,
content VARCHAR(64000) DEFAULT NULL,
ttl INT DEFAULT NULL,
prio INT DEFAULT NULL,
change_date INT DEFAULT NULL,
primary key(id)
) Engine=InnoDB;
CREATE INDEX nametype_index ON records(name,type);
CREATE INDEX domain_id ON records(domain_id);
create table supermasters (
ip VARCHAR(64) NOT NULL,
nameserver VARCHAR(255) NOT NULL,
account VARCHAR(40) DEFAULT NULL,
PRIMARY KEY (ip, nameserver)
) Engine=InnoDB;
将SQL信息添加到PowerDNS配置文件:
launch=gmysql
gmysql-host=localhost
gmysql-user=powerdns
gmysql-password=password
gmysql-dbname=powerdns
添加域名记录:
INSERT INTO domains (name, type) values ('example.com', 'NATIVE');
insert into `records`(`domain_id`,`name`,`type`,`content`,`ttl`,`prio`,`change_date`) values
(1,'example.com','SOA','localhost root@example.com 1',86400,NULL,NULL);
insert into `records`(`domain_id`,`name`,`type`,`content`,`ttl`,`prio`,`change_date`) values
(1,'example.com','NS','ns.example.com',86400,NULL,NULL);
insert into `records`(`domain_id`,`name`,`type`,`content`,`ttl`,`prio`,`change_date`) values
(1,'example.com','A','192.0.2.10',120,NULL,NULL);
insert into `records`(`domain_id`,`name`,`type`,`content`,`ttl`,`prio`,`change_date`) values
(1,'*.example.com','A','192.0.2.10',120,NULL,NULL);
insert into `records`(`domain_id`,`name`,`type`,`content`,`ttl`,`prio`,`change_date`) values
(1,'ns.example.com','A','192.0.2.10',120,NULL,NULL);
看看效果:
/etc/init.d/pdns monitor
PHP:
<?php
try {
$dbo = new PDO('mysql:host=localhost;dbname=powerdns', 'powerdns', 'password');
} catch (PDOException $e) {
$error = $e->getMessage();
die("PDO Execute Error : ".$error."\n");
}
$domain = 'www.haiyun.me';
$sql = "SELECT `id` FROM domains WHERE NAME = \"$domain\"";
$stmt = $dbo->query($sql);
//var_dump($stmt);
$result = $stmt->fetch(PDO::FETCH_ASSOC);
var_dump($result);
if ($result) {
$id = $result['id'];
} else {
$sql = "INSERT INTO domains (name, TYPE) VALUES (\"$domain\", 'NATIVE')";
$dbo->query($sql);
$id = $dbo->lastInsertId();
}
$sql = "INSERT INTO `records` (`domain_id`, `name`, `TYPE`, `content`, `ttl`) VALUES (:id, :name, :type, :content, :ttl)";
$stmt = $dbo->prepare($sql);
$stmt->execute(array(':id'=>$id, ':name'=>'a.'.$domain, ':type'=>'A', ':content'=>'192.168.1.1', ':ttl'=>'600'));
$stmt->execute(array(':id'=>$id, ':name'=>'b.'.$domain, ':type'=>'A', ':content'=>'192.168.1.1', ':ttl'=>'600'));
?>
分类
- Apache (13)
- Nginx (45)
- PHP (86)
- IIS (8)
- Mail (17)
- DNS (16)
- Cacti (14)
- Squid (5)
- Nagios (4)
- Puppet (7)
- CentOS (13)
- Iptables (23)
- RADIUS (3)
- OpenWrt (41)
- DD-WRT (1)
- VMware (9)
- 网站程序 (2)
- 备份存储 (11)
- 常用软件 (20)
- 日记分析 (10)
- Linux基础 (18)
- 欧诺代理 (0)
- Linux服务 (18)
- 系统监控 (4)
- 流量监控 (7)
- 虚拟化 (28)
- 伪静态 (2)
- LVM (3)
- Shell (18)
- 高可用 (2)
- 数据库 (16)
- FreeBSD (3)
- 网络安全 (25)
- Windows (35)
- 网络工具 (22)
- 控制面板 (3)
- 系统调优 (10)
- Cisco (3)
- VPN (6)
- ROS (20)
- Vim (14)
- KMS (4)
- PXE (2)
- Mac (1)
- Git (1)
- PE (1)
- LNS (2)
- Xshell (7)
- Firefox (13)
- Cygwin (4)
- OpenSSL (9)
- Sandboxie (3)
- StrokesPlus (1)
- AutoHotKey (4)
- Total Commander (3)
- WordPress (3)
- iMacros (6)
- Typecho (2)
- Ollydbg (1)
- Photoshop (1)
- 正则 (3)
- Debian (3)
- Python (8)
- NoSQL (6)
- 消息队列 (4)
- JS (7)
- Tmux (3)
- GO (7)
- HHVM (2)
- 算法 (1)
- Docker (2)
- PT (15)
- N1 (16)
- K2P (6)
- LUKS (4)
最新文章
- 光猫拨号ImmortalWrt/OpenWRT路由获取ipv6遇到的问题
- php-fpm错误error_log日志配置
- debian-12/bookworm安装mariadb10.3和mysql5.6
- smokeping主从配置及遇到的问题
- openwrt/linux使用tcpdump/nflog ulogd记录iptables日志
- tmux bash shell自动保存history
- ImmortalWrt/OpenWRT为guest wifi网络配置ipv6 nat6
- PVE更新upgrade遇到The following packages have been kept back
- openwrt/immortalwrt修改odhcpd ipv6 preferred_lifetime和valid_lifetime
- golang版本udpxy iptv rtp多播转http单播
最近回复
- 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 ...