AWSWordpress日記

AWS ELB Wordpress SSL https ロードバランサーを使用した構成

2 Mins read

AWS
ELB(ロードバランサー)
SSL
Apache 2.4.39
Wordpress 5.1

■通信環境
クライアントPC

(port:443)

ELB[SSL証明書設定][ELBルールで外部からの80アクセスは443へリダイレクト]

(port:80)

EC2(EC2内は80設定のみでOK)

■事象
・ブラウザからメインhttps(443)へアクセス
・EC2内は80環境として設定しているのでWordpressはhtml生成時にcssなどheader内URLをhttp(80)とする
・ブラウザがheader内URLにメインURLと違うhttp(80)が存在するとセキュリティエラーとして読み込みストップ
・ブラウザ上に正しくhtmlが表示されない

■.htaccessのrewriteのみパターン

# BEGIN K.Miyakoshi

# AWS ELBからのアクセスをHTTPSへ変更する
SetEnvIf X-Forwarded-Proto ^https$ HTTPS=on

# httpアクセスをhttpsへリダイレクトする
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

# END K.Miyakoshi

# BEGIN WordPress

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

# END WordPress

■「conf.d」などvhost.confなどでガッツリパターン

#============================================
# ELB 共通ログ対応 K.Miyakoshi
#============================================
# AWS ELB 対応 クライアントIP取得のため[%{X-Forwarded-For}i]追加
LogFormat "%{X-Forwarded-For}i:%{X-Forwarded-Port}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" elb-accesslog
ErrorLogFormat "[%{u}t] [%-m:%l] [pid %P:tid %T] %7F: %E: [client\ %{X-Forwarded-For}i:%{X-Forwarded-Port}i %a] %M% ,\ referer\ %{Referer}i"

# AWS ELB 対応 ヘルスチェックアクセスを通常ログから除外
SetEnvIf User-Agent "ELB-HealthChecker.*" nolog
# AWS ELB 対応 ヘルスチェックアクセスを別ログファイルに出力する設定
SetEnvIf User-Agent "ELB-HealthChecker.*" elb-log
# imgやjsなどログから除外
SetEnvIf Request_URI "\.(gif|jpg|png|ico|jpeg|js|css)$" nolog

# 通常のログ設定
CustomLog logs/access_log elb-accesslog env=!nolog
ErrorLog logs/error_log

#============================================
# ELB WordPress 対策 https(443)→http(80)リダイレクト問題
#============================================
# AWS ELBがhttpsで受けている場合はHTTPSを有効にする
SetEnvIf X-Forwarded-Proto ^https$ HTTPS=on

# httpアクセスはhttpsにリダイレクトする
<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
	RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</IfModule>

#============================================
# default
# ELBのヘルスチェックに使用(Aliasでも良い)
#============================================
<VirtualHost _default_:80>
	ServerName _default_:80
	ServerAdmin admin@hoge.com

	DocumentRoot "/opt/lampp/htdocs"
	<Directory "/opt/lampp/htdocs">
		AllowOverride All
		Options FollowSymLinks
		Require all granted

		Options +IncludesNoExec
		AddOutputFilter INCLUDES html
	</Directory>

	CustomLog "| /opt/lampp/bin/rotatelogs /opt/lampp/logs/htdocs/access_%Y%m%d.log 86400 540" elb-accesslog env=!nolog
	CustomLog "| /opt/lampp/bin/rotatelogs /opt/lampp/logs/htdocs/elb_%Y%m%d.log 86400 540" elb-accesslog env=elb-log
	ErrorLog "| /opt/lampp/bin/rotatelogs /opt/lampp/logs/htdocs/error_%Y%m%d.log 86400 540"

</VirtualHost>

#============================================
# taro.hoge.com
#============================================
<VirtualHost *:80>
	ServerName taro.hoge.com
	ServerAdmin admin@hoge.com

	DocumentRoot "/opt/lampp/taro"
	<Directory "/opt/lampp/taro">
		AllowOverride All
		Options FollowSymLinks
		Require all granted
	</Directory>

	CustomLog "| /opt/lampp/bin/rotatelogs /opt/lampp/logs/taro/access_%Y%m%d.log 86400 540" elb-accesslog env=!nolog
	# AWS ELB に[taro.hoge.com]DNSに紐づいて設定せれていればログ出力される
	CustomLog "| /opt/lampp/bin/rotatelogs /opt/lampp/logs/taro/elb_%Y%m%d.log 86400 540" elb-accesslog env=elb-log
	ErrorLog "| /opt/lampp/bin/rotatelogs /opt/lampp/logs/taro/error_%Y%m%d.log 86400 540"

</VirtualHost>

#============================================
# jiro.hoge.com
#============================================
<VirtualHost *:80>
	ServerName jiro.hoge.com
	ServerAdmin admin@hoge.com

	DocumentRoot "/opt/lampp/jiro"
	<Directory "/opt/lampp/jiro">
		AllowOverride All
		Options FollowSymLinks
		Require all granted
	</Directory>

	CustomLog "| /opt/lampp/bin/rotatelogs /opt/lampp/logs/jiro/access_%Y%m%d.log 86400 540" elb-accesslog env=!nolog
	# AWS ELB に[jiro.hoge.com]DNSに紐づいて設定せれていればログ出力される
	CustomLog "| /opt/lampp/bin/rotatelogs /opt/lampp/logs/jiro/elb_%Y%m%d.log 86400 540" elb-accesslog env=elb-log
	ErrorLog "| /opt/lampp/bin/rotatelogs /opt/lampp/logs/jiro/error_%Y%m%d.log 86400 540"

</VirtualHost>

#============================================
Read more
LinuxMySQLWordpress日記

WordPress ME2.0系から2.2系にお引越し(EUC-JPからUTF-8に)

1 Mins read

昨今のServerサイドのWeb環境文字コードはMS=Shift_JIS、Linux=EUC-JPだったが、
どうやらUTF-8に落ち着いてきたらしい。
他国の言葉もこれで一括対応出来る、マルチ言語対応が楽だからだろう:roll:

UTF-8は1Byteから4Byteで1文字を表現する可変文字コードである、
多少脆弱性の問題などあるらしいがこれが主力の文字コードときっとなるなぁ~詳しくはWiki等で:razz:

さて、Wordpress MEも2.2系からUTF-8のみの対応になったらしく、
今後、EUC版はバージョンアップが出来なくなるので、

現在のphp4系、MySQL4.0系、Web文字コードEUC-JP環境から
新版のphp5系、MySQL5.0系、Web文字コードUTF-8環境にお引越しをやります。
さらに試しにドメイン名も変えちゃいます!

もちろん、問題点が続発したので記述しておきます:evil:

作業順序
1.旧Wordpress2.0系のコンテンツ及びDB BackUp
2.新サーバーにBackUpをコピーし、起動&正常動作確認
3.Wordpress2.2を上書きしVersionUp、起動&正常動作確認

こんなところでまず

1.旧Wordpress2.0系のコンテンツ及びDB BackUp

・phpMyAdminでテーブル群をsqlとしてバイナリファイルでBackUp
 この時にCreate Databaseはいらない
・コンテンツをFTPツールでBackUp
・・・無事に終了

2.新サーバーにBackUpをコピーし、起動&正常動作確認

・sqlファイルをバイナリーEditで開き、URLとサーバーパスを置換で変更、普通のEditだと駄目ですよ:cool:
 例:URLは「hoge.mein.jp/blog」などを「hoge2.main.jp/blogman」に置換
 例:Server内コンテンツPathは「/usr/local/htdocs」などを「/usr/local/htdocs2」に置換
 あくまでドメイン(URL)を変える時なので変えない人は上記作業はいらない
・phpMyAdminで新規DBを作成する。文字コードは「UTF8」なので照会は「UTF8_unicode_ci」でCreate!
・先ほどBackup&編集したsqlファイルをphpMyAdminで作成したDBに対してインポート処理
 BackupしたsqlファイルはEUC-JPなので、ファイル種類のオプションは「eucjpms」にしてsqlオプションは「MySQL4.0」互換でGo!
・FTPでbackUpコンテンツをUpLoad!

完了!・・・・と行きたい所だけど、もちろんそうは問屋が卸さない:cry:

問題点
1.Wordpress内のオプションの文字コードがEUCのまま
 
2.これまたオプションのrole権限がEUCのまま
 「Warning: Invalid argument supplied for foreach() in /XXXX/wp-includes/capabilities.php on line 19」などのエラーがでる
 
3.テーマファイルがEUCのままなので日本語を使用している場合は文字化けする
 UTF-8はASCIIと互換があるのでASCII系の文字列の場合はEUCファイルでも問題ないが、日本語を使用しているWordpressファイルは基本的に文字化け対象に・・・
 
4.Wordpress2.0系のdbアクセス部分にMySQL5.0系のUTF-8に対応するコードが必要
 MySQLがUTF-8の場合、アクセス時に教える必要がある。
 
5.wp-config.phpの修正

解決方法 (注:DB系のプレフィックス文字「wp_」は環境により違う)
1.Wordpress内のオプションの文字コードがEUCのまま

A.phpMyAdminで「wp_options」テーブルを開き、option_nameが「blog_charset」のレコードを開くそして「option_value」値を「UTF-8」に変更しUpdate!

2.これまたオプションのrole権限がEUCのまま

A.phpMyAdminで「wp_options」テーブルを開き、option_nameが「wp_user_roles」のレコードを開く、「option_value」値が

「a:5:{s:13:"administrator";a:2:{s:4:"name";s:6:"管理人";s:12:"capabilities";a:31:」

などになってると思いますが、ここがみそで「s:13:”administrator”」はs:13とは文字数を表していてEUCでもUTF-8でも”administrator”は13Byteなのですが、「s:6:”管理人”」などはEUCだと全角2Byte×3=6Byteですが、UTF-8だと全角が3Byteなので=9Byteでなくてはいけません。なので「s:9:”管理人”」として、他にも漢字、ひらがながあれば同じように修正してからDBをUpdateする。

3.テーマファイルがEUCのままなので日本語を使用している場合は文字化けする

A.これはEUCファイルをUTF-8文字コードに変換できるツールで修正して:razz:
KanjiTranslatorなど良いですよ!

4.Wordpress2.0系のdbアクセス部分にMySQL5.0系のUTF-8に対応するコードが必要

A.これはphpファイルを修正する必要があります。
「wp-includes/wp-db.php」ファイルの以下の部分に「 mysql_query(“SET NAMES utf8”, $this->dbh); 」を追加する

function wpdb($dbuser, $dbpassword, $dbname, $dbhost) {
$this->dbh = @mysql_connect($dbhost, $dbuser, $dbpassword);
if (!$this->dbh) {
...
}
mysql_query("SET NAMES utf8", $this->dbh);
$this->select($dbname);

5.wp-config.phpの修正
A.これはEUCの部分をUTF-8と変えてください。
また、2.2系からconfigに追加がありますので詳しくはWordpressMEを参照して:roll:

以上の対応で修正完了、そのあとWordpress2.2系を上書きコピーしてupgradeすればOK:razz:

関係ないけどこんなのありました!
FFFTPでUTF-8を扱える拡張版・・・ここに・・・作者さん使わせて頂きます!感謝

Read more
Wordpress

WordPress2.04にてWP_Grins Plugin使用での変更箇所

1 Mins read

WP_Grinsを使用するにあたりPluginを「有効化」するだけでは使用できませんので以下の箇所に修正が必要です。

1.comments.php内の「<textarea name="comment" id="comment"」の前に「<?php wp_grins(); ?>」を追加
 
2.wp-admin/edit-form.phpの「id="content"」の前に「<?php wp_grins(); ?>」を追加
 
3.wp-admin/edit-form-advanced.phpの「id="content"」の前に「<?php wp_grins(); ?>」を追加
 
4.wp-admin/edit-form-comment.phpの「id="content"」の前に「<?php wp_grins(); ?>」を追加

これでスマイリーアイコンが手軽に使えるようになりました:razz:
Readme.txtには他にも手を入れるみたいなこと書いてありましたがこれでイケたので良しとしましょう:roll:

Read more