【gunicorn+Nginx】うっかり.sockが消えたときの話と対処方
手順書通りに構築しただけのサーバーからうっかり.sockを消してしまって、右も左も分からず偉い目を見たので覚え書き。
起こったこと
アプリの更新データをリリースしようとgit pullする
↓
保留中の更新があるからpullできねぇよって言われる
↓
何も考えず保留中の更新を破棄
↓
サーバー起動すると.sockファイルに接続出来ないよーって怒られる
↓
「保留中の更新」の中に.sockファイルが紛れてましたねー★
↓
.sockが復旧しない(本来、gunicornを再起動すれば再生成されるはず)
何で?
わかんない。
わかんないけど、とりあえずプロジェクトフォルダの中に.sockを作ってしまうと、以後のデプロイの際に同様の事が起こる(やらかす)可能性が高いので、.sockを別のフォルダに生成するようにします。
直し方
・「/etc/systemd/system/PROJECT.service」を書き換える
・「etc/systemd/system/PROJECT.socket」も書き換える
・「/etc/nginx/sites-available」も書き換える
・.sockを置くフォルダのアクセス権限を、実行ユーザーに与える
・アプリケーションを再起動
・VMを再起動
そもそも.sockって何か
リバースプロキシサーバー(マシン外からのアクセスを中に繋いでくれる部分)であるNginxと、アプリケーションサーバー(マシン内で動いて居るアプリケーションへの接続を出し入れしてくれる部分)であるgunicornを接続するための接続情報が書いてあるファイル。
設定がちゃんとできていれば、gunicornが勝手に作ってくれる。どこに置いても大丈夫。設定がちゃんとできていれば。
.serviceファイルの直し方
sudo vi /etc/systemd/system/PROJECT.service
して、PROJECT.serviceファイルをviで開く。
[Service]の欄から
ExecStart=
で始まる行を探す。その行の
--bind unix:PROJECT.sock
の部分が、.sockファイルの在処を指定している(相対パスを指定しておくと、WorkingDirectoryで指定したフォルダからの相対パスになる)。
ここを、絶対パスで書き直す。
--bind unix:/home/USER/socket/PROJECT.sock
とか、良い感じのところに。
.socketを書き換える
$ sudo vi /etc/systemd/system/PROJECT.socket
でファイルを開き、[Socket]ブロックの中の
ListenStream=/home/USER/PROJECT/PROJECT.sock
のところのパスを、.serviceファイルで設定したものと同じに書き換える
sites-availableを書き換える
$ sudo vi /etc/nginx/sites-available
でファイルを開いて、真ん中辺りにあるlocationブロック内の
proxy_pass http://unix:/home/USER/PROJECT/PROJECT.sock
を、serviceファイルで指定したパスに書き替える。
ディレクトリを用意して実行ユーザーへアクセス権限を付与
上記の2ファイルに指定した場所に指定したディレクトリを作っておく。
この場合、
$ mkdir /home/USER/socket
しておく。
serviceファイルで指定しているUserに対してディレクトリへのアクセス権限を与えておくのを忘れない。これ忘れると永遠に彷徨う羽目になる。
再起動
$ sodo systemctl deamon-reload
$ sudo systemctl restart PROJECT
$ systemctl status PROJECT
で起動することを確認してから、VM自体を再起動すれば多分直る。
……原因の特定と修正に丸一日掛かった……