みちのいに!!

自分のメモと、他にもハマる人がいそうなことを書く

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使った方法も一応残しておきます。

http://www.mydns.jp/

How To Useに従って、

  1. 会員登録
  2. ネームサーバ変更
  3. DNS設定
  4. IPアドレス登録

としていきます。
Hostname: * Type:A でサブドメイン全部飛ぶようになりましたね。

そして最後に使用したい回線からIPアドレスを通知しないといけません。これは定期的(1週間)に実行する必要があります。
そもそもここのDNSDDNS、つまり動的に変わるIPアドレスでもドメインが紐付けできるすごいDNSなので、IPアドレスが変わってないか、また変わったら変更するように確認する作業が必要なのです。VPSIPアドレスは変わりませんが、それでも一応必要らしいです。
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の設定完了


できました。