CentOS ITかあさん

ITかあさん

CentOS7×Apache2系でPermission設定777にしても書き込み権限できないときはSELinuxの設定を疑う!

もうだまされないぞ!CentOS7×Apache2系でPermission設定777にしても書き込み権限できないときはSELinuxの設定を疑う!

今回は壮大にはまりましたよ!でも分かってしまうと原因はとても単純でした

久々にWordPressでWEBサイト構築したんですよ、CentOS7とApache2系で。

たとえpermission777にしても、ユーザーグループをapacheにしても権限エラー。。

ことの発端はWordPressのメディアアップローダーが動作しないこと、何度やっても「ディレクトリに移動できません」エラー。ややや?
permission777にしても、ユーザーグループをapacheにしても権限エラーが出るので完全にお手上げ。php.iniのsafe_modeもoffになっているのでこれも違う。

CentOS7ではSELinuxがデフォルトで有効になってるよ

LinuxベースのセキュアOSのSELinux。たとえroot がのっとられてもシステムの影響を最小限にしようぜ!的な考えがあるようですが、かあさんの脳みそでは詳しいことは分かりません。
乱暴ですが、SELinuxを強制的にoffにすることで書き込み権限に関する問題は解決できました!

# setenforce 0

一応、切らずに設定もできるようです。
私の場合、一度offにしhていたのですが、サーバーを落として再度起動した際に再びONになってしまったため発生した問題のようです。
permission 権限、safe_modeもいずれも問題ないのにpermissionエラーが発生したらSELinuxを思い出して頂ければと思います。

CentOS7でLAMP+MongoDB環境を作る

CentOS7でLAMP+MongoDB環境を作る

CentOS

CentOS7(64bit)でLAMP+MongoDB環境をサクっと作るためのコマンドメモです。
自分用にメモっておきました。
近いうちシェルスクリプトで固めて、vagrantで一発で作れるようにしたいなあ。
2016年3月15日時点で、PHP5.6 MySQL5.6 MongoDB 3.2環境の構築手順です。
この他git comporser も入ってますがSMTPサーバーは立ててないのであしからず。
クラウドサーバーのコントロールパネルからポート番号を指定して空けていくことが可能な場合、fierwallコマンドでポート空けて行く作業は必要無いです。

MongoDBリポジトリ

MongoDBはリポジトリを予め指定しておく必要があります。

# vi /etc/yum.repos.d/mongodb.repo

以降、CentOS7 LAMP+MongoDBインストール手順

【緊急事体発生】ITかあさんブログがDOSアタック攻撃でダウン

【緊急事体発生】ITかあさんブログがDOSアタック攻撃発生!!

スクリーンショット 2016-02-18 9.26.56

ITかあさんの運営するサーバーが突如CPU70%越えて、MySQLに繋がらない問題発生!

ITかあさんのブログはWindowsAzureというクラウドサーバーで運用されています。ちなみにITかあさんの運営されているサーバーのスペックは以下の通り。

2 コア、3.5 GB メモリ CentOS6

まあ、一端のエンジニアごとき戯れ言のブログですから、これくらいあれば十分ですね。

夜間〜朝方にかけて猛烈なDOS攻撃!落ちるMySQL、繋がらないApacheサーバー

ざっけんなー!こらー!

ざっけんなー!こらー!

スクリーンショット 2016-02-18 9.26.56
こちらのグラフが明け方から落ち着きを取り始めた現在のWindowsAzureのCPU使用率なのですが、グラフの山が盛り上がっていますね。
あまりの重たさに一時的に

3 コア、7 GB メモリ

までメモリを増しましにした状態で、CPU60%越えに振り切れているっちゅーことで半端じゃないCPUの使用率ということがお分かり頂けると思います。

まずは冷静に状況の分析

サーバーが落ちる時点でもう顔面蒼白なのですが、メモリを一時的に増大させて何とかサイトを復旧させてここで一旦冷静に状況の分析から。なんとなーく原因はDOSくらっているんだろうなあと過去の経験から分かっているのですが。。

まずは冷静に状況の分析

明らかにCPUが高過ぎるので、「何がCPUを大量に消費しているのか」を調べます。

# ps au

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1997 0.0 0.0 4060 584 tty1 Ss+ Feb17 0:00 /sbin/mingetty

root 1979 0.0 0.0 4060 584 tty5 Ss+ 00:56 0:00 /sbin/mingetty

root 1981 0.0 0.0 4060 584 tty6 Ss+ 00:56 0:00 /sbin/mingetty

apache 2056 3.1 0.5 480216 38728 ? S 00:56 1:06 /usr/sbin/httpd

apache 2258 3.2 0.5 479168 39076 ? S 00:56 1:07 /usr/sbin/httpd

apache 2272 3.3 0.5 478932 38792 ? S 00:56 1:10 /usr/sbin/httpd

apache 2509 3.3 0.5 476300 36152 ? S 01:00 1:01 /usr/sbin/httpd

apache 2615 3.4 0.5 480420 40356 ? S 01:02 1:00 /usr/sbin/httpd
。。。。。。。。

apacheが多いなあ。。

# ps aux | grep httpd

すると
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
apache 2056 3.1 0.5 480216 38728 ? S 00:56 1:06 /usr/sbin/httpd

apache 2258 3.2 0.5 479168 39076 ? S 00:56 1:07 /usr/sbin/httpd
以下100行ほどapacheのプロセスが大量に渡って来ます。
試しにGoogleアナリティクスでリアルタイムのアクセス状況拾ってもその時間にサイトにアクセスしているのは朝方っていうこともあって数人しかおりません。
(っつーか1回のapacheプロセスに対して、CPU3%超えるようなアクセスってなんだよ!という話であってですね。もうこれはDOSアタックしかないですね)

DOSアタックの対処。国外アクセスの禁止

いつ落ちてもおかしく無いので一時的に国外からのアクセスを禁止します。(この手のDOSは中国系のDOSアタックが多いのは経験済みなので)

こちらのサイトから国外からのアクセスを禁止できる.htaccessを入手できますので、一先ずこれをWordPressの閲覧可能ディレクトリの直下の.htaccessにコピペします。
ただしこれをそのままにしておくことは出来ません。なぜならこのままだとfacebookからサイトにアクセスすることができないのでogpの取得ができなくなるのでソーシャルに一切対応していないサイトになってしまうからです。なので対処としては一時的に。

mod_evasiveモジュールの追加

Apacheのmod_evasiveモジュールでDOSアタックに対処します。1秒間に●●回アクセスしてくるIPアドレスを●●秒アクセス禁止にする
という設定が可能な有名なモジュールですね。
epelリポジトリが追加されているサーバーであればyumコマンドでインストール出来ます。

#yum install mod_evasive
#mkdir /var/lock/mod_evasive ログディレクトリ
#chown apache:apache /var/lock/mod_evasive  ログディレクトリへのアクセス権

mod_evasive.confの設定を変更します。

# vi /etc/httpd/conf.d/mod_evasive.conf


テストコマンドは以下。バージョンによって変わるので、/usr/share/docをlsコマンドで中身確認してtestスクリプトを実行してください。

perl /usr/share/doc/mod_evasive-1.10.1/test.pl

ちなみに私はテストすら出来ませんでした。
何度やってもテストがぜーんぶ200 OKでレスポンスが返ってくるんですね。最初なんでだろう!って辛くなったんですが、冷静に考えてみればこのテストの最中もアホか!ってほどDOS喰らっていたので、テストのシェルスクリプト1行ごとの実行に1秒より多くかかっていたためにまともにテストできなかったんですよ。あるんだねー、テストすらできなくなるほどのDOSアタック。

そんなわけでまとめ

CPUが突然爆発的に消費をはじめたらpsコマンドで原因を突き止めて、サイトのアクセス数に対してhttpdに対するCPUが爆発的に消費されていたらDOSアタック対策を行うこと。
以上!

追記

mod_evasiveは正しく設定できていたはずなのに、海外からのアクセスをもう一度許可をすると再びCPUが激しく増加しました。自分のサイトへの攻撃はDOSではなくDDOS(ディードス)だったもようで、mod_evasiveだけでは防ぐことが出来ませんでした。
ゆえに自分は海外からのアクセスは完全に拒否する対策を取って、facebookでOGPキャッシュを作る時だけ海外アクセスを許可する方法を取りたいと思います。出来れば国内だけに限定させるのは自分としてはあまりいい対処だとは思ってはいないので今後もDDOSへの対策を考えたいと思います。

MySQL5.6がInnoDB書き込み権限エラーで起動に失敗するよ問題

MySQL5.6がInnoDB書き込み権限エラー

あんたには書き込み権限がないのよ!

あんたには書き込み権限がないっつってんのよ!(バシっ)

そうですか、ないんですか。

まずはMySQLのエラーログチェックして、原因を突き止める

ログの場所を確認

cat /etc/my.cnf

ログチェック!

tail /var/log/mysqld.log

かあさんのMySQLログ

InnoDB: To fix the problem and start mysqld:
InnoDB: 1) If there is a permission problem in the file and mysqld cannot
InnoDB: open the file, you should modify the permissions.
InnoDB: 2) If the table is not needed, or you can restore it from a backup,
InnoDB: then you can remove the .ibd file, and InnoDB will do a normal
InnoDB: crash recovery and ignore that table.
InnoDB: 3) If the file system or the disk is broken, and you cannot remove
InnoDB: the .ibd file, you can set innodb_force_recovery > 0 in my.cnf
InnoDB: and force InnoDB to continue crash recovery here.
150502 15:53:24 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended

1)If there is a permission problem in the file and mysqld cannot
InnoDB: open the file, you should modify the permissions.
(パーミッションの問題があるならパーミッションを編集してね)

パーミッション変更

chown -Rf mysql:mysql /var/lib/mysql

再び起動!

# service mysqld start
Starting mysqld: [ OK ]

きたーーーーー!

MySQL5.6使うようになってからパーミッション問題をよく見るなあ

数年前からLAMP環境は当たり前のように作るんですが、MySQL5.6の新しい環境を使うようになってからよくパーミッション問題に悩まされるようになりました。
エラーログを冷静に見て、パーミッションならchownコマンドでパーミッションをmysqlにしてあげようっと。

CentOSのMySQLがシャットダウンできない!PIDファイルがないってどういうことだ!

service mysql stop
MySQL server PID file could not be found! [FAILED]

MySQLがシャットダウンできない!再起動できない!PIDファイルがないってどういうことだ!

ひとまずPIDファイルを表示する

ps auxww | grep mysql

root 1274 0.0 0.0 108336 1456 ? S Mar12 0:00 /bin/sh /usr/bin/mysqld_safe –datadir=/var/lib/mysql –pid-file=/var/lib/mysql/kanareba.pid
mysql 1450 0.0 12.9 1020676 459000 ? Sl Mar12 0:27 /usr/sbin/mysqld –basedir=/usr –datadir=/var/lib/mysql –plugin-dir=/usr/lib64/mysql/plugin –user=mysql –log-error=/var/log/mysqld.log —pid-file=/var/lib/mysql/kaasan.pid –socket=/var/lib/mysql/mysql.sock
root 6882 0.0 0.0 107472 896 pts/0 S+ 05:11 0:00 grep mysql

どうやら、本来必要なPIDは赤字の箇所みたい。
PIDファイルをcatしても無いようなのでPIDファイルとやらを作成。

vi /var/lib/mysql/kaasan.pid

で、白紙のpidファイルに青字の数値だけを記載して保存。

service mysql stop
Shutting down MySQL… [ OK ]

今度は無事に終了できたー!

CentOS6環境に最新LAMP環境を作る!

時代はPHP5.5 MySQLは5.6の時代よ!


そんな訳で、PHP5.5 MySQLは5.6をインストールするお話をメモがてら残しておく。

とりあえずApach。

#yum -y install httpd
#httpd -v
Server version: Apache/2.2.15 (Unix)
Server built: Oct 16 2014 14:48:21

epelとremiのリポジトリの追加

epelとremiのリポジトリの追加リポジトリからPHP5.5をインストールします。

#rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
#rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

PHP5.5

yum install –enablerepo=remi –enablerepo=remi-php56 php php-opcache php-mbstring php-mcrypt php-mysqlnd php-phpunit-PHPUnit php-pecl-xdebug php-devel php-pecl-xhprof

インストールをチェック

#php –version
PHP 5.6.6 (cli) (built: Feb 19 2015 10:30:11)

MySQL5.6 用にMySQLの公式サイトからリポジトリ

MySQLの5.6は、MySQLの公式サイトよりリポジトリを追加して そのリポジトリからMySQL5.6をんストールします。
既存のMySQLをチェック。

#rpm -qa | grep mysql
yum remove mysql*
wget http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-client-5.6.20-1.el6.x86_64.rpm
wget http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-shared-compat-5.6.20-1.el6.x86_64.rpm
wget http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-server-5.6.20-1.el6.x86_64.rpm
wget http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-devel-5.6.20-1.el6.x86_64.rpm
wget http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-shared-5.6.20-1.el6.x86_64.rpm

あとはリポジトリを元にMySQL5.6をインストール

#yum install MySQL-{client,devel,server,shared-compat}-5.6.20-1.el6.x86_64.rpm
#yum install MySQL-shared-5.6.20-1.el6.x86_64.rpm

最後にバージョンの確認。 

#mysql –version
mysql Ver 14.14 Distrib 5.6.20, for Linux (x86_64) using EditLine wrapper

以上終了!

CentOS環境にremiリポジトリが重複!?remiリポジトリでパッケージがインストールできない!

CentOS環境のremiリポジトリが重複してPHPのアップデートに失敗する!

PHP5.4をremiリポジトリから5.6をインストールしようとしたところ、以下のようなエラーで失敗。

–> Processing Dependency: libgd.so.3()(64bit) for package: php-gd-5.6.6-1.el6.remi.x86_64
–> Finished Dependency Resolution
Error: Package: php-gd-5.6.6-1.el6.remi.x86_64 (remi-php56)
Requires: gd-last(x86-64) >= 2.1.0-3
Error: Package: php-gd-5.6.6-1.el6.remi.x86_64 (remi-php56)
Requires: libgd.so.3()(64bit)
You could try using –skip-broken to work around the problem
You could try running: rpm -Va –nofiles –nodigest
[root@itkaasan html]# rpm -qa | grep remi
remi-release-6.5-1.el6.remi.noarch
[root@itkaasan html]# rpm -e remi-release-6.5-1.el6.remi.noarch

リポジトリが重複しているエラーが!

remiリポジトリが2つあるらしいので、remiリポジトリを削除します。

#rpm -e remi-release-6.5-1.el6.remi.noarch

これで再度remiリポジトリをインストールすればよいのです。

MacのターミナルからSCPコマンドでサーバーのファイルをダウンロード

SCPダウンロードの模様
MacのターミナルからSCPコマンドでLinuxサーバー上に置いてあるフォルダを一括ダウンロードします。
もちろんSCP,SFTP対応のアプリ、フリーソフトはたくさんあるんだけれどMacのターミナル、SSHから出来たら便利。
たまに使うのに忘れてしまうのでメモ。

SCPダウンロードコマンド

scp -r ユーザー名@サーバーホスト名:ダウンロードしたいサーバー上のフォルダパス Linuxなど保存したいローカルのパス

直後にパスワードを聞かれるのでパスワードを入力すれば指定したローカルのフォルダに大してファイル、フォルダをコピーしてくれます。
Macのターミナルじゃなくて、これをやればサーバー間でファイルの相互バックアップが出来ますね。

CentOS6 に yum localinstallが警告でまったくインストールできない!


CentOS6に、mySQL5.6インストール時にmySQL公式サイトから追加したリポジトリがyum localinstallが警告出てしまって全く使えない!

警告: /var/tmp/rpm-tmp.PvyEG0: ヘッダ V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY

ええええ!エラーもこれだけ。意味がわからん!

MySQL公式サイトから追加したCentOS6用リポジトリ

何度やってもyum localinstallが警告でて失敗。。

yum localinstall mysql-community-release-el6-5.noarch.rpm

そもそもyum localinstallコマンドってなんだ!

そもそもyumコマンドって登録されたリポジトリからパッケージインストするコマンド。yum localinstallコマンドはローカルの(自分のLinux環境)RPMをyumコマンドでインストするためのものらしい。

localinstall 実行時にGPGキーをチェックしないlocalinstallもあるよ

ずっと気になっていた警告、key ID 0608b895: NOKEY localinstallについて調べていたらGPGキーというものがわかりました。

よくわからないですが、yumコマンド使う際に、公開鍵を求められるケースがあって、すべてが公開鍵があるわけではなくて中にはGPGキーの存在しないものもあるってことがわかりました。
で、今回MySQLの公式から追加したRPMリポジトリが、単純に公開鍵が設定しているものじゃないから注意せえよ!っていうことみたいですね。
なので、今回はGPGキーがないものは仕方がないこととして、実行時にGPGキーをチェックしないlocalinstallを実行。

実行方法

*みにくいですが、nogpgcheck前のハイフンは2回です
yum localinstall mysql-community-release-el6-5.noarch.rpm –nogpgcheck

これに数時間はまりましたが、これでlocalinstallは理解できましたー

viエディタの便利コマンド

viエディタで使える各種コマンド

viエディタは最初は使いにくいけれど、「所詮はエディタ」。
行番号を表示したり、文字を検索したり、置換をしたり一般的なエディタと同等の機能はたくさんあります。

行番号を表示する

viエディタで行番号を表示する
viエディタを何でもいいので、何かファイルを表示している状態で、

:set number

指定した行番号にジャンプ

行番号を指定するだけで簡単にジャンプできます。
viエディタ行番号移動

:行番号

後方の文字列の検索

?文字列

次候補 n

前方の文字列の検索

/文字列

なお、こちらも文字列検索は正規表現OKです

私がよく使うのはこんな感じ。