タグ: nginx

Heroku上のPHPアプリケーションにBASIC認証を導入する

Heroku上でnginxをWEBサーバとしたPHPアプリケーションに対してBASIC認証をかける

流れ

  • BASIC認証の設定はnginxの設定ファイルに記述
  • IDやパスワードは環境変数に登録
  • htpasswdファイルはデプロイ時に生成

前提

ディレクトリの初期構成は以下の通り。

public/
    index.php
vendor/
composer.json
Procfile

composer.jsonは

{
    "require-dev": {
        "heroku/heroku-buildpack-php": "*"
    }
}

として、composer install or updateをして、vendor/binディレクトリにvendor/bin/heroku-php-nginxがインストールされている。

Procfileは

web: bin/heroku-php-nginx public

として、ドキュメントルートをpublicフォルダとしてデプロイしている。

手順

  1. 環境変数にBASIC認証アカウントを登録
    $ heroku config:set BASIC_AUTH_USERNAME="basic_auth_user"
    $ heroku config:set BASIC_AUTH_PASSWORD="basic_auth_pass"
    

    またはWEBコンソール (https://dashboard.heroku.com/apps/APPNAME/settings) で追加する

  2. nginxにBASIC認証の設定を加えるため、設定の追加をする

    1. 設定用のフォルダを作成する
      $ mkdir heroku
      $ cd heroku
      
    2. nginx_app.confというファイルを作成する。すでにある場合は、auth_basic,auth_basic_user_fileの部分を追記する
      location / {
          auth_basic            "Restricted";
          auth_basic_user_file  $document_root/../.htpasswd;
      }
      

      このサンプルではルート下すべてをBASIC認証の領域とする。

    3. Procfileを編集して、デプロイ時にnginx_app.confを読み込むませる

      web: bin/heroku-php-nginx -C heroku/nginx_app.conf public
      
  3. Herokuの.profile.dの仕組みを使って、htpasswdファイルを生成するbashスクリプトを追加する
    $ mkdir .profile.d
    $ cd .profile.d
    $ vi gen-htpasswd.sh
    

    gen-htpasswd.shは

    #!/usr/bin/env bash
    set -ex
    
    echo -e "${BASIC_AUTH_USERNAME}:$(perl -le 'print crypt($ENV{"BASIC_AUTH_PASSWORD"}, rand(0xffffffff));')" > /app/.htpasswd
    
  4. Herokuにデプロイする

参考

ownCloud8をアップデートしたら、管理画面に”The test with getenv(“PATH”) only returns an empty response.”と表示されたとき

環境

の状態で、yum updateでownCloudを8.1.1にした結果、管理画面に

php does not seem to be setup properly to query system environment variables. The test with getenv("PATH") only returns an empty response.
Please check the installation documentation for php configuration notes and the php configuration of your server, especially when using php-fpm.

が表示された。

ownCloud 8.1: The test with getenv(“PATH”) only returns an empty response. – Techish.net
より
/etc/php-fpm.d/www.conf

clear_env = noの行のコメントアウトをはずして再読み込みすると解消する。

@@ -367,7 +367,7 @@
 ; Setting to "no" will make all environment variables available to PHP code
 ; via getenv(), $_ENV and $_SERVER.
 ; Default Value: yes
-;clear_env = no
+clear_env = no

nginx cookbookのpassengerレシピのCentOS7対応

nginxのcookbookである miketheman/nginx にはpassengerをモジュールとして追加できるレシピがあります。

そこで、CentOS7上で利用するために、attributeの node[nginx][repo_source]passengernode[‘nginx’][‘install_method’]package に設定してインストールしようとしたところ、

recipes/package.rbには

if platform_family?('rhel')
  if node['nginx']['repo_source'] == 'epel'
    include_recipe 'yum-epel'
  elsif node['nginx']['repo_source'] == 'nginx'
    include_recipe 'nginx::repo'
    package_install_opts = '--disablerepo=* --enablerepo=nginx'
  elsif node['nginx']['repo_source'].to_s.empty?
    log "node['nginx']['repo_source'] was not set, no additional yum repositories will be installed." do
      level :debug
    end
  else
    fail ArgumentError, "Unknown value '#{node['nginx']['repo_source']}' was passed to the nginx cookbook."
  end

としてrepo_source==passengerの選択肢はなく、

recipes/repo_passenger.rb には

case node['platform_family']
when 'rhel', 'fedora'

  log 'There is not official phusion passenger repo for redhat based systems.' do
    level :info
  end

とあり、パッケージリポジトリがない。

また、readme.mdには

Basic configuration to use the official Phusion Passenger repositories:
node['nginx']['repo_source'] – ‘passenger’
node['nginx']['package_name'] – ‘nginx-extras’
node['nginx']['passenger']['install_method'] – ‘package’

とあるが、nginx-extras はCentOSのパッケージにはないため、インストールができない。

一方、PHUSION Passengerの公式ドキュメントには

We provide an official Phusion Passenger YUM repository with packages for Red Hat Enterprise Linux and CentOS.

とあり、パッケージリポジトリが用意されている。そこで、これをrepo_passenger.rbに組み込み、passengerモジュールをインストールする

変更ファイル

  • recipes/package.rb
    プラットフォームファミリーがrhelの場合にrepo_source==’passenger’の選択肢を増やす
  • recipes/repo_passenger.rb
    RHEL,CentOS用のリポジトリファイルを/etc/yum.repos.dにおいて、キャッシュを更新する
  • attributes/passenger.rb
    /etc/nginx/conf.d/passenger.confにあるpassenger_rootの値が違っていたため、プラットフォームファミリーがrhelの場合の時だけ変更する

オリジナルからの変更点一覧: https://github.com/mistymagich/nginx/commit/6327617a066cb09e60703b8dac17fe4c746dc15b?diff=unified

miketheman/nginxをforkして、上記変更を適用したものをmistymagic/nginxに置きました。

またそれを使ってインストールしたpassengerに対して、PHUSION Passengerの公式ドキュメントにあるデモをVagrant+Chefの組み合わせで動かしたデモをmistymagich/nginx-passenger-on-CentOS7-demo
に置きました。

nginxでpostしたデータをログに残す

参考:nginx – Logging POST data from $request_body – Stack Overflow

設定ファイルに

    location / {
        log_format postdata $request_body;
        access_log  /var/log/nginx/postdata.log  postdata;

    }

を追加。

POSTで通信すると、/var/log/nginx/postdata.logにリクエストのBody部が記録されます。

:
param_1=value_1&param_2=value_2&…
:

のように記録されます。