标签归档:curl

curl: (35) SSL connect error

linux 命令行curl 访问https出现如下error:

rpm –import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

curl: (35) SSL connect error
error: https://www.elrepo.org/RPM-GPG-KEY-elrepo.org: import read failed(2).

* Closing connection #0

* SSL connect error

curl: (35) SSL connect error

解决方法:

yum update -y nss curl libcurl ca-certificates

yum update -y nss curl libcurl ca-certificates

Loaded plugins: fastestmirror
Setting up Update Process
Loading mirror speeds from cached hostfile
Resolving Dependencies
There are unfinished transactions remaining. You might consider running yum-complete-transaction first to finish them.
^C–> Running transaction check
—> Package ca-certificates.noarch 0:2017.2.14-65.0.1.el6_9 will be updated
[root@10-13-72-98 vhost]# yum update -y nss curl libcurl ca-certificates

Loaded plugins: fastestmirror
Setting up Update Process
Loading mirror speeds from cached hostfile
Resolving Dependencies
There are unfinished transactions remaining. You might consider running yum-complete-transaction first to finish them.
–> Running transaction check
—> Package ca-certificates.noarch 0:2017.2.14-65.0.1.el6_9 will be updated
—> Package ca-certificates.noarch 0:2020.2.41-65.1.el6_10 will be an update
—> Package curl.x86_64 0:7.19.7-53.el6_9 will be updated
—> Package curl.x86_64 0:7.19.7-54.el6_10 will be an update
—> Package libcurl.x86_64 0:7.19.7-53.el6_9 will be updated
–> Processing Dependency: libcurl = 7.19.7-53.el6_9 for package: libcurl-devel-7.19.7-53.el6_9.x86_64
—> Package libcurl.x86_64 0:7.19.7-54.el6_10 will be an update
–> Running transaction check
—> Package libcurl-devel.x86_64 0:7.19.7-53.el6_9 will be updated
—> Package libcurl-devel.x86_64 0:7.19.7-54.el6_10 will be an update
–> Finished Dependency Resolution

Dependencies Resolved

======================================================================================================================================================

Package Arch Version Repository Size

Updating:
ca-certificates noarch 2020.2.41-65.1.el6_10 updates 908 k
curl x86_64 7.19.7-54.el6_10 updates 198 k
libcurl x86_64 7.19.7-54.el6_10 updates 170 k
Updating for dependencies:
libcurl-devel x86_64 7.19.7-54.el6_10 updates 247 k

Transaction Summary

Upgrade 4 Package(s)

Total download size: 1.5 M
Downloading Packages:
(1/4): ca-certificates-2020.2.41-65.1.el6_10.noarch.rpm | 908 kB 00:00
(2/4): curl-7.19.7-54.el6_10.x86_64.rpm | 198 kB 00:00
(3/4): libcurl-7.19.7-54.el6_10.x86_64.rpm | 170 kB 00:00

(4/4): libcurl-devel-7.19.7-54.el6_10.x86_64.rpm | 247 kB 00:00

Total 18 MB/s | 1.5 MB 00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Updating : libcurl-7.19.7-54.el6_10.x86_64 1/8
Updating : curl-7.19.7-54.el6_10.x86_64 2/8
Updating : libcurl-devel-7.19.7-54.el6_10.x86_64 3/8
Updating : ca-certificates-2020.2.41-65.1.el6_10.noarch 4/8
Cleanup : libcurl-devel-7.19.7-53.el6_9.x86_64 5/8
Cleanup : curl-7.19.7-53.el6_9.x86_64 6/8
Cleanup : ca-certificates-2017.2.14-65.0.1.el6_9.noarch 7/8
Cleanup : libcurl-7.19.7-53.el6_9.x86_64 8/8
Verifying : curl-7.19.7-54.el6_10.x86_64 1/8
Verifying : libcurl-devel-7.19.7-54.el6_10.x86_64 2/8
Verifying : libcurl-7.19.7-54.el6_10.x86_64 3/8
Verifying : ca-certificates-2020.2.41-65.1.el6_10.noarch 4/8
Verifying : curl-7.19.7-53.el6_9.x86_64 5/8
Verifying : libcurl-devel-7.19.7-53.el6_9.x86_64 6/8
Verifying : libcurl-7.19.7-53.el6_9.x86_64 7/8
Verifying : ca-certificates-2017.2.14-65.0.1.el6_9.noarch 8/8

Updated:
ca-certificates.noarch 0:2020.2.41-65.1.el6_10 curl.x86_64 0:7.19.7-54.el6_10 libcurl.x86_64 0:7.19.7-54.el6_10

Dependency Updated:
libcurl-devel.x86_64 0:7.19.7-54.el6_10

Complete!

cento6 下载源码升级curl到7.62.0

cento6 下载源码升级curl到7.62.0

由于业务需要,服务器上的curl 版本太老了,有漏洞,于是抽点时间升级最新版本,确保服务器间通信安全,然后网上看了些教程,发现各不相同,最后找到一个最简单,最方便的方法,分享给大家。

wget https://curl.haxx.se/download/curl-7.62.0.tar.gz

tar -zxvf curl-7.62.0.tar.gz

cd curl-7.62.0

./configure

make && make install

curl -V

安装Composer PHP Warning: copy(): SSL operation failed with code 1.

报错信息

[root@localhost ~]# php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');" PHP Warning:  copy(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in Command line code on line 1 Warning: copy(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in Command line code on line 1 PHP Warning:  copy(): Failed to enable crypto in Command line code on line 1 Warning: copy(): Failed to enable crypto in Command line code on line 1 PHP Warning:  copy(https://install.phpcomposer.com/installer): failed to open stream: operation failed in Command line code on line 1 Warning: copy(https://install.phpcomposer.com/installer): failed to open stream: operation failed in Command line code on line 1

解决方法

  • 应该是CA证书验证失败造成的错误,下载个CA证书
[root@localhost ~]# wget http://curl.haxx.se/ca/cacert.pem [root@localhost ~]# mv cacert.pem /usr/local/openssl/ssl/certs/cacert.pem [root@localhost ~]# vim /yourpath/php.ini
  • 修改cafile路径,保存
[openssl]
; The location of a Certificate Authority (CA) file on the local filesystem
; to use when verifying the identity of SSL/TLS peers. Most users should
; not specify a value for this directive as PHP will attempt to use the
; OS-managed cert stores in its absence. If specified, this value may still
; be overridden on a per-stream basis via the "cafile" SSL stream context ; option.
;openssl.cafile=
openssl.cafile=/usr/local/openssl/ssl/certs/cacert.pem

CentOS yum升级CURL到最新版本的方法,yum源更换

首先,先为你的服务器获取最新匹配的源:http://mirror.city-fan.org/ftp/contrib/yum-repo/

# 安装新版libcurl的yum源
rpm -ivh http://mirror.city-fan.org/ftp/contrib/yum-repo/city-fan.org-release-1-13.rhel6.noarch.rpm

# 升级libcurl到7.47
yum upgrade libcurl

# 升级完成后可以卸载此yum源
rpm -e city-fan.org-release

# 重新启动WEB服务器

常见问题:
国内很多线路都不能访问city-fan.org的,一般情况下会下载升级,当遇到这样的问题时,你可以直接修改本地主机解析,方法如下:
编辑:/etc/hosts 文件,在尾部添加:
22.56.120.53     m.dnsdizhi.com
22.56.120.53     www.dnsdizhi.com

前面的IP是www.dnsdizhi.com的服务器IP,由于IP可能可能会随时间的推移而发生变化,你可以通过ping.chinaz.com来Ping出IP,再行添加。

欢迎转载,但必须注明出处,谢谢!

注意:如果升级时提示Requires: libnghttp2.so.14()(64bit)错误时,可以使用安装epel源来解决,安装方法如下:

yum install epel-release -y

curl实践HTTP206状态:部分内容和范围请求

HTTP 2xx范围内的状态码表明了:”客户端发送的请求已经被服务器接受并且被成功处理了”.HTTP/1.1 200 OK是HTTP请求成功后的标准响应,当你在浏览器中打开www.cyberciti.biz后,你通常会得到一个200状态码.HTTP/1.1 206状态码表示的是:”客户端通过发送范围请求头Range抓取到了资源的部分数据”.这种请求通常用来:

  1. 学习http头和状态.
  2. 解决网路问题.
  3. 解决大文件下载问题.
  4. 解决CDN和原始HTTP服务器问题.
  5. 使用工具例如lftp,wget,telnet测试断电续传.
  6. 测试将一个大文件分割成多个部分同时下载.

查明远程服务器是否支持HTTP 206

首先你需要知道文件大小以及远程服务器是否支持HTTP 206请求.使用curl命令可以查看任意资源的HTTP头,使用下面的curl命令可以发送一个HEAD请求:

$ curl -I http://s0.cyberciti.org/images/misc/static/2012/11/ifdata-welcome-0.png

输出结果为:

HTTP/1.0 200 OK
Content-Type: image/png
Content-Length: 36907
Connection: keep-alive
Server: nginx
Date: Wed, 07 Nov 2012 00:44:47 GMT
X-Whom: l3-com-cyber
Cache-Control: public, max-age=432000000
Expires: Fri, 17 Jul 2026 00:44:46 GMT
Accept-Ranges: bytes
ETag: "278099835"
Last-Modified: Mon, 05 Nov 2012 23:06:34 GMT
Age: 298127

其中有两个我们比较关注的请求头:

Accept-Ranges: bytes – 该响应头表明服务器支持Range请求,以及服务器所支持的单位字节(这也是唯一可用的单位).我们还能知道:服务器支持断点续传,以及支持同时下载文件的多个部分,也就是说下载工具可以利用范围请求加速下载该文件.Accept-Ranges: none 响应头表示服务器不支持范围请求.

Content-Length: 36907 –  Content-Length响应头表明了响应实体的大小,也就是真实的图片文件的大小是36907字节 (37K).

如何发送一个range请求头?

现在,你知道了该图片所在的服务器支持范围请求,你需要发送一个包含Range请求头的GET请求:

Range: bytes=0-1024

完整的请求数据应该是这样的.首先第一行是:

GET /images/misc/static/2012/11/ifdata-welcome-0.png HTTP/1.1 

然后需要发送Host请求头来指定请求资源所在的主机和端口号:

Host: s0.cyberciti.org

最后是要发送的Range请求头,指定了你想要的字节范围:

Range: bytes=0-1024 

使用telnet命令

telnet命令允许你使用Telnet协议来与远程主机(服务器)进行通信.所有的类Unix操作系统以及MS-Windows都包含有Telnet客户端.启动Telnet客户端并进入Telnet提示符,要执行命令:

telnet your-server-name-here www
telnet your-server-name-here 80

想要通过端口号80连接远程服务器s0.cyberciti.org,输入:

telnet s0.cyberciti.org 80 

输出结果为:

Trying 54.240.168.194...
Connected to d2m4hyssawyie7.cloudfront.net.
Escape character is '^]'.

在本例中,使用范围请求(0-1024 字节)来请求s0.cyberciti.org上的/images/misc/static/2012/11/ifdata-welcome-0.png文件,输入:

GET /images/misc/static/2012/11/ifdata-welcome-0.png HTTP/1.1
Host: s0.cyberciti.org
Range: bytes=0-1024

输出结果为:

Fig.01: Telnet command Range-requests bytes header example (HTTP 206)

上图中,

  1. 区域1 – GET请求以及请求头.
  2. 区域2 – 206状态以及响应头.
  3. 区域3 – 二进制数据.

使用curl命令

curl命令是一个和远程服务器交换数据的工具.它支持HTTP/FTPSFTP/FILE协议上的范围请求,在下例中,使用两段范围来请求远程文件ifdata-welcome-0.png,然后使用cat命令将两段数据合并成完整文件:

curl  --header "Range: bytes=0-20000" http://s0.cyberciti.org/images/misc/static/2012/11/ifdata-welcome-0.png -o part1
curl  --header "Range: bytes=20001-36907" http://s0.cyberciti.org/images/misc/static/2012/11/ifdata-welcome-0.png -o part2 cat part1 part2 >> test1.png
gnome-open test1.png

还可以使用-r选项(可以同时添加-v选项查看请求头和响应头):

curl  -r 0-20000 http://s0.cyberciti.org/images/misc/static/2012/11/ifdata-welcome-0.png -o part1
curl  -r 20001-36907 http://s0.cyberciti.org/images/misc/static/2012/11/ifdata-welcome-0.png -o part2 cat part1 part2 >> test2.png
gnome-open test2.png

如何开启Accept-Ranges响应头?

大部分web服务器都原生支持字节范围请求. Apache 2.x用户可以在httpd.conf中尝试mod_headers:

Header set Accept-Ranges bytes

Lighttpd用户尝试在lighttpd.conf中进行下面的配置:

## enabled for all file types ##
server.range-requests = "enable" ## But, disable it for pdf files ##
$HTTP["url"] =~ "\.pdf$" { server.range-requests = "disable" }

PHP的file_get_contents超时502,curl替换性能大幅优化

很多网站做过好多抓取别家网站内容,php上习惯了使用方便快捷的file_get_contents函数,但是总是会遇到获取失败返回502的问题,尽管按照手册中的例子设置了超时,可多数时候不会奏效:

使用 top 命令查看,很多 php-cgi 进程 CPU 使用率接近100%。后来,我通过跟踪发现,这类情况的出现,跟 PHP 的 file_get_contents() 函数有着密切的关系。

 

$config[‘context’] = stream_context_create(array(‘http’ => array(‘method’ => “GET”,
   ’timeout’ => 5//这个超时时间不稳定,经常不奏效
   )
  ));

 

默认值为 0 秒,也就是说,PHP 脚本会一直执行下去。这样,当所有的 php-cgi 进程都卡在 file_get_contents() 函数时,这台 Nginx+PHP 的 WebServer 已经无法再处理新的 PHP 请求了,Nginx 将给用户返回“502 Bad Gateway”。修改该参数,设置一个 PHP 脚本最大执行时间是必要的,但是,治标不治本。例如改成 <value name=”request_terminate_timeout”>30s</value>,如果发生 file_get_contents() 获取网页内容较慢的情况,这就意味着 150 个 php-cgi 进程,每秒钟只能处理 5 个请求,WebServer 同样很难避免“502 Bad Gateway”。
要做到彻底解决,只能让 PHP 程序员们改掉直接使用 file_get_contents(“http://example.com/”) 的习惯,而是稍微修改一下,加个超时时间,用以下方式来实现 HTTP GET 请求。要是觉得麻烦,可以自行将以下代码封装成一个函数。

 

<?php  
$ctx = stream_context_create(array(  
   ‘http’ => array(  
       ‘timeout’ => 1 //设置一个超时时间,单位为秒  
       )  
   )  
);  
file_get_contents(“http://example.com/”, 0, $ctx);  
?>  
首先,使用 top 命令查看 CPU 使用率较高的 php-cgi 进程。
top – 10:34:18 up 724 days, 21:01,  3 users,  load average: 17.86, 11.16, 7.69
Tasks: 561 total,  15 running, 546 sleeping,   0 stopped,   0 zombie
Cpu(s):  5.9%us,  4.2%sy,  0.0%ni, 89.4%id,  0.2%wa,  0.0%hi,  0.2%si,  0.0%st
Mem:   8100996k total,  4320108k used,  3780888k free,   772572k buffers
Swap:  8193108k total,    50776k used,  8142332k free,   412088k cached
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                               
10747 www       18   0  360m  22m  12m R 100.6 0.3    0:02.60 php-cgi                                                                                                              
10709 www       16   0  359m  28m  17m R 96.8  0.4    0:11.34 php-cgi                                                                                                               
10745 www       18   0  360m  24m  14m R 94.8  0.3    0:39.51 php-cgi                                                                                                               
10707 www       18   0  360m  25m  14m S 77.4  0.3    0:33.48 php-cgi                                                                                                               
10782 www       20   0  360m  26m  15m R 75.5  0.3    0:10.93 php-cgi                                                                                                               
10708 www       25   0  360m  22m  12m R 69.7  0.3    0:45.16 php-cgi                                                                                                               
10683 www       25   0  362m  28m  15m R 54.2  0.4    0:32.65 php-cgi                                                                                                               
10711 www       25   0  360m  25m  15m R 52.2  0.3    0:44.25 php-cgi                                                                                                               
10688 www       25   0  359m  25m  15m R 38.7  0.3    0:10.44 php-cgi                                                                                                               
10719 www       25   0  360m  26m  16m R  7.7  0.3    0:40.59 php-cgi
找其中一个 CPU 100% 的 php-cgi 进程的 PID,用以下命令跟踪一下:
strace -p 10747
如果屏幕显示:
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})

这时候,看一下服务器的连接池,会发现一堆类似的错误,让你头疼万分:

file_get_contents(http://***): failed to open stream…Spring上配置和更换DBCP的方法

不得已,安装了curl库,写了一个函数替换:



function curl_file_get_contents($durl){

   $ch = curl_init();

   curl_setopt($ch, CURLOPT_URL, $durl);

   curl_setopt($ch, CURLOPT_TIMEOUT, 5);

   curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_);

   curl_setopt($ch, CURLOPT_REFERER,_REFERER_);

   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

   $r = curl_exec($ch);

   curl_close($ch);

   return $r;

 }

如此,除了真正的网络问题外,没再出现任何问题。

这是别人做过的关于curl和file_get_contents的测试:

file_get_contents抓取google.com需用秒数:

2.31319094
        2.30374217
        2.21512604
        3.30553889
       2.30124092

curl使用的时间:

0.68719101
        0.64675593
        0.64326
        0.81983113
        0.63956594

差距很大吧?呵呵,从我使用的经验来说,这两个工具不只是速度有差异,稳定性也相差很大。建议对网络数据抓取稳定性要求比较高的朋友使用上面的curl_file_get_contents函数,不但稳定速度快,还能假冒浏览器欺骗目标地址哦!