Passenger+ApacheのRedmineで、ファイルサイズが大きくなると添付できない対策

状況

  • Redmineの設定パネルから添付ファイルのアップロード上限サイズを設定しても、反映されない。
  • スクリーンショットなど5MB未満のファイルはアップロードできる。
    (そのためアップロード処理/パーミッションには問題がない)

原因

Apacheにmod_security入れてて、デフォルトのリクエスト上限が5MB程度だった。

例)/etc/httpd/conf.d/mod_security.conf

<IfModule mod_security2.c>

..略..
#SecRequestBodyLimit 5242880 #5MBを

SecRequestBodyLimit 52428800 #50MBに

..略..

</IfModule>

バーチャルホスト設定内で上書き定義できるので、
Redmineをサブドメイン運用しておけばよかったと反省するなど。

PHP5.4.30 + MySQL5.6.19で文字化けに対応。

ちなみに、PHPからは以下のようにつないでいます。

// PDO接続(PHP 5.3.6以降だとcharsetが使えます
$dsn="mysql:dbname=%s;host=%s;charset=utf8";

文字化けする環境と、/etc/my.cnfに対応したもの

$ cat /etc/redhat-release
CentOS release 6.5 (Final)

$ mysql --version
mysql  Ver 14.14 Distrib 5.6.19, for Linux (x86_64) using  EditLine wrapper

$ php -v
PHP 5.4.30 (cli) (built: Jun 25 2014 15:27:51)

$ yum list installed | grep mysql
mysql-community-client.x86_64        5.6.19-2.el6    @mysql56-community
mysql-community-common.x86_64        5.6.19-2.el6    @mysql56-community
mysql-community-devel.x86_64         5.6.19-2.el6    @mysql56-community
mysql-community-libs.x86_64          5.6.19-2.el6    @mysql56-community
mysql-community-server.x86_64        5.6.19-2.el6    @mysql56-community

$ find / -name libmysql*
/usr/lib64/mysql/libmysqlclient_r.so.18.1.0
/usr/lib64/mysql/libmysqlclient_r.a
/usr/lib64/mysql/libmysqlclient_r.so
/usr/lib64/mysql/libmysqlclient.so.18
/usr/lib64/mysql/libmysqlclient.a
/usr/lib64/mysql/libmysqlclient_r.so.18
/usr/lib64/mysql/libmysqlservices.a
/usr/lib64/mysql/libmysqlclient.so
/usr/lib64/mysql/libmysqlclient.so.18.1.0

$ php -r "phpinfo();" | grep "PDO"
PDO
PDO support => enabled
PDO drivers => mysql, sqlite
PDO Driver for MySQL, client library version => 5.6.19
PDO Driver for SQLite 3.x => enabled

こっちでは

# /etc/my.cnfの文字コード
character-set-server=utf8
skip-character-set-client-handshake #超だいじ

普通に文字化けしない環境の設定情報

$ cat /etc/redhat-release
CentOS release 6.5 (Final)

$ mysql --version
mysql Ver 14.14 Distrib 5.6.12, for Linux (x86_64) using EditLine wrapper

$ php -v
PHP 5.4.29 (cli) (built: Jun 5 2014 16:07:48)

$ yum list installed | grep mysql
mysql-libs.x86_64 5.5.32-1.el6.remi @remi
php-mysql.x86_64 5.4.29-3.el6.remi @remi

$ find / -name libmysql*
/usr/lib64/libmysqlclient_r.so.12
/usr/lib64/libmysqlclient_r.so.18.0.0
/usr/lib64/mysql/libmysqlclient_r.a
/usr/lib64/mysql/libmysqlservices.a
/usr/lib64/mysql/libmysqlclient.so.18
/usr/lib64/mysql/libmysqlclient.a
/usr/lib64/mysql/libmysqlclient.so.18.0.0
/usr/lib64/libmysqlclient.so.16
/usr/lib64/libmysqlclient.so
/usr/lib64/libmysqlclient.so.15.0.0
/usr/lib64/libmysqlclient_r.so.15
/usr/lib64/libmysqlclient_r.so.14
/usr/lib64/libmysqlclient_r.so.14.0.0
/usr/lib64/libmysqlclient_r.so.16.0.0
/usr/lib64/libmysqlclient.so.15
/usr/lib64/libmysqlclient_r.so.18
/usr/lib64/libmysqlclient_r.so
/usr/lib64/libmysqlclient.so.16.0.0
/usr/lib64/libmysqlclient_r.so.16
/usr/lib64/libmysqlclient.so.14.0.0
/usr/lib64/libmysqlclient.so.18
/usr/lib64/libmysqlclient_r.so.15.0.0
/usr/lib64/libmysqlclient.so.14
/usr/lib64/libmysqlclient.so.12.0.0
/usr/lib64/libmysqlclient.so.18.0.0
/usr/lib64/libmysqlclient_r.so.12.0.0
/usr/lib64/libmysqlclient.so.12

$ php -r "phpinfo();" | grep "PDO"
PDO
PDO support => enabled
PDO drivers => mysql, sqlite
PDO Driver for MySQL => enabled
PDO Driver for SQLite 3.x => enabled

PDO Driver for MySQL => enabled…? でも動いているんですよねー…。 ↓ ↓ ↓

# /etc/my.cnfの文字コード
character-set-server = utf8

ちなみに、両方ともMySQL Workbenchやコマンドラインから見るとこうなんだけど
mysql> show variables like "%character%";
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
文字化けするほうをPHP通して出力すると以下のようになってました。
character_set_client | <strong>latin1</strong>
character_set_connection | <strong>latin1</strong>
character_set_database | utf8
character_set_filesystem | binary
character_set_results | <strong>latin1</strong>
character_set_server | utf8
character_set_system | utf8
character_sets_dir | /usr/share/mysql/charsets/

//化けた文字をmb_detect_encodingしたもの
index.php#37string(8) "SJIS-win"

インストールしたときにシステムのタイムゾーンUTCだったのとかが関係あるのだろうか。
(途中から/usr/share/zoneinfo/Japanや、/usr/share/zoneinfo/Asia/Tokyoに変更したりした)

やれやれだぜ。

windows8.1にvagrantでCentOS6.4+php4+mysql4を作った

目的

Windows8.1(あえて64bitと明記)でvagrantでテストサーバを立てる。
都合上、php4/mysql4/apache2で構成。

用意するもの

vagrant 1.3.5(最新)
VirtualBox 4.2
現在4.3が最新ですが、Windows系64bitではVirtualBox Host-Only Ethernet Adapterがインストールできず積みます。(積みました)
ソースはここ→ https://github.com/mitchellh/vagrant/issues/2392
お好みのboxファイル
今回は http://www.vagrantbox.es から CentOS 6.4のminimalなものを探して、
https://github.com/2creatives/vagrant-centos/releases/tag/v0.1.0 構成のものを拝借。
Windows Powershell
これはお好み。コピペとサイズ変更が可能なDOS窓がほしかったんや。

やること

VirtualBoxをインストール

ダブルクリックのみ

vagrantをインストール

ダブルクリックしてインストール→再起動後、vagrant upまで。

> vagrant add box CentOS6_4 https://github.com/2creatives/vagrant-centos/releases/download/v0.1.0/centos64-x86_64-20131030.box

> mkdir CentOS6_4_php4_mysql4
> vagrant init

CentOS6_4_php4_mysql4/Vagrantfileを開いて

#書き換え
config.vm.box = &quot;base&quot;

↓ ↓

config.vm.box = &quot;CentOS_6_4&quot;

#以下は追記

config.vm.boot_timeout=60

保存したら

> vagrant up

結構待つ。

起動したら、以下の作業はすべてbox内。

> vagrant ssh

httpdほかインストール

sudo基本なので省略。

$ yum -y install httpd-devel bzip2-devel openssl-devel libjpeg-devel libpng-devel gmp-devel ncurses-devel flex gcc make

mysql4のインストール

sudo基本なので省略。

#php5用のmysql-libsが入っていて邪魔なので削除
$ yum remove mysql-libs

#perl-DBIがなくてインストールできないので先に入れる
$ yum install perl-DBI

#mysql4を入れる(チョイスはなんとなく)
$ wget ftp://ftp.pbone.net/mirror/mirror.cheetaweb.com/MySQL/4.0/MySQL-server-4.0.24-0.x86_64.rpm
$ wget ftp://ftp.pbone.net/mirror/mirror.cheetaweb.com/MySQL/4.0/MySQL-client-4.0.24-0.x86_64.rpm
$ wget ftp://ftp.pbone.net/mirror/mirror.cheetaweb.com/MySQL/4.0/MySQL-devel-4.0.24-0.x86_64.rpm
$ wget ftp://ftp.pbone.net/mirror/mirror.cheetaweb.com/MySQL/4.0/MySQL-share-4.0.24-0.x86_64.rpm

#順番に実行する
$ rpm -ivh ftp://ftp.pbone.net/mirror/mirror.cheetaweb.com/MySQL/4.0/MySQL-server-4.0.24-0.x86_64.rpm
$ rpm -ivh ftp://ftp.pbone.net/mirror/mirror.cheetaweb.com/MySQL/4.0/MySQL-client-4.0.24-0.x86_64.rpm
$ rpm -ivh ftp://ftp.pbone.net/mirror/mirror.cheetaweb.com/MySQL/4.0/MySQL-devel-4.0.24-0.x86_64.rpm
$ rpm -ivh ftp://ftp.pbone.net/mirror/mirror.cheetaweb.com/MySQL/4.0/MySQL-share-4.0.24-0.x86_64.rpm

順番に実行する。

すんなり入る。

設定ファイルはfindして、所定の位置にコピーする

$ sudo find / -name &quot;*my*cnf&quot;
$ sudo cp /usr/share/mysql/my-medium.cnf /etc/my.cnf

文字コードの設定など。

php4のインストール

sudo基本なの(ry

configure直前まではこちらのサイト通り。

CentOS6でphp4とphp5を共存させる
(openssl.soの流れも行う)

configreオプションは

$ ./configure
 --prefix=/usr/local/php4
 --with-apxs2=/usr/sbin/apxs
 --with-mysql
 --with-gd
 --with-jpeg-dir=/usr
 --with-png-dir=/usr
 --with-zlib
 --with-bz2
 --with-openssl
 --with-gettext
 --with-gmp
 --with-iconv
 --with-ncurses
 --enable-exif
 --enable-gd-native-ttf
 --enable-memory-limit
 --enable-mbstring
 --enable-mbstr-enc-trans
 --enable-bcmath
 --enable-trans-sid
 --enable-sysvsem
 --enable-sysvshm

–enable-mbregex(これが原因でmakeコケる、たぶん使わない)と–with-sqlite(今回は使わない)を削除した。

※なお、makeまで進んでコケたときは、configre再実行前に

$ make distclean

する。

$ make

$ make install

ここから先も、前述のサイトの通りhttpd.confの書き換え、AddHandlerも行う。

php.iniの設定も忘れずに。

そのあとは

vagrant sshを抜けて、CentOS6_4_php4_mysql4/Vagrantfileを開いて

#行頭の#をとる
config.vm.network :private_network, ip: "192.168.33.10"

保存したらコンソールに戻って

> vagrant reload

httpd、mysqlの起動設定とかもろもろやって、動作確認が取れたら

> vagrant package

で、もう二度とこの面倒くさいことをせずとも、同じ環境がpackage.boxから復帰できるようになります。

めでたしめでたし。

余談

phpからmysqlに接続するときに/tmp/mysql.sock関連のエラーが出たら、mysql起動しているかどうか確認して、起きているならmy.cnfの

socket = /var/lib/mysql/mysql.sock
socket = /tmp/mysql.sock

とする。

「Client does not support authentication protocol」エラーが出たら、
こちらを参考に http://d.hatena.ne.jp/psquare/20061207/p1 なんか腑に落ちないけどテスト環境だからまあいいかな処理を施す。

さくらVPS yumパッケージのアップデート

結構頻繁にパッケージアップデートしたり、再起動したりしたいタイプのあゆたやです。

安定稼動しなければいけないものを特に置いていないので、好きに弄くり倒してるんですが、うっかりyumパッケージのアップデートでKernelまで更新してしまって、アップデート後といえば再起動!でVPSが起動しなくなったので、それを回避するためのメモ。

yum update時にKernelを除外する設定

と、オマケにCPUアーキテクチャの異なるバージョン(x86_64=64bit以外)を除外する。

$sudo vim /etc/yum.conf

#最後の行に追加
exclude=kernel* *.i386 *.584 *.686

yum update実行

$sudo yum update

途中でアップデートしてもいいか確認が出るので

================================================================================
Upgrade 57 Package(s)

Total download size: 43 M
Is this ok [y/N]: y

yしてしばし待つのみ。

アップデートし残しがないか確認

$yum check-update

で確認して、パッケージが表示されなければOK。
あったらもう一度updateする。

もし再起動したければ

SSHは一度切断されるので、順調に起動が出来ない場合などにはもちろん再接続できません。
必ずさくらVPSコンパネのリモートコンソールが見られる状況で行いましょう。

$sudo reboot

ただし!
サーバはどのくらいの頻度で定期リブートしてますか? (ちょっと古いけど)

利点と障害正規サーバーの再起動

というわけで基本的には必要に迫られるまで再起動をしないもののようです。

アップデート後に再起動したらSSH接続できないときは→SSH接続できないときにVNCコンソールで頑張って復帰する

最後に、Redmineからメールが送信できるかちゃんとテストしようね!(経験談)

さくらVPS SSH接続できないときにVNCコンソールで頑張って復帰する

特に考えずにyum updateしてサーバー再起動したら、いくら待ってもSSH接続できなくなった…。
というときは、Kernelが複数インストールされていて、通常自動的に選択される最新のものでは起動できない状態の可能性があります。

とりあえず、あせらずにVPSコンパネから「VNCコンソール」を起動します。

コンパネからJavaのリモートコンソールを開く。
表示されてるほうじゃなくて「VNCコンソール」を開く。

で、これJavaで動いてます。

昨今のセキュリティホールのせいで基本的に「ブラウザでJAVAはOFF」という設定にしている人が多いと思います。

Windows7のコントロールパネル
Windows7のコントロールパネル

Windowsの場合は、OSのコントロールパネルにあるJavaから、

セキュリティタブの設定を見直す
セキュリティタブの設定を見直す

で、ブラウザ再起動したら、「VNCコンソール」の画面で

起動確認画面が出ます
起動確認画面が出ます

実行すると、別画面が開いて黒い画面が表示されます。
起動中のさまざまなものが随時表示されてゆきますが、いつものlogin:待機でない限り、kernel panic的なものが画面のどこかに出て、止まってるはず。

とりあえずこの状態で、VPSのコントロールパネルホーム画面から、再起動ボタンを押します。

そうすると別画面側の起動処理がだーっと出て

Press any keyとin # seconds...でそれぞれEnter
Press any keyとin # seconds…でそれぞれEnter

で。

yum update後に再起動しないで使っていると、意外と沢山入っている…
yum update後に再起動しないで使っていると、意外と沢山入っている…

一番古いバージョンを選択してEnterする。

いつもの!
いつもの!

めでたしめでたし。

でもこのままだと、また再起動したときに同じ目にあうので
Kernelのバージョンを削除するとか → 古いカーネルを削除する(CentOS) – ぱらせんメモ
Kernelのデフォルトバージョンを設定(できるのか?)しないと。

2013/10/05 追記

古いカーネルの削除方 – とりさんダイアリー でrpm -e で不要なKernelバージョンだけ狙い撃ちでアンインストールできるようです。