ESC

Start typing to search across invoices, services, domains, tickets, and more...

Search... Ctrl+K
Windowsサーバー

Windows Server の IIS で Web サイトを構築:インストール、IP バインド、無料 SSL、PHP

5 ステップ 9 分で読めます 4 回閲覧 0
目次

Windows 環境に慣れている方や ASP.NET アプリを動かしたい方には、Windows Server の IIS での Web サイト構築が最適です。この記事では Windows Server 2016/2019/2022 を例に、PowerShell での IIS インストール、特定の IP とホストヘッダーへのサイトのバインド(複数 IP のサイトクラスターサーバーで便利)、win-acme による無料 SSL 証明書の取得と自動更新、IIS FastCGI で PHP を動かす基本手順を解説します。

ステップ1:Install-WindowsFeature で IIS をインストールする

管理者として PowerShell を開き、以下を実行します。数分で IIS と管理ツールが導入されます。PHP を使う予定があれば CGI(FastCGI を含む)も一緒に入れておきます。ブラウザでサーバー IP にアクセスし、IIS の初期ページが表示されれば成功です。

Install-WindowsFeature -Name Web-Server -IncludeManagementTools
# Optional: CGI/FastCGI support (needed for PHP)
Install-WindowsFeature -Name Web-CGI

Get-WindowsFeature Web-Server, Web-CGI
IIS をインストールすると「World Wide Web サービス (HTTP 受信トラフィック)」のファイアウォール規則が自動で有効になります。443 番が許可されていない場合は「Windows ファイアウォールのポート開放」記事を参照してください。

ステップ2:IIS サイトを作成し IP とホストヘッダーをバインドする

IIS のバインドは「IP アドレス + ポート + ホスト名」の組み合わせです。以下は 203.0.113.11 上で www.example.com にだけ応答する site1 を作成し、www なしのホスト名も追加する例です。IP とドメインはご自身のものに置き換え、事前に DNS の A レコードをその IP に向けてください。

Import-Module WebAdministration
New-Item -ItemType Directory -Path C:\inetpub\site1 -Force
Set-Content -Path C:\inetpub\site1\index.html -Value "site1 OK"

New-Website -Name "site1" -PhysicalPath "C:\inetpub\site1" -IPAddress "203.0.113.11" -Port 80 -HostHeader "www.example.com"
New-WebBinding -Name "site1" -IPAddress "203.0.113.11" -Port 80 -HostHeader "example.com"

Get-WebBinding -Name "site1"

ステップ3:複数 IP のサイトクラスターサーバーでの IIS バインド

IMIDC の複数 IP・サイトクラスター向けサーバーでは、サイトごとに専用 IP を割り当てるケースがよくあります。まずすべての IP を NIC に追加し(「Windows で IP アドレスを追加」記事を参照)、各サイトを個別の IP にバインドします。ホスト名を指定しなければ、その IP に向いたすべてのドメインに応答します。既定の Web サイトは「未割り当て:80」でリクエストを奪うので停止しておきます。

# One site per IP, no host header (answers any domain pointed at that IP)
New-Website -Name "site2" -PhysicalPath "C:\inetpub\site2" -IPAddress "203.0.113.12" -Port 80
New-Website -Name "site3" -PhysicalPath "C:\inetpub\site3" -IPAddress "203.0.113.13" -Port 80

# Stop the Default Web Site so it does not catch *:80
Stop-Website -Name "Default Web Site"
Set-ItemProperty "IIS:\Sites\Default Web Site" -Name serverAutoStart -Value $false
同じ「IP + ポート + ホスト名」は 1 つのサイトにしか割り当てられず、重複するとサイトが起動しません。大量に追加する前に Get-WebBinding で既存のバインドを確認してください。

ステップ4:win-acme で IIS に無料 SSL 証明書を導入する

win-acme(wacs.exe)は Windows 向けの定番 Let's Encrypt クライアントで、IIS サイトの検出、検証、証明書のインストール、443 バインドの追加、更新タスクの作成まで自動で行います。win-acme の公式サイトまたは GitHub のリリースページから x64 版 zip を入手し、C:\tools\win-acme に展開して実行します。既定の設定で証明書を作成するメニューを選び、対象サイトとドメインを選択します。

cd C:\tools\win-acme
.\wacs.exe

# Check the renewal task created by win-acme
Get-ScheduledTask | Where-Object TaskName -like "win-acme*"

申請前に、ドメインがサイトにバインドした IP に解決されること、80 番ポートが外部から到達可能なこと(HTTP 検証に必要)、証明書に含めたいホスト名がバインドに登録されていることを確認してください。

ステップ5:IIS FastCGI で PHP を動かす

PHP 公式の Windows 版ダウンロードサイトから NTS(スレッドセーフでない)x64 版 zip を取得して C:\PHP に展開し、対応する Visual C++ 再頒布可能パッケージを入れ、php.ini-production を php.ini としてコピーします。続いて appcmd で FastCGI アプリの登録、*.php のハンドラーマッピング、index.php の既定ドキュメント追加を行います。

$appcmd = "$env:windir\System32\inetsrv\appcmd.exe"
& $appcmd set config /section:system.webServer/fastCgi /+"[fullPath='C:\PHP\php-cgi.exe']"
& $appcmd set config /section:system.webServer/handlers /+"[name='PHP_via_FastCGI',path='*.php',verb='*',modules='FastCgiModule',scriptProcessor='C:\PHP\php-cgi.exe',resourceType='Either']"
& $appcmd set config /section:defaultDocument /+"files.[value='index.php']"

Set-Content -Path C:\inetpub\site1\info.php -Value "<?php phpinfo();"
iisreset

http://ドメイン/info.php で PHP 情報ページが表示されれば成功です。テスト後は情報漏えいを防ぐため info.php を削除してください。

よくある質問

「別の Web サイトがポートを使用している可能性があります」と表示され起動しません。

同じ IP + ポート + ホスト名を他のサイト(多くは既定の Web サイト)が使っています。そのサイトを停止するかバインドを変更してから再度起動してください。

win-acme の検証に失敗します。

A レコードの向き先、外部からの 80 番ポートの到達性、CDN やリダイレクト設定が /.well-known/acme-challenge/ をブロックしていないかを確認してください。

IIS と aaPanel/宝塔パネルのどちらがよいですか?

ASP.NET や MSSQL を使うなら Windows + IIS、PHP/MySQL 中心なら Linux + 宝塔パネルの方が軽量なことが多いです。「宝塔パネルのインストール」記事もご覧ください。

上記の手順で解決しない場合は、サポートチケットから IMIDC の 24 時間 365 日対応テクニカルサポートへお問い合わせください。サーバー IP、OS のバージョン、実行したコマンド、エラー画面のスクリーンショットを添えていただくと、より早く原因を特定できます。

この回答はお役に立ちましたか?

関連チュートリアル