nginxでリバースプロキシがサブドメインな失敗談
くれはちゃん(お名前.comのVPSで、ArchLinuxで動いている。
くれはちゃん育成日記 カテゴリーの記事一覧 - みちのいに!!参照)のお話です。
リバースプロキシってなに
なにかアプリケーション作るのはいいものの、http://example.com:8080とかはダサいし、環境によっては80と443とか以外通れなかったりする。そこで、http://app.example.com(:80)/以下のアクセスをhttp://example.com:8080/に飛ばすようにしよう!ってやつ(雑な理解)
サブドメインってなに
example.com ←これが普通のドメイン
sub.example.com ←こういうことができる これがサブドメイン
どうやるの
nginxの基本的な設定はしてあるものとします。私がした設定はこちらを見てください
くれはちゃん育成日記3日目(お名前VPSに入れたArchLinuxを設定する話) - みちのいに!!
で、
/etc/nginx/conf.d/app.conf に
server { listen 80; server_name app.example.com; access_log /var/log/nginx/access_app.log main; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header HOST $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Real-IP $remote_addr; } }
って書いて
systemctl restart nginx
で動くはずだったんですよ。動かなかったんです。
おかしいなーってnginxの設定をいじっても一向に良くならない。直接サーバー内からhttp://127.0.0.1:8080をたたくとアクセスは出来る。ただ、app.example.comを叩いてもアクセスログにすら記録されない。
試しにapp.example.comでnslookupしてみたんです。
ありませんでした。
DNSの設定してませんでした
何が悪かったの
DNSってドメイン名からIPアドレスに変換するやつですよね。
example.comは203.0.113.13ですって。
私ネームサーバの設定しかしてない。してないのにAレコードでexample.comのサブドメイン全部203.0.113.13に飛ぶと勘違いしてたんですよね。
どうするの
お名前.comでDNS設定そのまま出来たんですが、月額100円。いやだ。
http://www.onamae.com/guide/details.php?g=18 無料の範囲でできるみたいですね。勘違いしてMyDNS.jp使った方法も一応残しておきます。
How To Useに従って、
としていきます。
Hostname: * Type:A でサブドメイン全部飛ぶようになりましたね。
そして最後に使用したい回線からIPアドレスを通知しないといけません。これは定期的(1週間)に実行する必要があります。
そもそもここのDNSはDDNS、つまり動的に変わるIPアドレスでもドメインが紐付けできるすごいDNSなので、IPアドレスが変わってないか、また変わったら変更するように確認する作業が必要なのです。VPSのIPアドレスは変わりませんが、それでも一応必要らしいです。
IPアドレス登録で固定IPで設定してしまえば、どこからアクセスしても設定したものになります。私がIPアドレスを打ち間違えて登録してしまったらそれが反映されたので確認済みです。
その通知方法にセキュアな方法がないのがすごく気になりますが…………まあやっていきましょう。
通知を送りつけるシェルスクリプトを書きます。
/root/script/mydns.sh
#!/bin/bash wget -O - http://www.mydns.jp/login.html --http-user=mydns****** --http-password=***********
これを定期実行すればいいです。cron使ってる人はcron使ってください。
/etc/systemd/system/mydns.timer
[Unit] Description=update MyDns [Timer] OnBootSec = 5m OnUnitActiveSec = 2d [Install] WantedBy=timers.target
/etc/systemd/system/mydns.service
[Unit] Description=update MyDns [Service] Type=oneshot ExecStart=/root/script/mydns.sh [Install] WantedBy=timers.target
で、
systemctl restart mydns
これでDNSの設定完了
できました。