PR

【Django】 Xserver の MySQL 接続で Can’t connect … ‘/tmp/mysql.sock’ エラー

trouble-shoot01 Django
この記事は約5分で読めます。
記事内に広告が含まれています。

この記事では、 Django を Xserver にデプロイし、 MySQL に接続しようとした際に Can't connect to local MySQL server through socket '/tmp/mysql.sock' エラーが発生した際の対処法を紹介します。

私は、個人開発した URL 短縮サービスである TANTAN-LINK を Xserver で運用しています。

【個人開発】URL短縮サービス TANTAN-LINK をリリースしました
この度、自作の URL短縮サービスである TANTAN-LINK を正式にリリースしました。大手サービスに比べると至らない点も多いと思いますが、徐々に育てていこうと思いますのでぜひご利用ください。

最初の環境構築でさまざまなエラーに遭遇し、悪戦苦闘したため、徐々に備忘録として残しておこうと思います。

本記事のエラーもその中の一つです。

事象

Django で mysqlclient を使用し、MySQL データベースと接続する際に、 Can't connect to local MySQL server through socket '/tmp/mysql.sock' が発生する場合があります。

ローカル (私の場合は macOS Ventura 13.3.1, mysql Ver 8.3.0) では発生せず、Xserver でのみ生じた事象です。

pip install -r requirements.txt 実施後に、 index.cgi が動作せず、エラーが表示されます。

原因

mysql.sock のパスが異なるため。

Xserver の mysql.sock のパスは、私の場合は /var/lib/mysql/mysql.sock でした。

ローカルでは /tmp/mysql.sock のようなので、差分を吸収してあげる必要があります。

スポンサーリンク

対処方法

まず、ローカル開発環境の環境変数(.env など) に、以下を設定します。

DB_SOCKET=/tmp/mysql.sock

そして、 settings.py のデータベース設定の記述箇所を以下のように書き換えます。

import os
from dotenv import load_dotenv

env_path = Path('./') / '.env'
load_dotenv(dotenv_path=env_path)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': os.getenv('DB_NAME'),
        'USER': os.getenv('DB_USER'),
        'PASSWORD': os.getenv('DB_PASSWORD'),
        'HOST': os.getenv('DB_HOST', 'localhost'),
        'PORT': os.getenv('DB_PORT', '3306'),
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
            'unix_socket': os.getenv('DB_SOCKET', '/var/lib/mysql/mysql.sock')  # ソケットパスを環境変数から取得
        }
    }
}

おそらく、DB名やユーザなどは環境変数に切り出していると思いますが、今回は OPTIONS を追加します。

'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
'unix_socket': os.getenv('DB_SOCKET', '/var/lib/mysql/mysql.sock')  # ソケットパスを環境変数から取得

これが肝心の箇所で、 DB_SOCKET を環境変数から読み込み、 unix_socket に指定してあげる必要があります。

これでローカルと本番環境で mysql.sock のパスを切り替えて設定できます。

なお、 Windows 環境での動作は確認していないのでご容赦ください。 少なくとも、 Xserver 上は unix なので、この設定で動作します。

スポンサーリンク

その他

なぜ Xserver に Django をデプロイしようとしているかについては、こちらの記事をご覧ください。

【雑記】個人開発のサービス基盤として レンタルサーバー は優秀
この記事では、個人開発のサービス基盤として、 レンタルサーバー は選択肢に上がると感じた件を紹介します。個人開発で悩んだのが技術選定よりもサービス基盤をどうするかという点でした。

サービスのインフラ選定にて、最終的に Xserver にたどり着くまでの経緯をまとめています。

おわりに

ローカルでの動作では問題なくとも、本番運用の前には必ず何かしらのエラーに遭遇しますね。

一つひとつ、着実に乗り越えていきましょう。

コメント

タイトルとURLをコピーしました