はじめに

初老丸カレンダー 12/12分です。 UTCではまだ12日。

httpsにはhttps、httpにはhttpを返すというWebサイトを作りたいという要望がありました。
ELBが前段にあり、SSLターミネーションする環境のため、nginxにはhttpとしてリクエストが届きます。
railsなど、nginxをリバースプロキシとして動作させる場合の設定は検索によくでてきますが、php-fpmのようなfastcgi系の場合の設定がみつからなかったので試してみました。

設定

最初から答えになります。

https://www.nginx.com/resources/wiki/start/topics/examples/phpfcgi/
の設定をhttps化した例です

#X-FORWARDED-PROTOを使ってHTTPS判定する変数を作成
set $elb_https off;
if ($http_x_forwarded_proto = https) {
    set $elb_https on;
}

location ~ [^/]\.php(/|$) {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    if (!-f $document_root$fastcgi_script_name) {
        return 404;
    }

    # Mitigate https://httpoxy.org/ vulnerabilities
    fastcgi_param HTTP_PROXY "";

    # HTTPSパラメータにX-FORWARDED-PROTOを判定した結果を設定
    fastcgi_param HTTPS $elb_https; 

    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    include fastcgi_params;
}

組み込み変数 $http_x_forwarded_proto でロードバランサーでのSSL Terminationの有の場合にのみ、fastcgiのパラメータHTTPSをonにするという設定になっています。ELB用とかきましたが、他でもつかえるかとおもいます。

全部httpsとして返したいということであれば、 リダイレクト設定をいれる等の対応になるのですが、httpもつかうということでこの設定になっています。

いろいろ試していたのですが、fastcgi_paramをif文で括るとエラーになりました。また、直接$httpsを変更しようとしてもエラーとなりました。そういうものなのでしょうか。

おかしな点あれば是非ご指摘ください。

余談

FPMってFastCGI Process Managerの略だったんですね…

元記事はこちら

ELB + nginx + php-fpm でHTTPS対応した