postfix+mysqlでコケた時のメモ


とりあえずこんな設定を書いた。単純にMySQLを使ってエイリアスの設定を取得する的な。

# cat /etc/postfix/mysql_virtual_alias_maps.cf 
user = postfix
password = PASSWORD
hosts = localhost
dbname = postfix
table = alias
select_field = goto
where_field = address

しかしメールを送るとMySQLに接続できないとコケる。

Oct  7 00:01:02 localhost postfix/cleanup[26321]: warning: connect to mysql server localhost: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
Oct  7 00:01:02 localhost postfix/cleanup[26321]: warning: mysql:/etc/postfix/mysql_virtual_alias_maps.cf lookup error for "test@nogisawa.net"
Oct  7 00:01:02 localhost postfix/cleanup[26321]: warning: A05B0C0CDF: virtual_alias_maps map lookup problem for test@nogisawa.net -- message not accepted, try again later

ネットワークが何かおかしい?ソケットにしたらどうかな?という事でソケットにしてみる。

# cat /etc/postfix/mysql_virtual_alias_maps.cf 
(略)
hosts = unix:/run/mysqld/mysqld.sock
(略)

もちろんソケットはちゃんとある

# ls -la /run/mysqld/mysqld.sock
srwxrwxrwx 1 mysql mysql 0 Sep 13 11:42 /run/mysqld/mysqld.sock

再起動してログを眺めると・・・

Oct  7 00:05:39 localhost postfix/cleanup[26559]: warning: connect to mysql server unix:/run/mysqld/mysqld.sock: Can't connect to local MySQL server through socket '/run/mysqld/mysqld.sock' (2) 
Oct  7 00:05:39 localhost postfix/cleanup[26559]: warning: mysql:/etc/postfix/mysql_virtual_alias_maps.cf lookup error for "test@nogisawa.net"
Oct  7 00:05:39 localhost postfix/cleanup[26559]: warning: A38ACC0CDF: virtual_alias_maps map lookup problem for test@nogisawa.net -- message not accepted, try again later

コケた。そういえばpostfixってchrootしてるんだっけ。見えないじゃん。

root@localhost:/etc/postfix# cat /etc/postfix/master.cf
(略)
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (no)    (never) (100)
# ==========================================================================
smtp      inet  n       -       y       -       -       smtpd

という事でネットワーク経由に戻す。今度はlocalhostではなくIPアドレス。

root@localhost:/etc/postfix# cat /etc/postfix/mysql_virtual_alias_maps.cf 
(略)
hosts = 127.0.0.1
(略)

再起動してメールを投げてみると・・・

Oct  7 00:08:48 localhost postfix/virtual[26771]: D248BC0CDF: to=<test@nogisawa.net>, relay=virtual, delay=0.01, delays=0.01/0/0/0, dsn=2.0.0, status=sent (delivered to maildir)
Oct  7 00:08:48 localhost postfix/qmgr[26764]: D248BC0CDF: removed

おお、今度はちゃんと行った。名前が解決できないのか・・・なぜだ・・・。

それとパーミッションは下記のようにしないと怒られる模様。

# ls -la mysql_virtual_alias_maps.cf
-rw-r----- 1 root postfix 130 Oct  7 00:08 mysql_virtual_alias_maps.cf

最初root:rootで600とかやってたら怒られた。まぁ、warningが出るだけで使える気もするけど・・・。

もうちょっと深堀り

localhostだとNGなのに127.0.0.1はOKなのがいまいち納得できないので色々調べてみました。で、ふと気づきました。

# netstat -lnp | grep mysql
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      850/mysqld          
# cat /etc/hosts | grep localhost
127.0.0.1	localhost
127.0.1.1	localhost
::1     localhost ip6-localhost ip6-loopback

勘の良い人はおわかりと思いますが、これは単純にMySQLがIPv4でしかLISTENしていなくて、localhostはIPv4(127.0.0.1)とIPv6(::1)の両方が定義されていて、postfixはIPv6の::1の方に接続に行っている…という話でした。