AzureのLinux VMにNginxをインストールしてHTTPS公開する方法|VNet・NSG設定からcertbot証明書取得まで実践ハンズオン

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Azure > AzureのLinux VMにNginxをインストールしてHTTPS公開する方法|VNet・NSG設定からcertbot証明書取得まで実践ハンズオン
「AzureでLinux VMを立ち上げたが、NginxをインストールしてHTTPSで公開する手順が分からない」
「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で限定してブルートフォース攻撃のリスクを下げる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

なぜ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)
Let's Encryptの証明書取得には独自ドメインが必要です。ドメインのAレコードをVMのパブリックIPに向けておいてください。ドメインがない場合はHTTPのみで動作確認することもできます。

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(ネットワークセキュリティグループ)を作成し、SSH・HTTP・HTTPSの3つのポートを許可します。

# 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

NSGルールの一覧を確認します。

$ 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" }

出力のpublicIpAddress(例: 20.78.xxx.xxx)がSSH接続先のIPアドレスです。

# パブリック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ルールが設定されているか確認してください。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
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

証明書の有効期限は90日ですが、certbotはインストール時にsystemdタイマー(certbot.timer)を設定して自動更新します。dry-runで更新動作を確認しておきましょう。

# 自動更新の動作確認(実際には証明書を更新しない) 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

ISPによってグローバルIPが変動する場合は、Azure Bastionを利用してパブリックIPなしでSSHする設計も検討してください。

トラブルシュート

【問題】ブラウザで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

表示されたAddressがVMのパブリックIPと一致していない場合は、ドメイン管理画面でAレコードを修正してDNS反映を待ってから再実行してください。

【問題】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 CLIのazコマンドでVNet・NSG・VMを作成し、apt install後のsystemctlとcertbotでHTTPS公開まで一気通貫で完結できます。本番環境ではSSHのアクセス元IPを必ず限定して運用してください。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
Azure対応セミナーの詳細を見る >>

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。