
独学で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台分で済むのが大きいです。
つまずきポイントまとめ
独学で自分がハマった所を先回りで置いておきます。
- ポートが開いていない:VPSのパケットフィルターで80/443を許可し忘れる。
- DNSのゾーンずれ:レコードを書いた場所と、委任されているネームサーバーが一致していない(SERVFAILの主犯)。
- Node.jsを直接公開してしまう:nginxを挟まずに晒すと、証明書もプロセス管理も辛くなる。
- 手動起動のまま: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台にまとめたい人に向いています。