古いWordPressサイトをStaticPressで静的に書き出してしまおう

WordPressで作ってた古いサイトを静的サイトに変換しておけば、
今後バージョンアップだとかセキュリティアップデートだとかに手間取らない。

ということで久々に触ったサイトのWordpressを最新版にバージョンアップして
StaticPressプラグインを導入。

有効化するぞーと思ったらエラーが。
class-static_press.phpの965行目でsyntax error。unexpected T_SL…

$regex = <<<'END'
/
(中略)
/x
END;

PHPのヒアドキュメントの開始でエラー。
シングルクォートで囲む ‘xxx’ という指定法はNowdoc形式といって、PHP5.3以降でないと使えない。
今回使ってたサーバーはさすが古いだけあって5.2.xでした。

幸い、(中略)の中にシングルクォートや変数を含む部分は無かったので

$regex = '
/
(中略)
/x
';

として解決。
直接プラグインを書き換えるのは一時しのぎだけど、
どうせこのサイトは静的に書き出してしまうのだからこれでも良かろう。

「良かろう」なんて普段使わない言葉遣いしたら亘理町の「よかろう寿司」に行きたくなったわね!はらこめし!
(↓元祖はらこめし味くらべのときの様子)

で、有効化したらメニューのStaticPressから設定して書き出し開始。
設定の「静的サイト URL」は、出力したファイルを後で運用するURLを指定しておく。
「出力先ディレクトリ (ドキュメントルート)」は既存のwordpressファイルととカブると面倒なので
独自のディレクトリを指定しておいた方がラクだと思う(無ければ作ってくれる)。

あとはできあがったファイルを適当に移設して公開すればオッケーよ!

EdgeRouter XをOpenVPNサーバーにする

EdgeRouterXを入手しました。
VPNを設定します。
L2TP/IPsecでもいいんですが、他のプラットフォームでも使ってるのでOpenVPNにしたい。

ubntにサイトにはsite-to-siteとかER-X同士のserver-clientしか書いてなかったが、
考えてみればserver-clientのclient側は他の端末でも良いはず。

…と作業して1回目は「繋がるのに通信できない」状態で諦め。
改めて作業したらあっさりつながった。

ER-Xはeth0からPPPoEでWANへ。
eth1~eth4は内部的にswitch0に接続、switch0はproxyarpをonに。

LANは192.168.64.0/24、OpenVPN側を192.168.65.0/24にする内容で


# sshでER-Xにログイン
sudo su
cd /usr/lib/ssl/misc
# CA作成
./CA.sh -newca

# server用の鍵作成
./CA.sh -newreq
./CA.sh -sign

cp demoCA/cacert.pem demoCA/private/cakey.pem /config/auth/
mv newcert.pem /config/auth/server.pem
mv newkey.pem /config/auth/server.key
openssl rsa -in /config/auth/server.key -out /config/auth/server-nopass.key

openssl dhparam -out /config/auth/dhp.pem -2 1024

# client用の鍵作成。hostnameがserverや他のclientとかぶらないようにする
./CA.sh -newreq
./CA.sh -sign
mv newcert.pem client1.pem
mv newkey.pem client1.key
openssl rsa -in client1.key -out client1-nopass.key
# ↑クライアント2つ目以降はここを繰り返し

# clientに client1(-nopass).key,client1.pem,cacert.pem をコピー

# EdgeRouterXの設定
—-
configure

edit interfaces openvpn vtun0
set mode server
set server subnet 192.168.65.0/24
set tls ca-cert-file /config/auth/cacert.pem
set tls cert-file /config/auth/server.pem
set tls key-file /config/auth/server-nopass.key
set tls dh-file /config/auth/dhp.pem

# ルーティング情報のpush
set server push-route 192.168.64.0/24

# 下記は無くても繋がるけどいつも入れてる
## openvpn-optionをダブルクオートで囲んだり
## –comp-lzoみたいにハイフン付けたりするのは何か違いがあるのか?(調べなきゃ)
set openvpn-option comp-lzo
set openvpn-option persist-key
set openvpn-option persist-tun
# LAN側のDNSをpushする
# LAN側で別のローカルDNSがある環境なのでそれを指定(2019-01-09追記)
set server name-server 192.168.64.2
set openvpn-option “dhcp-option DNS 192.168.64.2”
set openvpn-option “dhcp-option DOMAIN localdomain”

# OpenVPN向けのFirewall設定
top

edit firewall name WAN_LOCAL rule 1
set description OpenVPN
set action accept
set destination port 1194
set log disable
set protocol udp

# 保存
commit
save
exit
—-


# clientにovpnファイルを作る
----
client
dev tun
proto udp
remote erx.example.com 1194
resolv-retry infinite
nobind
persist-key
persist-tun
verb 3
ca cacert.pem
cert client1.pem
key client1-nopass.key
----

これでとりあえず繋がった。
ta.keyとかtls-cipherの設定を追加してより強固にしたいが、また後日。

更新しなくなったWordPressサイトを静的にしておく

WordPressはPHPで動的にサイトを出してます。
当然サーバーのCPUパワーを食うので、更新しなくなったサイトは静的に変換して置いておきたい。
StaticPress等のプラグインを入れて出力させるのが常套手段なのですが、現段階の最新版Wordpress4.7.2に入れたらエラーが出たりして(使っているテーマ、環境にもよると思います)。

ならば無理矢理クロールして取ってしまえ!ということでwget
$ wget -nc -x -r http://example.com

出来上がったファイルは拡張子がhtmlじゃないものも多いので、
設置先サーバーのほうでMIME-typeをいじります。

今回はnginx上に置いたので

server {
    server_name example.com;
    location / {
        default_type text/html;
    }
}


これだけ。
たぶんApacheでもDefaultType text/htmlとか書いておけば拡張子ナシでもhtmlとして出してくれるでしょう(未確認)

あとはアクセスしてみて、微妙にリンク先が無かったりするものは個別に手直し。
Wordpressに限らず動的サイトを静的にするのに使えるなぁ。

2017-04-19 追記: wgetによる収集では一部欠けているようで、
やはりなんとかアップデートした後にStaticPressするのが良さそうです。

CentOS+Postfix環境でDKIM導入

CentOS5, CentOS6でpostfix使ってるところにDKIMを入れたのでメモ。

EPELを有効にしてyum -y install opendkimで入る。あっさり。

PostfixをDKIM認証に対応(CentOS) – Angel21 HP Blog
人様のblogを頼りに一通り設定する。
# mkdir /etc/opendkim/keys/example.com
# opendkim-genkey -D /etc/opendkim/keys/example.com -d example.com -s 20170208
# chown opendkim:opendkim /etc/opendkim/keys/example.com/*

namedへTXTレコード追加
20170208._domainkey IN TXT "v=DKIM1; k=rsa; p=Mf(略)B"
_adsp._domainkey IN TXT "dkim=unknown"
_dmarc IN TXT "v=DMARC1;p=none;rua=mailto:dmarc@example.com;ruf=mailto:dmarc@example.com;rf=afrf;pct=100"

/etc/opendkim.conf
Mode sv
#KeyFile
KeyTable
SigningTable
ExternalIgnoreList
InternalHosts

秘密鍵指定
/etc/opendkim/KeyTable
20170208._domainkey.example.com example.com:default:/etc/opendkim/keys/example.com/20170208.private
ドメイン指定
/etc/opendkim/SigningTable
*@example.com 20170208._domainkey.example.com

追加でポイント

●namedで _ アンダースコアが使えない
named-checkzoneしてみると bad owner と言われてアンダースコアから始まる名前が使えない。
_dmarcを書くときに困るので、対象ゾーンにcheck-names ignoe;を追記して通るようにする。
zone "example.com" IN {
type master;
file "example.com.hosts";
check-names ignore;
};

●opendkimの鍵ファイルがセキュアじゃないと言われる
実際に送信してみるとエラーで送れてない。
maillogを見ると
key data is not secure: opendkim is in group 0 which has multiple users (e.g., "sync")
とエラーが出てる。にしてもgroup 0ってなぁ…

ググっても日本語資料皆無なので英語フォーラム見たら、軒並み回答なし。
しかしヒントっぽいのがあったので

opendkim.conf

/etc/opendkim.confの末尾に RequireSafeKeys false を追加。これで動いた。

WordPressサイトの全SSL化…一部リンクがSSLにならない

とあるwordpressを使ってるサイトを常時SSL化することになりました。
VPSだったのでSSL証明書の取得からインストールまでLet’s Encryptですんなり行きました。

Let’s Encrypt 総合ポータル

次にWordpressの設定でホームURLを http から https に変更します。
そして全文検索してhttpのリンクをhttpsにします。
このへんはSearch and Replace for WordPress Database Scriptを使用。

WordPress移行時にURLをSQLで直接一括置換はダメ! 「Search and Replace for WordPress Databases Script」を使おう | infoScoop開発者ブログ

あとはテーマのファイルをgrepしてhttp箇所を //からの表記に直したり…

しかしメニューのリンクとか一部プラグインの出力がSSLにならない。
ソースを見るとget_page_link()とかで呼んでるわけです。
じゃぁ中身の設定に従うはずだよなぁ…と wp-includes/link-templates.php を読み、
データベースを疑い…わからん。

しかし結局Really Simple SSLというプラグインを入れたらあっさり解決。
なんだ、どこにこの違いがあったのだ…

WordPressを一瞬でHTTPS化するプラグイン「Really Simple SSL」の使い方

今後常時SSLサイトが増えるだろうし、もうちょっと根本的に原因を探りたいのだがなぁ