Azure上でNginxを構築し、リバースプロキシ機能を検証

◆ Live配信スケジュール ◆
サイオステクノロジーでは、Microsoft MVPの武井による「わかりみの深いシリーズ」など、定期的なLive配信を行っています。
⇒ 詳細スケジュールはこちらから
⇒ 見逃してしまった方はYoutubeチャンネルをご覧ください
【5/21開催】Azure OpenAI ServiceによるRAG実装ガイドを公開しました
生成AIを活用したユースケースで最も一番熱いと言われているRAGの実装ガイドを公開しました。そのガイドの紹介をおこなうイベントです!!
https://tech-lab.connpass.com/event/315703/

Microsoft Azure上で、最近人気急上昇中のWebサーバであるNginxを構築し、Web画面を表示する検証を実施。また、Nginxの”リバースプロキシ機能”も同時に検証。

はじめに

こんにちは、今回はMicrosoft社が提供するクラウドプラット フォームMicrosoft Azure上で、最近人気急上昇中のWebサーバであるNginxを構築し、Web画面を表示する検証を行ってみたいと思います。しかし、Web画面を表示するだけでは Nginxの持ち味を生かせませんので、目玉の機能と言っても過言ではない”リバースプロキシ機能”を利用した構成の構築を行っていきます。また、仮想マシンの構築にはWebコンソールでは無く、Azure PowerShellから構築していきたいと思います。

構成

システム構成

構築するシステム構成は次の通りです。
diagram2

仮想マシン構成

構築する仮想マシンの構成は次の通りです。

項目名設定値
インスタンスサイズA2 Basic (Core:2/RAM:3.5GB)
OSCentOS release 7.2 x86_64

インスタンスに「A2 Basic」を選択した理由として、CentOS及びNginxのシステム要件を満たしたCPUコア数/メモリ量であること。また、今回の検証では負荷分散や自動スケールなどの機能は利用しないため、Basicレベルを選択しました。

パッケージ構成

今回利用する主なパッケージ構成は次の通りです。

パッケージ名バージョン
Nginx1.6.3-8

Azure環境の準備

まず、Azure環境で仮想マシンを構築する流れをご紹介します。前提としてAzureにログイン可能なアカウントやライセンスは取得済として記載させて頂きます。

Azure PowerShell の準備

以下のMicrosoft社の公式Webサイトを参考にAzure PowerShell をローカルマシンにインスールします。
https://azure.microsoft.com/ja-jp/documentation/articles/powershell-install-configure/

また、PowerShell上でMicrosoft Azureにログインするところまで進めます。

リソースグループの作成

Microsoft Azureでは仮想サーバやネットワーク、ストレージ等はリソースという単位で管理されるため、まずはリソースグループという枠を作成します。

項目名設定値
リソースグループ名sios-azure-nginx
ロケーションjapaneast
# リソースグループ名 
> $RSCGRP = "sios-azure-nginx" 

# ロケーション 
> $LOCALE = "japaneast" 

# リソースグループの新規作成 
> New-AzureRmResourceGroup -Name $RSCGRP -Location $LOCALE 

ResourceGroupName : sios-azure-nginx 
Location : japaneast 
ProvisioningState : Succeeded 

Tags : 
ResourceId : /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/sios-azure-nginx

「ProvisioningState」 が「Succeeded」となっていることを確認します。

ストレージアカウントの作成

仮想マシンディスクなどを格納するAzure Storageを利用するため、ストレージアカウントを作成します。ストレージアカウントには以下の二種類存在し、今回はパフォーマンスを要求しないため、標準ストレージで作成します。

  • Standard Storage:標準ストレージ
  • Premium Storage:ソリッドステートドライブを利用した高パフォーマンスストレージ
項目名設定値
ストレージアカウント名azurenginxstrage
ストレージタイプStandard_LRS

※記号利用不可

# ストレージアカウント名 
> $STRAGENAME = "azurenginxstrage" 

# ストレージタイプ 
> $STRAGETYPE = "Standard_LRS" 

# ストレージアカウント作成 
> New-AzureRmStorageAccount -ResourceGroupName $RSCGRP -Location $LOCALE -Name $STRAGENAME -Type $STRAGETYPE

仮想ネットワークの作成

仮想ネットワークやサブネットを作成します。

項目名設定値
仮想ネットワーク名azure-nginx-vnet01
仮想ネットワークのアドレス空間10.10.0.0/16
仮想ネットワークのサブネット名azure-nginx-subnet01
仮想ネットワークのサブネット10.10.0.0/24
# 仮想ネットワーク名 
> $VNETNAME = "azure-nginx-vnet01" 

# 仮想ネットワークのアドレス空間 
> $VNETPREFIX = "10.10.0.0/16" 

# 仮想ネットワークの作成 
> $VNETINFO = New-AzureRmVirtualNetwork -ResourceGroupName $RSCGRP -Location $LOCALE -Name $VNETNAME -AddressPrefix $VNETPREFIX 

# 仮想ネットワークのサブネット名 
> $SUBNETNAME = "azure-nginx-subnet01" 

# 仮想ネットワークのサブネット 
> $SUBNET = "10.10.0.0/24" 

# 仮想ネットワークのサブネット作成 
> $VNETINFO = $VNETINFO | Add-AzureRmVirtualNetworkSubnetConfig -Name $SUBNETNAME -AddressPrefix $SUBNET | Set-AzureRmVirtualNetwork

パブリックIPアドレスの作成

パブリックIPアドレスを利用するために管理リソースを作成します。実際のパブリックIPアドレスは自動で割り振られます。

項目名設定値
パブリックIPアドレスのリソース名azure-nginx-public01
# パブリックIPアドレスのリソース名 
> $PUBLICNAME = "azure-nginx-public01" 

# パブリックIPリソースの作成 
> $PUBLICINFO = New-AzureRmPublicIpAddress -ResourceGroupName $RSCGRP -Location $LOCALE -Name $PUBLICNAME -AllocationMethod Dynamic –Verbose

ネットワークインタフェースの作成

仮想ネットワークやパブリックIPアドレスを仮想マシンに紐づけるためにネットワークインターフェイスを作成します。また、仮想マシンごとに作成する必要があります。

項目名設定値
ネットワークインタフェース名azure-nginx-nic01
azure-nginx-nic02
azure-nginx-nic03
プライベートIPアドレス10.10.0.11
10.10.0.12
10.10.0.13

以下はネットワークインタフェース「azure-nginx- nic01」の作成例となります。

# ネットワークインタフェース名 
> $NICNAME = "azure-nginx-nic01" 

# プライベートIPアドレス 
> $PRIVATEIP = "10.10.0.11" 

# ネットワークインタフェースの作成 
> $VNETINFO = Get-AzureRmVirtualNetwork -ResourceGroupName $RSCGRP -Name $VNETNAME -Verbose 
> $SUBNETINFO = Get-AzureRmVirtualNetworkSubnetConfig -Name $SUBNETNAME -VirtualNetwork $VNETINFO 
> $NICINFO = New-AzureRmNetworkInterface -ResourceGroupName $RSCGRP -Location $LOCALE -Name $NICNAME -PrivateIpAddress $PRIVATEIP -Subnet $SUBNETINFO -PublicIpAddress $PUBLICINFO -Verbose

仮想マシンの作成

仮想マシンリソース名やホスト名、インスタンスサイズ等を指定し、仮想マシンを作成します。今回、構築するサーバのユニーク値は以下となります。

【Proxyサーバ#01】

項目名設定値
仮想マシンリソース名azure-nginx-server01
ホスト名NginxProxy01

【Webサーバ#01】

項目名設定値
仮想マシンリソース名azure-nginx-server02
ホスト名NginxWeb01

【Webサーバ#02】

項目名設定値
仮想マシンリソース名azure-nginx-server03
ホスト名NginxWeb02

以下は仮想マシンリソース「azure-nginx-server01」 の作成例となります。

# 仮想マシンリソース名 
> $VMNAME = "azure-nginx-server01" 

# ホスト名 
> $CMPNAME = "NginxProxy01" 

# インスタンスサイズ 
> $VMSIZE = "Standard_A1" 

# 管理者ユーザとパスワード設定 
> $CREDS = Get-Credential 

# 仮想マシンリソース名とインスタンスサイズを指定 
> $VMINFO = New-AzureRmVMConfig -VMName $VMNAME -VMSize $VMSIZE 

# OS 用イメージの選択 
> $VMIMG = Get-AzureRmVMImagePublisher -Location $LOCALE | ? PublisherName -eq "OpenLogic" | ` 

Get-AzureRmVMImageOffer | ? Offer -eq "CentOS"| ` 
Get-AzureRmVMImageSku | ? Skus -Like "7.*" | ` 
Get-AzureRmVMImage | select -Last 1 
> $VMIMG | Set-AzureRmVMSourceImage -VM $VMINFO 

# 仮想マシンの設定 
> Set-AzureRmVMOperatingSystem -VM $VMINFO -Linux -ComputerName $CMPNAME -Credential $CREDS 

# 仮想マシンに NIC を追加 
> $NICINFO = Get-AzureRmNetworkInterface -ResourceGroupName $RSCGRP -Name $NICNAME 
> Add-AzureRmVMNetworkInterface -VM $VMINFO -NetworkInterface $NICINFO 

# OS 用ディスクの保存場所の指定 
> $OSDISK = $VMNAME + "_OSDisk" 
> $STRGINFO = Get-AzureRmStorageAccount -ResourceGroupName $RSCGRP -Name $STRAGENAME 
> $OSDISKURI = $STRGINFO.PrimaryEndpoints.Blob.ToString() + "vhds/" + $OSDISK + ".vhd" 
> Set-AzureRmVMOSDisk -VM $VMINFO -Name $OSDISK -VhdUri $OSDISKURI -CreateOption FromImage 

# 仮想マシンの作成 
> New-AzureRmVM -Location $LOCALE -ResourceGroupName $RSCGRP -VM $VMINFO

仮想マシンにログイン

仮想マシンが作成されると、自動的にパブリックIPアドレスが割り振られ、インターネットに接続されている端末からSSHコンソール接続が可能になります。パブリックIPアドレスは以下のコマンドより確認することが出来ます。

> Get-AzureRmPublicIpAddress -ResourceGroupName $RSCGRP | Select-Object Name,IpAddress | Format-List
 
Name : azure-nginx-public01 
IpAddress : xxx.xxx.xxx.xxx

Name : azure-nginx-public02 
IpAddress : xxx.xxx.xxx.xxx 

Name : azure-nginx-public03 
IpAddress : xxx.xxx.xxx.xxx

Nginxインストール

ここからはNginxのインストール方法となります。

パッケージのインストール

Nginxを動作させるために必要なパッケージをインストールします。 Webサーバとリバースプロキシサーバは同じパッケージを利用します。

[]$ sudo su - 

[]# yum install epel-release 

[]# yum install nginx 

Webサーバの設定

WebサーバのNginxの設定を変更します。
① IPv4待ち受けポートを「10080」に変更。IPv6待ち受けポートを無効化。
② デフォルトWebページにホスト名を入力。
-:変更前
+:変更後

[]#diff -u nginx.conf.org nginx.conf 

include /etc/nginx/conf.d/*.conf; 

server { 

- listen 80 default_server; 
- listen [::]:80 default_server; 
+ listen 10080 default_server; 
+ #listen [::]:80 default_server; 

server_name _; 

root /usr/share/nginx/html; 

[]# echo `uname -n` > /usr/share/nginx/html/index.html  

Proxyサーバの設定

リバースプロキシサーバのNginxの設定を変更します。
① 「upstream」ディレクティブにWebサーバ及び待ち受けポートを追加。
② 「location」ディレクティブに「proxy_pass」を追加。
-:変更前
+: 変更後

[]# diff -u nginx.conf.org nginx.conf 

# for more information. 

include /etc/nginx/conf.d/*.conf; 

+ upstream webs { 
+ server <Webサーバ#01のプライベートIPアドレス>:10080; 
+ server <Webサーバ#02のプライベートIPアドレス>:10080; 
+ } 

+ 

server { 

listen 80 default_server; 

listen [::]:80 default_server; 

@@ -42,7 +47,14 @@ 

include /etc/nginx/default.d/*.conf; 

location / { 

- } 
+ proxy_pass https://webs; 
+ } 

error_page 404 /404.html; 

location = /40x.html {

Nginx起動

以下コマンドより、Nginxを起動します。

# コンフィグ正常性確認 

[]# nginx -t 

# Nginx起動 

[]# nginx

動作確認

早速、Nginxに接続してみます。Webブラウザで以下のURLにアクセスします。IE接続する場合、Ctrl+F5ボタンを何度か押下すると画面が切り替わり、Webサーバ#01とWebサーバ#02にバランシングされていることがわかります。
https://パブリックIPアドレス/

【Webサーバ#01】
web01

【Webサーバ#02】
web02

最後に

今回はNginxをMicrosoft Azure上で構築し、リバースプロキシ機能を利用した場合の実装方法をご紹介させて頂きました。仮想マシンの構築にAzure PowerShellを利用しているため、CLIに慣れている方だと比較的馴染みやすいのではないでしょうか。またスクリプト言語であるため、自由にカスタマイズでき、仮想マシン自動構築なども十分に検討可能かと思います。 尚、実運用に 耐えうる設定とするにはネットワークセキュリティグループの 設定やNginxの設定等々、細かい設定が必要になるかと思います。Microsoft Azureには様々な機能が実装されているため、オンプレミスで構築されているサーバを移行する上で検討されてみては如何でしょうか。 以上

サイオステクノロジー株式会社 山田

 

 nginxnginx の詳細については下記をご覧ください!
https://sios.jp/products/oss-integration/service/oss_on_cloud/nginx.html

 

アバター画像
About 山田康裕 27 Articles
20代前半からLinux系OSSや認証基盤を中心とした提案/設計/構築を担当。特に仕事を選ばない、何でも屋さん。
ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。


ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

Be the first to comment

Leave a Reply

Your email address will not be published.


*


質問はこちら 閉じる