Pythonを使用して pipからモジュールをインストールする時、次のようなエラーでインストールが失敗することがある。
raise ReadTimeoutError(self._pool, None, 'Read timed out.')
requests.packages.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(Host='pypi.python.org', port=443): Read timed out.
このエラーは、Let's Encryptで証明書の取得や更新に使用する certbot-autoで virtualenv から pipをインストールするときにも発生する。
コンソールでインストール失敗の場合には、判りやすいですが Let's Encrypt の自動更新の処理で失敗している事に気がつかないと、いつのまにか証明書が無効になっていたという事故になる。
pip を更新することで問題が解決する場合がありますが、再発するようであれば以下の対策を実施する。
pip ReadTimeoutErrorの対策
pip の ReadTimeoutError は、指定した時間内にモジュールを取得できなかった場合に発生する。
コマンドラインのインストールの場合には、次のようにしてタイムアウトを長くすることができる。
sudo pip --default-timeout=1000 install [MODULE_NAME]
certbot-autoでの対策:常にタイムアウトを長く
certbot-auto など、cronで自動処理する場合には certbot-auto を書き換えるのではなく、実行するユーザーの .bashrc などで次のように環境変数を定義する。
export PIP_DEFAULT_TIMEOUT=100
今回は PIP_DEFAULT_TIMEOUT で 100(秒)を設定した。
処理に失敗しないように確実にインストールしたい場合には、1000(秒)などもっと長いタイムアウトを指定することもできる。