独学でiOSアプリのバックエンドをXserver VPSで動かした全手順【個人開発】


独学でiOSアプリを開発していると、どこかで「サーバー側(バックエンド)が必要」という壁にぶつかります。プッシュ通知、課金レシートの検証、AIのAPIを叩く中継、Web公開ページ(プライバシーポリシー等)── アプリだけでは完結しない処理が出てくるからです。

この記事では、独学でiOSアプリのバックエンドをXserver VPS上で動かし、独自ドメイン+HTTPSで公開するまでの全手順を、実際に自分がやってみて詰まった所も含めてまとめます。構成は Node.js + nginx + Let’s Encrypt です。

この記事の一部にはPR(アフィリエイト)リンクを含みます。紹介するのは自分が実際に契約して使っているサービスだけです。

なぜバックエンドにVPSを選んだのか

最初は Render や Firebase のようなマネージドサービスも検討しました。実際 Render は今も一部で使っています。それぞれ良さがありますが、個人開発で複数のアプリを持つようになると、VPSに軍配が上がる場面が出てきました。

  • 1台で複数プロジェクトを同居させられる:アプリごとにサービスを立てても、サーバー代は1台分。
  • 料金が読みやすい:従量課金でヒヤヒヤせず、月額固定。
  • どこに何があるか完全に把握できる:nginx・systemd・証明書まで自分で触るので、詰まっても原因が追える。

デメリットは「全部自分で面倒を見る必要がある」こと。ですが、独学でエンジニアを目指すなら、この“全部自分で面倒を見る”経験そのものが一番の勉強になりました。

なぜ Xserver VPS なのか

VPSはいくつかありますが、自分は Xserver VPS を選びました。理由はシンプルです。

  • 性能・コスパのバランスが良い(2GBプランで個人開発の複数アプリが十分動く)
  • 同じXserverでドメインもまとめて取れるので管理が一元化できる
  • 国内サービスで情報も多く、独学でも詰まりにくい

比較検討したい人向けに、後半で ConoHa VPS との違いにも触れます。

📌 PR: 自分が使っているのは エックスサーバーVPS(公式) の2GBプランです。

全体構成

やることを図にするとこうです。

[iOSアプリ] --HTTPS--> [独自ドメイン]
                          |
                    [Xserver VPS]
                          |
             nginx(443, TLS終端) --proxy--> Node.js(127.0.0.1:8788)
                          |
                  Let's Encrypt で証明書
                  systemd で常駐化

ポイントは 「nginxが表側(443)でHTTPSを受け、内側のNode.jsアプリにproxyする」 形です。Node.jsを直接インターネットに晒さないので、証明書もアプリの再起動も分離して管理できます。

手順1:VPSを契約してOSを入れる

Xserver VPSを契約し、OSは Ubuntu(LTS)を選びました。契約後、管理パネルからサーバーの IPアドレスrootのログイン情報(またはSSH公開鍵)を確認します。

⚠️ Xserver VPSには パケットフィルターがあります。初期状態だとポートが絞られているので、あとで使う 80番・443番(HTTP/HTTPS)を許可しておきます。ここを忘れると「サーバーは動いているのにブラウザから繋がらない」で詰まります(自分はここで一度ハマりました)。

手順2:SSHで鍵ログインできるようにする

パスワードログインのままだと危ないので、SSH鍵でログインするようにします。手元(Mac)で鍵を作成し、公開鍵をサーバーに登録します。

# 手元のMacで鍵を作成(例)
ssh-keygen -t ed25519 -f ~/.ssh/myvps -C "myvps"

# 公開鍵をサーバーへ登録
ssh-copy-id -i ~/.ssh/myvps.pub root@203.0.113.10   # ← 203.0.113.10 は自分のVPSのIPに置き換え

# 以後はこれでログイン
ssh -i ~/.ssh/myvps root@203.0.113.10

ログインできたら、apt update && apt upgrade で最新化しておきます。

手順3:Node.jsアプリを置く

バックエンドのNode.jsアプリをサーバーに配置します。gitで持ってくるのが楽です。

# 例:アプリ用ユーザーのホームに配置
cd /home/appuser
git clone <あなたのリポジト>
cd <リポジト>
npm ci                # lockfileから正確に復元
node server.js        # まずは手動で起動して動作確認(例:127.0.0.1:8788 で待受)

ここではまず 127.0.0.1(ローカル)だけで待ち受けるようにしておきます。外からの接続は次のnginxに任せます。

手順4:nginxでリバースプロキシ+TLS終端

nginxを入れて、443番で受けた通信を内側のNode.jsにproxyします。

apt install -y nginx

サイト設定(/etc/nginx/sites-available/myapp)の例:

server {
    listen 80;
    server_name api.example.com;      # ← 自分のドメインに置き換え
    # 証明書取得(ACME)用のパス以外は https へリダイレクト
    location / { return 301 https://$host$request_uri; }
}

server {
    listen 443 ssl;
    server_name api.example.com;

    # 証明書は手順6の certbot が入れてくれる
    location / {
        proxy_pass http://127.0.0.1:8788;   # ← Node.jsの待受ポート
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

有効化します。

ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
nginx -t          # 設定ミスがないかテスト
systemctl reload nginx

手順5:独自ドメインとDNS ── ここが一番詰まった

独自ドメインを取り、「api.example.com → VPSのIP」の Aレコード を設定します。ここで自分は SERVFAIL(名前解決できない) に遭遇し、原因が分かるまでかなり時間を溶かしました。

原因は、「ネームサーバーの委任先」と「実際にDNSレコードを設定した場所」がズレていたことでした。

  • ネームサーバーは VPS側(xvps) に委任される設定になっていた
  • 一方で自分がAレコードを書き込んでいたのは 別のゾーン(xdomain側)
  • → 書いたレコードを誰も参照しておらず、いつまでも名前解決できない

解決策:DNSレコードを設定する場所を、実際に委任されているネームサーバー側に合わせる(自分の場合は Xserver Domain 側で設定するように統一)。ドメイン・VPS・DNSが同じ会社でも、「どのゾーンが実際に引かれているか」を必ず確認するのが教訓でした。

確認コマンド:

# 名前解決できているか
dig api.example.com +short         # VPSのIPが返ればOK

# どのネームサーバーに委任されているか
dig example.com NS +short

💡 独学の人がここで詰まったら、まず「レコードを書いた場所」と「NSレコードが指す先」が一致しているかを疑ってください。9割これです。

手順6:Let’s EncryptでHTTPS化

DNSが通ったら、certbotで無料の証明書を取ります。

apt install -y certbot python3-certbot-nginx
certbot --nginx -d api.example.com

対話に答えるだけで、nginxの設定に証明書のパスを自動で追記し、https://api.example.com が有効になります。証明書の自動更新も systemd のタイマーで設定されるので、基本は放置でOKです。

curl -I https://api.example.com     # HTTP/2 200 などが返れば成功

手順7:systemdで常駐化(落ちても自動復帰)

node server.js を手で起動したままだと、ログアウトや再起動で止まります。systemdサービスにして常駐させます。

/etc/systemd/system/myapp.service

[Unit]
Description=My iOS backend
After=network.target

[Service]
WorkingDirectory=/home/appuser/<リポジトリ>
ExecStart=/usr/bin/node server.js
Restart=always
User=appuser
Environment=NODE_ENV=production

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now myapp
systemctl status myapp     # active (running) を確認

これで、サーバーが再起動してもアプリが自動で立ち上がります。

応用:1台のVPSに複数アプリを同居させる

VPSの美味しい所は、1台に複数アプリを載せられることです。やり方はシンプルで、

  • アプリごとに 待受ポートを分ける(例:8788, 8789, 8790
  • アプリごとに サブドメイン+nginxのserverブロックを作る(例:api.example.com, admin.example.com
  • それぞれ systemdサービスにする

自分はこの構成で、複数の個人開発アプリのバックエンドを1台のVPSにまとめています。サーバー代が1台分で済むのが大きいです。

つまずきポイントまとめ

独学で自分がハマった所を先回りで置いておきます。

  1. ポートが開いていない:VPSのパケットフィルターで80/443を許可し忘れる。
  2. DNSのゾーンずれ:レコードを書いた場所と、委任されているネームサーバーが一致していない(SERVFAILの主犯)。
  3. Node.jsを直接公開してしまう:nginxを挟まずに晒すと、証明書もプロセス管理も辛くなる。
  4. 手動起動のまま:systemd化しないと再起動で落ちる。

かかった費用

  • Xserver VPS 2GBプラン:月 数百円〜(キャンペーン・契約期間で変動)
  • 独自ドメイン:年 1,000〜1,500円程度
  • HTTPS証明書(Let’s Encrypt):無料

複数アプリを載せてこの金額なら、個人開発としては十分に元が取れています。

Xserver VPS と ConoHa VPS、どっちがいい?

比較検討する人向けに、ざっくり違いを。

  • Xserver VPS:老舗の安定感、同社でドメインもまとめられる。情報が多く独学向き。
  • ConoHa VPS:時間課金プランもあり短期利用に強い。もしもアフィリエイト経由なら提携が即時。

自分は「長く1台を育てる」使い方なのでXserver VPSにしましたが、まず試したい・短期で使いたいならConoHaも選択肢です。

まとめ

独学でも、iOSアプリのバックエンドを Node.js + nginx + Let’s Encrypt でVPSに立てて、独自ドメイン+HTTPSで公開できます。手順自体は多くありませんが、DNSのゾーンずれだけは独学者が必ずと言っていいほど踏むので、この記事を思い出してもらえたら嬉しいです。

「全部自分で面倒を見る」構成は、遠回りに見えて、独学でエンジニアを目指す人には最高の教材になります。

📌 PR: この記事で使っているVPSは エックスサーバーVPS(公式) です。個人開発で複数アプリを1台にまとめたい人に向いています。