📝

"CURL_SSLVERSION_TLSv1_2\"のエラーに3日溶かした話

2024/12/20に公開

このエラー知っていますか

production.ERROR: Undefined constant "CURL_SSLVERSION_TLSv1_2" 

Zennのブログ記事をAPIで取得して表示させるサイトを作成したものの、レンタルサーバーに掲載されたら下記エラーで記事を取得できずにいました。
まだLaravel勉強中の身なので、書き方が悪かったのかとめちゃくちゃ調べ、3日は余裕で溶かしました。メンターさんにも相談したものの「初めて見たエラー」ということで手詰まり。

でもめちゃくちゃ簡単な話だったので、記録に残します。

エントリポイントで起きている500エラー

’api/blog’でfetchしてるにも関わらず、ドメイン/api/blogでは500エラー何これ。
localでは問題ないので、仕方ないから.envをいじってエラーの箇所を見せるようにしました。

APP_DEBUG=true #false

ここをfalseからtrueに変更。するとエラーが見えてきます。
そこで冒頭のエラーと出会いました。なんだこれ。

production.ERROR: Undefined constant "CURL_SSLVERSION_TLSv1_2" 

一旦APP_DEBUGをfalseに戻し調べたら、どうもSSHとかcurlが古いためサーバー側に「CURL_SSLVERSION_TLSv1_2」という変数がなくて怒られているらしいです。
PHPの切り替えを確認しても最新にしています。あれ、これマジで打つ手なし?

っていうか、.envをいじらないでもstorage/logs/laravel.logにエラー情報は入ってます。
ファイルマネージャーから見たらすぐだった...。
まぁいろんな方法がありますよってことで。

エラーの時はjson読み込む設定にしちゃえ

カッコつかないサイトを表示さ続けるよりも、本来エントリポイントで取得するはずのjsonを予備でサーバーに載せちゃって、最悪手動で更新しようか。
と考えて下記のように作り替えました.

import { useState, useEffect } from 'react';
import Title from '../PageTitle';
import ZenBlog from '../../../json/Zen-blog.json';
import ConvertDate from './ConvertDate';

export type ZennItem = {
    id: number;
    title: string;
    emoji: string;
    path: string;
    published_at: string;
};

export type ZennResponse = {
    articles: ZennItem[];
};

export default function BlogList() {
    const [posts, setPosts] = useState<ZennItem[]>([]);
    useEffect(() => {
        const fetchData = async () => {
            try {
                const res = await fetch('/api/blog'); //エントリポイント
//api/の下にするとわざわざconfig/cors.phpをいじらなくて良いのでおすすめ
                const data: ZennResponse = await res.json();
                if (data?.articles) {
                    setPosts(data.articles.slice(0, 10));
                } else {
                    console.error('No articles found');
                }
            } catch (error) {
                if (ZenBlog?.articles) {
                    setPosts(ZenBlog.articles.slice(0, 10));
                } else {
                    console.error('No articles found in ZenBlog');
                }
                console.error('こんなところまで見てくれてありがとうございます!これから直す予定です🫶現在CORFエラー発生中:', error);
            }
        };
        fetchData();
    }, []);

    return (
        <>
            <Title title="blog" />
            <p className="text-center">ZennにてTechブログ記載しています。</p>
            <div className="container px-4 lg:px-0 h-auto mx-auto my-9 flex flex-row flex-wrap gap-2">
                {posts.map((post, index) => (
                    <article
                        key={index}
                        className="w-full h-auto md:w-[calc(50%-4px)] "
                    >
                        <a
                            href={`https://zenn.dev${post.path}`}
                            target="_blank"
                            rel="noopener noreferrer"
                            className="blog-card group border-spacing-0.5 flex flex-row gap-2 items-start w-full h-auto px-8 py-4 bg-slate-200 transition-all ease-in-out focus:outline-none hover:bg-amber-500 focus:bg-amber-500 hover:transition-all hover:ease-in-out focus:translate-y-[-20px] hover:translate-y-[-20px]"
                        >
							<p className='text-2xl'>{post.emoji}</p>
							<div className="flex flex-col gap-2">
                            <h2 className="line-clamp-2 overflow-hidden text-ellipsis text-2xl group-hover:text-primary">{post.title}</h2>
                            <ConvertDate
								convertDate={post.published_at}
								className="group-hover:text-white group-focus:text-white" />
							</div>
                        </a>
                    </article>
                ))}
            </div>
        </>
    );
}

まめな人がコンソールエラーまで見ることを想定してラブレターを残しておきました。

悪あがきでエックスサーバーに連絡

多分「ユーザーのエラーは自分で」で終わるんだろうなと思いつつ、お問い合わせから連絡してみました。
すると下記の回答

恐れ入りますが、当サポートではお客様が設置されたプログラムについて、
エラー原因の特定など個別の対応はいたしかねること、あらかじめご了承ください。
どのような変更が設定が必要なのかなど具体的にお知らせいただければ、
可能な範囲でご案内をいたします。

ですよね〜〜〜〜〜

でもふと思い立って、下記の問い合わせも追加。

下記の点を確認したいです。
・現在、私が入っている入っているプランがLaravel11のapi通信に対応していないのか?
・phpのvr切り替えは行なっているが変化がない(curlが変わってない)
・サーバーでcurlが古いと言われるがユーザーから変更ができないとのことだがここが新しいプランはあるのか

新サーバーへ移行してなかった私のミスだった話

そしたら下記の回答をいただきました。

当サービスの最新サーバー環境においては「curl 7.61.1」にて
ご利用が可能でございます。
先のご案内にて確認が不足しており申し訳ございませんが、
お客様は「旧xserver.jp」のサーバーをご利用いただいておりますので、
新サーバー簡単移行を実施していただくことで、当該curlバージョンへの変更が
可能でございます。

サーバー側が今新サーバーへ移行中だというではないですか。
そういえばそんなメール来てた!(アホか)
早速サーバー切り替えのボタンをポチポチしたらものの30分程度でサーバー切り替え完了。

そしてサイトを確認すると、ラブレター消えてる!!!エントリポイントも見るとJson出てる!!!

バージョンのアップデートはこまめにしましょう

エックスサーバーさん、丁寧に教えてくれてありがとうございました...!
ちなみに新サーバーの移行は下記を参考にすぐできます。
▼新サーバー簡単移行
https://www.xserver.ne.jp/manual/man_order_servertransfer_intro.php

[おまけ]SSH入れんくなったやないかい

普段SSHでログインしていたのにいつものコマンドで入れなくなりました。


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is....(中略).....
Host key for [古い情報のサーバー]:10022 has changed and you have requested strict checking.
Host key verification failed.

(誰かが何か悪いことをしている可能性がある!
今、誰かがあなたのことを盗聴しているかもしれません(中間者攻撃)!
ホストの鍵が変更された可能性もある。
リモートホストから送信されたED25519鍵のフィンガープリントは......(中略).......
古い情報のサーバー]:10022 のホスト鍵が変更されました。
ホスト鍵の検証に失敗しました。)

悪さされてるかもって怖いって。
でも大丈夫、1コマンドで修正できます。Host key forからポート番号までコピペしておきます。

ssh-keygen -R "[古い情報のサーバー]:10022"

この後、Yes/Noを聞かれるのでYesと答えると新しい情報に上書きしてくれます。

Discussion