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:ちょっと大きすぎな気もしますがメモリに余裕があるのでこの数値です

Powered by はてなブログ