cURL error 28 in cURL error 60 v WordPressu: kaj pomenita?

WordPress Branje: 5 min

Če se posodobitev vtičnika ustavi tako: „Download failed. cURL error 28: Connection timed out after 10001 milliseconds” ali preverjanje licence oziroma plačilni modul zabeleži napako „cURL error 60: SSL certificate problem: unable to get local issuer certificate”, je WordPress poskušal doseči drug strežnik, pa mu ni uspelo. Obe sporočili izvirata iz cURL, programske knjižnice, s katero PHP pošilja spletne zahteve.

  • Napaka 28 je vedno iztek časa: nekje na poti nekaj ni odgovorilo, dokler se časovna omejitev ni iztekla.
  • Napaka 60 pomeni, da je bila povezava vzpostavljena, potrdila oddaljenega strežnika pa ni bilo mogoče preveriti.

Iz nadaljnjega besedila sporočila je razvidno, kje se je zahteva zataknila in tudi, kdo naj jo odpravi: ti, naša podpora ali oddaljeni ponudnik.

Infografika: pet postaj odhodne zahteve in pripadajoče napake cURL

1. Zapiši točno napako

Napaka se pojavi na strani Vtičniki ali Nadzorna plošča › Posodobitve, v lastnem dnevniku vtičnika ali na strani Orodja › Zdravje spletišča. Tam na primer tako: „Ni bilo mogoče doseči WordPress.org”, pod tem pa z napako cURL in naslovom IP. Zapiši številko napake, besedilo za številko in naslov, ki ga je spletno mesto želelo doseči.

2. Ponovi zahtevo iz WordPressa

Terminal v cPanelu (skupina Napredno) ali SSH uporablja isti PHP in WordPress kot spletno mesto. V mapi spletnega mesta:

cd ~/public_html
wp eval '$r = wp_remote_get( "https://api.wordpress.org/core/version-check/1.7/" ); echo is_wp_error( $r ) ? $r->get_error_message() : wp_remote_retrieve_response_code( $r ), PHP_EOL;'

Na urejenem spletnem mestu je odgovor 200. Namesto WordPress.org lahko vpišeš tudi naslov licenčnega strežnika vtičnika ali plačilnega ponudnika. Katera koli statusna koda, tudi 401 ali 404, pomeni, da omrežna pot deluje in je oddaljeni strežnik odgovoril. Osnove WP-CLI opisuje članek o uporabi WP-CLI.

3. Ponovi s curl, z merjenjem časa

To teče neodvisno od WordPressa, zato loči nastavitev WordPress od omrežja:

curl -sS -o /dev/null --max-time 10 -w 'dns=%{time_namelookup} kapcsolat=%{time_connect} tls=%{time_appconnect} elso_bajt=%{time_starttransfer} ip=%{remote_ip} kod=%{http_code}\n' https://api.wordpress.org/core/version-check/1.7/

Na našem testnem gostovanju (strežnik cPanel aWh):

dns=0.000184 kapcsolat=0.082131 tls=0.169085 elso_bajt=0.252814 ip=2620:109:b00a::4206:2afb kod=200

Vsaka vrednost je število sekund od začetka. Ob napaki curl izpiše tudi vrstico z napako; tabela pokaže, kje se je zataknilo:

curl izpiše tole Kje se je zataknilo Kdo odpravi
curl: (28) Resolving timed out ali curl: (6) Could not resolve host razreševanje imena (DNS) podpora aWh
curl: (7) Failed to connect … Connection refused (takoj) odhodna vrata so prepovedana podpora aWh
curl: (28) Connection timed out požarni zid ali omrežna pot podpora aWh
curl: (28) Operation timed out … with 0 bytes received oddaljeni strežnik ne odgovori pravočasno oddaljeni ponudnik
curl: (60) SSL certificate problem: … preverjanje potrdila glej 5. korak

4. Če curl deluje, WordPress pa ne

Dve konstanti wp-config.php lahko odhodne zahteve prepovesta, še preden se začnejo:

wp config get WP_HTTP_BLOCK_EXTERNAL
wp config get WP_ACCESSIBLE_HOSTS
wp config get WP_PROXY_HOST

Običajni odgovor za vse tri je, da konstanta ni navedena. Če je WP_HTTP_BLOCK_EXTERNAL vklopljena, lahko WordPress doseže le svoje spletno mesto in naslove na seznamu WP_ACCESSIBLE_HOSTS; sporočilo je takrat „User has blocked requests through HTTP”. Dodaj potrebne naslove, ločene z vejico (* je nadomestni znak):

wp config set WP_ACCESSIBLE_HOSTS 'api.wordpress.org,*.wordpress.org,api.szolgaltato.hu'

Ukinjen strežnik proxy (WP_PROXY_HOST) povzroči enak iztek časa; če proxyja ne uporabljaš, ga izbriši: wp config delete WP_PROXY_HOST.

5. Napaka 60: potrdilo

Besedilo za „SSL certificate problem:” pove vzrok:

  • „unable to get local issuer certificate”: shramba potrdil ne pozna izdajatelja ali oddaljeni strežnik ne pošlje vmesnega potrdila.
  • „certificate has expired”: potrdilo oddaljenega strežnika je poteklo, podaljšati ga mora ponudnik.
  • „self-signed certificate in certificate chain”: na poti zahteve naprava razbije šifriranje (na primer filtrirni proxy).

WordPress za svoje zahteve uporablja lastno shrambo potrdil (wp-includes/certificates/ca-bundle.crt), ki se posodablja s posodobitvijo WordPressa. Če je WordPress star, ga najprej posodobi. Nato poglej, kaj pošilja oddaljeni strežnik:

echo | openssl s_client -connect api.szolgaltato.hu:443 -servername api.szolgaltato.hu -showcerts 2>/dev/null | grep -E '^ *[0-9] s:|^ *i:'

Pravilna veriga je sestavljena iz vsaj dveh členov (potrdilo strežnika in vmesno potrdilo). Če je vidna le vrstica 0, na oddaljenem strežniku manjka vmesno potrdilo; to mora popraviti ponudnik, piši mu z izpisom ukaza. O vmesnih potrdilih govori ločen članek.

6. Odhodna vrata

Na naših strežnikih gostovanja cPanel spletna mesta na standardnih vratih (HTTP 80, HTTPS 443) prosto dosegajo druge strežnike; na našem testnem gostovanju je WordPress.org brez težav odgovoril prek IPv6. Če storitev uporablja nestandardna vrata (na primer https://api.szolgaltato.hu:8443), požarni zid povezavo takoj zavrne (cURL error 7) ali se zatakne z iztekom časa (cURL error 28). Takrat piši naši podpori: pošlji izpis 3. koraka in naslov storitve skupaj z vrati, pogledali bomo, ali jih je mogoče dovoliti.

Prav tako nam sporoči, če se zatakne razreševanje imena ali se napaka pojavlja le občasno (na primer pri vsaki deseti zahtevi). Ukaz iz 3. koraka zaženi desetkrat zapored in pošlji, katera vrednost poskoči.

7. Počasna oddaljena storitev: časovno omejitev povečaj le zanjo

Če sta vrednosti kapcsolat in tls hitri, odgovor pa je vseeno „Operation timed out … with 0 bytes received”, je oddaljeni strežnik počasen. Najprej poglej stran s stanjem ponudnika. Če je počasnost trajna, lahko časovno omejitev za en sam naslov povečaš z vtičnikom must-use (wp-content/mu-plugins/szolgaltato-idokorlat.php):

<?php
/**
 * Plugin Name: Daljša časovna omejitev za počasen API
 */
add_filter( 'http_request_args', function ( $args, $url ) {
    if ( 'api.szolgaltato.hu' === wp_parse_url( $url, PHP_URL_HOST ) ) {
        $args['timeout'] = 15;
    }
    return $args;
}, 10, 2 );

Ostani pod 15 sekundami: dokler zahteva čaka, zaseda proces PHP, in če na to zahtevo čaka tudi stran, čaka z njo tudi obiskovalec.

Preverjanje

Ponovi 2. korak za vsak naslov, ki je vrnil napako; vsak mora vrniti statusno kodo, ne napake cURL. Nato lasten preizkus Zdravja spletišča:

wp eval 'require_once ABSPATH . "wp-admin/includes/class-wp-site-health.php"; $r = WP_Site_Health::get_instance()->get_test_dotorg_communication(); echo $r["label"], PHP_EOL;'

Pričakovani odgovor: „Povezava z WordPress.org je uspela”. Na koncu posodobitev poskusi znova na strani Nadzorna plošča › Posodobitve.

Česa ne delaj

  • Ne izklopi preverjanja potrdil (sslverify = false ali filter https_ssl_verify). Sporočilo o napaki izgine, vendar lahko kdor koli, ki pride na pot povezave, odgovarja v imenu strežnika za posodobitve ali plačilnega sistema.
  • Ne povečaj vseh časovnih omejitev na 60 sekund. Napačnega razreševanja imena ali prepovedanih vrat to ne popravi, vsaka stran, ki kliče zunanjo storitev, pa je lahko za toliko počasnejša.
Nazaj: WordPress – članki (45)