「NSGでポートを開けても、SSL証明書の設定で詰まってしまった」
この記事では、AzureのLinux VMにNginxをインストールしてHTTPS公開するまでの手順を、VNetとNSGの設定から始め、certbotによるLet's Encrypt証明書の取得まで実践ハンズオン形式で解説します。
AzureポータルのブラウザGUI操作ではなく、すべてAzure CLIのazコマンドで実行できる手順にしています。
実行環境はAzure CLI 2.61.0 / Ubuntu 22.04 LTS(Azure VM)で動作確認済みです。
この記事のポイント
・az vm createでVNet・NSG・パブリックIPをまとめて作成してSSH接続まで完結できる
・sudo apt install -y nginxとsystemctl enableの2ステップでNginxを起動・常駐化できる
・NSGのHTTP(80)・HTTPS(443)ルールとcertbot --nginxでSSL化まで一気に完結できる
・本番ではSSH送信元IPをNSGで限定してブルートフォース攻撃のリスクを下げる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜLinux VMにNginxを自前でインストールするのか
AzureにはWebアプリを動かすPaaSサービスとしてAzure App Serviceがあります。App ServiceはNginxの管理が不要で手軽に使えますが、以下のような要件がある場合はLinux VMにNginxを自前でインストールする選択肢が現実的です。・OSレベルのNginx設定(worker_processes・rate limitなど)を細かく制御したい
・既存のオンプレミスNginx構成をそのままAzureへ移行したい
・複数のWebアプリをリバースプロキシとして1台で統合管理したい
・OSのカスタマイズやミドルウェアの組み合わせが必要なシステムを構築したい
20年以上Linuxサーバーを運用してきた経験から言うと、PaaSは確かに便利ですが「OSを直接触れる自由さ」が必要な場面では、Linux VM+Nginxの組み合わせが依然として主流です。
構築の全体像と実行環境
本記事で作成するAzureリソースの概要です。| コンポーネント | 設定値 |
|---|---|
| リージョン | Japan East |
| リソースグループ | rg-nginx-demo |
| VNet / サブネット | 10.1.0.0/16 / 10.1.1.0/24 |
| VMサイズ | Standard_B1s(開発・検証用) |
| OSイメージ | Ubuntu 22.04 LTS |
| Webサーバー | Nginx 1.18.0 |
| SSL証明書 | Let's Encrypt(certbot) |
Azure CLIでVNetとLinux VMを準備する
1. リソースグループとVNetの作成
リソースグループはAzureリソースをまとめて管理する論理的な入れ物です。まずリソースグループを作成し、その中にVNetとサブネットを用意します。# ログインしていない場合はaz loginを実行する $ az login # Japan Eastにリソースグループを作成する $ az group create --name rg-nginx-demo --location japaneast { "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg-nginx-demo", "location": "japaneast", "name": "rg-nginx-demo", "properties": { "provisioningState": "Succeeded" } }
# VNet(10.1.0.0/16)とパブリックサブネット(10.1.1.0/24)を作成する $ az network vnet create --resource-group rg-nginx-demo --name vnet-nginx --address-prefix 10.1.0.0/16 --subnet-name subnet-public --subnet-prefix 10.1.1.0/24
2. パブリックIPとNSGの作成
VMをインターネットに公開するためのパブリックIPアドレスを作成します。Static(静的)のStandard SKUを選ぶと、VMを停止・起動してもIPが変わりません。# 静的パブリックIPアドレスを作成する(Standard SKU) $ az network public-ip create --resource-group rg-nginx-demo --name pip-nginx-vm --sku Standard --allocation-method Static
# NSGを作成する $ az network nsg create --resource-group rg-nginx-demo --name nsg-nginx # SSH(22番)を許可する(後でIP制限を加える) $ az network nsg rule create --resource-group rg-nginx-demo --nsg-name nsg-nginx --name AllowSSH --priority 100 --protocol Tcp --destination-port-range 22 --access Allow # HTTP(80番)を許可する(certbotの所有権確認にも使用) $ az network nsg rule create --resource-group rg-nginx-demo --nsg-name nsg-nginx --name AllowHTTP --priority 110 --protocol Tcp --destination-port-range 80 --access Allow # HTTPS(443番)を許可する $ az network nsg rule create --resource-group rg-nginx-demo --nsg-name nsg-nginx --name AllowHTTPS --priority 120 --protocol Tcp --destination-port-range 443 --access Allow
$ az network nsg rule list --resource-group rg-nginx-demo --nsg-name nsg-nginx --query "[].{Name:name,Priority:priority,Port:destinationPortRange,Access:access}" --output table Name Priority Port Access ----------- ---------- ------ -------- AllowSSH 100 22 Allow AllowHTTP 110 80 Allow AllowHTTPS 120 443 Allow
3. Linux VMの作成とSSH接続確認
Ubuntu 22.04 LTSのVMを作成します。--ssh-key-valuesには自分のPCのSSH公開鍵のパスを指定してください。# Ubuntu 22.04 LTSのVMをVNet・NSG・パブリックIPと一緒に作成する $ az vm create --resource-group rg-nginx-demo --name vm-nginx --image Ubuntu2204 --size Standard_B1s --admin-username azureuser --ssh-key-values ~/.ssh/id_rsa.pub --public-ip-address pip-nginx-vm --nsg nsg-nginx --vnet-name vnet-nginx --subnet subnet-public { "fqdns": "", "location": "japaneast", "macAddress": "00-0D-3A-xx-xx-xx", "powerState": "VM running", "privateIpAddress": "10.1.1.4", "publicIpAddress": "20.78.xxx.xxx", "resourceGroup": "rg-nginx-demo" }
# パブリックIPアドレスを単体で確認する $ az network public-ip show --resource-group rg-nginx-demo --name pip-nginx-vm --query ipAddress --output tsv 20.78.xxx.xxx # SSH接続する $ ssh azureuser@20.78.xxx.xxx Welcome to Ubuntu 22.04.4 LTS (GNU/Linux 5.15.0-1060-azure x86_64) azureuser@vm-nginx:~$
azureuser@vm-nginx:~$に変わればSSH接続成功です。NginxのインストールとHTTP動作確認
1. パッケージの更新とNginxのインストール
VM内でaptパッケージリストを更新してからNginxをインストールします。# パッケージリストを更新する azureuser@vm-nginx:~$ sudo apt update # Nginxをインストールする azureuser@vm-nginx:~$ sudo apt install -y nginx # バージョンを確認する azureuser@vm-nginx:~$ nginx -v nginx version: nginx/1.18.0 (Ubuntu)
2. Nginxの起動と自動起動設定
インストール直後はNginxが自動起動していますが、systemctlで状態を確認してenableも設定しておきます。# Nginxを起動する(すでに起動中でも問題ない) azureuser@vm-nginx:~$ sudo systemctl start nginx # OS起動時に自動起動するよう設定する azureuser@vm-nginx:~$ sudo systemctl enable nginx Synchronizing state of nginx.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install enable nginx # 起動状態を確認する azureuser@vm-nginx:~$ sudo systemctl status nginx * nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2026-09-17 10:00:00 UTC; 5s ago Main PID: 1234 (nginx) Tasks: 2 (limit: 1074) Memory: 4.8M CGroup: /system.slice/nginx.service ├─1234 "nginx: master process /usr/sbin/nginx -g daemon on;" └─1235 "nginx: worker process"
Active: active (running)が表示されれば起動成功です。ssコマンドでNginxが80番ポートで待ち受けているかも確認できます(Linux ポート確認の全コマンド)。
# 80番ポートで待ち受けているプロセスを確認する azureuser@vm-nginx:~$ ss -tlnp | grep ':80' LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1235,uid=33,fd=6))
3. ブラウザでHTTP接続を確認する
ブラウザでVMのパブリックIPにアクセスします(例: http://20.78.xxx.xxx)。「Welcome to nginx!」のデフォルトページが表示されれば正常です。表示されない場合はNSGのAllowHTTPルールが設定されているか確認してください。
Azure対応セミナーの詳細を見る >>
Let's EncryptでHTTPS(SSL/TLS)を設定する
Let's Encryptの証明書を取得するには、事前にドメインのDNS AレコードをVMのパブリックIPに向けておく必要があります。DNSの反映に時間がかかる場合があるため、VM作成後すぐにAレコードを設定しておくのがスムーズです。1. certbotとNginxプラグインのインストール
# certbotとNginxプラグインをインストールする azureuser@vm-nginx:~$ sudo apt install -y certbot python3-certbot-nginx
2. SSL証明書の取得と自動更新設定
certbot --nginxはNginxの設定ファイルを自動的に書き換えてSSLを有効化します。-dオプションにドメイン名を指定します。# SSL証明書を取得してNginxの設定を自動更新する # example.comは実際のドメイン名に置き換えてください azureuser@vm-nginx:~$ sudo certbot --nginx -d example.com -d www.example.com Saving debug log to /var/log/letsencrypt/letsencrypt.log Requesting a certificate for example.com and www.example.com Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/example.com/fullchain.pem Key is saved at: /etc/letsencrypt/live/example.com/privkey.pem This certificate expires on 2026-12-16. Deploying certificate Successfully deployed certificate for example.com to /etc/nginx/sites-enabled/default Congratulations! You have successfully enabled HTTPS on https://example.com
# 自動更新の動作確認(実際には証明書を更新しない) azureuser@vm-nginx:~$ sudo certbot renew --dry-run Simulating renewal of an existing certificate for example.com and www.example.com Congratulations, all simulated renewals succeeded: /etc/letsencrypt/live/example.com/fullchain.pem (success)
3. HTTPSの動作確認
curlコマンドでHTTPSのレスポンスを確認します。# HTTPSのレスポンスヘッダーを確認する $ curl -I https://example.com HTTP/2 200 server: nginx/1.18.0 (Ubuntu) date: Wed, 17 Sep 2026 10:00:00 GMT content-type: text/html content-length: 612
HTTP/2 200が返ってきたら、HTTPS公開は完了です。本番運用に向けたNSGの調整
現状のNSGはSSH(22番ポート)をインターネット全体から許可しています。ブルートフォース攻撃のリスクを下げるために、SSH接続元を自分のPCのIPアドレスに限定します。# 現在の自分のPCのグローバルIPアドレスを確認する $ curl -s https://api.ipify.org 203.0.113.100 # NSGのSSHルールを特定のIPからのみ許可するよう更新する $ az network nsg rule update --resource-group rg-nginx-demo --nsg-name nsg-nginx --name AllowSSH --source-address-prefixes 203.0.113.100/32
トラブルシュート
【問題】ブラウザでVMのIPにアクセスしてもNginxのページが表示されない
NSGのAllowHTTPルールが設定されているか確認します。VM内のUFW(Uncomplicated Firewall)が有効になっている場合はNginxを許可する設定が必要です。# VM内のファイアウォール状態を確認する azureuser@vm-nginx:~$ sudo ufw status Status: inactive # UFWが有効な場合はNginxのHTTP/HTTPSを許可する azureuser@vm-nginx:~$ sudo ufw allow 'Nginx Full' azureuser@vm-nginx:~$ sudo ufw status Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx Full ALLOW Anywhere
【問題】certbotがドメインの所有権を確認できずに失敗する
certbotはHTTPチャレンジ(80番ポート)でドメインの所有権を確認します。ドメインのAレコードがVMのパブリックIPに解決されているかnslookupで確認してください。# ドメインが正しいIPに解決されているか確認する $ nslookup example.com Non-authoritative answer: Name: example.com Address: 20.78.xxx.xxx
【問題】Nginxが起動しない(80番ポートが使用中)
Apacheが競合している場合があります。ssコマンドで競合プロセスを確認して停止します。# 80番ポートを使っているプロセスを確認する azureuser@vm-nginx:~$ ss -tlnp | grep ':80' LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("apache2",pid=2345,uid=33,fd=6)) # Apacheを停止・無効化する azureuser@vm-nginx:~$ sudo systemctl stop apache2 azureuser@vm-nginx:~$ sudo systemctl disable apache2 # 改めてNginxを起動する azureuser@vm-nginx:~$ sudo systemctl start nginx
本記事のまとめ
AzureのLinux VMにNginxをインストールしてHTTPS公開するまでの手順を解説しました。| 手順 | コマンド |
|---|---|
| リソースグループ作成 | az group create --name rg-nginx-demo --location japaneast |
| VNet作成 | az network vnet create --address-prefix 10.1.0.0/16 |
| NSG作成・ルール追加 | az network nsg create / az network nsg rule create |
| Linux VM作成 | az vm create --image Ubuntu2204 --size Standard_B1s |
| Nginxインストール | sudo apt install -y nginx |
| Nginx自動起動設定 | sudo systemctl enable nginx |
| SSL証明書取得 | sudo certbot --nginx -d example.com |
| SSH元IP制限 | az network nsg rule update --source-address-prefixes xxx.xxx.xxx.xxx/32 |
Azure対応セミナーの詳細を見る >>
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:AzureのVM Run CommandでSSH不要にLinux VMをリモート操作する方法|az vm run-command invokeによる緊急コマンド実行の実践
- この記事の属するカテゴリ:Azureへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます