windwos11のwls2からSQLserverに接続環境を構築する手順

ポイントは以下の2点です。

  1. ドライバの導入: Linux用のMicrosoft公式ドライバとPHP拡張機能を入れる必要がある。
  2. ネットワーク: WSL2(Linux)からWindows(ホスト)を見るための特別な設定が必要。

手順1:Microsoft ODBCドライバのインストール

UbuntuにSQL Serverと通信するための土台(ODBC Driver 18)をインストールします。

ターミナルで以下のコマンドを1行ずつ実行してください。 (※Ubuntuのバージョンが22.04または24.04と仮定していますが、一般的なコマンドです)h

# 1. 必要なツールのインストール
sudo apt-get install -y curl gnupg2

# 2. Microsoftの公開鍵を登録
curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc

# 3. リポジトリの登録(Ubuntuのバージョンを自動判定して登録します)
curl https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list

# 4. パッケージリストの更新
sudo apt-get update

# 5. ODBCドライバのインストール
# ※途中でライセンス条項への同意画面が出るので「YES」を選択してEnter
sudo apt-get install -y msodbcsql18 unixodbc-dev

手順2:PHP拡張機能(sqlsrv, pdo_sqlsrv)のインストール

PHPからドライバを使うための拡張機能をインストールします。これには pecl コマンドを使います。

# 1. PHP開発用ツールとPECLのインストール
sudo apt-get install -y php-dev php-pear build-essential

# 2. SQL Server用PHP拡張のコンパイルとインストール
sudo pecl install sqlsrv
sudo pecl install pdo_sqlsrv

手順3:PHPの設定ファイルへの登録

インストールした拡張機能をPHPに認識させます。

  1. 以下のコマンドを実行して設定ファイルを作成します。
    # sqlsrvの有効化
    echo "extension=sqlsrv.so" | sudo tee /etc/php/8.1/mods-available/sqlsrv.ini
    #pdo_sqlsrvの有効化
    echo "extension=pdo_sqlsrv.so" | sudo tee /etc/php/8.1/mods-available/pdo_sqlsrv.ini
    (注意: 上記コマンドの 8.1 の部分は、php -v で確認したバージョンに合わせて 8.28.3 に変更してください)
  2. 設定を反映させます。
    sudo phpenmod sqlsrv pdo_sqlsrv
    sudo service apache2 restart

WSL2上のUbuntu(PHP 8 + Apache)から、Windows側にインストールされているSQL Serverに接続するには、MySQLよりも少し手順が多くなります。

主なハードルは以下の2点です。

  1. ドライバの導入: Linux用のMicrosoft公式ドライバとPHP拡張機能を入れる必要がある。
  2. ネットワーク: WSL2(Linux)からWindows(ホスト)を見るための特別な設定が必要。

以下に手順をまとめました。


手順1:Microsoft ODBCドライバのインストール

UbuntuにSQL Serverと通信するための土台(ODBC Driver 18)をインストールします。

ターミナルで以下のコマンドを1行ずつ実行してください。 (※Ubuntuのバージョンが22.04または24.04と仮定していますが、一般的なコマンドです)

Bash

# 1. 必要なツールのインストール
sudo apt-get install -y curl gnupg2

# 2. Microsoftの公開鍵を登録
curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc

# 3. リポジトリの登録(Ubuntuのバージョンを自動判定して登録します)
curl https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list

# 4. パッケージリストの更新
sudo apt-get update

# 5. ODBCドライバのインストール
# ※途中でライセンス条項への同意画面が出るので「YES」を選択してEnter
sudo apt-get install -y msodbcsql18 unixodbc-dev

手順2:PHP拡張機能(sqlsrv, pdo_sqlsrv)のインストール

PHPからドライバを使うための拡張機能をインストールします。これには pecl コマンドを使います。

Bash

# 1. PHP開発用ツールとPECLのインストール
sudo apt-get install -y php-dev php-pear build-essential

# 2. SQL Server用PHP拡張のコンパイルとインストール
sudo pecl install sqlsrv
sudo pecl install pdo_sqlsrv

手順3:PHPの設定ファイルへの登録

インストールした拡張機能をPHPに認識させます。

  1. 以下のコマンドを実行して設定ファイルを作成します。Bash# sqlsrvの有効化 echo "extension=sqlsrv.so" | sudo tee /etc/php/8.1/mods-available/sqlsrv.ini # pdo_sqlsrvの有効化 echo "extension=pdo_sqlsrv.so" | sudo tee /etc/php/8.1/mods-available/pdo_sqlsrv.ini (注意: 上記コマンドの 8.1 の部分は、php -v で確認したバージョンに合わせて 8.28.3 に変更してください)
  2. 設定を反映させます。Bashsudo phpenmod sqlsrv pdo_sqlsrv sudo service apache2 restart

手順4:接続コード(PHPソース)の修正

ここがWSL2特有の最大のポイントです。 Ubuntuから見て「Windows」は localhost ではありません。

1. ホスト名の指定

接続文字列(DSN)のサーバー名には、WindowsマシンのIPアドレスを指定する必要がありますが、WSL2では以下の特殊な名前でWindowsを指すことができます。

  • サーバー名: $(hostname).local (例: MY-PC.local
  • またはIPアドレス: /etc/resolv.conf に書いてあるIP(少し面倒なのでホスト名推奨)

2. サンプルコード

PDOを使った接続例です。ODBC Driver 18からはセキュリティが厳しくなっているため、TrustServerCertificate=yes が重要です。

<?php
// WindowsのPC名に ".local" をつけるか、WindowsのIPアドレスを指定
$serverName = "あなたのPC名.local, 1433"; // ポート1433を指定

$connectionOptions = [
    "Database" => "データベース名",
    "Uid" => "sa",             // SQL Server認証のユーザー名
    "PWD" => "パスワード",      // SQL Server認証のパスワード
    
    // 【重要】開発環境では証明書エラーを回避するために必須
    "TrustServerCertificate" => "yes", 
    "Encrypt" => "yes" 
];

try {
    // DSNの構築
    $dsn = "sqlsrv:server=$serverName;Database=" . $connectionOptions['Database'] . 
           ";TrustServerCertificate=yes;Encrypt=yes";
    
    $conn = new PDO($dsn, $connectionOptions['Uid'], $connectionOptions['PWD']);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    echo "接続成功!";
} catch (PDOException $e) {
    echo "接続失敗: " . $e->getMessage();
}
?>

手順5:Windows側(SQL Server)の設定確認

コードが正しくても、Windows側で拒否されることがよくあります。以下の3点を確認してください。

  1. SQL Server認証モードの有効化
    • WSL(Linux)からは「Windows統合認証」が使えません。
    • SQL Server Management Studio (SSMS) でサーバーのプロパティを開き、セキュリティで「SQL Server認証モードとWindows認証モード」を選択し、sa ユーザーなどを有効にしてください。
  2. TCP/IP接続の許可
    • スタートメニューから「SQL Server Configuration Manager(構成マネージャー)」を開きます。
    • 「SQL Server ネットワークの構成」→「(インスタンス名)のプロトコル」を選択。
    • TCP/IP が「有効」になっていることを確認してください。
  3. Windowsファイアウォール
    • Windowsのファイアウォールで、ポート 1433 の受信接続を許可するルールを追加する必要がある場合があります。

トラブルシューティングのヒント

もし接続できない場合は、Ubuntuターミナルから ping を打ってみてください。

Bash

ping あなたのPC名.local

これで応答があればネットワークは繋がっています。エラーが出る場合は、WindowsのIPアドレス(Windowsのコマンドプロンプトで ipconfig で確認)を直接PHPに記述して試してください。