Docker の中の Apache で PHP の shell_exec() すると実行できるときとできないときがある

Webブラウザから PHP の exec 系統のコマンドを実行する

ある程度のセキュリティはちゃんと意識した上で、シェルスクリプトを Webブラウザ 上から叩くときなどに便利です。

Docker 上だと

が、Docker 上の Apache(PHP)だと「実行できたりできなかったり」する。原因は分からない。完全に実行できないなら調べようもあるとは思うが……。

ハマっている時間もないので、Docker ではやらないことにしました*1

エラーログ

こんな感じ。

[Fri Mar 10 02:41:17.459441 2017] [:error] [pid 26519] [client 192.168.160.102:57781] PHP Warning:  shell_exec(): Unable to execute '/bin/echo hello' in /var/www/html/hogehoge/exec.php on line 6

補足

シェルスクリプトなどは実行権限を適切に設定することを忘れずに。あと、パスも適切に書くことも忘れずに*2

*1:たぶん権限系?

*2:何でもかんでもフルパスで書けば安全っちゃあ安全

Ubuntu 16.04 LTS で MongoDB の認証を有効にする方法

MongoDB

まずはインストールしましょう。

認証ユーザの追加

db.addUser()はdeprecatedです。ダメです。db.createUser()を使いましょうroleとかdbとかは適切なものを。

> use admin
> db.createUser( { user: "username", pwd: "password", roles: [{ role: "userAdminAnyDatabase", db: "admin"}] } )   
Successfully added user: {
        "user" : "username",
        "roles" : [
                {
                        "role" : "userAdminAnyDatabase",
                        "db" : "admin"
                }
        ]
}

設定ファイルを書き換える

/etc/mongodb.confauthがコメントアウトされていますので、コメントを外してtrueにしましょう。そうしたら再起動です。

auth = true

認証の設定が有効かどうかを確認する

認証しないでshow collectionsするとエラーが返ってくれば設定はうまくいってます。

$ mongo                                                                                   
MongoDB shell version: 2.6.10
connecting to: test
> use admin                                                                                            
switched to db admin
> show collections                                                                                     
2017-03-05T21:46:47.182+0900 error: {
        "$err" : "not authorized for query on admin.system.namespaces",
        "code" : 13
} at src/mongo/shell/query.js:131

認証してみる

では、認証してみて再度show collectionsしましょう。

> db.auth( "username", "password" )
1
> show collections;                                                                                    
system.indexes
system.users
system.version

無事認証できました。

Embulk で MySQL に大量のデータを流し込む際にエラーが出る場合

Embulk

今さら説明の必要はないと思いますが、データをいい感じに流してくプロダクトです。

MySQL に大量のデータを流し込み

この Embulk で 100万件 規模の大量のデータを MySQL に流し込もうとすると以下のようなエラーが出てしまいました。

The total number of locks exceeds the lock table size

どうしたものかと。

結論

MySQL のinnodb_buffer_pool_sizeのサイズを大きくしたら問題なくなりました。Ubuntu 16.04 LTS の場合ですと/etc/mysql/mysql.conf.d/mysqld.cnfに例えば以下のように書き加えれば OK です*1。再起動を忘れないようにしましょう。

innodb_buffer_pool_size = 512000000

補足

ちなみにこのエラーが出るのはModesinsertのときです(mergeでも出るかも)。このモードのときは、一度テンポラリのテーブルを作ってそれから流し込みをするためです。insert_directだと起きないです。

*1:ちょっと大きすぎな気もしますがメモリに余裕があるのでこの数値です

embulk-input-mysql の incremental_columns の設定でハマった

embulk-input-mysql

ご存知、Embulk 用の MySQL の input プラグインです。

incremental と incremental_columns

設定項目の一つにincrementalという項目があり、ここをtrueにするとこの項目で指定されたカラムを基準として最終取得したレコードの情報を保存してくれます。

次回以降に Embulk するときは最初からまた総なめするのではなく、続きから取得してくれるという大変便利なプラグイン(設定内容)です。incrementalに用いるカラムは自前で設定することができ、その際はincremental_columnsでカラム名を指定します。

incremental_columns の設定記述方法

コレではだめです……。

incremental: true
incremental_column: column_name

ドキュメントのIncremental loadingの箇所を読むと分かるのですが、以下のような記述があります。

For example, if incremental_columns: [updated_at, id] option is set, query will be as following:

これはすなわち、カラム名を [] でくくってあげなければいけないということです。だからさっきの場合の正解は以下のとおりです。ちなみにカラム名はカンマ区切りで複数指定が可能です。

incremental: true
incremental_column: [column_name]

思いっきりはまり込んでしまいました……

Powered by はてなブログ