「会員登録完了メールが迷惑メールに入っちゃいます」対策

「会員登録完了メールが迷惑メールに入っちゃいます」対策

概要

サイト作りにありがちな設定忘れ
「会員登録完了メールが迷惑メールに入っちゃいます」

SPF レコード設定と DNS の逆引き設定が必要です。

まず DNS 正引きとは

ドメイン — 問合せ —> IP アドレス

以下のようなメールアドレスがあるとします。

info@hogehoge.jp

この hogehoge.jp から IP アドレス を問い合わせるのが 正引き

DNS 逆引きとは

IP アドレス — 問合せ —> ドメイン

IP アドレス から hogehoge.jp を問い合わせるのが 逆引き

SPF レコード

SPF = Sender Policy Framework

メールを送る側のポリシーを設定したフレームワークです。

何故こんなフレームワークがあるの?

送信元偽装なんて簡単にできるから!

1
$ echo "TEST" | sendmail -f aiueo@xxxx.jp -t kenzo.xxxxxx.0107@gmail.com

SPF レコードを設定することの意味

SPF レコード設定する、ということは
送信元の IP アドレス, ドメイン を指定することで
受信先が 送信元メールアドレスと SPF レコード情報に設定している IP, ドメイン情報と一致しているか
わかるようになります。

逆引き設定することの意味

送信元の IP アドレスから割り出したドメインと
逆引き設定された IP に紐づくドメインとを照合し
異なる場合は偽装と判断することができる為です。

Gmail などではこのフィルターが設定されていて
逆引き設定されていないと迷惑メール BOX に入っちゃいます。

SPF レコード設定確認

1
$ dig -t TXT <メールドメイン>
  • 例) gmail.com
1
2
3
$ dig -t TXT gmail.com

gmail.com. 300 IN TXT "v=spf1 redirect=_spf.google.com"
  • 例) yahoo.co.jp
1
2
3
$ dig -t TXT yahoo.co.jp

yahoo.co.jp. 6 IN TXT "v=spf1 include:spf.yahoo.co.jp ~all"

Gmail で SPF レコード設定確認

  • SPF: NEUTRAL の場合、SPF レコードが正しく設定されていません。
  • SPF: PASS の場合、SPF レコードが正しく設定されています。

以上です。

Python ローカルとリモートサーバ上のファイル差分抽出ツール

概要

これまで数社経験してきましたが
必ずといっていいほど存在する、
現状のステータスがわからないサーバ。。

Git 上の master とも差分が激しく生じている状態。。

そんなサーバとローカルの workspace との差分を確認すべく
ツールを作成しました。

今後

今の所、
リモートからファイルをダウンロードする度に SSH のコネクションを張ってしまいパフォーマンス悪い(>_<)

はじめ pysftp で ssh コネクション張ってた方がパフォーマンスよかった気がする。
でも、手軽さを考えたら hostname 指定の方が良かったので
hostname 指定の方向でパフォーマンスを上げていくことを考えます。

ところが
pysftp で実装してみましたが 多段 ssh アクセスの場合がうまくいかず。。
随時解消させていきます。

golang で並行処理を試してパフォーマンスを上げるのも検討します。

CentOS 5系 Neobundle 対応 vim をインストール

概要

CentOS 5 に vim をソースからビルドしようとした所
.configure 実行時にエラー発生

1
2
3
4
no terminal library found
checking for tgetent()... configure: error: NOT FOUND!
You need to install a terminal library; for example ncurses.
Or specify the name of the library with --with-tlib.

terminal library がないと怒られている。

ちなみにこんな流れで vim をソースからダウンロードしビルドしようとしました。

1
2
3
4
5
6
$ wget ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2
$ tar xvf vim-7.4.tar.bz2
$ cd vim74
$ ./configure --enable-multibyte --with-features=huge --disable-selinux --prefix='/usr/local/vim-7.4'
$ sudo make install
$ sudo ln -s /usr/local/vim-7.4/bin/vim /usr/bin/vim
  • ncurses-devel インストールし再度実行
1
$ sudo yum install -y ncurses-devel

通りました (;_)

yum でインストールする vim だと Neobundle が利用不可バージョンだった為
ソースからビルドする選択にしました。

程よい rpm があれば教えてください!

zsh vcs_info が使えない問題解決

zsh vcs_info が使えない問題解決

概要

CentOS5 系で yum でインストールした zsh で以下エラー発生

1
precmd: vcs_info: function definition file not found

Version 4.3.6 以上でないと vcs_info は利用できないそう

1
vcs_info is available since zsh-beta, version 4.3.6-dev-0+20080929-1 or later
  • バージョン確認
1
2
3
$ /bin/zsh --version

zsh 4.2.6 (x86_64-redhat-linux-gnu)

なので zsh バージョンアップデートする必要があります。

zsh 5.2 ダウンロード ビルド

1
2
3
4
5
$ cd /usr/local/src
$ wget https://sourceforge.net/projects/zsh/files/zsh/5.2/zsh-5.2.tar.gz/download
$ tar xvjf zsh-5.2.tar.gz
$ cd zsh-5.2
$ ./configure && make && sudo make install

インストールされた zsh バージョン確認

1
2
3
$ /usr/local/bin/zsh --version

zsh 5.2 (x86_64-unknown-linux-gnu)

新たにダウンロードした zsh にシェル変更

1
2
$ echo "/usr/local/bin/zsh" | sudo tee -a /etc/shells
$ chsh -s /usr/local/bin/zsh

それでも、まだ出てくるこのエラー。。

1
precmd: vcs_info: function definition file not found

.zcompdump を削除し zsh を実行し直す

1
2
$ rm ~/.zcompdump
$ exec zsh

.zscompdump はコマンドやその補間関数の定義一覧が記載されているファイルです。

無事エラーが消えました。

Golang 簡易パフォーマンス測定

概要

簡易的なパフォーマンス測定覚書です。
よく使うので備忘録的に保存。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package main

import (
"fmt"
"runtime"
"time"
)

func main() {
// CPU数
cpus := runtime.NumCPU()

// 開始時メモリ
var startMemory runtime.MemStats
runtime.ReadMemStats(&startMemory)

// 開始時間
start := time.Now()


// do something


// 経過時間
elapsed := time.Since(start)

// 終了時メモリ
var endMemory runtime.MemStats
runtime.ReadMemStats(&endMemory)

fmt.Printf("実行時間: %f 秒 \n", elapsed.Seconds())
fmt.Printf("CPU: %d \n", cpus)
fmt.Printf("Memory All: %f MB \n", float64(endMemory.Alloc-startMemory.Alloc)/float64(1024*1024))
}
Let's encrypt SSL 証明書自動更新

Let's encrypt SSL 証明書自動更新

概要

Let’s encrypt SSL は開発環境で本番環境と同等に
https 通信プロトコルを利用したい為に利用しています。

バーチャルホストで複数ドメインを利用している場合等でも
マルチドメイン SSL 証明書が取得でき便利です。

オレオレ SSL 証明書ではブラウザによっては
「このページは保護されていません」
と表示されるケースがあり
非エンジニアの方によっては不信感が募ることもあります。

β 版

β 版時代の Let’s Encrypt SSL 証明書管理スクリプトです。
今回作成した SSL 自動更新スクリプトはこちらではありません。

SSL 自動更新スクリプト

今回作成した Let’s Encrypt 自動更新(Apache)スクリプトです。
更新判定し Slack 通知します。

有効期限が 30 日を切った場合に SSL 証明書を更新し httpd を再起動します。

cron 設定

  • 毎月第一土曜日 AM6:00 設定

開発環境なら土曜日に実行気づいて最低でも日曜日には治せる為。
現運用ではこれは功を奏してます。

1
00 6 1-7 * * 6 root /root/letsencrypt.sh/refresh_cert.sh

Slack 通知

強制更新したい場合

2016 年 5 月 07 日より certbot-auto に名称変更され
certbot-auto による自動更新を以下スクリプトになります。

本番環境以外でクライアント様への確認用等でなければ
こちらを利用しても良いかと思います。

--force-renewal をオプション指定することで強制的に更新します。

そもそも通知いらないという場合

こちらも certbot-auto

  • cron で直接コマンド設定
  • 毎月第一土曜日実行
  • 一応ログには残しておく
1
00 6 1-7 * * 6 root /root/certbot/certbot-auto renew --force-renewal && service httpd graceful > /root/certbot/renewal.log

以上です。

MySQL COUNT, SUM, GROUP BY, CASE WHEN THEN で集計する

概要

ECサイトに新しい決済機能の利用率出したいな
と思ったときのクエリです。

ちょうどいくつかの集計関数がまとまった1クエリとなったので
まとめました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT
DATE_FORMAT(create_date, '%Y-%m-%d') AS 日付
,COUNT(order_id) AS 全件数
,FORMAT(SUM(payment_total),0) AS "全支払い合計(円)"
,COUNT(payment_id = 12 or NULL) AS "新決済機能の購入件数"
,COUNT(customer_id = 0 or NULL) AS "ゲスト購入数"
,FORMAT(SUM(CASE WHEN payment_id = 12 THEN payment_total else 0 END),0) AS "新決済機能の購入支払い合計(円)"
,count(payment_id = 12 or NULL)/count(order_id) * 100 AS "新決済機能の購入比率(%)"
,SUM(CASE WHEN payment_id = 12 THEN payment_total else 0 END)/SUM(payment_total) * 100 AS "新決済機能の購入支払い合計比率(%)"
,COUNT(customer_id = 0 or NULL)/COUNT(order_id) * 100 AS "ゲスト購入比率"
FROM
dtb_order
WHERE 1=1
AND site_id = 1
AND create_date > '2016-09-21 10:00:00'
GROUP BY
DATE_FORMAT(create_date, '%Y%m%d')
;
  • パッケージ = EC-CUBE 2.11.5
  • 新決済ID = 12

結果

CASE文をさらっと書けるようになると少し大人になった気分になります。
心残りは比率部分の重複部分がまとまったらかっこいいかなと。

精進します。

LINE Notify で Zabbix Alert 通知

LINE Notify で Zabbix Alert 通知

概要

Zabbix アラート を LINE Notify を利用して
LINE にメッセージを送るように設定しました。

手順

LINE Notify アクセス

[https://notify-bot.line.me/ja/]

登録してログイン

サービス登録

この情報が審査されるということは特になかったですが
ある程度精度の高い情報を入力して登録しときました

トークルーム選択しトークン発行

発行したトークンコピー

Zabbix スクリプト設定

Env

  • Zabbix 3.0
  • CentOS Linux release 7.2.1511 (Core)

Install Steps

1
2
3
4
5
[Zabbix-Server]$ cd /usr/lib/zabbix/alertscripts    # AlertScriptsPath
[Zabbix-Server]$ git clone https://github.com/kenzo0107/zabbix3-linenotify
[Zabbix-Server]$ mv zabbix3-slack/line_notify.sh .
[Zabbix-Server]$ rm -r zabbix3-linenotify
[Zabbix-Server]$ chmod 755 line_notify.sh

Media Types 設定

Users > Media 設定

通知テスト

テスト環境などで
Nginx の process が 1 つ以上になったらアラート出すように設定してみた結果

所感

トークルームに参加するにも
LINE アカウントはプライベートアカウントなので
ちょっと知られたくないわ〜という時は
何とも言えない気持ちになる方もいることがわかりました。

ご利用は計画的に。

今後の期待

個人的に
Twilio みたいに LINE Notify で電話通知出来たら嬉しいです。

まずは障害がない世界を ♪

以上です。

error RPC failed; curl 56 SSLRead() return on MacOS Sierra

概要

みんなのGo言語を購入しまして
ghq でGit管理してみよう!
と心動いた方は多いはず

昔から peco で Git Repository 移動コマンドはしてたけど、
ghq を利用したリポジトリ管理は便利ですね。

そんな折、
ghq コマンドで git repository をクローンしようとした際に
掲題のエラーが発生しましたので備忘録。

1
2
3
4
$ ghq get <git repository>
...
error: RPC failed; curl 56 SSLRead() return
...

利用している git が SSL 対応していないようです。

対応

  • git を openssl, curl 付きで再インストール
1
$ brew reinstall git --with-brewed-curl --with-brewed-openssl

再度実行

1
2
3
4
5
$ ghq get <git repository>
remote: Total 74442 (delta 145), reused 0 (delta 0), pack-reused 74160
Receiving objects: 100% (74442/74442), 701.45 MiB | 1.42 MiB/s, done.
Resolving deltas: 100% (50571/50571), done.
Checking out files: 100% (11350/11350), done.

無事できた♪

参照

Curl: (56) SSLRead() return error -9806 - Need Help please slight_smile

負荷監視とその原因調査

負荷監視とその原因調査

概要

新卒向けの説明として簡単な備忘録です。

-Item- -Explain-
%user ユーザー空間での CPU 使用率
%system カーネル空間での CPU 使用率
%iowait I/O 待ち時間の割合
%idle I/O 待ち以外で CPU が何もしていない時間の割合

ある日の Zabbix + Grafana の CPU 関連のグラフから原因を調査する。

① %iowait が飛び抜けて高い

  • %iowait 高
  • %user 低
  • %system 低

原因

スワップが大量に発生している可能性がある。

調査手順

1. SwapIn & SwapOut 確認

1
$ sar -W

2. システム全体のメモリ使用状況

1
$ free

3. メモリ使用率順でソート後メモリを消費しているプロセスを特定する

1
$ top
  • Shift+p: CPU 使用率順にソート
  • Shift+m: メモリ使用率順にソート
実際の原因

定期的に同時刻に発生した為
crontab -l でクーロン設定確認したら
誰も知らないバッチが動いていた汗

② %user が飛び抜けて高い

  • %iowait 低
  • %user 高
  • %system 低

原因

CPU 使用率が高い。

調査手順

1. CPU 使用率の高い順にソートしてプロセス特定

1
$ top
  • Shift+p: CPU 使用率順にソート

ほんの一部分ですが参考になれば何よりです。
以上です。