普段は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-utilsとsmbclientは別パッケージなので、追加でインストールします。
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はstorageとbootstrap/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を動かすため、ローカルディスク上で動かす場合と比べると、vendorやnode_modulesの読み込みは遅くなります。
特にLaravelは1リクエストごとに多数のPHPファイルを読み込むため、用途によってはレスポンスの遅さが気になるかもしれません。
ただ、Windows上のソースをそのままLinuxで動かしたい検証用途では、ファイルをコピーしたりGitで同期したりする必要がないため、なかなか便利です。
本番運用であれば、Linux側へGit cloneやrsyncで配置した方がよいですが、開発環境としては使いどころのある構成になりました。