﻿<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Web Creators Hub</title>
	<atom:link href="https://web-creators-hub.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://web-creators-hub.com</link>
	<description>WEB技術などの情報をわかりやすく配信するメディア</description>
	<lastBuildDate>Wed, 08 Feb 2023 01:56:31 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.8.2</generator>
	<item>
		<title>【Linux】findで日数が過ぎたファイルを削除するコマンド</title>
		<link>https://web-creators-hub.com/blog/post-753/</link>
		<pubDate>Wed, 08 Feb 2023 01:56:15 +0000</pubDate>
		<dc:creator><![CDATA[taizo]]></dc:creator>
				<category><![CDATA[ブログ]]></category>

		<guid isPermaLink="false">https://web-creators-hub.com/?p=753</guid>
		<description><![CDATA[Linux環境で、指定した日数が過ぎたファイルをfindコマンドを使用して削除するコマンドを紹介します。 findコマンドとは findコマ...]]></description>
				<content:encoded><![CDATA[<p>Linux環境で、指定した日数が過ぎたファイルを<span style="font-weight: 400;">findコマンドを使用して</span>削除するコマンドを紹介します。</p>
<h2><span style="font-weight: 400;">findコマンドとは</span></h2>
<p><span style="font-weight: 400;">findコマンドは、Linuxシステム上のファイルを検索するためのコマンドです。このコマンドは、指定したディレクトリ内のファイルを検索し、検索条件に一致するファイルを見つけることができます。</span><span style="font-weight: 400;"><br />
</span><span style="font-weight: 400;"><br />
</span><span style="font-weight: 400;">findコマンドは、検索条件を指定して、検索を行うことができます。検索条件として、ファイル名、ファイルサイズ、ファイルタイプ、ファイルの最終更新日時などを指定することができます。また、findコマンドは検索結果を処理するためのオプションも提供しています。</span><span style="font-weight: 400;"><br />
</span><span style="font-weight: 400;"><br />
</span><span style="font-weight: 400;">findコマンドは、Linuxシステム上のファイルを効率的に検索するために非常に便利なツールです。また、findコマンドを使用することで検索結果を処理するための複雑なコマンドを簡単に作成することができます。</span></p>
<p>&nbsp;</p>
<h2><span style="font-weight: 400;">検索条件を指定する</span></h2>
<p><span style="font-weight: 400;">findコマンドを使用して、指定した日数が過ぎたファイルを検索するためには、検索条件を指定する必要があります。今回は、指定した日数が過ぎたファイルを検索するために、-mtimeオプションを使用します。</span><span style="font-weight: 400;"><br />
</span><span style="font-weight: 400;"><br />
</span><span style="font-weight: 400;">例えば、7日以上経過したファイルを検索する場合は、次のように指定します。</span><span style="font-weight: 400;"><br />
</span><span style="font-weight: 400;"><br />
</span></p>
<pre class="brush: bash; title: ; notranslate">$ find /path/to/dir -mtime +7</pre>
<p><span style="font-weight: 400;"><br />
</span></p>
<p>&nbsp;</p>
<h2><span style="font-weight: 400;">削除する</span></h2>
<p><span style="font-weight: 400;">検索条件を指定したら、検索結果を削除します。削除するには、rmコマンドを使用します。</span><span style="font-weight: 400;"><br />
</span><span style="font-weight: 400;"><br />
</span><span style="font-weight: 400;">例えば、7日以上経過したファイルを削除する場合は、次のように指定します。</span><span style="font-weight: 400;"><br />
</span><span style="font-weight: 400;"><br />
</span></p>
<pre class="brush: bash; title: ; notranslate">$ find /path/to/dir -mtime +7 -exec rm {} \;</pre>
<p><span style="font-weight: 400;"><br />
</span><span style="font-weight: 400;">このコマンドでは、findコマンドで検索した結果をrmコマンドで削除しています。</span></p>
]]></content:encoded>
			</item>
		<item>
		<title>Laravel7から8 Target class [bindings] does not exist.</title>
		<link>https://web-creators-hub.com/php/laravel8-error-bindings/</link>
		<pubDate>Wed, 28 Dec 2022 06:24:06 +0000</pubDate>
		<dc:creator><![CDATA[taizo]]></dc:creator>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">https://web-creators-hub.com/?p=749</guid>
		<description><![CDATA[kernel.phpをLaravel7のソース8にコピペしたときに出たエラー。 エラーの原因 kernel.php Laravel7の場合 ...]]></description>
				<content:encoded><![CDATA[<p>kernel.phpをLaravel7のソース8にコピペしたときに出たエラー。</p>
<h2>エラーの原因</h2>
<p>kernel.php</p>
<p>Laravel7の場合</p>
<pre class="brush: bash; title: ; notranslate">
        'stateful_api' =&gt; [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            'throttle:60,1',
            'bindings',
        ],
</pre>
<p>Laravel8の場合<br />
bindingsクラスをフルパスで記入する必要がある。<br />
bindings →  \Illuminate\Routing\Middleware\SubstituteBindings::class</p>
<pre class="brush: bash; title: ; notranslate">
        'stateful_api' =&gt; [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            'throttle:60,1',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
</pre>
]]></content:encoded>
			</item>
		<item>
		<title>【簡単】PowershellでXML構造ファイルをオブジェクト化して読み込む</title>
		<link>https://web-creators-hub.com/windows/powershell/xml/</link>
		<pubDate>Tue, 25 Feb 2020 07:51:27 +0000</pubDate>
		<dc:creator><![CDATA[taizo]]></dc:creator>
				<category><![CDATA[Powershell]]></category>

		<guid isPermaLink="false">https://web-creators-hub.com/?p=684</guid>
		<description><![CDATA[PowershellではXMLファイルを簡単に扱うことができます。XMLファイルを見やすく別のファイルに保存するときなどに利用します。 &#038;n...]]></description>
				<content:encoded><![CDATA[<p>PowershellではXMLファイルを簡単に扱うことができます。XMLファイルを見やすく別のファイルに保存するときなどに利用します。<br />
&nbsp;</p>
<h2>XMLファイルの内容をオブジェクトにする</h2>
<p>XMLの構造はツリー構造です。フォルダ構造とほぼ同じなのでフォルダのPAHTを記載するようにデータにアクセスします。</p>
<p>例えばPATHをオブジェクト風に記載すると以下のようになります。<br />
・PATH<br />
C:/Users/test/Desktop/test<br />
↓<br />
・オブジェクト風<br />
pathObj.Users.test.Desktop.test</p>
<p>では実際にpowershellを利用しXMLをオブジェクト化します。<br />
以下のサンプルXMLをデスクトップにtest.xmlファイルとして保存してください。</p>
<p>&nbsp;</p>
<h3>サンプルXML</h3>
<pre class="brush: bash; title: ; notranslate">
&lt;TestList version=&quot;2&quot; revision=&quot;1&quot;&gt;
	&lt;Item category=&quot;test&quot;&gt;
		&lt;ID type=&quot;int&quot;&gt;1&lt;/ID&gt;
		&lt;Name type=&quot;string&quot;&gt;テスト1&lt;/Name&gt;
		&lt;Description type=&quot;text&quot;&gt;テスト1の内容&lt;/Description&gt;
		&lt;/Item&gt;
	&lt;Item category=&quot;test&quot;&gt;
		&lt;ID type=&quot;int&quot;&gt;2&lt;/ID&gt;
		&lt;Name type=&quot;string&quot;&gt;テスト2&lt;/Name&gt;
		&lt;Description type=&quot;text&quot;&gt;テスト2の内容&lt;/Description&gt;
	&lt;/Item&gt;
	&lt;Item category=&quot;test&quot;&gt;
		&lt;ID type=&quot;int&quot;&gt;3&lt;/ID&gt;
		&lt;Name type=&quot;string&quot;&gt;テスト3&lt;/Name&gt;
		&lt;Description type=&quot;text&quot;&gt;テスト3の内容&lt;/Description&gt;
	&lt;/Item&gt;
	&lt;Item category=&quot;news&quot;&gt;
		&lt;ID type=&quot;int&quot;&gt;4&lt;/ID&gt;
		&lt;Name type=&quot;string&quot;&gt;ニュース1&lt;/Name&gt;
		&lt;Description type=&quot;text&quot;&gt;ニュース1の内容&lt;/Description&gt;
	&lt;/Item&gt;
	&lt;Item category=&quot;news&quot;&gt;
		&lt;ID type=&quot;int&quot;&gt;5&lt;/ID&gt;
		&lt;Name type=&quot;string&quot;&gt;ニュース2&lt;/Name&gt;
		&lt;Description type=&quot;text&quot;&gt;ニュース2の内容&lt;/Description&gt;
	&lt;/Item&gt;
	&lt;Item category=&quot;news&quot;&gt;
		&lt;ID type=&quot;int&quot;&gt;6&lt;/ID&gt;
		&lt;Name type=&quot;string&quot;&gt;ニュース3&lt;/Name&gt;
		&lt;Description type=&quot;text&quot;&gt;ニュース3の内容&lt;/Description&gt;
	&lt;/Item&gt;
&lt;/TestList&gt;
</pre>
<p>コードを記載するためtest.ps1ファイルを作成します。</p>
<p>test.ps1を右クリック→編集をクリックしファイルを開きます。<br />
以下のコードをコピペします。</p>
<pre class="brush: bash; title: ; notranslate">
# 現在のパス取得
$scriptPath = [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.Definition)

# xmlファイルのPATH
$source = &quot;$scriptPath\test.xml&quot;

# xmlオブジェクト作成
$xmlObj = (Get-Content -path &quot;$source&quot;)
# データはループさせて取得
foreach ($List in $xmlObj.TestList) {
        foreach ($item in $List.Item) {
            echo $item.Name.innerText
        }
}
</pre>
<p>&nbsp;</p>
<h2>説明</h2>
<p>&nbsp;</p>
<h3>1.オブジェクト化</h3>
<pre class="brush: bash; title: ; notranslate">
$scriptPath = [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.Definition)
$source = &quot;$scriptPath\test.xml&quot;
$xmlObj = (Get-Content -path &quot;$source&quot;)
</pre>
<p>XMLファイルをオブジェクト化するためXMLファイルのPATHを取得します。<br />
ファイルのデータを一行づつ取得するGet-Contentコマンドに使用します。これでは普通テキストファイルのような処理になっていまいますのでXMLを扱えるように全体をXMLにキャストします。</p>
<h3>2.要素の値を取得</h3>
<pre class="brush: bash; title: ; notranslate">
foreach ($List in $xmlObj.TestList) {
    foreach ($item in $List.Item) {
       echo $item.Name.innerText
    }
}
</pre>
<p>要素の値を取得する場合はinnerTextプロパティを使用します。<br />
オブジェクト.innerText<br />
&nbsp;</p>
<h3>3.属性の値を取得</h3>
<pre class="brush: bash; title: ; notranslate">
foreach ($List in $xmlObj.TestList) {
    foreach ($item in $List.Item) {
       echo $item.GetAttribute(&quot;category&quot;)
    }
}
</pre>
<p>属性の値を取得する場合はGetAttributeメソッドを使用します。<br />
オブジェクト.GetAttribute(&#8220;属性名&#8221;)</p>
<p>&nbsp;</p>
<h2>特定の条件により処理する</h2>
<p>if文を利用し特定の条件にマッチした値のみ取得します。<br />
例ではItemのcategory属性の値が「test」になっている要素の値を取得します。</p>
<pre class="brush: bash; title: ; notranslate">
# 現在のパス取得
$scriptPath = [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.Definition)

# xmlファイルのPATH
$source = &quot;$scriptPath\test.xml&quot;

# xmlオブジェクト作成
$xmlObj = (Get-Content -path &quot;$source&quot;)
# データはループさせて取得
foreach ($List in $xmlObj.TestList) {
        foreach ($item in $List.Item) {
            if($item.GetAttribute(&quot;category&quot;) -eq &quot;test&quot;){
             echo $item.Name.innerText
             }
        }
}
</pre>
]]></content:encoded>
			</item>
		<item>
		<title>PHPパッケージ管理ツール「Composer」をWindows10にインストール</title>
		<link>https://web-creators-hub.com/php/composer/</link>
		<pubDate>Thu, 20 Feb 2020 15:15:27 +0000</pubDate>
		<dc:creator><![CDATA[taizo]]></dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">https://web-creators-hub.com/?p=674</guid>
		<description><![CDATA[PHPのパッケージ管理ツール「Composer」をWindows10にインストールします。PHPを使用するためXAMPPなどインストールされ...]]></description>
				<content:encoded><![CDATA[<p>PHPのパッケージ管理ツール「Composer」をWindows10にインストールします。PHPを使用するためXAMPPなどインストールされている必要があります。<br />
Composerは、Lalavelのインストールなどに使います。</p>
<h2>Composerインストーラーをダウンロード</h2>
<p>以下のURLからComposer-Setup.exeをダウンロードします。<br />
<a href="https://getcomposer.org/doc/00-intro.md#installation-windows">https://getcomposer.org/doc/00-intro.md#installation-windows</a></p>
<h2>Composerのインストール</h2>
<p>ダウンロードしたインストーラをダブルクリックで実行します。画面がでてきたら「Next」を押します。<br />
<a href="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer1.png"><img src="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer1.png" alt="" width="640" height="475" class="alignnone size-full wp-image-675" srcset="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer1.png 640w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer1-300x223.png 300w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer1-320x238.png 320w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>
<p>XAMPPがインストールされている場合は、自動的にPHPの実行ファイルを認識してくれます。認識してくれない場合は、任意で設定する必要があります。<br />
設定が終わったら「Next」を押します。<br />
<a href="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer2.png"><img src="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer2.png" alt="" width="640" height="475" class="alignnone size-full wp-image-676" srcset="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer2.png 640w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer2-300x223.png 300w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer2-320x238.png 320w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>
<p>プロキシの設定画面が表示されます。必要がある場合は設定して「Next」を押します。<br />
<a href="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer3.png"><img src="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer3.png" alt="" width="640" height="475" class="alignnone size-full wp-image-677" srcset="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer3.png 640w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer3-300x223.png 300w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer3-320x238.png 320w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>
<p>確認画面が出るので問題がなければ「Install」を押します。<br />
<a href="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer4.png"><img src="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer4.png" alt="" width="640" height="475" class="alignnone size-full wp-image-678" srcset="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer4.png 640w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer4-300x223.png 300w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer4-320x238.png 320w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>
<p>インストール完了後注意書きを読み問題なければ「Next」を押します。<br />
<a href="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer5.png"><img src="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer5.png" alt="" width="640" height="475" class="alignnone size-full wp-image-679" srcset="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer5.png 640w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer5-300x223.png 300w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer5-320x238.png 320w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>
<p>インストール終了です。<br />
<a href="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer6.png"><img src="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer6.png" alt="" width="640" height="475" class="alignnone size-full wp-image-680" srcset="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer6.png 640w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer6-300x223.png 300w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer6-320x238.png 320w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>
<h2>動作を確認する</h2>
<p>コマンドプロンプトを起動しと入力しエラーがでなければ動作完了です。</p>
<pre class="brush: bash; title: ; notranslate">
composer -V
</pre>
<p><a href="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer7.png"><img src="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer7.png" alt="" width="600" height="314" class="alignnone size-full wp-image-681" srcset="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer7.png 600w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer7-300x157.png 300w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/composer7-320x167.png 320w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>
]]></content:encoded>
			</item>
		<item>
		<title>Postfix + dovecot バーチャルメールボックスの設定を深堀する</title>
		<link>https://web-creators-hub.com/linux/postfix3/</link>
		<pubDate>Sat, 01 Feb 2020 14:27:09 +0000</pubDate>
		<dc:creator><![CDATA[taizo]]></dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Postfix]]></category>

		<guid isPermaLink="false">https://web-creators-hub.com/?p=607</guid>
		<description><![CDATA[メールサーバは、配送先を1つのドメインのみ設定できるのではなく、複数のドメインを配送先として設定できます。指定された配送先のドメインをどのよ...]]></description>
				<content:encoded><![CDATA[<p>メールサーバは、配送先を1つのドメインのみ設定できるのではなく、複数のドメインを配送先として設定できます。指定された配送先のドメインをどのように仕分けを行うかはいろいろな方法が用意されています。</p>
<p>&nbsp;</p>
<h2>前提</h2>
<p>前提としてメール保管形式は、Maildir形式にします。Postfixとdovecotの設定は、以下に設定してください。</p>
<p><a href="https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix4.png"><img src="https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix4.png" alt="" width="920" height="426" class="alignnone size-full wp-image-352" srcset="https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix4.png 920w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix4-300x139.png 300w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix4-768x356.png 768w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix4-320x148.png 320w" sizes="(max-width: 920px) 100vw, 920px" /></a></p>
<p>&nbsp;</p>
<h3>Postfix　Maildir形式の設定</h3>
<pre class="brush: bash; title: ; notranslate">
vi /etc/postfix/main.cf
</pre>
<pre class="brush: bash; title: ; notranslate">
#MailDir形式に設定
home_mailbox = Maildir/
</pre>
<p>設定の反映は、Postfixを再起動してください。</p>
<p>&nbsp;</p>
<h3>dovecot　Maildir形式の設定</h3>
<p>まずdovecotのインストールします。すでにインストールされている場合は、飛ばしてください。</p>
<pre class="brush: bash; title: ; notranslate">
yum install dovecot
</pre>
<p>以下Maildir形式の設定です。</p>
<pre class="brush: bash; title: ; notranslate">
vi /etc/dovecot/conf.d/10-mail.conf
</pre>
<pre class="brush: bash; title: ; notranslate">
mail_location = maildir:~/Maildir
</pre>
<p>設定の反映は、dovecotを再起動してください。</p>
<p>&nbsp;</p>
<h2>バーチャルメールボックスを設定する方法</h2>
<p>バーチャルメールボックスを実現する方法は、3つあります。それは、<span class="marker-under">mydestinationを利用する方法、バーチャルエイリアスを利用する方法、バーチャルメールボックスを利用する方法</span>です。</p>
<p>&nbsp;</p>
<h2>mydestinationを利用した場合</h2>
<p>mydestinationは、宛先、行先を意味しここにドメインを設定するとメールの宛先を見て、設定されているドメインの場合、自サーバに配送されます。ここからどのユーザーに配送するか仕分けします。仕分けは、ドメインを完全に無視しユーザー名のみで仕分けされます。ユーザーは、Linuxで設定されているユーザーのメールボックスに配送されます。</p>
<p><a href="https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix3.png"><img class="alignnone size-full wp-image-351" src="https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix3.png" alt="" width="775" height="367" srcset="https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix3.png 775w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix3-300x142.png 300w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix3-768x364.png 768w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix3-320x152.png 320w" sizes="(max-width: 775px) 100vw, 775px" /></a></p>
<p><a href="https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix5.png"><img class="alignnone size-full wp-image-353" src="https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix5.png" alt="" width="734" height="357" srcset="https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix5.png 734w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix5-300x146.png 300w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix5-320x156.png 320w" sizes="(max-width: 734px) 100vw, 734px" /></a></p>
<p>例としてgmail.comと設定した場合、設定されたサーバから送信すると実際のgmail.com宛には配送されず自サーバに配送されます。</p>
<pre class="brush: bash; title: ; notranslate">
vi /etc/postfix/main.cf
</pre>
<pre class="brush: bash; title: ; notranslate">
mydestination = $myhostname, localhost.$mydomain, localhost,gmail.com
</pre>
<p>また、後に説明するバーチャルエイリアス、バーチャルメールボックスを設定してもmydestinationで設定したほうが優先され、仕分けもvirtual_alias_maps、virtual_mailbox_mapsで設定していても完全に無視され、Linuxのユーザーに仕分けされるので設定には注意が必要です。</p>
<p>&nbsp;</p>
<h2>バーチャルエイリアスを設定した場合</h2>
<p>バーチャルエイリアスは、宛先のドメインがvirtual_alias_domainsで設定されているものと一致した場合、自サーバに配送されます。そしてvirtual_alias_mapsの記載されている内容を基に仕分けされます。virtual_alias_mapsは、宛先のメールアドレスを基に既存のどのLinuxユーザーに配送するかを記載します。</p>
<p><a href="https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix6.png"><img class="alignnone size-full wp-image-354" src="https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix6.png" alt="" width="734" height="384" srcset="https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix6.png 734w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix6-300x157.png 300w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix6-320x167.png 320w" sizes="(max-width: 734px) 100vw, 734px" /></a></p>
<p>&nbsp;</p>
<h3>Postfixの設定</h3>
<pre class="brush: bash; title: ; notranslate">
vi /etc/postfix/main.cf
</pre>
<pre class="brush: bash; title: ; notranslate">
virtual_alias_domains = hogehoge.com
virtual_alias_maps = hash:/etc/postfix/virtual
</pre>
<p>&nbsp;</p>
<h3>どのユーザーに配送するか設定する</h3>
<pre class="brush: bash; title: ; notranslate">
vi /etc/postfix/virtual
</pre>
<pre class="brush: bash; title: ; notranslate">
#以下のように[ドメイン] anythingを記述したあとメールアドレスとユーザーを関連付ける
hogehoge.com              anything
newname@hogehoge.com      newname
</pre>
<p>hash化されたDBを作成します。以下のコマンドで設定が反映します。</p>
<pre class="brush: bash; title: ; notranslate">
postmap /etc/postfix/virtual
</pre>
<p>宛先のアカウントはadduserで作成しておきます。</p>
<p>&nbsp;</p>
<h2>バーチャルメールボックスを設定した場合</h2>
<p>バーチャルメールボックスは、Linuxのユーザーを使わず独自にユーザーを作成しメールアドレスと関連付けます。Linuxのユーザーと切り分けができるため独立性が高まり、管理もしやすくなります。ユーザーとメールボックスは、Linuxのユーザーを使わないため独自に用意する必要があります。</p>
<p>バーチャルメールボックスは、宛先のドメインがvirtual_mailbox_domainsで設定されているものと一致した場合、自サーバに配送されvirtual_mailbox_mapsの記載されている内容を基に仕分けします。virtual_mailbox_mapsは、宛先のメールアドレス(ユーザー名)を基にどのメールボックスに配送するかを記載します。メールボックスのディレクトリは、virtual_mailbox_baseで設定します。メールボックスのディレクトの権限を持つユーザー、グループは、virtual_uid_maps、virtual_gid_mapsで定義します。</p>
<p><a href="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/postfix12.png"><img src="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/postfix12.png" alt="" width="768" class="alignnone size-full wp-image-661" srcset="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/postfix12.png 817w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/postfix12-300x149.png 300w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/postfix12-768x383.png 768w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/postfix12-320x159.png 320w" sizes="(max-width: 817px) 100vw, 817px" /></a></p>
<p>&nbsp;</p>
<h3>Postfixの設定</h3>
<pre class="brush: bash; title: ; notranslate">
vi /etc/postfix/main.cf
</pre>
<pre class="brush: bash; title: ; notranslate">
#自サーバに配送するドメイン。複数記述する場合カンマで追加
virtual_mailbox_domains = hogehoge.com
#仕分け時に利用する関連付けファイル
virtual_mailbox_maps = hash:/etc/postfix/vmail
#メールボックスのディレクトの権限を持つユーザーID、グループID
virtual_uid_maps = static:10000
virtual_gid_maps = static:10000
#メールボックスのディレクトリ
virtual_mailbox_base = /var/www/vmailbox
</pre>
<p>&nbsp;</p>
<h3>メールボックスの作成</h3>
<pre class="brush: bash; title: ; notranslate">
#メールボックスのディレクトの権限を持つユーザー、グループを作成
groupadd -g 10000 vmailg
useradd -u 10000 -g vmailg vmail
#バーチャルメールボックスのディレクトリを作成。このディレクトリにユーザーのメールボックスが作成される。
mkdir /var/www/vmailbox
#権限変更
chown -R 10000.10000 /var/www/vmailbox
</pre>
<p>&nbsp;</p>
<h3>どのユーザーに、どこのメールボックスへ配送するか記載する</h3>
<p>ユーザー名と配送先のメールボックスのpathを記入します。ユーザー名はメールアドレスと同一にします。pathは/ドメイン名/@の前のユーザー名/Maildir/にします。これは後に設定するdovecotの設定と合わすためです。</p>
<pre class="brush: bash; title: ; notranslate">
vi /etc/postfix/vmail
</pre>
<pre class="brush: bash; title: ; notranslate">
test@hogehoge.com      hogehoge.com/test/Maildir/
</pre>
<p>hash化されたDBを作成します。以下のコマンドで設定が反映します。</p>
<pre class="brush: bash; title: ; notranslate">
postmap /etc/postfix/vmail
</pre>
<p>&nbsp;</p>
<h2>バーチャルメールボックスに対応したdovecotの設定</h2>
<p>Postfixの設定で送信されてきたメールは、無事メールボックスに配送されます。しかしユーザーがメーラーでメールを受信するためには、バーチャルメールボックスに対応したdovecotの設定が必要です。</p>
<p>&nbsp;</p>
<h3>バーチャルメールボックスの設定</h3>
<p>dovecotの認証関連の設定を変更します。デフォルトの認証方法は、Linuxのユーザーのみになっているので、dovecotで独自のユーザー情報を利用した認証方法に変更します。このユーザーを利用して先ほど設定したPostfixの設定に対応させます。</p>
<p>dovecotのアカウント情報は、ユーザーDBとパスワードDBで構成されています。DBは、外部のアカウントシステムやファイルを参照することで情報を管理します。今回は、ユーザーDBにstatic(静的にメールボックスのpathを定義)とpasswdfile(認証用ユーザー)、パスワードDBにpasswdfile(認証用ユーザーに対応したパスワード)を使用します。</p>
<p><a href="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/dovecot_db.png"><img src="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/dovecot_db.png" alt="" width="840" height="400" class="alignnone size-full wp-image-662" srcset="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/dovecot_db.png 840w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/dovecot_db-300x143.png 300w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/dovecot_db-768x366.png 768w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/dovecot_db-320x152.png 320w" sizes="(max-width: 840px) 100vw, 840px" /></a></p>
<p>以下の設定で認証方法を変更します。</p>
<pre class="brush: bash; title: ; notranslate">
vi /etc/dovecot/conf.d/10-auth.conf
</pre>
<pre class="brush: bash; title: ; notranslate">
#!include auth-deny.conf.ext
#!include auth-master.conf.ext
#認証時のパスフレーズの送信方法を指定。デフォルトは plain。
auth_mechanisms = cram-md5 plain login
#Linuxのアカウントを使って認証を使用する。使わない場合はコメントアウトする。
!include auth-system.conf.ext
#!include auth-sql.conf.ext
#!include auth-ldap.conf.ext
#Dovecotの認証データベースを使用する。#を外す
!include auth-passwdfile.conf.ext
#!include auth-checkpassword.conf.ext
#!include auth-vpopmail.conf.ext
#静的なPathを設定するデータベースを使用する。#を外す。この設定でPostfixのメールボックスに対応させる。
!include auth-static.conf.ext
</pre>
<p>&nbsp;</p>
<h3>dovecot独自のユーザーを設定する</h3>
<p>以下の設定で独自のユーザー情報が記載されたファイルを定義します。</p>
<pre class="brush: bash; title: ; notranslate">
vi /etc/dovecot/conf.d/auth-passwdfile.conf.ext
</pre>
<pre class="brush: bash; title: ; notranslate">
passdb {
  driver = passwd-file
  #args = scheme=CRYPT username_format=%u /etc/dovecot/users
  args = scheme=CRAM-MD5 username_format=%u /etc/dovecot/passwd
}

userdb {
  driver = passwd-file
  #args = username_format=%u /etc/dovecot/users
  args = scheme=CRAM-MD5 username_format=%u /etc/dovecot/passwd
}
</pre>
<p>次は、ユーザーに設定するパスワードを先に作成します。</p>
<pre class="brush: bash; title: ; notranslate">
#パスワード生成コマンド
doveadm pw
Enter new password:←パスワードを入力
Retype new password:←再度パスワードを入力
#生成されたパスワードは後に貼り付けるのでコピーする
{CRAM-MD5}fe8522268d91e485ccac8f36800e4fa6b10363e2a371....
</pre>
<p>最後にユーザーを作成します。</p>
<pre class="brush: bash; title: ; notranslate">
vi /etc/dovecot/passwd
</pre>
<p>ユーザー名は、必ずメールアドレスと同一にします。これは、userdbで「username_format=%u」と設定したからです。%uは、メールアドレス全体を表します。これを「username_format=%n」とすると@の前のユーザー名で定義する必要があります。パスワードは、先ほどコピーしたパスワードを貼り付けます。</p>
<pre class="brush: bash; title: ; notranslate">
#ユーザー名:パスワード　で設定
#userdbでusername_format=%uにした場合
test@hogehoge.com:{CRAM-MD5}fe8522268d91e485ccac8f36800e4fa6b10363e2a371....

#userdbでusername_format=%nにした場合は@以降を削除する
#test:{CRAM-MD5}fe8522268d91e485ccac8f36800e4fa6b10363e2a371....
</pre>
<h3>バーチャルメールボックスのPathを設定する</h3>
<p>Postfixで設定したバーチャルメールボックスからメーラーで受信できるように設定します。<br />
以下の設定でPostfixで設定したバーチャルメールボックス、ユーザーID、グループIDを設定します。<br />
argsのhomeでメールボックスのpathを定義します。ユーザー名をメールアドレスにすることで変数%dと%nを使うことができます。%dは、ユーザー名の@以後のドメイン名を参照し%nは@の前のユーザー名を参照します。これでメールボックスのpathを動的に定義することができます。</p>
<p><a href="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/user_format.png"><img src="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/user_format.png" alt="" width="601" height="337" class="alignnone size-full wp-image-671" srcset="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/user_format.png 601w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/user_format-300x168.png 300w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/user_format-320x179.png 320w" sizes="(max-width: 601px) 100vw, 601px" /></a></p>
<pre class="brush: bash; title: ; notranslate">
vi /etc/dovecot/conf.d/auth-static.conf.ext
</pre>
<pre class="brush: bash; title: ; notranslate">
userdb {
  driver = static
  #args = uid=vmail gid=vmail home=/home/%u
  #Postfixで設定したバーチャルメールボックス、ユーザーID、グループIDを記載する
  #%dはユーザー名の@以後のドメイン名、%nは@の前のユーザー名
  args = uid=10000 gid=10000 home=/var/www/vmailbox/%d/%n
}
</pre>
<p>特殊変数の詳しい説明はこちら<br />
<a href="https://doc.dovecot.org/configuration_manual/config_file/config_variables/#config-variables" rel="noopener" target="_blank">https://doc.dovecot.org/configuration_manual/config_file/config_variables/#config-variables</a></p>
<p>dovecotを再起動すると設定が反映され、メーラーからメールを受信することができます。</p>
]]></content:encoded>
			</item>
		<item>
		<title>SMTP-AUTH(認証機能)を使ったメール送信 Postfix + dovecot の設定</title>
		<link>https://web-creators-hub.com/linux/postfix2/</link>
		<pubDate>Wed, 29 Jan 2020 16:08:25 +0000</pubDate>
		<dc:creator><![CDATA[taizo]]></dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Postfix]]></category>

		<guid isPermaLink="false">https://web-creators-hub.com/?p=597</guid>
		<description><![CDATA[前回のつづき 前回までは「mynetworks」で設定したネットワーク内でしか外部送信できませんでしたが、今回は、「mynetworks」以...]]></description>
				<content:encoded><![CDATA[<p>前回のつづき<br />
<div class="linkcard"><table border="1" cellspacing="0" cellpadding="4"><tbody></tr><tr><td><br><a class="lkc-link no_icon" href="https://web-creators-hub.com/linux/postfix-basic/">【基本】理解しながらPostfixの設定を行う</a> - Web Creators Hub</td></tr></tbody></table></div></p>
<p>前回までは「mynetworks」で設定したネットワーク内でしか外部送信できませんでしたが、今回は、「mynetworks」以外から送信をできるようにします。それを実現するためにSMTPに認証機能(SMTP-AUTH)を実装します。まずはSMTP-AUTHとはなにか理解する必要があります。</p>
<p>&nbsp;</p>
<h2>SMTP-AUTHとは</h2>
<p>スパムメールがなかった時代、メール送信サーバは、認証などなくだれでも送信できる状態でした。しかしスパムメールが流行りだすと誰でも送信できないようにメール送信にも認証が必要になりました。当初は、そのような認証機能がなかったため、POP認証の機能を使い代用していました。それが「POP before SMTP」です。そして現在では、送信サーバは、自前の認証機能を持つようになりました。それが「SMTP AUTH」です。「SMTP AUTH」は、「SASL」をいうライブラリ(フレームワーク)を使って認証システムを実現しています。</p>
<p><a href="https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix8.png"><img src="https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix8.png" alt="" width="479" height="447" class="alignnone size-full wp-image-356" srcset="https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix8.png 479w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix8-300x280.png 300w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix8-320x299.png 320w" sizes="(max-width: 479px) 100vw, 479px" /></a></p>
<p>&nbsp;</p>
<h2>SASL</h2>
<p>SASLはSimple Authentication and Security Layerの略で認証システムを実現するライブラリ(フレームワーク)です。Postfixだけでなくさまざまなアプリケーションで使用されています。SASLは主に「Cyrus-SASL」と「Dovecot-SASL」というライブラリを使用しています。</p>
<p>&nbsp;</p>
<h2>Dovecot-SASL</h2>
<p>今回は「Dovecot-SASL」ライブラリを使用して認証システムを実現します。Postfixはdovecotと親和性が高く、アカウントを共有することができます。POP認証用とSMTPの認証を一元管理することができます。ちなみに「Cyrus-SASL」はSMTP用とPOP用の2種類別々に管理する必要があります。</p>
<p><a href="https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix9.png"><img src="https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix9.png" alt="" width="726" height="331" class="alignnone size-full wp-image-357" srcset="https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix9.png 726w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix9-300x137.png 300w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix9-320x146.png 320w" sizes="(max-width: 726px) 100vw, 726px" /></a></p>
<p>&nbsp;</p>
<h2>PostfixのSMTP AUTHの設定</h2>
<p>まずはPostfixの設定から。「smtpd_sasl_type」をdovecotに指定することで「Dovecot-SASL」ライブラリが使用できます。</p>
<pre class="brush: bash; title: ; notranslate">
vi /etc/postfix/main.cf
</pre>
<pre class="brush: bash; title: ; notranslate">
##smtpauth setting
#SASL認証を有効にする
smtpd_sasl_auth_enable = yes
#RCPT TO コマンドへの対応方法を制御
#mynetworksで定義したものを許可、認証成功している場合許可、認証失敗は拒否
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
#Anonymous認証を拒否
smtpd_sasl_security_options = noanonymous
#outlookでSASL認証を使えるようにする。
broken_sasl_auth_clients = yes
#SASL認証で利用するレルム(ドメイン)を指定
smtpd_sasl_local_domain = $myhostname
#Dovecot-SASLを使用する
smtpd_sasl_type = dovecot
#Dovecot-SASLで使用するソケットファイル
smtpd_sasl_path = private/auth
#VRFYコマンドを無効化
disable_vrfy_command = yes
</pre>
<p>&nbsp;</p>
<h2>dovecotのインストール</h2>
<p>まずは、POPサーバのアプリケーション、dovecotをインストールします。SMTPの認証に「Dovecot-SASL」を使用するとアカウント情報をdovecotに合わすため、dovecotをインストールする必要があります。</p>
<pre class="brush: bash; title: ; notranslate">
yum install dovecot
</pre>
<p>&nbsp;</p>
<h2>dovecot側のSMTP AUTHの設定</h2>
<p>Postfix側が指定のソケットを通じてdovecotのアカウント情報にアクセスできるように設定します。<br />
これでPostfixがdovecotのアカウントを使って認証することができます。</p>
<pre class="brush: bash; title: ; notranslate">
vi /etc/dovecot/conf.d/10-master.conf
</pre>
<pre class="brush: bash; title: ; notranslate">
  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }
</pre>
<p>&nbsp;</p>
<h2>dovecotの認証情報の確認</h2>
<p>dovecotの認証に使っているアカウント情報がどこか確認します。デフォルトではLinuxのユーザーを使用しているので念のため確認します。「!include auth-system.conf.ext」がコメントアウトされていなければ問題ありません。ここがコメントアウトされている場合は、Linuxのユーザーを使用しない設定になっています。</p>
<pre class="brush: bash; title: ; notranslate">
vi /etc/dovecot/conf.d/10-auth.conf
</pre>
<pre class="brush: bash; title: ; notranslate">
#!include auth-deny.conf.ext
#!include auth-master.conf.ext
auth_mechanisms = plain login
#Linuxのアカウントを使って認証
!include auth-system.conf.ext
#!include auth-sql.conf.ext
#!include auth-ldap.conf.ext
#!include auth-passwdfile.conf.ext
#!include auth-checkpassword.conf.ext
#!include auth-vpopmail.conf.ext
#!include auth-static.conf.ext
</pre>
<p>次回はバーチャルメールボックス(バーチャルホスト)の設定を説明します。<br />
<div class="linkcard"><table border="1" cellspacing="0" cellpadding="4"><tbody></tr><tr><td><br><a class="lkc-link no_icon" href="https://web-creators-hub.com/linux/postfix3/">Postfix + dovecot バーチャルメールボックスの設定を深堀する</a> - Web Creators Hub</td></tr></tbody></table></div></p>
]]></content:encoded>
			</item>
		<item>
		<title>【基本】理解しながらPostfixの設定を行う</title>
		<link>https://web-creators-hub.com/linux/postfix-basic/</link>
		<pubDate>Wed, 22 Jan 2020 16:01:54 +0000</pubDate>
		<dc:creator><![CDATA[taizo]]></dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Postfix]]></category>

		<guid isPermaLink="false">https://web-creators-hub.com/?p=348</guid>
		<description><![CDATA[メール送受信の全体像 クライアントからメールを送るとメールサーバはそのメールを送信先へ配送します。配送されたメールは最終的に送信先の受信ボッ...]]></description>
				<content:encoded><![CDATA[<h2>メール送受信の全体像</h2>
<p>クライアントからメールを送るとメールサーバはそのメールを送信先へ配送します。配送されたメールは最終的に送信先の受信ボックスに届けられます。送信先のクライアントはメールを受け取るためサーバにアクセスし受け取ります。</p>
<p>この一連の流れではそれぞれ役割が分担されていて、バケツリレーのようにメールを配送していきます。そしてそれぞれの役割を理解することでメールの技術的なことを基本から理解することができます。</p>
<p>その役割は4つに分けられそれぞれ名前がついています。</p>
<p><img class="alignnone size-full wp-image-349" src="https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix1.png" alt="" width="999" height="532" srcset="https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix1.png 999w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix1-300x160.png 300w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix1-768x409.png 768w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix1-320x170.png 320w" sizes="(max-width: 999px) 100vw, 999px" /></p>
<p>■MUA(Mail User Agent)<br />
メールを送受信するクライアントのこと。Thunderbirdやoutlookなどのメーラーがその役割を担当します。プロトコルはSMTP、POP3など。</p>
<p>■MTA（Mail Transfer Agent）<br />
メールの配送・転送するサーバのこと。Postfixが担当します。プロトコルはSMTP。</p>
<p>■MDA（Mail Delivery Agent）<br />
メールボックスにメールを配送するサーバのこと。Postfixが担当します。プロトコルはSMTP。</p>
<p>■MRA（Mail Retrieval Agent ）<br />
配送されたメールをMUAに渡すサーバのこと。dovecotが担当します。プロトコルはPOP3など。</p>
<p><a href="https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix2.png"><img src="https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix2.png" alt="" width="873" height="289" class="alignnone size-full wp-image-350" srcset="https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix2.png 873w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix2-300x99.png 300w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix2-768x254.png 768w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/10/postfix2-320x106.png 320w" sizes="(max-width: 873px) 100vw, 873px" /></a></p>
<p>今回設定するPostfixはMTA、MDA、dovecotはMRAになります。これらを意識して設定すると理解力が上がります。</p>
<p>&nbsp;</p>
<h2>Postfixの設定</h2>
<p>全体像を理解した上でPostfixの設定を行っていきます。SSHでサーバにログインしPostfixを起動します。</p>
<pre class="brush: bash; title: ; notranslate">
service postfix start
</pre>
<p>&nbsp;</p>
<h2>ローカルからの送信時のFromの値を設定する [mydomain]と[myorigin]</h2>
<p>起動するとメールを送信することができますが、デフォルトではローカルからでしか送信できません。とりあえずサーバからメールを送信してみましょう。mailコマンドで送信します。送信先は任意で設定し送信してください。</p>
<p><code></p>
<pre>#メールコマンド
mail 送信先メールアドレス</pre>
<p></code></p>
<pre class="brush: bash; title: ; notranslate">
mail test@hogehoge.com
Subject: test
test
.
</pre>
<p>メールを受信しメールの内容を確認すると差出人(from)がサーバのドメインになっていると思います。これはPostfixのmyoriginの設定がそのようになっているからです。この値を変えることでローカルからのメールを送信した場合、Fromの値を変えることができます。</p>
<pre class="brush: bash; title: ; notranslate">
vi /etc/postfix/main.cf
</pre>
<pre class="brush: bash; title: ; notranslate">
mydomain = sample.com
myorigin = $mydomain
</pre>
<p>ログインしているアカウントがrootの場合、fromの値はroot@sample.comになります。myoriginの設定はそれほど重要ではないのでデフォルトのままで結構です。mydomainの値はweb-creators-hub.comなど任意のドメインを設定します。</p>
<p>&nbsp;<br />
&nbsp;</p>
<h2>外部からPostfixに通信できるようにする</h2>
<p>デフォルトではPCからPostfixに通信することができません。これを解決するためには<span class="marker-under">iptables、OP25B対策、postfix</span>の設定を行います。<br />
&nbsp;</p>
<h3>iptableで25番と587番を開放</h3>
<p>iptablesの設定を変更しポートを開放します。</p>
<pre class="brush: bash; title: ; notranslate">
vi /etc/sysconfig/iptables
</pre>
<pre class="brush: bash; title: ; notranslate">
-A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 587 -j ACCEPT
</pre>
<p>再起動し反映。</p>
<pre class="brush: bash; title: ; notranslate">
service iptables restart
</pre>
<p>ここを開放してもまだ通信できせん。次にpostfixの設定を変更します。<br />
&nbsp;</p>
<h3>inet_interfacesの設定</h3>
<p>この設定を変更しないと外部から送信できません。これはポートがlocalhostからしかバインドできずLISTEN状態になっていないからです。これはnetstatコマンドで確認することができます。</p>
<pre class="brush: bash; title: ; notranslate">
netstat -ant | grep LISTEN
</pre>
<pre class="brush: bash; title: ; notranslate">
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN
</pre>
<p>これを外部からバインドできるように設定変更します。</p>
<pre class="brush: bash; title: ; notranslate">
vi /etc/postfix/main.cf
</pre>
<pre class="brush: bash; title: ; notranslate">
#inet_interfaces = localhost
inet_interfaces = all
</pre>
<p>この設定はiptablesのような効果があります。ここをallにすると25番ポートとバインドでき通信ができるようになります。<br />
設定を反映するため再起動します。</p>
<pre class="brush: bash; title: ; notranslate">
service postfix restart
</pre>
<p>もう一度ポートの状態を確認します。</p>
<pre class="brush: bash; title: ; notranslate">
netstat -ant | grep LISTEN
</pre>
<pre class="brush: bash; title: ; notranslate">
tcp        0      0 0.0.0.0:25                0.0.0.0:*                   LISTEN
</pre>
<p>これで外部からバインドできるようになりました。<br />
&nbsp;</p>
<h3>OP25B対策</h3>
<p>OP25B対策としてPostfixに587番ポートを使って通信できるように設定します。</p>
<pre class="brush: bash; title: ; notranslate">
vi /etc/postfix/master.cf
#submission inet n - n - - smtpd
#↓
submission inet n - n - - smtpd
</pre>
<p>再起動します。</p>
<pre class="brush: bash; title: ; notranslate">
service postfix restart
</pre>
<p>これで587番ポートがListen状態になり通信できるようになります。<br />
念のためnetstatで状態を確認します。</p>
<pre class="brush: bash; title: ; notranslate">
netstat -ant | grep LISTEN
</pre>
<pre class="brush: bash; title: ; notranslate">
tcp        0      0 0.0.0.0:25                0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:587                 0.0.0.0:*                   LISTEN
</pre>
<p>587番ポートがListen状態になっています。<br />
&nbsp;</p>
<h3>通信テスト</h3>
<p>それでは実際に通信できるかクライアントからtelnetを使って通信します。</p>
<pre class="brush: bash; title: ; notranslate">
telnet sample.com 587
220 ～ Postfix

</pre>
<p>応答が返ってきたら通信成功です。</p>
<p>&nbsp;</p>
<h2>PCからメールを送信できるようにする</h2>
<p>Postfixと通信できるようになりましたが、まだPCから送信することができません。これはデフォルトの設定で「ローカルのみ送信可能」という設定になっているためです。この設定を変更し送信できるようにします。以下の「mynetworks」がこれにあたります。</p>
<p>この設定にネットワークIPをを記入すると無条件(パスワードなどの認証なし)で配送する項目になります。そのためこの設定をミスると踏み台に利用されるため注意が必要です。</p>
<pre class="brush: bash; title: ; notranslate">
vi /etc/postfix/main.cf
</pre>
<pre class="brush: bash; title: ; notranslate">
#mynetworks = 127.0.0.0/8
mynetworks = 192.168.0.0/16
relay_domains = $mydestination
</pre>
<p>デフォルトでは「mynetworks」に127.0.0.0/8が記入されているので自サーバからしか送信することができません。これを「mynetworks = 192.168.0.0/16」に設定すると192.168.～からのIPアドレスに限り無条件で配送する設定になります。</p>
<p><a href="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/postfix11.png"><img src="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/postfix11.png" alt="" width="703" height="533" class="alignnone size-full wp-image-660" srcset="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/postfix11.png 703w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/postfix11-300x227.png 300w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/02/postfix11-320x243.png 320w" sizes="(max-width: 703px) 100vw, 703px" /></a></p>
<p>「relay_domains」は無条件で配送する送信先ドメイン(to)を設定します。例えばここに「gmail.com」と設定するとgmail.comを送信先とするメールは無条件で配送されます。</p>
<p>この二つの設定は、基本的にデフォルト設定で問題ありません。特にVPSなどで設定する場合は、プライベートアドレスを設定する場面が少ないため設定することがありません。「mynetworks」以外からの送信は、次回に紹介する認証機能(SMTP-AUTH)を使用して送信します。<br />
&nbsp;</p>
<h3>「mynetworks」の設定する場面</h3>
<p>プライベートネットワーク内でなにかしらのシステムが管理者にアラートを通知するときなどによく使われます。</p>
<p>つづきはこちら<br />
<div class="linkcard"><table border="1" cellspacing="0" cellpadding="4"><tbody></tr><tr><td><br><a class="lkc-link no_icon" href="https://web-creators-hub.com/linux/postfix2/">【続】dovecotの設定、Postfixの設定(認証機能、バーチャルメールボックス)</a> - Web Creators Hub</td></tr></tbody></table></div></p>
]]></content:encoded>
			</item>
		<item>
		<title>別々にあるバーチャルホストのログを集約 apache→fluentd→zabbix</title>
		<link>https://web-creators-hub.com/%e7%9b%a3%e8%a6%96/fluentd-apache/</link>
		<pubDate>Tue, 21 Jan 2020 16:02:42 +0000</pubDate>
		<dc:creator><![CDATA[taizo]]></dc:creator>
				<category><![CDATA[監視]]></category>

		<guid isPermaLink="false">https://web-creators-hub.com/?p=545</guid>
		<description><![CDATA[プロセスのメモリをある程度管理できたので、次にどのサイトがApacheの負荷をかけているのかをすぐに把握できないかと考えた。 また1台のサー...]]></description>
				<content:encoded><![CDATA[<p>プロセスのメモリをある程度管理できたので、次にどのサイトがApacheの負荷をかけているのかをすぐに把握できないかと考えた。</p>
<p>また1台のサーバでサイトを50サイトぐらい管理しているのだが、ログの場所がサイトごとに散らばっておりログの管理が大変だった。そこで「fluentd」を使ってログを集約しアクセス数をリアルタイムに監視できるようにした。</p>
<p>全体像は以下の通り。<br />
<a href="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/01/fluentd-3.png"><img class="alignnone size-full wp-image-548" src="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/01/fluentd-3.png" alt="" width="1395" height="569" srcset="https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/01/fluentd-3.png 1395w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/01/fluentd-3-300x122.png 300w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/01/fluentd-3-768x313.png 768w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/01/fluentd-3-1024x418.png 1024w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2020/01/fluentd-3-320x131.png 320w" sizes="(max-width: 1395px) 100vw, 1395px" /></a><br />
各サイトに散らばっているログを集約しdatacounterプラグインを使って集計しデータをzabbixに送って表示するといった感じだ。</p>
<h2>fluentdインストール</h2>
<p>まずはこれをインストールしないと始まらないので以下のコマンドでインストールする。これはCentOSの場合になる。</p>
<pre class="brush: bash; title: ; notranslate">
curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent3.sh | sh
</pre>
<p>以下のURLにほかのOSのインストール方法が記載されているのでCentOS以外の場合は調べてください。<br />
<a href="https://docs.fluentd.org/installation/install-by-rpm" rel="noopener" target="_blank">https://docs.fluentd.org/installation/install-by-rpm</a></p>
<h2>datacounterプラグインインストール</h2>
<p>集計部分を担当。</p>
<pre class="brush: bash; title: ; notranslate">
/opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-datacounter
</pre>
<h2>Zabbixプラグインインストール</h2>
<p>Zabbixにデータを送るためのプラグイン。</p>
<pre class="brush: bash; title: ; notranslate">
/opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-zabbix
</pre>
<h2>zabbix senderインストール</h2>
<p>前提としてZabbixのエージェントがインストールされていること。そのほかにZabbixトラッパーというタイプを使ってデータを送信するためテストコマンドが使えるように「zabbix sender」をインストールする。</p>
<pre class="brush: bash; title: ; notranslate">
yum install zabbix-sender.x86_64
</pre>
<h2>Zabbixのアイテム作成(テスト用)</h2>
<p>データの受け皿のアイテムをZabbixの管理画面から設定する。<br />
テストとして以下のアイテムを追加しておく。</p>
<p>・アイテム追加</p>
<pre class="brush: bash; title: ; notranslate">
名前:test
タイプ:Zabbixトラッパー
キー:test.trapper
データ型:文字列
</pre>
<h2>トラッパーテスト</h2>
<p>以下のコマンドを入力しデータが保存されるかテストする。ホスト名は、Zabbixでアイテムを登録したホスト名を記入する。</p>
<pre class="brush: bash; title: ; notranslate">
#/usr/bin/zabbix_sender -vv -z ZabbixサーバのIP -s &quot;ホスト名&quot; -k &quot;キー&quot; -o データ
#例：ZabbixサーバのIP：192.168.0.20　ホスト名：hogehoge キー：test.trapper データ：100の場合

/usr/bin/zabbix_sender -vv -z 192.168.0.20 -s &quot;hogehoge&quot; -k &quot;test.trapper&quot; -o 100
</pre>
<p>このコマンドでエラーが出た場合、修正しエラーがでないようにする。ここで設定したZabbixサーバのIPとホスト名はのちのfluentdの設定に使う。</p>
<h2>fluentdの設定</h2>
<pre class="brush: bash; title: ; notranslate">
vi /etc/td-agent/td-agent.conf
</pre>
<p>まずtailの部分を追加する。tailタイプはコマンドのtail -fと同じ感じでログをリアルタイムに監視する。これで散らばっていたサイトをログを集約する。</p>
<pre class="brush: bash; title: ; notranslate">
#バーチャルホスト1
&lt;source&gt;
  @type tail
  @id input_tail_sample1.com
  time_format %d/%b/%Y:%H:%M:%S %z
  path /var/www/vhosts/sample1.com/logs/access_log
  pos_file /var/log/td-agent/apache.sample1.com.pos
  tag apache.access.sample1.com
&lt;/source&gt;
#バーチャルホスト2
&lt;source&gt;
  @type tail
  @id input_tail_sample2.com
  time_format %d/%b/%Y:%H:%M:%S %z
  path /var/www/vhosts/sample2.com/logs/access_log
  pos_file /var/log/td-agent/apache.sample2.com.pos
  tag apache.access.sample2.com
&lt;/source&gt;
</pre>
<p>つぎに集計する部分を追加する。<br />
datacounterの説明サイトにサンプルが載っているのでそれをカスタマイズする。<br />
<a href="https://github.com/tagomoris/fluent-plugin-datacounter">https://github.com/tagomoris/fluent-plugin-datacounter</a></p>
<p>ログはここを通り集計される。</p>
<pre class="brush: bash; title: ; notranslate">
&lt;match apache.access.**&gt;
  type datacounter
  aggregate all
  count_interval 1m
  count_key code
  tag response.code.analysis
  pattern1 2xx ^2\d\d$
  pattern2 3xx ^3\d\d$
  pattern3 4xx ^4\d\d$
  pattern4 5xx ^5\d\d$
&lt;/match&gt;
</pre>
<p>最後に集計したデータを出力する部分を追加する。出力先を二か所にしたいのでcopyを使う。出力先はZabbixとファイル。<br />
zabbixの設定は上記でテストした値を入れる。</p>
<pre class="brush: bash; title: ; notranslate">
&lt;match monitor.duration&gt;
  @type copy
  &lt;store&gt;
   @type file
   @id output_file_duraion
   path /var/log/td-agent/apache.duraion
  &lt;/store&gt;
  &lt;store&gt;
    type zabbix
    zabbix_server 192.168.0.20
    host hogehoge
    name_key_pattern ^[num|min|max|avg|sum|percentile_90|percentile_95]
  &lt;/store&gt;
&lt;/match&gt;
</pre>
<h2>挿入する設定</h2>
<p>上記をまとめると以下のコード。</p>
<pre class="brush: bash; title: ; notranslate">
&lt;source&gt;
  @type tail
  @id input_tail_sample1.com
  time_format %d/%b/%Y:%H:%M:%S %z
  path /var/www/vhosts/sample1.com/logs/access_log
  pos_file /var/log/td-agent/apache.sample1.com.pos
  tag apache.access.sample1.com
&lt;/source&gt;
#バーチャルホスト2
&lt;source&gt;
  @type tail
  @id input_tail_sample2.com
  time_format %d/%b/%Y:%H:%M:%S %z
  path /var/www/vhosts/sample2.com/logs/access_log
  pos_file /var/log/td-agent/apache.sample2.com.pos
  tag apache.access.sample2.com
&lt;/source&gt;
&lt;match apache.access.**&gt;
  type datacounter
  aggregate all
  count_interval 1m
  count_key code
  tag response.code.analysis
  pattern1 2xx ^2\d\d$
  pattern2 3xx ^3\d\d$
  pattern3 4xx ^4\d\d$
  pattern4 5xx ^5\d\d$
&lt;/match&gt;
&lt;match monitor.duration&gt;
  @type copy
  &lt;store&gt;
   @type file
   @id output_file_duraion
   path /var/log/td-agent/apache.duraion
  &lt;/store&gt;
  &lt;store&gt;
    type zabbix
    zabbix_server 192.168.0.20
    host hogehoge
    name_key_pattern ^[num|min|max|avg|sum|percentile_90|percentile_95]
  &lt;/store&gt;
&lt;/match&gt;
</pre>
<h2>fluentdを再起動</h2>
<p>再起動し設定を反映させる。</p>
<pre class="brush: bash; title: ; notranslate">
service td-agent restart
</pre>
<p>ログを確認。</p>
<pre class="brush: bash; title: ; notranslate">
cat /var/log/td-agent/apache.access/buffer.xxxxxxxxxxxxxxx.log
</pre>
<p>以下のようになっていると取得成功</p>
<pre class="brush: bash; title: ; notranslate">
2020-01-14T00:34:48+09:00       response.code.analysis  {&quot;apache.access.analyzer_unmatched_count&quot;:0,&quot;apache.access.analyzer_unmatched_rate&quot;:0.0,&quot;apache.access.analyzer_unmatched_percentage&quot;:0.0,&quot;apache.access.analyzer_2xx_count&quot;:3,&quot;apache.access.analyzer_2xx_rate&quot;:0.05,&quot;apache.access.analyzer_2xx_percentage&quot;:100.0,&quot;apache.access.analyzer_3xx_count&quot;:0,&quot;apache.access.analyzer_3xx_rate&quot;:0.0,&quot;apache.access.analyzer_3xx_percentage&quot;:0.0,&quot;apache.access.analyzer_4xx_count&quot;:0,&quot;apache.access.analyzer_4xx_rate&quot;:0.0,&quot;apache.access.analyzer_4xx_percentage&quot;:0.0,&quot;apache.access.analyzer_5xx_count&quot;:0,&quot;apache.access.analyzer_5xx_rate&quot;:0.0,&quot;apache.access.analyzer_5xx_percentage&quot;:0.0}
</pre>
<h2>Zabbixのアイテム作成(本番用)</h2>
<p>データを取得する受け皿をZabbixに追加する。</p>
<p>・アイテム追加</p>
<pre class="brush: bash; title: ; notranslate">
名前:2xx_count
タイプ:Zabbixトラッパー
キー:2xx_count
データ型:数値
</pre>
]]></content:encoded>
			</item>
		<item>
		<title>【oom-killer】メモリが原因でサーバが落ちた時にやった対応</title>
		<link>https://web-creators-hub.com/linux/oom-killer/</link>
		<pubDate>Fri, 10 Jan 2020 07:56:25 +0000</pubDate>
		<dc:creator><![CDATA[taizo]]></dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">https://web-creators-hub.com/?p=537</guid>
		<description><![CDATA[カーネルパニック サーバの監視アラートが発報されサーバが落ちていることが発覚し調査した。SSHでの接続は不可能だったので、さくらVPSのコン...]]></description>
				<content:encoded><![CDATA[<h2>カーネルパニック</h2>
<p>サーバの監視アラートが発報されサーバが落ちていることが発覚し調査した。SSHでの接続は不可能だったので、さくらVPSのコントロールパネルから状態を確認。画面には「kernel panic」の文字。操作できなかったのでコンパネ上から再起動しサーバは復帰した。</p>
<h2>原因究明</h2>
<p>messagesログを確認すると「httpd invoked oom-killer: ～」というログを発見。どうやらメモリが枯渇しサーバが落ちた模様。以下が障害の流れ。</p>
<p>メモリ枯渇→oom-killer→カーネルパニック</p>
<h2>oom-killerとは</h2>
<p>物理メモリ、スワップメモリが枯渇したとき、システム全体に最も影響の与えてるプロセス(メモリを一番使っている)を選択しkillするプログラムのこと。init プロセスやカーネルスレッドなどは OOM Killer 発動対象外。</p>
<h2>スワップメモリ追加</h2>
<p>メモリは物理が4G、スワップが2G。スワップメモリがかなり少なかったので応急処置としてスワップメモリを6Gに増やした。</p>
<pre class="brush: bash; title: ; notranslate">
# dd if=/dev/zero of=作成ファイル bs=ブロックサイズ count=ブロック数
dd if=/dev/zero of=/var/swpfile4G bs=1M count=4096
</pre>
<p>ddコマンドで4Gの空ファイルを作成する。</p>
<pre class="brush: bash; title: ; notranslate">
mkswap /var/swpfile4G
</pre>
<p>mkswapでフォーマットしスワップとして使用できるようにする。</p>
<pre class="brush: bash; title: ; notranslate">
chmod 600 /var/swpfile4G
</pre>
<p>このままでは権限のエラーがでるのでパーミッション変更。</p>
<pre class="brush: bash; title: ; notranslate">
swapon /var/swpfile4G
</pre>
<p>スワップ領域を割り当てる</p>
<pre class="brush: bash; title: ; notranslate">
free
</pre>
<p>freeコマンドで確認。</p>
<pre class="brush: bash; title: ; notranslate">
vi /etc/fstab
#最終行に以下を追加
/var/swpfile4G          swap                    swap    defaults        0 0
</pre>
<p>OS再起動時に追加したSwap領域がマウントするようにfstabファイルを編集。</p>
<h2>プロセスチェック</h2>
<p>以下のコマンドを利用してメモリを使っているプロセスを割り出した。調査すると落ちたサーバがWEBサーバとして利用していることもあり「httpd」が一番怪しかった。Apacheの設定を確認すると「MaxClients」の値が256あり、1プロセス当たりのメモリ使用量が50Mの場合、12Gのメモリを使用することになり完全に枯渇することがわかった。</p>
<pre class="brush: bash; title: ; notranslate">
#ランキング
ps -eo comm,rss | sort -rn -k 2 | head -n 50

#指定プロセスの物理メモリ(RSS)合計
ps -eo rss,comm | awk 'BEGIN {SUM=0} {if ($2 == &quot;[プロセス名]&quot;){ SUM+=$1 }} END {printf(&quot;%dMB\n&quot;, SUM/1024)}'

#指定プロセス数
ps -eo rss,comm | awk 'BEGIN {COUNT=0} {if ($2 == &quot;[プロセス名]&quot;){ COUNT+=1 }} END {print COUNT}'

#指定プロセスの物理メモリ(RSS)平均
ps -eo rss,comm | awk 'BEGIN {SUM=0;COUNT=0} {if ($2 == &quot;[プロセス名]d&quot;){ SUM+=$1;COUNT+=1 }} END {printf(&quot;%dKB\n&quot;, SUM/COUNT)}'

#指定プロセスの物理メモリ(RSS)最大
ps -eo rss,comm | awk 'BEGIN {MAX=0} {if ($2 == &quot;[プロセス名]&quot;){ if (MAX &lt; $1) { MAX=$1 }}} END {print MAX}'

#指定プロセスのCPU使用率
ps -eo %cpu,comm | awk 'BEGIN {SUM=0} {if ($2 == &quot;[プロセス名]&quot;){ SUM+=$1 }} END {print SUM}'
</pre>
<p>ちなみに主要プロセスのメモリ使用量は以下になった。<br />
Postfixメモリ使用量:約33MB<br />
PHPメモリ使用量    :0MB<br />
MySQLメモリ使用量  :75.51 MB<br />
httpdメモリ使用量  :443.44 MB<br />
clamメモリ使用量   :806.4 MB</p>
<p>clamがメモリの使用量が大きかったので一旦停止した。</p>
<h2>Apacheのチューニング</h2>
<p>プロセスチェックの結果からApacheの設定に問題があることがわかりチューニングした。<br />
以下チューニングに関係するディレクティブ。</p>
<p><span class="bold">・StartServers</span><br />
Apache起動時の子プロセス数</p>
<p><span class="bold">・MinSpareServers</span><br />
待機時の最小子プロセス数</p>
<p><span class="bold">・StartServers</span><br />
Apache起動時の子プロセス数</p>
<p><span class="bold">・MinSpareServers</span><br />
待機時の最小子プロセス数</p>
<p><span class="bold">・MaxSpareServers</span><br />
待機時の最大子プロセス数</p>
<p><span class="bold">・ServerLimit</span><br />
設定可能なサーバプロセス数の上限</p>
<p><span class="bold">・MaxClients</span><br />
最大の小プロセス数</p>
<p><span class="bold">・MaxRequestsPerChild</span><br />
1子プロセスが処理するリクエスト数(上限を超えると新しいプロセスに入れ替わる)</p>
<p>実際設定したのは以下の設定。</p>
<pre class="brush: bash; title: ; notranslate">
サーバが落ちた時の設定内容(デフォルト値)
&lt;IfModule prefork.c&gt;
StartServers         8
MinSpareServers         5
MaxSpareServers     20
ServerLimit     256
MaxClients     256
MaxRequestsPerChild  4000
&lt;/IfModule&gt;
</pre>
<p>↓</p>
<pre class="brush: bash; title: ; notranslate">
&lt;IfModule prefork.c&gt;
StartServers         25
MinSpareServers         25
MaxSpareServers     40
ServerLimit     105
MaxClients     100
MaxRequestsPerChild  1000
MaxMemFree           2048
&lt;/IfModule&gt;
</pre>
<p>「MaxSpareServers」はメモリが枯渇しないように設定。「MaxClients」は始め50ぐらいに設定していたが、すぐに上限に到達したので(apacheのエラーログでわかる)調整し100ぐらいに落ち着いた。</p>
<h2>Zabbixでプロセスの監視</h2>
<p>Zabbixでプロセスの監視をすることにした。今後これらの値を参考にさらなるチューニングなどに生かしていく。<br />
テンプレートを作成しアイテムを追加する。</p>
<p>以下プロセスのメモリ容量を監視。</p>
<p>・postfixメモリ使用量<br />
・phpメモリ使用量<br />
・mysqldメモリ使用量<br />
・httpdメモリ使用量<br />
・clamメモリ使用量</p>
<p>あとはapacheのプロセス数、1プロセス当たりの平均メモリ使用量を監視。</p>
<h3>プロセス名メモリ使用量</h3>
<p>アイテム追加</p>
<pre class="brush: bash; title: ; notranslate">
名前:プロセス名メモリ使用量
タイプ:エージェント
キー:proc.mem[プロセス名,,sum,,rss]
データ型:数値(整数)
データ形式：10進数
単位：B
</pre>
<p>プロセス名はpostfix、php、mysqld、httpd、clamを入れる。</p>
<h3>httpdの1プロセス当たりの平均メモリ使用量</h3>
<p>アイテム追加</p>
<pre class="brush: bash; title: ; notranslate">
名前:httpdメモリ使用量平均
タイプ:エージェント
キー:proc.mem[httpd,,avg,,rss]
データ型:数値(整数)
データ形式：10進数
単位：B
</pre>
<h3>httpdプロセス数</h3>
<p>アイテム追加</p>
<pre class="brush: bash; title: ; notranslate">
名前:httpdプロセス数
タイプ:エージェント
キー:proc.num[httpd,,,]
データ型:数値(整数)
データ形式：10進数
</pre>
<h2>Zabbixでログ監視</h2>
<p>ログを監視し問題のあるものはアラートを飛ばす設定にした。<br />
テンプレートを作成しアイテム追加、トリガーを追加する。</p>
<h3>messages監視</h3>
<p>以下の設定でmessagesログを監視し「oom-killer」が出たらアラートを飛ばすようにする。</p>
<p>アイテム追加</p>
<pre class="brush: bash; title: ; notranslate">
名前:messagesログ監視
タイプ:アクティブ
キー:log[/var/log/messages,,,,,]
データ型:ログ
</pre>
<p>トリガー</p>
<pre class="brush: bash; title: ; notranslate">
名前:OOM killer が発動されました。
条件式:
{Template linux logs:log[/var/log/messages,,,,,].regexp(oom-killer)}=1 and 
{Template linux logs:log[/var/log/messages,,,,,].nodata(10m)}=0
</pre>
<h3>apacheのエラーログ</h3>
<p>以下の設定でapacheのエラーログを監視し「MaxClients」が出たらアラートを飛ばすようにする。<br />
このアラートは、apacheのプロセス数が「MaxClients」の値に到達したことを意味し再チューニングの参考にできる。</p>
<p>・アイテム</p>
<pre class="brush: bash; title: ; notranslate">
名前:apache error_log
タイプ:アクティブ
キー:log[/var/log/httpd/error_log,,,,,]
データ型:ログ
</pre>
<p>トリガー</p>
<pre class="brush: bash; title: ; notranslate">
名前:apacheのプロセスが上限に達しました。
条件式:
{Template linux logs:log[/var/log/httpd/error_log,,,,,].regexp(MaxClients)}=1 and 
{Template linux logs:log[/var/log/httpd/error_log,,,,,].nodata(10m)}=0
説明:
apacheのプロセスが上限に達しました。
</pre>
<h2>今後</h2>
<p>・MySQLなどの設定もデフォルト値のままなので見直す必要がある。<br />
・サイト数が40サイトぐらいあるサーバなのでapacheのログを集計しどのサイトがアクセス数が多いかを把握し対応(サーバ移行など)する必要がある。</p>
]]></content:encoded>
			</item>
		<item>
		<title>【必読】Gulpとは 本質は視点の変換</title>
		<link>https://web-creators-hub.com/%e7%92%b0%e5%a2%83%e6%a7%8b%e7%af%89/gulp-1/</link>
		<pubDate>Thu, 12 Dec 2019 07:11:23 +0000</pubDate>
		<dc:creator><![CDATA[taizo]]></dc:creator>
				<category><![CDATA[環境構築]]></category>

		<guid isPermaLink="false">https://web-creators-hub.com/?p=525</guid>
		<description><![CDATA[Gulpとは node.jsをベースとしたビルドシステムヘルパーです。ビルドシステムヘルパーとは、直訳するとビルドを手助けする人。ビルドとは...]]></description>
				<content:encoded><![CDATA[<h2>Gulpとは</h2>
<p>node.jsをベースとしたビルドシステムヘルパーです。ビルドシステムヘルパーとは、直訳するとビルドを手助けする人。ビルドとは、人間が書いたソースコードを実際に動くプログラムにする作業のことです。gulpとは、ビルドしたい内容をgulpに定義して自動で行うツールのことです。Gulpでは、ビルドの処理をタスクとして扱います。そして処理の内容によってプラグインをインストールしタスクを定義します。それによりいろいろな処理を自動化します。</p>
<p>&nbsp;</p>
<h2>なぜGulpが必要なのか</h2>
<p>制作者は、制作者の視点で物事を考えます。scssを使って効率的にcssを書きたい、ファイルを分割してソースをコンポーネント化し再利用性を高めたい、TypeScriptを導入して安全性を高めたいなどを考えます。これらは、すべてビルドを行わない限りプログラムとして動作しません。手作業でビルドする場合、ひとつひとつコマンドを打ってビルドを行います。</p>
<p>ビルドとは、コストのかかる作業なのです。制作者の意思・視点を捨てればビルドしない方法で制作することもできます。しかしこれを自動化することでそれらのコストがなくなり、制作者の意思を制作物に反映することができます。</p>
<p>&nbsp;</p>
<h2>制作の視点とSEOの視点</h2>
<p>WEBの場合、ファイルを分割するとインクルードするファイルが増えます。増えるとWEBサーバの処理が重くなり、サイトの表示が若干遅くなります。グーグルは、このようなサイトの評価を下げます。これは、SEO的にもマイナスです。制作者は、再利用性を高めるためにファイルを分割したのですが、SEOのためにファイルを分割せず一つにまとめる必要があります。</p>
<p>ほかにもグーグルは、ソースコードや画像の圧縮をサイトの制作者に要求します。制作の視点から見ればjavascriptやcssの圧縮は、メンテナンス性をなくし手間が増えるためやりたくありません。このように制作の視点とSEOの視点とでは考え方が違うため制作者は、苦労します。しかしGulpを使えばそのような問題も解決できます。このような視点の変換を自動でおこなってくれるのがGulpの本質なのです。</p>
<p><img class="alignnone size-full wp-image-526" src="https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/12/Gulp.png" alt="" width="800" height="416" srcset="https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/12/Gulp.png 800w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/12/Gulp-300x156.png 300w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/12/Gulp-768x399.png 768w, https://web-creators-hub.com/__wordpress/wp-content/uploads/2019/12/Gulp-320x166.png 320w" sizes="(max-width: 800px) 100vw, 800px" /></p>
<p>&nbsp;</p>
<h2>Gulpのインストール</h2>
<h3>node.jsのインストール</h3>
<p>gulpは、node.jsをベースとしています。前提として、node.jsをインストールする必要があります。フロントサイドエンジニアには必須のものになるので、インストールされている方が多いと思います。</p>
<p><a href="https://nodejs.org/en/" target="_blank" rel="noopener">https://nodejs.org/en/</a></p>
<p>シェルやコマンドブロンプトを起動し、以下のコマンドでバージョンが表示されればインストール完了です。</p>
<pre class="brush: bash; title: ; notranslate">
npm -v
</pre>
<p>&nbsp;</p>
<h3>Gulpのインストール</h3>
<p>Gulpを使用するにはグローバルとローカルにインストールする必要があります。グローバルとはPC全体でローカルとは作成するサイトやアプリのプロジェクトのことです。</p>
<p>・グローバルインストール<br />
グローバルインストールはオプションgを付けます。</p>
<pre class="brush: bash; title: ; notranslate">
npm install -g gulp
</pre>
<p>&nbsp;</p>
<h3>ローカルインストール</h3>
<p>プロジェクトを定義します。フォルダを作成し以下のコマンドを入力します。</p>
<pre class="brush: bash; title: ; notranslate">
npm init
</pre>
<p>以下のコマンドでGulpをインストールします。<br />
&#8211;save-devオプションは、package.jsonのdevDependenciesに追加されます。</p>
<pre class="brush: bash; title: ; notranslate">
npm install gulp --save-dev
</pre>
<p>&nbsp;</p>
<h2>Gulpのバージョンを指定する場合</h2>
<p>バージョンを指定しない場合は、gulp4がインストールされます。バージョン3をインストールしたい場合は以下のコマンドを入力しバージョンを指定してください。</p>
<pre class="brush: bash; title: ; notranslate">
npm install gulp@3.9.1 --save-dev
</pre>
<p>gulpのタスクの定義の仕方は次回</p>
]]></content:encoded>
			</item>
	</channel>
</rss>
