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

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)
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 http://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にバランシングされていることがわかります。
http://パブリックIPアドレス/

【Webサーバ#01】
web01

【Webサーバ#02】
web02

最後に

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

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

 

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

 

Be the first to comment

コメント投稿

Your email address will not be published.


*