Nginx上のPHPで$_SERVER[‘REQUEST_URI’]を取得する方法

Nginx上のPHPで$_SERVER['REQUEST_URI']を取得する方法 サーバー

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が対応しないともなりかねませんからね。
そこまでは言いすぎかもしれませんが、決して未来のあることではありません。

長期戦を覚悟して、検証を続けていこうと思います。
その過程で共有できる情報があれば、当ブログで情報を発信していきます。

タイトルとURLをコピーしました