Linuxを日常的に使う実験ブログ

Nginx+php-fpm環境でaliasで設定したサブディレクトリでPHPを動かす

 2020-08-19

 WEB技術

こんにちは今回のテーマは「Nginx+php-fpm環境でサブディレクトリでPHPを動かす」です。Nginxでalias設定でサブディレクトリにアクセスしてそこでPHPをを動かしたい。サブディレクトリよりもバーチャルホストの方が使う機会が多くあまり需要がないかも知れませんが、個人的なメモも兼ねて記事化しておきます。 [adsense02] 【目次】

やりたかったこと

http://example.comのルートディレクトリを/var/www/htmlとしている時にhttp://example.com/sub/にアクセスされた場合/var/www/subディレクトリをルートディレクトリとさせるようnginxにalias設定をするとします。この時、var/www/subディレクトリに配置したtest.phpをphp-fpm経由で動作させたいというお話です。

検証環境

システムDebian 9
Nginx1.10.3
php-fpm7.0

rootとaliasによる設定の使い分け

nginxで特定のサブディレクトリだけルートディレクトリ内のディレクトリとは異なるディレクトリを使用したい場合、設定方法としてrootとaliasがあります。似ているのですが少々設定方法が異なります。 /var/www/subディレクトリにtest.phpファイルを置きhttp://example.com/sub/test.phpにアクセスするとします。

rootで設定する場合

server {
    ...

    location /sub {
        root /var/www;
    }
    ...
}

rootはルートディレクトリを設定するという意味なので/var/wwwをルートとしてその中にあるsubディレクトリにアクセスするという意味になります。

aliasで設定する場合

ではaliasで設定する場合はどうでしょうか?省略形ですが、以下のような設定をします。

server {
    ...

    location /sub {
        alias /var/www/sub;
    }
    ...
}

aliasの場合は文字通りエイリアスなのでexample.com/subにアクセスがあったら/var/www/subにショートカットさせるという意味合いの設定となります。なのでURLのサブディレクトリと実際のディレクトリ名は一致しなくても問題ありません。このような利便性からaliasを使用するケースが多いように思われます。(もちろんケースバイケースではあるのですが)

alias設定時にPHPファイルがFile not foundが発生

aliasを使用して以下のように設定してhttp://example.com/sub/test.phpにアクセスすると/var/www/subに配置した\*.phpファイルだけ”File Not Found”メッセージが出てしまいます。 ※以下の設定は正常に動作しません

server {
	listen 80;

	root /var/www/html;

	# Add index.php to the list if you are using PHP
	index index.html index.htm index.nginx-debian.html index.php;

	server_name test.example.com;

	location / {
		try_files $uri $uri/ =404;
	}

	location /test {
		alias /var/www/sub;
        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        }
	}
}

*.htmlファイルを配置するとHTMLの内容が描画されますので問題はphp-fpmへの連絡部分だということになります。ルートディレクトリ(/var/www/html)に配置した*.phpファイルは動作していたため、php-fpmのパーミッション等の設定は上手くいっているという前提です。 実はこの設定をrootを用いた書き方に変更するとPHPファイルが動きます。ここがとてもややこしいというか筆者がハマったポイントでもあります。

rootとaliasで異なるFastCGIの設定

さて、ここからが本題です。サブディレクトリへのアクセスをrootで設定した場合とaliasで設定した場合ではPHPファイルへのアクセスへの設定が少々異なりますので、それぞれのケースで設定例を見ていきたいと思います。

rootを使用した場合

rootでサブディレクトリを設定した場合は以下の設定でhttp://example.com/sub/test.phpにアクセスすると/var/www/sub/test.phpが動作します。

server {
	listen 80;

	root /var/www/html;

	# Add index.php to the list if you are using PHP
	index index.html index.htm index.nginx-debian.html index.php;

	server_name test.example.com;

	location / {
		try_files $uri $uri/ =404;
	}

	location /test {
		root /var/www;
        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        }
	}
}

aliasを使用した場合

aliasでサブディレクトリを設定した場合は以下の設定でhttp://example.com/sub/test.phpにアクセスすると/var/www/sub/test.phpが動作します。

server {
	listen 80;

	root /var/www/html;

	# Add index.php to the list if you are using PHP
	index index.html index.htm index.nginx-debian.html index.php;

	server_name test.example.com;

	location / {
		try_files $uri $uri/ =404;
	}

	location /test {
		alias /var/www/sub;
        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
            fastcgi_param SCRIPT_FILENAME $request_filename;
        }
	}
}

ポイントは以下の部分です。

fastcgi_param SCRIPT_FILENAME $request_filename;

この部分が

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_file;

になっていてもFile not found.となってしまいますので注意しましょう。

最後に

ルートディレクトリにPHPファイルがある前提の設定例はネット上にも沢山情報があるのですが、aliasを用いたサブディレクトリに配置する場合は情報量も少なく手探りになってしまいました。本記事が何かのお役に立てば幸いです。 [adsense]