CentOS 7でPHPのアップデートがErrorになる

PHPがアップデートできない!

※この事例は、remiリポジトリを使用しています。またPHP71を対象としています。remiリポジトリを使っていない場合は参考にならないかも知れません。PHP71以外のバージョンでは適宜コマンドの指定を変えてください。ご注意ください!

CentOS 7.5-1804でyum updateを実施しようとしたら、アップデートが出来ませんでした。
手動でPHP以外のアップデートを済ませて再度確認を行った結果、以下のエラーが原因でした。

当然、–skip-brokenとかやる気は全く無いので、ググってみると同様の現象に見舞われている方を発見!
そのQAに書かれている内容を見て何となく方向性は判ったのだが、どうも気に掛かる。
やっぱり1個足りない気がする。。。。
危なっかしいので、万が一のことを想定しスナップショット(バックアップ)を取得してから以下の手順を順次実施した。

アップデート手順

まずは、障害を取り除く

まず最初にエラーメッセージ記載されているパッケージを以下のコマンドで削除する。

Dependencies ResolvedとDependencies Removedの項目にも書かれているが、phpMyAdminもトランザクションの影響で削除されている。
こういう時、yum -yオプションは避けた方が良いだろう。

必要なパッケージを再度インストールして更新する。

とりあえず、参考にしたサイトに記載されていた内容でインストールしてみた。その手順が以下になる。

やっぱり、phpMyAdminがインストールされていない!
phpMyAdminを明示的に入れる必要があるわけで、以下のコマンドでインストールを行う。

無事入りました!
ちなみに、こちらはremiを使ってPHP71の事例となっていますが、その他のバージョンに関しては適宜バージョン指定を変えてくださいね。

CentOS 7 メールサーバ構築

※本記事は執筆中であり、一部正確ではない部分があります。でも一応は動くはずです。

今更ですが、CentOS 7にメールサーバを構築します。
RHEL 8(RedHat Enterprise Linux 8)が公開されているのに、今更な感じは拭えませんが、多分、CentOS 8でも同じ感じで設定できるでしょう(^^;

インターネット上を散策すると、私を含めて色々な方がインストール方法をブログなどに掲載されていますが、簡単なインストール方法は分かるんだけど、実はファイアーウォールが無視されていたり。。。SELinuxを無効にするとか。。。それって良いの?という感じになったり、少し不安がよぎります。

そんなことがあって、自分に合った記事を見つけるのは意外と大変なんですよね。

ということで、この記事も私に合った記事になっていますので、参考にされる方はご自身の環境に合うか合わないかを判断した上で考えてみてください。

本記事では、メールサーバのインストールを何とか使えるレベルから少し踏み込んでセキュリティ対策も考えた状態までもって行こうと思っています。
それと合わせて、少しだけですけどデフォルトよりも少しパフォーマンスを上げてみようと思います。

こんなことやります。

まず最初に、本記事で紹介するメールサーバでは、postfixとdovecotを採用することにしました。
他のsendmailを使う方などは対象外になります。

以下の様な構成です。

サーバの種類概要パッケージ
SMTPサーバメール送信postfix
POPサーバメール受信dovecot

インストール前の準備

メールサーバを立ち上げようなんて考えている方はご存知とは思いますが、DNSの設定を行う必要があります。
ドメインを取得して、AレコードとMXレコードを設定してください。
まず、AレコードでグローバルIPアドレスとドメインを紐づけます。
次に、そのドメインとMXレコードを紐づけます。
サーバ本体とは別にファイアウォールを設置されている場合は、そちらの設定も忘れずに行います。

SMTPサーバ/postfix

SMTPサーバとしてpostfixをインストールします。

私の環境では、デフォルトでインストールが完了していました。
以下のコマンドでインストール状況を確認しましょう。

インストールされていない場合には、いつものようにyumでインストールします。
#CentOS 8ではyumがdnfへ変更されるんでしたね。

インストール自体はこれで終わりです。

postfixの設定

postfixの設定を行います。
/etc/postfix/main.cfを編集します。
編集項目のみを抜粋します。

スパム対策

スパム対策を行います。
まず、必要なパッケージをインストールします。

spamassassinを利用したスパム対策では、procmailを使用します。
postfixの設定を変更します。
/etc/postfix/main.cf の下記の内容を有効にします。

/etc/procmailrcを作成し、以下の様に編集します。

通常は、この後にfirewall-cmdでsmtpを有効にしいます。

ここまでは簡単な設定です。
SMTPサーバを外部の方が使われないのであれば良いのですが、SMTPサーバを勝手に外部の人が使うケースがあります。
そうならない為に、スパム対策が色々とあります。
そこまでの内容をここで記載するには、時間が掛かるので、今回はここまでにします。
会社などで外部からSMTPサーバへアクセス出来ないようなにしている場合にはこの程度で十分ではないかと思います。
社外からSMTPサーバを使えるようにすると、関係のない人もSMTPサーバを利用出来てしまいます。
インターネット上の公開サーバなども同じです。
その場合には、スパムホスト対策やSMTP-AUTHやCRAM-MD5認証など対策を行う必要があるでしょう。
詳しくは、別の機会に投稿したいと思います。
私の環境では、firewallでSMTPを閉じてしまいました。
外部からSMTPのサービスを使用できなくするだけでOKです。

POPサーバ/dovecot

POPサーバにはdovecotを利用します。
dovecotが入っていない場合には、以下のコマンドでインストールします。

dovecotの設定

dovecotの設定を行います。
まず、/etc/dovecot/conf.d/10-mail.confを編集します。
SSL用のpop3sも有効にしていますが、使わなければコメントアウトしておきます。

firewallの設定を行います。

サービスを起動

サービスを起動します。

mailx コマンドによる動作確認

mailxコマンドを用いて動作確認を行います。
まずは、mailxをインストールします。

mailxコマンドを実行します。

dateコマンドで日時を出力し、その結果をメールのタイトルとして送信します。
-rで送信元のメールアドレスを指定し、一番最後に送信先を指定します。

実際に受信をしてみるとわかりますが、送信してから受信完了するまでに時間が掛かる場合があります。

失敗すると、次に再送を行うまでに3分程時間を要する設定にデフォルトではなっています。

ちょっとだけチューニング

ほんの少しだけチューニングします。
/etc/postfix/main.cfの最後に以下を追加します。

詳しくは別途調べてみてください。
少し改善されていると思います。

Vulsによる脆弱性の検査

はじめに

今回はVulsを用いた脆弱性の検査を行う。
対象とするシステムはCentOS 7とする。
また、本サイトは個人運営のため、メンテナンスが不十分であり対象パッケージのアップデートに追従できていないことに注意!

流れは以下の通り。

  • Vulsインストールの下準備
  • 脆弱性情報の準備
  • Vulsによる脆弱性の検査
  • 可視化

以上について順を追って記載する。
オフィシャルなインストール方法は以下のURLに示されており、参考にしている。
https://vuls.io/docs/en/install-manually-centos.html

Vulsインストールの下準備

実行ユーザの作成

Vulsを実行するユーザの作成を行う。

sudoを許可するためにvisudoでユーザに許可をします。

セキュリティ確保の為、不要なユーザによるsudoを許可したくない場合には、作業終了後に上記の内容を削除する。
※継続的なモニタリングを行う場合には、残しておく必要あり。

ログ格納用ディレクトリの作成

vulsのログを格納するディレクトリを作成する。

go環境のインストール

以下のサイトからパッケージをダウンロードする。

https://golang.org/dl/

本資料作成時点における最新バージョンは1.12でしたので、以下のコマンドを実行し解凍する。

goの環境変数を設定する。
/etc/profile.d/goenv.shを新たに作成する。

ここでvulsの実行ユーザでgo環境の確認を行う。

環境変数を読み込む。

バージョンが正しく表示されていれば、goのインストールは成功している。

脆弱性情報の準備

NIST(アメリカ国立標準技術研究所)が提供するNVDと、IPA(情報処理推進機構)が提供するJVNから脆弱性情報を取得する。

gitのサイトを覗いてみると、どうも日本人の方がまとめてくれているみたいですね。感謝!

今度は、Linuxのディストリビュータが提供されているOVALも取得する。

各データベースを構築する。

NVDのデータベースを構築する。
相当古い情報から取得するので、時間は結構かかる。
オフィシャルのインストールマニュアルには、AWSで10分程度となっていたが、1〜2時間程度は覚悟した方が良さそう(^^;
出力さているログを見ていると、西暦が記されたファイルがちらほら見受けられるので、進捗状況が分かると思う。

JVNのデータベースを構築する。

こちらは更に古くて1998年以降のデータベースになる。
オフィシャルのインストールマニュアルには、こちらもAWSで10分程度とされているが、実際どれだけかかるのか。。。
2005年のデータまでは比較的速やかに登録が進むのだが、2006年くらいからいきなり重くなる(^^;
日本では2006年くらいから本気で取り組みを始めたということなのだろうか?(笑)

OVALのデータベースを構築する。

ここからはある意味でオプションデータベースみたいな感じもするけど、オフィシャルマニュアルに記載があるので、合わせて登録する。

gostのデータベースを構築する。
これまでよりは少し短い時間で構築できるが、それも10分程度は覚悟。
ディストリビューたから脆弱性に関するパッチが提供されていないものを検出出来るとのこと。

Exploitのデータベースを構築する。
エクスプロイトコードを表示出来るExploit DBがVuls 0.6.0から提供されているので、それを使いたい場合に追加する。ここもオフィシャルマニュアルの丸コピ


Vulsのインストール

データベースの準備が整い、これからVulsのインストールを行う。
ここは、オフィシャルマニュアルを丸コピ!
※Vulsを再インストールするとかアップデートする際には、ここでインストールするソースを含めた生成物を削除する必要があるらしい。方法については後述する「Vulsのアップデート」に記したが、オフィシャルマニュアルも合わせて確認すること。

Vulsの設定ファイルを作成する。

設定ファイルの確認を以下のコマンドで行う。

エラーが表示されなければ完了である。

Vulsによる脆弱性の検査

ローカルスキャンの方法を記載する。
ローカルスキャン以外にもリモートスキャンを行う方法等も準備されているので、必要に応じてセットアップなどを行ってやってみるのも良いかと思う。
ローカルスキャンのコマンドは至ってシンプルで以下のコマンドで実施する。

Vulsのアップデート(新規インストール時は不要)

Vulsをアップデートする時は、実行モジュールとソースを全削除してから行うらしい。
ということで、ここで記載する内容は、Vulsをアップデートする際に行う事前作業であり、新規インストール時には必要ない。

スキャン結果の確認

スキャン結果を確認してみる。
困ったことに、-format-short-textオプションが使えなくなっているみたい。
オフィシャルマニュアルにはまだその記載があるのだが、諦めて他の出力結果を試してみる。

デフォルトの出力結果を出してみた。
コマンドは以下の通り。

ちなみに、この時点で-lang=jaは全く意味が無かった(笑)
日本語が出てくれることを期待しただが。。。結果は以下の通り

Total: 200 (High:49 Medium:133 Low:18 ?:0),
全体で200の脆弱性を確認している。
各レベルに対応した数値が提示されている。

199/200 Fixed
200件中199件でアップデートパッケージが提供されている。

後の説明は省略。。。。

表は、それぞれの脆弱性に関するレポートが示される。

TUI形式で表示することも可能。

終了は、Ctrl+Cで行う。

VulsRepoを用いた解析方法などもあるようだが、今回はここまで。

WebAssembly 事始め

WebAssemblyのインストール

WebAssemblyを導入してみようと思い立ち、取り敢えずググること数時間。
WebAssemblyって面白そう!ということで、その辺に転がっていたCentOS 7に取り敢えずインストールして試してみようかな?と言うことでやってみた。

よく解らないながら、node.jsを入れておくと良さそうなので、インストールしておく。

他にも入ってるかも知れないけど、gccとか既に入っていたので無視!
確認のために必要なWebサーバについても、Apacheがインストールされているので、こちらも無視。
まあ、何かあったらエラー出てくるだろう?ということで。。。

適当なディレクトリを作成して、gitでクローンを作るところから始まる。

よくわかんないけど、こんな感じでおまじないを入れる。

最初はそこそこ時間掛かるみたいです。
終わったら、サンプルプログラムを動かしてみようと思います。

サンプルプログラムと実行

サンプルプログラムと言っても、単なるHell Worldですが。。。(^^ゞ

ここではC言語なのに、敢えてsample.cppとして作りました。
コンパイルしてみます。

忘れていました。emsdkを構築したディレクトリで以下のコマンドを実行して、環境設定を行います。

このままだと毎回上記のコマンドを実行する必要が生じますので、ログイン時に設定する様にした方が良いですね。(割愛しますが。。。)

コンパイルします。

.jsだけ作る場合は、以下のコマンドになります。

# emcc -o sample.js

確認方法は2通りあります。
node.jsで動作確認する場合は以下のコマンドで確認出来ます。

# node sample.js

Webサーバで確認する場合は、.jsと.wasmと.htmlを/var/www/html以下の適当なディレクトリへ保存します。
あとは、ブラウザでアクセスしてみてください。

こんな感じ

こんな感じの画面が出たら成功です!

どのファイルがWebサーバに必要なのか解らなかったのですが、結局全部欲しいらしいw
これだけだと、単なるリソースの無駄遣いプログラムを作っただけなのでは。。。?
はい、そうですw

Qtが連携出来そうなので、Qtと連携してみようと思います。

仮想OSでインストールしたWindows 10がLAN上のNASに繋がらない時の対応

概要

VirtualBoxでWindowsをインストールした時に、LAN上のNASが接続出来ない状況が発生しました。
その対処についてまとめます。

最終的な結果として、プレインストールのWindows PCで同現象が発生していないことから、Windowsをメディア等からインストールした時に発生する現象であると思われます。
私の環境では、Windows 10で現象が確認されましたが、Windows Server 2016でも同現象が発生するもとの思われます。
その他Windowsの各バージョンにおいて発生した場合でも参考になるかも知れません。

Windows からNASに接続出来ない場合の対処法として記録します。

具体的な現象

VirtualBoxでWindows 10の環境を構築しました。
VirtualBoxでLAN上のネットワークに接続する方法は他にもありますが、ブリッジ接続を選択しました。
プライベートネットワークとして接続しています。

この状態で、通常のプレインストールされたWindows PCであれば、特に気にすることなく接続出来ると思うのですが、新規にインストールしたWindowsからは見えませんでした。

対策内容

幾つかの対策を行いました。
それぞれ順を追って説明しますが、以下に一覧を記します。

VirtulaBoxにおけるネットワークの設定

WindowsをVirtualBoxで仮想OSとして構築した場合について記載します。
ホストOS(Physical OS)の場合は、この項目の内容を飛ばして、次の設定に進んでください。

Windows側のネットワークの設定

Windowsのネットワーク設定がパブリックになっている可能性があります。
当初、私の環境ではパブリックになっていたのでプライベートに変更しました。設定は以下の手順です。

「ネットワークとインターネットの設定」を開きます。

画面右下のネットワークアイコンを右クリックすると以下のポップアップが表示されます

「ネットワークとインターネットの設定を開く」を選択します。

赤枠で囲んだイーサネットのアダプタをクリックします。

「パブリック」になっていたら、「プライベート」に変更してください。

ネットワークと共有センターの設定

ネットワークと共有センターの設定は、一つ前の画面にある「ネットワークと共有センター」を選択すると移動が楽です。

左メニューの「共有の詳細設定の変更」を選択します。

「ネットワーク探索を有効にする」を設定してください。

ワークグループの設定

「コントロールパネル」→「システム」を開きます。

「設定の変更」を開きます。

「変更(C)」で開かれるダイアログで、ワークグループを適切に設定してください。

ここまで来ると、エクスプローラで「ネットワーク」を選択すると、対象となるNASの名前が表示されたりします。
表示されない場合もありますので、あまり深く考えないで次へ進みましょう。

レジストリの設定

最大の難関はここでした!

「regedit」を起動します。
次に、以下のレジストリを探します。

「AllowInsecureGuestAuth」の項目を確認し、「1」をセットします。

再起動を行うことをお勧めしますが、私の場合は再起動なしでもNASへアクセス出来る様になりました。

ただ、このレジストリが見つからない場合もあります。
環境に依存している可能性もあり、判断が難しいところですが、新規に作ってしまうという手もあるのか?ご自身の責任で試してください。
レジスタを追加するのは、最後の手段にしておく方が良いでしょう。
保証も何もありません。

最後に

この現象はWindowsのアップデート後に発生している方も多い様です。
SMB絡みの不具合でもあると思いますが、MS社からすれば仕様なのかな?
そもそもWindows自体が安定性に乏しいということなのでしょう。
この問題は、Windows Server 2016でも報告されているので、アップデートの際にきちんとしてくれるとかないのかねぇ?MS社は無駄な労力をこういうところで強いるので、サポートをもっと手厚くしてほしいですね。

これがWindowsカテゴリ最初の投稿になるとは・・・w

GeoTiff 座標系変換と結合

前提

国土地理院の地理院地図やGoogle Mapで提供されている航空写真を用いずに、独自に入手した衛星画像や航空写真を用いて広範囲の画像を表示させようとした時、座標系の変換と画像の結合が必要となります。

一般に入手される航空写真などで提供されている画像の座標系はJGD2011など、Web上では使い難い座標系を用いている場合が多く見受けられます。
その為、多くの場合には、座標系を変換する必要が生じるのです。
本資料では、この作業を行うための環境について説明し、衛星画像や航空写真などを用いて、座標系変換を行ってから画像を結合する以下の手順について説明します。

  1. 環境準備
  2. 画像の座標系を確認する。
  3. 座標系を変換する。

では順番に進めましょう。

環境準備

環境準備と言いましても、インストール方法については割愛します。
既に、本サイトでも紹介をしているOSGeo4Wをベースにお話しを進めます。
ただし、衛星画像や航空写真を結合する作業を行うには、正直申し上げてWindows環境はあまり適している環境とは言えません。
その理由としては以下が考えられるでしょう。

  • コマンドライン(シェル)が使い難い
  • 元々メモリの消費が激しく、大量のメモリを消費する作業では使い勝手が悪い。

数枚の画像を扱う程度であれば、GISツール(QGISなど)を用いて、ちまちま行うという方法もあるでしょう。パッチ処理などでまとめて出来るよ!という方もいらっしゃるとは思いますが。。。無視!

ということで少し作業がやり易いように1つツールを入れて作業を行っています。
また、一部の操作に関しては、Linux上で作業を行うかも知れません。

環境としては、以下の環境を準備しました。

Windows 10
OSGeo4W (GDALが入っていればOK!)
 参考情報:https://trac.osgeo.org/osgeo4w/wiki/OSGeo4W_jp
 過去の参考情報:https://tech.godpress.net/?p=368
Gow
 参考情報:https://ja.wikipedia.org/wiki/Gow

実際の作業ではGDALを使用します。
GDALのみをインストールした環境を準備されている方は、その環境を用いてもOKです。(って、そんな環境造っている人が、このサイトを参考にされるとは思いませんが。。。)

画像の座標系を確認する

OSGeo4Wをインストールしている場合、QGISで確認しちゃおう!という方は、GUI上でプロパティ確認で終わっちゃいますね。
でも今回は、コマンドライン操作が基本となりますので、コマンドで対処します。

Gowをインストールしていると、Linuxと同じような感覚でコマンドラインの操作が行える様になります。

なんでコマンドラインで作業を行うかと言いますと、入手した画像が全て同じ座標系であれば、あまり大したことではないのですが、時折、異なる座標系の画像を提供されて結合する場合があり、全ての画像を同じ座標系に統一しないと画像を結合した時にズレが生じて隙間が発生するのです。
間違って座標変換を行わないためには、事前に元画像の座標系を確認しておく必要があるためです。
では、実際のコマンド操作に関して説明します。

以下のコマンドは1つのファイルに対して座標系の確認を行うためのコマンドです。

複数のファイルに対し一括して確認を行う場合は、対象ファイルがあるフォルダーへ移動してから、以下のコマンドを実行します。

「gfind」コマンドは、Linuxの「find」コマンドをGowが実装したコマンドになります。

最初の引数「.」は対象となるフォルダーを指定しています。
対象フォルダーへ移動せずに、直接フォルダーを指定しても構いません。

-name *.tif :対象となるファイル名を指定します。ここではワイルドカードを用いた指定を行いました。全てのtifファイルが対象となります。

「|」で次のxargsコマンドへ出力結果を引き渡しています。
xargsコマンドでは-n 1とすることで、ファイル名を一つづつ処理します。
gdalinfo <ターゲットファイル>がファイル数分処理されます。

最後に、grepで必要な行だけを取得しています。

座標系を変換する

今回は、以下のフォルダー構成を想定して作業を進めます。
<作業フォルダー>—<EPSG102617>
         |
                                   +<EPSG4326>
コマンド操作は、<作業フォルダー>で行います。
<EPSG102617>は元の画像が保存されているフォルダーです。
先程の確認で座標系がEPSG:9001となっていましたが、内部ではEPSG:102617が正式な座標系となるためこの様にしています。

<EPSG4326>は座標変換後の画像ファイルを出力するためのフォルダーです。

既にお分かりのことと思いますが、本資料では、EPSG:102617(9001)→EPSG:4326の座標系変換を行います。

少し長くなりますが、以下のコマンドを実行してみましょう。

gfindコマンドで対象ファイルを特定し、そのファイル名だけを抜き出し、gdalwarpコマンドへ引き渡しています。

gdalwarpコマンドでは、-s_srsで元の座標系(102617)を-t_srsで指定される座標系(4326)へ変換を行うことを指定しています。
-srcnodataでは、元画像の中にある不要なデータのカラーコードを指定しています。同様に-dstnodataで出力時のノーデータを指定しています。

-srcnodataや-dstnodataを指定しなかった場合、画像の繋ぎ目に隙間が生じ、黒く筋が入ってしまうと思います。
座標変換に伴う歪により生じた隙間が黒色で塗潰され、それが隙間となってなって見えている状態になります。

これを除外するために、-srcnodataと-dstnodataを用いて不要なデータ部分を見えなくしているのです

余談・・・画像結合に関して

これだけの画像を準備したのですから、画像結合の話を少しだけ。。。
実は、画像結合してタイル画像を作成する予定だったのですが、マシンの不調とその必要性が無くなってしまったので、余談として記載します。

画像の結合にはgdal_mergeを使用します。

コマンドはこんな感じです。

-a_nodata “255 255 255″を追加した方が良さそうに思います。
環境変数GDAL_CHACHEMAXの値を出来るだけ大きくすると良さそうです。
ちなみに、gdalbuildvrtで仮想ファイルを作成して作業を行う方が効率良いとも思います。

こんな感じでしょうか?
タイル化などにご興味のある方は、別途ご連絡ください。

CentOS 7 初期設定でやっておきたいこと(随時更新予定)

CentOS 7をインストール後にやっておきたいこと

CentOS 7をインストールした後に、そのまま使うには面倒なところがありますよね。
そこで、インストール後にやっておきたいことを幾つか記録しておこうと思います。
私の個人的な趣向もありますので、皆さんの環境に合わせて参考になれば幸いです。

なお、CentOS 7自体のインストール方法については、他を参照してください。
以前に書いた様な覚えもありますが、インストール方法に関しては割愛します。

さて、本題のインストール後に行ておきたい初期の設定に関してですが、この記載内容は適宜更新します。
よって、初期の段階でご覧になられた方は、これだけじゃ足りないじゃないか!?と思われる方もいらっしゃるかと思います。
参考情報ですから、基本はあまり期待しないでくださいね。

bashを使いやすくしておこう!

CentOS 7のシェルはbashが基本となっており、昔に比べると随分使いやすくなりました。
昔と言いましても10年以上昔の話なので、ご存知ない方も多いかと思いますが。。。(^^ゞ

VPSなどプロバイダが提供されている環境では、既に独自の設定が為されているところもあり、自分でインストールした場合とは異なったりします。
既に設定が為されている場合もあるようなので、必要ない場合もありますが、コマンドの補完を行ってくれるようにしておきたいです。

コマンドの補完

bashのコマンドを補完してくれる機能は、インストールされた環境によりまちまちであったりします。
まったく補完がされないことを前提に設定を行います。

まずは大文字/小文字を含めた補完を行ってくれる機能を有効にします。
rootユーザとして作業を進めます。
ホームディレクトリに以下のファイルを作成します。

この1行だけのファイルが重要なんです!
/etc/inputrcに記載しても良いはずです。

有効にするにはログインし直すか、以下のコマンドを実行してみてください。

これで反映されると思います。反映されない場合は、再度ログインし直してみてください。
大文字/小文字も含めたコマンドの補完が行われるようになっていると思います。
例えば、以下のコマンドを自動的に保管されるはずです。

ここまでは序の口です。更に補完機能を強化したいと思います。
続いて、以下のコマンドを実行してbashの補完機能を更に強化するパッケージをインストールします。

これを入れることで、コマンドのオプションなどが補完されるようになるんです。
例えば、systemctlのオプションをタブキーを使って補完することが出来る様になります。
ただし、インストール後に再度ログインを行う必要があります。

aliasについては好みがありますから、.bashrcにaliasを適当に追加しますが、今夏何時でbash周りは終わりかな?

ファイルの平均サイズ計算・最大・最小サイズの確認 for Linux

備忘録のつもりで平均だけを計算する簡単なメモにしようと思ったのですが、最大値も出してみようか?最小値もとかやってみたのです。
今更ながらawkの有り難味を感じながら。。。。w(←今更awkかよ!?)

Linux環境で 指定フォルダー以下にある特定ファイルの 以下の情報を調査します。

  • ファイルの平均サイズ
  • ファイルの最大サイズと最小サイズ

ファイルの平均サイズ

解り易いように、lsの部分を少し展開してみたコマンドは以下の通りです。

findやlsコマンドで個々のファイルサイズを表示させて、そのサイズ部分だけをawkで抜出し、合計値(s)を計算するのとそのファイル数(n)をカウント。
最後に合計値(s)/ファイル数(n)で平均値を計算しています。

合計値を取りたい場合には、ファイル数(n)で割らなければ良いだけです。
一定期間のファイル数やファイルサイズなども、findで探すファイルを限定することで計算出来ますね。
※ファイルサイズが0のファイルもファイル数としてカウントされます。

ファイルの最大サイズと最小サイズ

ファイルの最大サイズと最小サイズを確認するコマンドは以下の通りです。

少し細工をしています。取り出したファイルのサイズが0の時はそのサイズを無視しています。

合わせ技!

大したことはありません。ただ単純に、上記の両方を一気に計算してしまおうという話です。
ただし、ファイルサイズが0のファイルは無視します。つまり、平均ファイルサイズの対象からサイズが0のファイルは除かれますので、上記の方法とは少し異なります。

こんな感じです(^^♪
しばらく使わないとすぐに忘れてしまうので、備忘録大事ですねw

WordPressに「いいね」ボタンを追加

WordPressに「いいね」ボタンや「ツイート」ボタンを追加しようと思います。
幾つか方法があるのですが、私が面倒くさがりなので、プラグインで対応しました。
簡単に追加出来ちゃったのですが、問題が・・・「いいね」になって欲しいボタンが「Like」になっていました。
対応を行いましたので、簡単に紹介します。

プラグインの追加

使用したプラグインは「WP Social Bookmarking Light」です。
WordPressでプラグインを追加してください。

「設定」→「WP Social Bookmarking Light」で設定画面が表示されます。

図1 WP Social Bookmarking Light初期設定画面

「Like」→「いいね」に変更する。


「Like」を「いいね」に変更するには、英語表記を日本語表記に変更する必要がありました。

FBタブを選択し、以下の画面を表示します。

図2 FB設定画面

既に変更してありますが、Localeの項目を「en_US」(デフォルト)から「ja_JP」(日本語)に変更し、「変更を保存」とします。

以上で設定完了です。
やってみると簡単だったのですが、この設定が見つからなくてしばらく放置していました。
私の様に悩んでいる人は少ないと思いますが、ご参考までに。

Apache(Webサーバ)のチューニングとベンチマーク

ここでは、Apache HTTP Serverのチューニングとベンチマークに関してまとめます。

Apacheのベンチマーク

Apacheの性能はサーバの性能にも左右されますが、Apacheの設定内容によっても変わってきます。
最近のサーバはそこそこ速くなっているので、デフォルト設定のままでもそこそこ速く動いてくれるのですが、それでもアクセス集中対策を考慮するにはサーバのApacheのチューニングも必要になります。

さて、チューニングの方法は説明する前に、性能測定の方法について説明します。

Apacheの性能測定には、ab(Apache Bench)コマンドを使用します。

色々なサイトでも紹介されていますが、基本的なコマンド操作は以下の様になります。

-n 数値  : リクエストの総数
-c 数値  : 同時接続数

指定したURLに対し「リクエストの総数」分のリクエストを行います。並列して接続するため、「同時接続数」を指定することが出来ます。

試しにabコマンドを叩いてみます。(URLは適当です。)
※絶対に他人のサイトを指定しないでください。DoS攻撃とみなされる可能性があります。負荷試験の一種なので、対象のサーバに高負荷を与えることになります。

ここで注目したいのは、以下の2点です。
Failed requests: 0
Requests per second: 134.39 [#/sec] (mean)

「Failed requests」でリクエストがフェールになった回数をカウントしています。Failが発生しない様に調整する必要があります。

では、調整の仕方を見ていきましょう。

Apacheのチューニング

Apache 2.2系と2.4系ではチューニングの設定が少し異なります。パラメタの名称が一部変更になっているためです。
以下にそれぞれのパラメタ設定例を示します。
ただし、この設定内容は環境により異なりますので、ご自身のサーバ環境によって値を調整してみてください。

Apache2.2系のチューニングパラメタ

Apache 2.2系のチューニング方法を以下に紹介します。今更感はあるのですが、最も効果的な結果が得られたのがこの環境だったので敢えて事例紹介します。

対象ファイル:/etc/httpd/conf.d/httpd.conf

viなどで開いて編集してください。

こちらがデフォルト状態の設定状態です。

こちらが設定変更後の値です。

StartServers1起動時に生成される子サーバの数
MinSpareServers1アイドル状態で待機している
子サーバの最小数
MaxSpareServers5アイドル状態で待機している
子サーバの最大数
ServerLimit10MaxClientsに指定できる上限値
MaxClients10同時接続可能なクライアントの数
MaxRequestsPerChild4000子サーバが処理できる
リクエストの総数

デフォルトの状態では、StartServersが「1」になっていたので、最初の接続に掛かる時間が遅くなる傾向にありそうです。
また、MaxClientsが「10」しかないため同時に処理できるリクエストの数が少なく、こちらも処理が遅くなる傾向にあったようです。
変更後の値に設定し、以下のコマンドでWebサーバを再起動します。

Webサーバの再起動が完了したら、コマンドを実行して動作を確認してみましょう。

主要な内容については以下の通りです。

Failed requests: 0
Requests per second: 601.08 [#/sec]

「Requests per second」の値が134.39→601.08に変化しており、1秒間に処理で来ているリクエストの数が大幅にアップ(約4.5倍)しました。

と、ここで問題です。
MaxClientsを適当にしていしましたが、子サーバ(プロセス)が使用するメモリを考慮して計算しないと、実装メモリよりも多くの子サーバが起動してしまうことになってしまいます。
そうなると、スワップ領域まで達し、最終的にもメモリ不足に陥ることになります。
まず、httpdプロセスがどれ位のメモリを使用しているか?そして、PHPを使用しているならば、PHPの利用するメモリも考慮する必要があります。
実際にサーバ上で動作する際に必要となるメモリ量も気に掛かります。

面倒ですよね。
色々な方が作られている様ですが、MaxClientsを自動計算してくれる仕組みがあります。
その方法について、次に説明を行います。

MaxClientsの自動計算

MaxClientsを自動計算する方法について記載します。
Apache Web Service(Webサーバ)は、並列処理を実現するために複数子サーバを起動して、同時に複数のクライアントから要求されるリクエストに対応します。
その最大値をMaxClientsで指定します。

理論的には、httpd(子サーバ)が利用するメモリとPHPが利用するメモリで1つのクライアントから要求される処理を行うとして、システムのメモリを割ることで値が得られる感じです。
この時、システムでそれ以外に使用するメモリも考慮する必要があり、意外と面倒な計算と情報収集を行うこととなります。

それを自動化してくれる仕組みが以下のサイトにあるスクリプトになります。

https://github.com/richardforth/apache2buddy

apache2buddyを利用してMaxClientsを計算させるには、以下のコマンドを実行し、表示される情報を利用します。

コマンドは以下に記していますが、上記のURLで示されたサイトに記載がありますので(英文ですが)、そちらを参考にされることをお勧めします。(本記事が古くなると使えなくなりますが、上記サイトはメンテナンスされていますので)

重要な箇所は以下の一文です。

Your recommended MaxClients setting (based on available memory) is between 33 and 37. <——- Acceptable Range (10% of MAX)

httpdを再起動した直後などは正確な数値が得られない場合がありますので、本来は24時間程度運用した状態で数値を計算することが望ましいです。

上記の例では、MaxClientsの値として33~37が望ましい値として提示されています。

正直、実験を行ったサーバでは、長時間のヒートランを行っていなかったのでこの値が示されましたが、本来であればもっと少ない値が得られるのではないかと思います。

これを元に、先程示したhttpd.confに記載されている以下の値を調整します。

StartServers
MinSpareServers
MaxSpareServers
ServerLimit
MaxClients
MaxRequestsPerChild

最後に、Webサーバの再起動を行えば設定が反映され安定した動作になると思います。こまめにチェックするというよりも、ある程度時間を空けてチェックすると良いと思います。

apache2buddy以外にも自動計算や手動計算の手法が幾つか紹介されています。
自分に合った方法を見つけることが重要です。
今回の手法は、Linux上での手法となります。Windows上での計算は難しいかな?