この記事では、 Django を Xserver にデプロイし、 MySQL に接続しようとした際に Can't connect to local MySQL server through socket '/tmp/mysql.sock'
エラーが発生した際の対処法を紹介します。
私は、個人開発した URL 短縮サービスである TANTAN-LINK を Xserver で運用しています。

最初の環境構築でさまざまなエラーに遭遇し、悪戦苦闘したため、徐々に備忘録として残しておこうと思います。
本記事のエラーもその中の一つです。
事象
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 にたどり着くまでの経緯をまとめています。

おわりに
ローカルでの動作では問題なくとも、本番運用の前には必ず何かしらのエラーに遭遇しますね。
一つひとつ、着実に乗り越えていきましょう。
コメント