Microsoft Azure上で、最近人気急上昇中のWebサーバであるNginxを構築し、Web画面を表示する検証を実施。また、Nginxの”リバースプロキシ機能”も同時に検証。
はじめに
こんにちは、今回はMicrosoft社が提供するクラウドプラット フォームMicrosoft Azure上で、最近人気急上昇中のWebサーバであるNginxを構築し、Web画面を表示する検証を行ってみたいと思います。しかし、Web画面を表示するだけでは Nginxの持ち味を生かせませんので、目玉の機能と言っても過言ではない”リバースプロキシ機能”を利用した構成の構築を行っていきます。また、仮想マシンの構築にはWebコンソールでは無く、Azure PowerShellから構築していきたいと思います。
構成
システム構成
構築するシステム構成は次の通りです。
仮想マシン構成
構築する仮想マシンの構成は次の通りです。
項目名 | 設定値 |
---|---|
インスタンスサイズ | A2 Basic (Core:2/RAM:3.5GB) |
OS | CentOS release 7.2 x86_64 |
インスタンスに「A2 Basic」を選択した理由として、CentOS及びNginxのシステム要件を満たしたCPUコア数/メモリ量であること。また、今回の検証では負荷分散や自動スケールなどの機能は利用しないため、Basicレベルを選択しました。
パッケージ構成
今回利用する主なパッケージ構成は次の通りです。
パッケージ名 | バージョン |
---|---|
Nginx | 1.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】
【Webサーバ#02】
最後に
今回はNginxをMicrosoft Azure上で構築し、リバースプロキシ機能を利用した場合の実装方法をご紹介させて頂きました。仮想マシンの構築にAzure PowerShellを利用しているため、CLIに慣れている方だと比較的馴染みやすいのではないでしょうか。またスクリプト言語であるため、自由にカスタマイズでき、仮想マシン自動構築なども十分に検討可能かと思います。 尚、実運用に 耐えうる設定とするにはネットワークセキュリティグループの 設定やNginxの設定等々、細かい設定が必要になるかと思います。Microsoft Azureには様々な機能が実装されているため、オンプレミスで構築されているサーバを移行する上で検討されてみては如何でしょうか。 以上
サイオステクノロジー株式会社 山田
nginx の詳細については下記をご覧ください!
https://sios.jp/products/oss-integration/service/oss_on_cloud/nginx.html