Nginx上でPHPを動かす必要性が出てきました。
理由は、Apacheで動かしているサイトで負荷が問題になってきたからです。
簡単に言えば、スペックを上げれば解決する問題です。
クライアントにそのように言えば済みます。
もともと低額料金のVPSで頑張っているサイトという事情があるため。
しかし、まずは低額料金のVPSで頑張る方向で行くつもりです。
負荷問題をチャンスだと捉えて、Nginxの検証を行おうかと考えています。
検証が上手くいけば、クライアントにもいい結果となるでしょう。
もちろん、私にとってもです。
そこで、早速検証を始めました。
しかし、いきなり大きな問題が発生しました!!
本記事の内容
- Nginx上でPHPを動かす環境
- $_SERVER[‘REQUEST_URI’]が取得できない
- PHP-FPMで$_SERVER[‘REQUEST_URI’]を取得する設定
- NGINX Unitで$_SERVER[‘REQUEST_URI’]を取得する設定
- 今回の問題は解決したが・・・
上記に沿って大きな問題を解決していきます。
Nginx上でPHPを動かす環境
問題について語る前に、環境を説明しておきます。
発生した問題は、環境によることが大きいからです。
Nginx上でPHPを動かす環境は以下。
- Ubuntu 18.04
- Nginx 1.14.0
- NGINX Unit 1.20.0
Ubuntu 18.04
現状のサイトは、Linuxサーバーで動いています。
ディストリビューションは、Debianです。
OSから変えようと考えています。
DebianからUbuntuへの変更となります。
以下は、Ubuntuのバージョン情報です。
$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=18.04 DISTRIB_CODENAME=bionic DISTRIB_DESCRIPTION="Ubuntu 18.04.5 LTS"
設定に関しては、次の記事にまとめています。
できる限りで必要最低限の設定としています。
Nginx 1.14.0
もともとは、Nginx上ではPythonを動かす予定でした。
PHPは今後もApacheで無難にやろうと考えていました。
しかし、今回のような事情もあり、考えを改めました。
NginxでもPHPを動かしていこうと。
Nginxのバージョンは以下。
$ nginx -V nginx version: nginx/1.14.0 (Ubuntu)
Nginxのインストールに関しては、次の記事にまとめています。
NGINX Unit 1.20.0
「NGINX Unit、何これ?」
このように思う方もいるかもしれません。
この場合は、次の記事をご覧ください。
NGINX Unitは、アプリケーションサーバーです。
アプリケーションサーバーとして、インストールしています。
その際の手順などは、次の記事で解説しています。
まとめ
NGINX Unitをインストールしていることから、PHP-FPMを使うつもりはありません。
以前に、PHP-FPMを勉強がてらにインストールしたことはあります。
でも、本気でNginx + PHPをやっていくのであれば、PHP-FPMは選択肢としてナシです。
簡潔に言うと、技術的に古すぎます。
そのため、今回はNGINX Unit上でPHPを動かすことを検証しています。
検証に目処が付けば、パフォーマンスの比較をやってみたいですね。
ただ、このことが問題に関係しているのです・・・
$_SERVER[‘REQUEST_URI’]が取得できない
この記事における、本題です。
なんと、$_SERVER[‘REQUEST_URI’]の値が取得できません。
そのため、該当(移行予定)サイトは全く動かないことがわかりました。
$_SERVER[‘REQUEST_URI’]に依存していますからね。。。
そもそも、$_SERVER[‘REQUEST_URI’]が取得できないのは大事です。
実際、Googleで検索すれば、それなりに関係する記事がヒットします。
以下でそれぞれの解決方法を説明します。
PHP-FPMで$_SERVER[‘REQUEST_URI’]を取得する設定
検索して出てくるのは、PHP-FPMにおける解決方法ばかりです。
よく出てきた解決方法は以下。
location ~* .php$ { fastcgi_param REQUEST_URI $request_uri; }
これをnginxの設定ファイルに記述すれば、OKというモノです。
でも、これでは解決できませんでした。
これは、PHP-FPMによる解決方法だからです。
今回は、NGINX Unitを使っていくと心に決めています。
よって、この設定では意味がありません。
NGINX Unitで$_SERVER[‘REQUEST_URI’]を取得する設定
以下が求めていた解決方法です。
location ~* .php$ { proxy_set_header REQUEST_URI $request_uri; }
探しだすのに、苦労しました。
そもそも、NGINX Unitはまだまだ利用者自体が少ないです。
そのため、役に立つ情報も全然足りていません。
こういうことがあるから、新しい技術が使われないということはあるのでしょう。
いずれにせよ、必要な情報が取得できるようにはなります。
しかし、$_SERVER[‘REQUEST_URI’]では値を取得できません。
PHP側でも取得する際に、工夫が必要です。
echo $_SERVER['HTTP_REQUEST_URI'];
こうしないとダメです。
$_SERVER[‘REQUEST_URI’] | × |
$_SERVER[‘HTTP_REQUEST_URI’] | ○ |
「HTTP_」を付ける必要があるのです。
微妙ですが、これで必要な情報は取れるのでOKとしましょう。
今回の問題は解決したが・・・
「$_SERVER[‘REQUEST_URI’]の値が取得できない」
この問題は、なんとか解決できました。
しかし、これでは先が思いやられますね。。。
前途多難とも言えるのでしょう。
でも、いつまでも枯れた技術に寄りかかるのも危険だとは思います。
最悪、OSが対応しないともなりかねませんからね。
そこまでは言いすぎかもしれませんが、決して未来のあることではありません。
長期戦を覚悟して、検証を続けていこうと思います。
その過程で共有できる情報があれば、当ブログで情報を発信していきます。