Linux Windows11 パソコン関連 自宅サーバ 設計

Windows上のLaravelプロジェクトをSMBでマウントして、DebianをAPサーバとして動かす

普段はWindows上のPhpStormでLaravelを触っているのですが、今回はWindows側に置いたソースコードをそのまま利用しつつ、Linux側をAPサーバとして動かす構成を試してみました。(CI/CDの構成組んでも良いですが、色々異な事情があって今回は横着構成をします)

構成はこんな感じです。

ソースコードはWindows側に置いたまま、DebianからSMBでマウントし、NginxとPHP-FPMでLaravelを動かします。
本番向けというよりは、Windowsで編集しながらLinux環境で動作確認するための構成です。

⚠ 注意事項

設定内容やプログラムの内容は、用途・環境に応じて適切なものが変わります。

各種設定値や環境情報についてよく理解を深め、壊れてもよい環境で十分に検証してください。

なるべく正確に書くよう心掛けていますが、本投稿内容を実施される際には自己責任の下でお願いいたします。

DebianへSSH接続

とりあえず、Debianはインストールしたてホヤホヤなので、WindowsのコマンドプロンプトからDebianへSSH接続します。
(WindowsにもSSHクライアントデフォルトでは居るようになって、便利)

ssh 172.16.20.64 -l localadm

初回接続時はホスト鍵の確認が表示されるため、内容を確認してyesを入力します。

Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

sudo権限を付与

最初はlocaladmユーザーにsudo権限がありませんでした。

localadm は sudoers ファイルにありません。

そのため、いったんrootへ切り替えます。

su -

sudoパッケージを確認し、localadmをsudoグループへ追加しました。

apt update
apt install -y sudo
usermod -aG sudo localadm

グループ追加後は、いったんログアウトしてSSH接続し直します。

getent group sudo
sudo:x:27:localadm

再ログイン後、以下でrootシェルへ切り替えられるようになりました。

sudo -i

CIFS関連ツールをインストール

Windowsの共有フォルダをマウントするため、cifs-utilsをインストールします。

apt update
apt install -y cifs-utils vim

共有一覧を確認しようとしてsmblientを実行したところ、コマンドがありませんでした。

smbclient: command not found

cifs-utilssmbclientは別パッケージなので、追加でインストールします。

apt install -y smbclient

Windows側の共有一覧を確認します。

smbclient -L //172.16.20.211 -U 'localadm'

共有一覧にUsersが表示されました。

Sharename       Type
---------       ----
ADMIN$          Disk
C$              Disk
IPC$            IPC
Users           Disk

Nginx、PHP-FPM、PHP拡張をインストール

Laravelを動かすために、Nginx、PHP-FPM、必要なPHP拡張をまとめてインストールします。

apt update

apt install -y \
  nginx \
  php \
  php-cli \
  php-fpm \
  php-common \
  php-mysql \
  php-sqlite3 \
  php-mbstring \
  php-xml \
  php-curl \
  php-zip \
  php-bcmath \
  php-intl \
  php-gd \
  cifs-utils \
  smbclient

今回の環境では、PHP 8.4がインストールされました。

nginx -v
php -v
smbclient --version
nginx version: nginx/1.26.3
PHP 8.4.23
Version 4.22.8-Debian

NginxとPHP-FPMを有効化します。

systemctl enable --now nginx
systemctl enable --now php8.4-fpm

状態を確認します。

systemctl status nginx --no-pager
systemctl status php8.4-fpm --no-pager

PHP-FPMのソケットも確認しました。

ls -l /run/php/
/run/php/php8.4-fpm.sock

SMBの認証情報を保存

Windows共有へ接続するための認証情報を保存します。

vim /root/.smb-kakeibo

内容は以下のようにします。

username=Windowsのユーザー名
password=Windowsのパスワード

認証情報が他のユーザーから読まれないように、権限を制限します。

chmod 600 /root/.smb-kakeibo

Windows上のLaravelプロジェクトをマウント

マウントポイントを作成します。

mkdir -p /var/www/kakeibo

最初はUsers共有をマウントし、prefixpathでLaravelのディレクトリを指定しました。

mount -t cifs //172.16.20.211/Users /var/www/kakeibo \
  -o credentials=/root/.smb-kakeibo,vers=3.0,iocharset=utf8,\
prefixpath=localadm/IdeaProjects/kakeibo,\
uid=33,gid=33,file_mode=0664,dir_mode=0775,noperm

ただ、確認してみるとLaravelのプロジェクト直下ではなく、Users共有のルートが見えていました。

ls -la /var/www/kakeibo
Default
desktop.ini
localadm

今回は、共有配下のフルパスをそのまま指定する方法に変更しました。

umount /var/www/kakeibo
mount -t cifs \
  //172.16.20.211/Users/localadm/IdeaProjects/kakeibo \
  /var/www/kakeibo \
  -o credentials=/root/.smb-kakeibo,vers=3.0,iocharset=utf8,\
uid=33,gid=33,file_mode=0664,dir_mode=0775,noperm

確認します。

ls -alh /var/www/kakeibo

Laravelのファイル一式が直接見えるようになりました。

app
artisan
bootstrap
composer.json
config
database
public
resources
routes
storage
vendor

再起動後も自動マウントする

毎回手動でマウントするのは面倒なので、/etc/fstabへ登録します。

vim /etc/fstab

以下を追記しました。

//172.16.20.211/Users/localadm/IdeaProjects/kakeibo /var/www/kakeibo cifs credentials=/root/.smb-kakeibo,vers=3.0,iocharset=utf8,uid=33,gid=33,file_mode=0664,dir_mode=0775,noperm,_netdev,nofail,x-systemd.automount,x-systemd.idle-timeout=0 0 0

設定を反映します。

systemctl daemon-reload
mount -a

マウント状態を確認します。

findmnt /var/www/kakeibo
/var/www/kakeibo
//172.16.20.211/Users/localadm/IdeaProjects/kakeibo
cifs

x-systemd.automountを付けているため、再起動後はアクセス時に自動でマウントされます。

Laravelの動作確認

LaravelをCLIから確認します。

cd /var/www/kakeibo
sudo -u www-data php artisan about

今回の環境では、以下の構成でした。

Laravel Version  12.12.0
PHP Version      8.4.23
Environment      local
Timezone         Asia/Tokyo
Database         mysql
Session          database
Queue            database

Composerのプラットフォーム要件も確認します。

rootで実行すると警告が出るため、www-dataで実行しました。

sudo -u www-data php composer.phar check-platform-reqs

PHPバージョンと必要な拡張は、すべて問題ありませんでした。

storageとbootstrap/cacheの書き込み確認

Laravelはstoragebootstrap/cacheへ書き込みます。

SMBマウント時に、所有者をwww-dataへ見せるようにしているため、書き込みできるか確認します。

sudo -u www-data touch storage/logs/linux-write-test.log
sudo -u www-data touch bootstrap/cache/linux-write-test.tmp

問題なく作成できたので削除します。

rm -f storage/logs/linux-write-test.log
rm -f bootstrap/cache/linux-write-test.tmp

MySQLクライアントを追加

php artisan dbを実行したところ、MySQLクライアントがないと言われました。

mysql not found in path.

PHPのpdo_mysql拡張とは別に、CLIのMySQLクライアントが必要です。

apt install -y default-mysql-client

Debian 13では、MariaDBクライアントがインストールされました。

再度実行します。

php artisan db

今度は、自己署名証明書のエラーが発生しました。

TLS/SSL error: self-signed certificate in certificate chain

今回は検証環境のため、証明書検証を無効化する設定を追加しました。

vim /root/.my.cnf
[client]
disable-ssl-verify-server-cert

ファイル権限を制限します。

chmod 600 /root/.my.cnf

設定が反映されているか確認します。

mysql --print-defaults
--disable-ssl-verify-server-cert

その後、DBユーザーの権限も調整し、最終的に接続できました。

php artisan db
Welcome to the MariaDB monitor.
Server version: 8.0.41 MySQL Community Server

Laravel経由の接続も確認します。

sudo -u www-data php artisan migrate:status

すべてのマイグレーションがRanになっていることを確認できました。

Nginxの設定

Laravel用のNginx設定を作成します。

vim /etc/nginx/sites-available/kakeibo

設定内容は以下です。

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    server_name _;

    root /var/www/kakeibo/public;
    index index.php index.html;

    charset utf-8;

    access_log /var/log/nginx/kakeibo-access.log;
    error_log /var/log/nginx/kakeibo-error.log;

    client_max_body_size 50m;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.4-fpm.sock;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

設定を有効化します。

ln -s /etc/nginx/sites-available/kakeibo \
  /etc/nginx/sites-enabled/kakeibo

デフォルトサイトは削除します。

rm -f /etc/nginx/sites-enabled/default

設定確認後、反映します。

nginx -t
systemctl reload nginx

ApacheとNginxが競合した

Nginxを再起動しようとしたところ、起動に失敗しました。

Job for nginx.service failed

curlで確認すると、NginxではなくApacheのデフォルトページが返ってきました。

curl -i http://127.0.0.1/
Server: Apache/2.4.67
Apache2 Debian Default Page

PHP関連パッケージをまとめてインストールした際に、libapache2-mod-php経由でApacheもインストールされていたようです。

ApacheとNginxの両方が80番ポートを使おうとしていたため、Apacheを停止・無効化します。

systemctl stop apache2
systemctl disable apache2
systemctl enable --now nginx

NginxとPHP-FPMを再起動します。

systemctl restart php8.4-fpm
systemctl restart nginx

これでNginxが80番ポートを使用するようになりました。

再起動後の確認

最後にサーバを再起動します。

reboot

再接続後、SMBが自動マウントされているか確認します。

findmnt /var/www/kakeibo
ls -la /var/www/kakeibo/public/index.php

NginxとPHP-FPMも確認します。

systemctl status nginx php8.4-fpm --no-pager

HTTP応答を確認します。

curl -I http://127.0.0.1/

今回の構成では、Windows側のソースコードを変更すると、その内容がそのままDebian側へ反映されます。

Windows上のPhpStormで編集しつつ、DebianのNginxとPHP-FPMで動作確認できるようになりました。

実際にやってみて

SMB越しにLaravelを動かすため、ローカルディスク上で動かす場合と比べると、vendornode_modulesの読み込みは遅くなります。

特にLaravelは1リクエストごとに多数のPHPファイルを読み込むため、用途によってはレスポンスの遅さが気になるかもしれません。

ただ、Windows上のソースをそのままLinuxで動かしたい検証用途では、ファイルをコピーしたりGitで同期したりする必要がないため、なかなか便利です。

本番運用であれば、Linux側へGit cloneやrsyncで配置した方がよいですが、開発環境としては使いどころのある構成になりました。

-Linux, Windows11, パソコン関連, 自宅サーバ, 設計
-, , ,