apacheのバーチャルホスト設定

すでにバーチャルホスト無しで動いている環境で、バーチャルホストを追加する場合の設定。すぐ忘れるのでメモ。

以下条件。極力オリジナルのhttpd.confは触らない方針で。

  • OS:CentOS 5.5
  • WEBサーバ:Apache 2.2.3
  • apache設定ファイルを置くディレクトリ:/etc/httpd/conf.d

最初にまず、デフォルトのServerNameを無効化。

バーチャルホスト用の設定ファイルを作る。

 

以下のように記述。
ポイントは、デフォルトのドメインでアクセスしたときの設定も<VirtualHost>ディレクティブで改めてしなければならないということ。
つまりバーチャルで追加したいFQDNのバーチャルホスト設定をしただけではダメ。

 

参考URL)

ひかり電話オフィスでビジネスフォン(SAXA HM700Std)

この度諸々の理由で、会社の電話をSAXAのビジネスフォンに変更することになった。

このSAXA HM700はひかり電話を直収できるタイプのものなので、終端装置(ONU)に介する信号変換機(OG)が必要ないらしい。

ただしひかり電話オフィス(タイプ)にすることで、今までのWifiカード付のNTTルータが使えなくなるので、Wifi飛ばす場合は別途Wifiルータが必要となる。(今回はTP-Link AC1200を導入)

一次側(ONUまで)の回線工事と疎通はもちろんNTTにやってもらい、ビジネスフォン主装置は、事前に外線着信設定や内線の設定を専門業者に済ませてもらい、基本現場でつなぐだけの状態で導入した。

で、ひかり電話のため、当然二次側もネットが疎通しないと電話が使えないし、インターネットも使えない。ついでに警備の通信も有線回線がメインだったりすると、当然メインが停止状態になる。(ちなみに警備はA社利用)

ちょっとした思い込みで3時間くらいはまってしまったので、今後使うかどうかわからないけど一応忘備録。

【事前準備】

ONU設置と回線工事完了後、

  1. 専門業者の説明書を参考に主装置をONUにつなぐ
  2. 専門業者の説明書を参考に電話機(今回導入したのはTD615)とFAXを主装置につなぐ
  3. 主装置の電源を入れる

【ネット疎通】

  1. 主装置から出ている(はずの)WAN側接続用のLANケーブルをPCに接続。
  2. ブラウザを起動し、主装置(初期値:192.168.1.253)にアクセス。(主装置のIPアドレスは電話機のメニュー→その他→ネットワーク→ネットワーク情報の確認→主装置で確認可能)
  3. 主装置に工事担当者権限でログイン。(工場出荷時は、ユーザ名「in」、パスワード「tlipinst」)
  4. 上の方の「VoIP1+ルータ」をクリック
  5. 「Service Type」が指定されていなければ、「ひかり電話オフィスタイプ(フレッツ光ネクスト[NTT東/西])」を選択して保存
  6. 左側の「設定メニュー」→「ルータ設定メニュー」→「WANインターフェイス」
  7. いずれかのインターフェイス名(ここではPPPoE_1)を選択
  8. 各情報を入力
    • セッション→「有効」
    • 認証方式→「あり」
    • 接続ユーザ名→「プロバイダから提供されているインターネット接続用のユーザID」
    • 接続パスワード→「プロバイダから提供されているインターネット接続用のパスワード」
  9. 「設定」ボタンクリック。さらに左側メニューの一番下「設定データ保存」をクリックし主装置に反映。(この時点で電話は使えるようになっているはず。)

【Wifiルータ(もしくはハブなど)】

  1. PCからLANケーブルを外し、別途準備したWifiルータのWANポートに接続。
  2. 既存の警備用のLANケーブル(あれば)とプリンタ用のLANケーブル(あれば)をWifiルータのLANポートに接続
  3. PCをWifiルータのLANポートに接続
  4. Wifiルータの電源を入れる
  5. ブラウザを起動し、Wifiルータ(初期値:192.168.0.1)にアクセスしログイン(工場出荷時は、ユーザ名パスワード共に「admin」)
  6. メニューから「クイックセットアップ」を選択し設定を行う。
    • WANタイプ→「動的IP」→次へ
    • MACクローン→「いいえ」→次へ
    • ワイアレスデュアルバンド選択→「5GH,2.4GH」どちらもチェック→次へ
    • ワイヤレス2.4GH、ワイヤレス5GH→「セキュリティ:WPA2-PSK」、それ以外は任意に指定(Wifiの接続パスワードはこの時確認しておく)→次へ
    • 最後に内容を確認して「設定」をクリック。
  7. DHCPを有効にするため、メニュー「DHCP」→「DHCP設定」
  8. 「有効」になっていなければ「有効」にチェックを入れ「保存」
  9. メニュー「DHCP」→「DHCPクライアントリスト」でプリンタ(あれば)のIPアドレスを確認しておく。
  10. 管理画面からログアウト
  11. PCとWifiルータを接続していたLANケーブルを外す。

【確認】

PCでインターネットが利用でき、警備用の回線がバックアップから回復していればOK(警備会社にちゃんと報告しましょう。)

ルーターのDHCP更新によりプリンタのIPアドレスが変更されていると思われるので、必要に応じてプリンタの接続設定を行う。(Wifiルータの管理画面で、プリンタのIPアドレス出てこない場合は、プリンタ本体で確かめる(プリンタ側でDHCP受付がOFFになっている可能性あり)。)

【総評】

ミソは【ネット疎通】の個所。

つまりこれをやらずに、いきなりWifiルータ側で一生懸命PPPoEを開通させようとして、何度もパスワードを確認したりして、ハマってしまった。

結局主装置側でルーティングが遮断されているのだから、その先のWifiルータ側で何やってもダメなわけ。(主装置自体がルータなのだから、主装置でPPPoE設定し、Wifiルータはただのブリッジでよい)。

IP電話なのだから、言われてみれば当たり前のことなのだが、、、。

説明書にその辺をちょっとだけでも書いておいて欲しかったなあ。

メール本文にピリオド(.)のみの行がある場合の対処

今更感がありますが、、。

SMTP通信上は、原則ピリオドのみの行(正確にはCRLF.CRLF)はメールの終わりを意味します。

本文にこれらが含まれていた場合、以降のデータが無視されてしまいますので、SMTPとPOPのルール上は、本文にピリオドのみの行があった場合には、送信時にピリオドをさらに1つつけ、受信時(POP処理時)には1つピリオドを落とします。

sendmailでは-iオプションで送信時に上記の処理を勝手にやってくれます。(逆に-iオプションを付けないとデフォルトでピリオドだけの行を終端と見なし以降は無視される、という仕様に驚き)

 

qmailやPostfixで、sendmailラッパを利用している場合でも、きちんと動作します。

 

参考サイト)

https://fumiyas.github.io/2014/12/13/sendmail.postfix-advent-calendar.html

またまたcerbot-auto renewでエラー

以前書いた記事とは異なる現象。

CRONで自動更新設定したはずなのに、なーんかまた更新案内メール来てるので、、。

どうやら今回は下記のエラーが発生している模様。

pipをアップグレードしろみたいなことが書いてあるが、、

最新版なんですけど。

 

調べた結果、cerbot-autoスクリプトのpycparserハッシュがおかしいとか。

※今回のcerbot-autoの更新では「pycparser==2.14」ではなく「pyparsing==2.1.8」となっている模様。

これで無事renewも通りました。

を忘れずに。

以下参考サイト)

Let’s Encryptが急に動かなくなった件(THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE.)

https://community.letsencrypt.org/t/certbot-auto-fails-while-setting-up-virtual-environment-complains-about-package-hashes/20529/24

zoneファイルへのDMARCレコード一括追加用シェルスクリプト

業務用スクリプト。

DNSサーバのどこかに置き、指定されたディレクトリ内の名前が「FQDN.zone」で終わるすべてのファイルの末尾に、DMARCポリシー用のTXTレコードを追加するスクリプト。

※ご利用の際は必ずテストを行ってください。
※改変すれば、その他のレコード追加時にも使えると思います。
※コマンドが通らないときはwhichして探してください。

 

cerbot-auto renew でpythonパッケージのインストールが進まない

letsencryptの証明書更新時に、「cerbot-auto renew」でpythonパッケージのインストールが進まない話。
→ 結果、待つしかない(笑)

導入編は、こちらを参照。

さてcronによる証明書の自動更新設定を行っていたはずだが、下記のような「期限が迫ってるよ~。早く証明書更新してね~。」的なメールが届く。
———————————————
Hello,

Your certificate (or certificates) for the names listed below will expire in
9 days (on 12 Mar 17 08:02 +0000). Please make sure to renew
your certificate before then, or visitors to your website will encounter errors.

hoge.jp

For any questions or support, please visit https://community.letsencrypt.org/.
Unfortunately, we can’t provide support by email.
(以下略)
———————————————

おかしーなーと思ってrootあてのメールを見ると、以下のメッセージが。
———————————————

FATAL: Amazon Linux support is very experimental at present…
if you would like to work on improving it, please ensure you have backups
and then run this script again with the –debug flag!

———————————————

debugフラグをつけてコマンドを実行せい!とのことなので、言われたとおりにやってみるが、、

———————————————
# /usr/local/src/letsencrypt/certbot-auto renew –debug
->
Bootstrapping dependencies via Amazon Linux…
yum is /usr/bin/yum
Loaded plugins: priorities, update-motd, upgrade-helper
amzn-main/latest | 2.1 kB 00:00
amzn-updates/latest | 2.3 kB 00:00
epel/x86_64/metalink | 6.0 kB 00:00
epel/x86_64 | 4.3 kB 00:00
epel/x86_64/updateinfo | 741 kB 00:00
epel/x86_64/primary_db | 5.9 MB 00:00
remi-safe | 2.9 kB 00:00
remi-safe/primary_db | 718 kB 00:04
991 packages excluded due to repository priority protections
Package gcc-4.8.3-3.20.amzn1.noarch already installed and latest version
Package augeas-libs-1.0.0-5.7.amzn1.x86_64 already installed and latest version
Package 1:openssl-1.0.1k-15.96.amzn1.x86_64 already installed and latest version
Package 1:openssl-devel-1.0.1k-15.96.amzn1.x86_64 already installed and latest version
Package libffi-devel-3.0.13-16.5.amzn1.x86_64 already installed and latest version
Package system-rpm-config-9.0.3-42.28.amzn1.noarch already installed and latest version
Package ca-certificates-2015.2.6-65.0.1.16.amzn1.noarch already installed and latest version
Package python27-2.7.12-2.120.amzn1.x86_64 already installed and latest version
Package python27-devel-2.7.12-2.120.amzn1.x86_64 already installed and latest version
Package python27-virtualenv-12.0.7-1.13.amzn1.noarch already installed and latest version
Package python27-tools-2.7.12-2.120.amzn1.x86_64 already installed and latest version
Package python27-pip-6.1.1-1.23.amzn1.noarch already installed and latest version
Nothing to do
Creating virtual environment…
Installing Python packages…
——————————————————————————-
この状態でうんともすんとも言わなくなった!
10分待とうが20分待とうが進まないので、再度コマンド発行して、一日放置してみるも、無操作によりsshクライアントとの接続が自動切断、、、

翌週、気を取り直してもう一度試すと、、、え?通った!
——————————————————————————-

Installation succeeded.
Saving debug log to /var/log/letsencrypt/letsencrypt.log

——————————————————————————-
Processing /etc/letsencrypt/renewal/hoge.jp.conf
——————————————————————————-
Cert is due for renewal, auto-renewing…
Renewing an existing certificate
Performing the following challenges:
tls-sni-01 challenge for hoge.jp
Waiting for verification…
Cleaning up challenges
Generating key (2048 bits): /etc/letsencrypt/keys/0001_key-certbot.pem
Creating CSR: /etc/letsencrypt/csr/0001_csr-certbot.pem

——————————————————————————-
new certificate deployed with reload of apache server; fullchain is
/etc/letsencrypt/live/hoge.jp/fullchain.pem
——————————————————————————-

Congratulations, all renewals succeeded. The following certs have been renewed:
/etc/letsencrypt/live/hoge.jp/fullchain.pem (success)
——————————————————————————-

最初はpipのミラーサイトがダメになったのかな?とも思っていろいろ調べたが、結局通信状態の問題もしくは一時的にミラーが落ちてたっぽい。
とりあえず待つしかなかったってことね。

参考サイト)

 

Amazon LinuxでletsEncryptを導入

今回使用したamazon linuxのバージョンは以下。
——————————-
# cat /etc/system-release
-> Amazon Linux AMI release 2016.09
——————————-
WEBサーバはapache2.4。なおWEBサーバの設定の詳細は割愛します。

githubからletsencryptインストール
——————————-
# cd /usr/local/src
# git clone https://github.com/letsencrypt/letsencrypt
# cd letsencrypt
# sudo ./letsencrypt-auto –help –debug
——————————-

※使用するドメインで外部から80番にアクセスできないと認証できないので、あらかじめファイアウォールの解放と、httpd.confの設定を行っておきます。

証明書作成
——————————-
# ./letsencrypt-auto certonly –standalone -d ドメイン名
——————————-

画面の案内に沿って進める。
完了後、サーバ証明書が作成されているか確認
——————————-
# ls -lat /etc/letsencrypt/live/
——————————-

作成した証明書を、ssl.confに指定
——————————-
# vi /etc/httpd/conf.d/ssl.conf
->
:
SSLCertificateFile /etc/letsencrypt/live/ドメイン名/fullchain.pem
:
SSLCertificateKeyFile /etc/letsencrypt/live/ドメイン名/privkey.pem
:
——————————-
※fullchain.pemを指定した場合は中間証明書(SSLCertificateChainFile)の指定は不要。

WEBサーバリロード
——————————-
# service httpd reload
——————————-

ブラウザなどでhttpsでアクセスして証明書が効いているかチェック

更新用コマンド
——————————-
# /usr/local/src/letsencrypt/certbot-auto renew
——————————-

自動更新設定
——————————-
# vim /etc/crontab
——————————-
->
# letsencrypt renew #####
5 4 * * * root /usr/local/src/letsencrypt/certbot-auto renew && /etc/init.d/httpd reload
#########################
——————————-
※ちなみにcerbot-autoが使えるのはpython2.7以降。それ以前の場合は「/usr/local/src/letsencrypt/letsencrypt-auto」を使う

 

参考リンク)

とても便利なGROUP_CONCAT()

今まであまり使う機会がなく知らなかったのだが、グループ化したカラム以外のカラム値をつなげて返してくれるこの関数はとても便利。
しかもDISTINCTも使えるのが最高に良い。(DISTINCTはUNIONでしか使えないと思っていた。。。)

使用例
tb_family

id
1
2
3

tb_parent

id parent_name family_id
1 山田 太郎 1
2 鈴木 花子 2
3 佐藤 次郎 3
4 山田 よしこ 1

tb_student

id student_name family_id
1 山田 息子 1
2 鈴木 息子 2
3 佐藤 息子 3
4 鈴木 娘 2

同じ家庭の保護者(parent)をグループ化して表示

結果

family_id all_parent
1 山田 太郎,山田 よしこ
2 鈴木 花子
3 佐藤 次郎

同じ家庭の保護者(parent)と学生(student)をグループ化して表示

結果

family_id all_parent all_student
1 山田 太郎,山田 よしこ 山田 息子,山田 息子
2 鈴木 花子,鈴木 花子 鈴木 娘,鈴木 息子
3 佐藤 次郎 佐藤 息子

このままだと保護者と学生の列数分ダブってしまうので、、、
同じ家庭の保護者(parent)と学生(student)をグループ化し、重複値は1つにまとめて表示

結果

family_id all_parent all_student
1 山田 太郎,山田 よしこ 山田 息子
2 鈴木 花子 鈴木 娘,鈴木 息子
3 佐藤 次郎 佐藤 息子

Linuxコマンドのワンライナー集

全文検索

で、指定したパス以下の全文検索が実行され、結果には対象のファイルと行番号が表示される。

使用例:hogeディレクトリ以下の、内容に「fuga」という文字列を含んだファイルを検索

 

指定のディレクトリ以下を再帰的にパーミッション変更

使用例:hogeディレクトリ以下の、すべてのディレクトリのパーミッションを755に変更

 

指定のディレクトリ以下の特定の名前のファイルを再帰的に削除

使用例:hogeディレクトリ以下の、desktop.iniファイルを全て削除

使用例:hogeディレクトリ以下の、拡張子が「.ini」のファイルを全て削除

 

WHERE句のINでプレースホルダを使う際の注意点

DBIモジュールでは、プレースホルダを使う場合、基本的な記述は下記のようになる。

んで、SQL分にWHERE句を含んでいる場合で、条件をINで複数指定している場合、

でいけると思いきや、値の最初の要素(カンマで区切った一番最初の値=「あ」)のみプレースホルダに代入されて処理されてしまう。つまり、

と同じ結果となってしまう。

どうやらカンマで連結した文字列を渡しても、配列要素とみなされるようだ。

なので、条件の数分だけ、プレースホルダを作り指定してやる必要がある。

単純に書くと、

てな感じ。

現実的にはINの条件数は動的になると思うので、うちでは下記のような感じで処理している。

・DB処理用ファイル(database.pl)

・呼び出し元

PHPでもフレームワークによってここの処理が違ったりするので注意が必要。