朝霞市在住のWEB系エンジニアかあさんのPHPメインの雑記帳

ITかあさん

最新記事

CakePHP SSL強制リダイレクト

CakePHP3からCakePHP1.3対応SSL強制リダイレクト

CakePHP2 Helper
わーい、久々のCakePHPネタ。
相当昔に開発をして、たまに保守作業をしていたCakePHP1.3環境。SSL対応する必要が出てきて一通りの設定が完了したのち、非SSLアクセスを強制的にHTTPSにリダイレクトさせる必要が出てきました。
調べたところ、CakePHP3からCakePHP1.3 (それ以前のバージョンについては確認していませんが) Securityコンポーネントを使うという点で全く同じです。

CakePHP2以下


if文でactionを指定することで、指定されたaction でのみSSL強制が動作可能です。例はAppControllerですが、個別のControllerで動作もちろん可能です。

CakePHP3

CakePHPではコンポーネントの呼び出しの仕方が少し変わっているだけで、強制リダイレクト用の関数を呼び出しの内容など、ほぼ差はない形になっています。

ITかあさんをレンタルサーバへお引越しすることにしました

ITかあさんをレンタルサーバへお引越しすることにしました

00_PP48_PP_TP_V

しばらくぶりの更新とな理ました。上流工程がメインとなるとどうしても技術から離れてしまい、ITかあさんブログは技術ブログとして始めたこともあってどうしても更新がおざなりになっておりました。
来月からまた少し技術ネタが増やせそうな仕事になるので、数少ないITかあさんファンのみなさまもう少しお待ちくださいませ。

ITかあさんをお引越しすることにしました

ドメインは変わらず、完全にサーバそのものを移転させます。
私はここ2年ほどMicrosoft Azureにお世話になってます。もちろん今もお世話になってますし、UI含めてAWSよりもAzure
が大好きです。ですが。。

サーバーの管理がしんどくなりました

「パクたそ」この写真のタイトルが「本番サーバー rm -rf / しちゃった」で吹いたw

「パクたそ」この写真のタイトルが「本番サーバー rm -rf / しちゃった」で吹いたw

ITかあさんは3万PVくらいの個人ブログですが、広告費用も発生したり、定期的にITかあさんブログからお仕事の発注もいただいたり、
先日法人を立ち上げたこともあって「会社としての資産」となりました。

資産となるとITかあさんブログが落ちてしまうことは論外ですし、安定運用が大前提。その上で定期的なブログの更新があるべきなのです。
ここ1年くらいで中国からのDOS攻撃が相次、先日はMySQLに直接アクセスをしようしたであろう大量のMySQLログが吐かれていました。MySQLはメモリオーバで停止してしまう時間帯が発生することがあり、最低限の「安定運用」が守れない状態でした。

メモリを増やせばいいし、ログを一つずつ追って問題を解決しながら運用してきましたが、ふと気がついたんです。

「オレ、サーバー屋さんじゃねえ」

私の職業はあくまでもWebエンジニアです。Webアプリ作ってなんぼです。サーバの運用、保守は私の仕事じゃない。

Webエンジニアがレンタルサーバーなんて恥ずかしい

Webサーバーの管理に疲れてきたとはいえ、ずっと移転に踏み切れなかったのは単純にプライドです。
エンジニアたるもの、自分が構築したサーバで運用してなんぼだ!と考えてました。ところがです。

サーバ費用の圧迫

例えば月間100万PVくらいあって、広告費用月間数十万稼ぐサイトならクラウドでメモリもコアも増し増し、全部のせしてしまえばいいのでしょうが、私のブログの収益は多くても10万円ほどです。サーバにかけられる費用もたかが知れています。

ここ数ヶ月のクラウドサーバの利用料金は月3万超えており、ITかあさんブログの運用だけで月2万近く行ってます。もちろんswap管理で回避したり、MySQLチューニングでメモリを抑えることもできます。わかってます。
だましだましのサーバ運用にはちょっと疲れてしまったんですね。

アラートメールにどきり!としたり、毎月3万円を超えるサーバー費用。(我が家の食費とそんな変わらんじゃないか!)
ならば、ITかあさんをまるっとお願いできるレンタルサーバに移転しよう。

レンタルサーバーも知らない間に進化してた

クラウドサーバも進化してきましたが、その間にレンタルサーバも進化しました。私がVPSを覚えたての頃はまだSSHでアクセス可能なレンタルサーバも少なかったし、転送量の制限がありましたが、だいぶその辺りも緩和され、SSHどころか独自ドメインで無料SSL,PHPのバージョンも選べたり、php.iniファイルの変更をさせてくれるところまで出てきました

Webエンジニアたるもの、サーバくらい自分で立てられねば!と思ってやってきましたが、立てられるわ!
問題はその後の運用なんじゃい!

もう毎日の運用にドキドキするのやめよう。

WordPress含めたちょっとしたCMSを動かしたりちょっとしたミニマムなWebアプリケーションならもうレンタルサーバで十分。

うっかり重要なメールがSMTPサーバ、POPサーバ停止、うっかりHDDオーバーでMySQL起動できませんとかもうこりごりです。プロに任せましょう、プロに。

もちろん 自動デプロイ、PHP以外の言語だと当然レンタルサーバではどうしようもできないですが一般的なCMSを利用したWebアプリならもうレンタルサーバでいいじゃないか、インフラ担当じゃないんだもの。

最後にまともに会社員していたところは年商4億くらいの中小企業でしたがインフラエンジニアはおらず、たまに私がクラウドで組んだりするものの、重要なサイトのサーバーはサーバー会社に丸投げの専用サーバーでした。それでいいんです、それで。

そんなわけでITかあさんはSSL付きのレンタルサーバへお引越しします。
Node.jsやその他違う言語のお勉強を公開する時はもちろん大好きなAzureで公開します。
クラウドサーバーの運用で毎日ヒヤヒヤするならそろそろレンタルサーバーも検討したっていい時代みたいですよ、奥様。

真夏のMySQL!! HDDいっぱいで緊急停止事件簿

down-your-site

真夏の怖い話と言えばやっぱりあれですよね

真夏ですし、今日は恐怖の怪談話をしましょう。。
突然電話が鳴ってですね、こう言われるんですよ。。。。。

「サイト落ちてますよ」

いやあああああああああ!!!!!!!!!

Webエンジニア恐いのは、幽霊じゃない、妖怪じゃない、ゾンビじゃない!!
「サイトが何故か落ちてる」問題!!

震える指先、笑うヒザ。。安定運用を3年、なーんの異常もないまま3年経過した運用サーバ。(VPS) クラウドじゃないのでオートスケール対応してないので、何らかの事情で落ちるケースもある。お安いVPS。落ちることもたまにはあるでしょう。

過去の経験則から Apacheかと推測し、とりま再起動しようとするも。。あれ?Apacheは落ちてない。

??

セツコ!!落ちたのはApacheやない!MySQLや!

アンちゃん。。。。

MySQLもアクセス不可で落ちることもありますね。

MySQLを再起動するも。。。。。

# /etc/init.d/mysqld restart
Stopping mysqld: [ OK ]
Starting mysqld: [FAILED]

※CentOS6の運用サーバのため、古いコマンドです

??あれ?停止したあと起動しない

# /etc/init.d/mysqld start
MySQL Daemon failed to start.
Starting mysqld: [FAILED]

!!!!!????????

起動しない!!

何度やっても起動しない!

down-your-mysql

運用サーバのMySQLが死亡した模様。。

ギャーーーー!!!!!

落ち着いてMySQLのログを確認することに。

# tail -f /var/log/mysqld.log
2017-07-25 12:52:43 29864 [ERROR] /usr/sbin/mysqld: Error writing file '/var/run/mysqld/mysqld.pid' (Errcode: 28 – No space left on device)
2017-07-25 12:52:43 29864 [ERROR] Can't start server: can't create PID file: No space left on device

No space left on device?? お前のデバイスはもう空きがない、HDDがいっぱいで起動出来ないですと??

df コマンドで、ディスクの空き容量を調べる

-hオプションで容量に対してそれっぽい単位で表示してくれます

# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 98G 93G 0 100% /
tmpfs 1003M 0 1003M 0% /dev/shm

100%!!!!use 100%!! もう全く容量が完全に限界まで使われていました。

今回運用していたサーバは格安のVPS。クラウドではないため 容量アップも出来ません。そもそもコンテンツとしての容量も100GB容量のVPSに10GB程度しか積んでません。

でも原因は分かりました。何かがHDDの容量を圧迫していてMySQLの起動に失敗しているようです。

HDDの容量を圧迫している箇所を知る方法

# sudo du -sh /*

.
.
.
8.0K /tmp
789M /usr
90G /var

これでどのディレクトリがどれだけの容量のデータを積んでいるのかわかります。varが90Gも持ってることが分かりますね。
あとはディレクトリの階層を掘りながら再びds

# du -sh /var/*
.
.
.
8.0K /var/lock
90G /var/log
0 /var/mail
.
.

HDDの容量90%を占める溜まりまくったクソログが原因と判明。。
btmpとsecureのログがかなり溜まっている様子。サーバへの不正ログイン系ですね。
確かにSSHは22番ポートをデフォルトで使っていましたが、こういう不正ログインのクソログの温床にもなるのでやはりsshのポートは22以外にしておくのがベータのようです。

# cd /var/log
# ls -ll
total 6968212
-rw——- 1 root root 0 Feb 23 2015 anaconda.log
-rw——- 1 root root 0 Feb 23 2015 anaconda.program.log
-rw——- 1 root root 0 Feb 23 2015 anaconda.storage.log
-rw——- 1 root root 0 Feb 23 2015 anaconda.syslog
-rw——- 1 root root 0 Feb 23 2015 anaconda.xlog
-rw——- 1 root root 0 Feb 23 2015 anaconda.yum.log
drwxr-x— 2 root root 4096 Jul 24 02:45 audit
-rw-r–r– 1 root root 33415 Sep 14 2015 boot.log
-rw——- 1 root utmp 4422120960 Jul 25 13:08 btmp
-rw——- 1 root root 10876 Feb 26 2015 cron
-rw-r–r– 1 root root 19284 Sep 14 2015 dmesg
-rw-r–r– 1 root root 19284 Feb 25 2015 dmesg.old
drwx—— 2 root root 4096 Feb 26 2015 httpd
-rw-r–r– 1 root root 148044 Jul 25 12:35 lastlog
-rw——- 1 root root 8450523 Jul 25 13:12 maillog
-rw——- 1 root root 277469 Jul 24 15:33 messages
-rw-r—– 1 mysql mysql 4865748 Jul 25 13:12 mysqld.log
drwxr-xr-x 2 ntp ntp 4096 Nov 29 2011 ntpstats
-rw——- 1 root root 2692548419 Jul 25 13:08 secure
-rw——- 1 root root 0 Feb 23 2015 spooler
-rw——- 1 root root 0 Feb 23 2015 tallylog
-rw-rw-r– 1 root utmp 36480 Jul 25 12:35 wtmp
-rw——- 1 root root 4197 Dec 21 2015 yum.log

このほかApacheでも大量のログを持っていることが判明。

# du -sh /var/log/httpd/*
0 /var/log/httpd/access_log
168K /var/log/httpd/error_log
488K /var/log/httpd/ssl_access_log
664K /var/log/httpd/ssl_error_log
624K /var/log/httpd/ssl_request_log
6.8G /var/log/httpd/virtual-access_log
76G /var/log/httpd/virtual-error_log

溜まったログを削除していきます。

手順はどのログの削除も一緒なのでbtmpのみ記載します

rm btmp
rm: remove regular file `btmp'? y (本当に消していいの?と聞かれるので”y”で)

touchして権限を600にしておきます。同様に全てのクソログ溜まったログファイルを同様の手順で一度削除して、新しくファイルを作ってください。

# touch /var/log/btmp
# chmod 600 /var/log/btmp

ファイルをrmしたはずなのに、HDDの使用量に変化がない!!

やばいファイルをrmしたはずなのに、HDDの使用量に変化がほぼ変化が起きない

参考

rmでファイル削除後にdf -hで容量が減らない時の対処(Linux)
参考の通りなのですが、プロセスが活きている使用中のファイルはrmしても変化が無いようです。
今回だと調べた結果、一番ヤバいログはhttpdに関連するログでした。対象のログファイルをrmしたあとhttpdを再起動したところ無事HDDの使用量は劇的に減りました

# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 98G 5.8G 87G 7% /
tmpfs 1003M 0 1003M 0% /dev/shm

# /etc/init.d/mysqld start
MySQL Daemon failed to start.
Starting mysqld: [OK]

無事起動が確認できました

まとめ

サーバ管理の専門職では無いためやはり運用しているサイトのサーバが落ちると焦ります。が、やはり冷静にログを見れば解決方法は必ずあるはずなので。
サイトが落ちたときの監視として クラウドサーバ以外のサーバでは外部サービスで80ポート監視して一定時間応答がなければメールでお知らせするように設定していました。
今回だとMySQLが完全に落ちてしまい、アクセス不可による停止出なかったた80ポートは正常動作。これにより発見が遅れてしまいました。
クラウドサーバだとこれらHDDの容量制限が危なくなるとメールでお知らせしてくれるものですが、格安VPSにはこれらは自分で監視しなければなりません。。
やっぱりクラウドが何かと安心で便利。月額1000円程度のVPSは月間数万PVくらいしか耐えられないかもしれません。やはり今回の運用サイトは移転が必要かもしれません。
あ、なお今回落としたのはITかあさんブログではありません。ITかあさんはクラウドでオートスケールに対応しているからです。
今後はログも含めたHDDの容量の監視にも目を光らせていと思います。まる。

HelloDockerFile!!DockerFileからPHP7×MySQL5.7×Apache環境を作る

HelloDockerFile!! 初めてのDockerFileからPHP7×MySQL5.7×Apache環境を作る

docker

Docker Hubにはたくさんの公式リポジトリがあって phpの公式のイメージももちろんあるのですが、試した結果やはりCentOS7をベースに構築した方がなんだかんだ良いということになりました。
ざっくり手順をまとめましたので何かの参考になれば幸いです

docker pullでMySQLの5.7バージョンのイメージをpullする

docker pull mysql:5.7

pullしたmysql:5.7のイメージからMySQLサーバーコンテナを起動する

docker runコマンドでコンテナ名の指定とMySQLのrootユーザーのパスワードとイメージの指定を行って起動します。

起動したMySQLコンテナにSequel Proを使ってアクセスする

スクリーンショット 2017-07-20 17.12.13

クライアントPC(Dockerのコンテナをインストしたマシン)から見ると今起動したMySQL5.7のコンテナはlocalhostになるので127.0.0.1(localhost)の見方になります。
先ほど設定したrootのパスワードを指定してログインします。

起動したMySQLコンテナにログインしてMySQLを直接叩く

ターミナルからコンテナにログインして、クエリを直接叩くことも可能です。
手順としては、docker psコマンドで起動中のMySQLコンテナのCONTAINER IDをコピーしてdocker exec コマンドでコンテナの中に入り、先ほど設定したMySQLのrootパスワードを指定するだけです

CentOS7イメージをベースにPHP7のイメージを作成する

ざっくり構成と手順

  • CentOS7のイメージをベースにPHP7のDockerFileを作成
  • docker imageをビルド
  • docker runでコンテナを作成・起動

参考

Dockerコンテナ内のCentOS7にPHP7をインストールする
今回はPHPについてのみ必要だったので、NPMパッケージ周りのインストールは取り外しました。

ビルド実行

カレントディレクトリにDockerFileがある想定で(DockerFileがあるディレクトリ出ないと buildできません)

docker build -t your-image-name .

ビルドしたらdocker run で起動します

解説

/your-app-source-dir:/var/www/html

apahceのデフォルトのDocumentrootディレクトリと、Dockerを起動しているクライアントマシンのソースコードのディレクトリを指定します。これでDockerのCentOS中のApacheのDocumentRootがリンクしてくれます

privilegedオプション

コンテナのすべてのデバイスへのアクセス許可の設定になります。説明が長くなるので下記リンクを参照してください。
詳しくはこちら。

-p 8000:80

ポート番号8000としました。ポートフォワードしてます。なので、今回 Dockerで起動したコンテナにブラウザからアクセスする場合はhttp://localhost:8000と、なります。

80:80

にしてあげればhttp://localhost/でアクセスができますので、本番環境をDockerで起動したコンテナとする場合は80ポートをそのまま使ってあげれば良いことになります。

your-php-container-name your-php-image

コンテナの名称は何も設定しなくても問題ないですが、よくわからない謎のコンテナ名がランダムでつけられるので管理の都合としても設定した方が良いです。imageの名称は省略できません。何のイメージを使ってそもそもコンテナを立ち上げるか
というコマンドなので必須です。imageが存在しなければ失敗します。

DFOREGROUND

フォアグランドで実行できるようにすることです。画面上で動かすことがフォアグランドですね。あとでDockerのコンテナにログインしてApacheをごにょごにょして再起動するのにこのオプションが必要になります。

そのほか各種設定の為に必要なこと

コンテナへアクセス


DockerのApacheは直後はそもそも起動していません。.htaccessの許可もされていない、 phpはエラーも吐かない設定になっているので、PHPがインストされたCentOS7のDockerコンテナにアクセスして 各種設定をしてからApacheを起動してあげる必要があります。
これらはDockerの説明ではなくあくまでもCentOS7にインストされているApacheの設定とやり方は同等になります。

PHPからMySQLへのアクセス

クライアントマシンからブラウザベースでアクセスするときはlocalhostですが、対コンテナ間ではlocalhostではアクセスすることはできません。
IPアドレスを取得して

それからIPアドレスベースでMySQLに繋げばいいですね

Sequal ProなどMySQLへDockerをインストしているクライアントマシンから直接アクセスする際はlocalhostでアクセスできますね。

まとめ

プロジェクトでちょいちょいDockerを使うことが増えたのでDockerFileを初めて書いてbuildしてみたのですが、PHPからMySQLへコンテナ間の通信をする方法がわからなかったり、
当たり前に使っていたapacheの再起動が使えなかったりとかなり戸惑いました。本当であればdockerをrunしてコンテナの起動のタイミングとapacheを同時に起動したかったのですが、
/usr/sbin/httpd -DFOREGROUND
と、すればApacheがDockerの立ち上げと同時に立ち上がることも分かっているのですが、すると今度はapacheの再起動ができません。CentOS7のサービス(デーモン)が使えないのです。
ちょっと今後の課題とします・・・
なお、PHP7は公式イメージもあるのですが、色々設定を変えようと思った際、Mobyを公式は使っていて、CentOS系の知見に頼りたかったが為にCentOS7ベースで構築しました。
結果、この方が構築には早かった次第です