ReverseProxy配下でDNSアクセス制御をかけると、Apacheが403となる

他ドメインのDNSアクセス制御

他ドメインのDNSをアクセス制御する場合、下記を設定する。
VirtualHostを設定している場合は、上記設定をしないと他ドメインのネームサーバーに同じドメインが指定された場合、他ドメインが同じサーバを向き、ドメイン以外の全てが同じ表示となってしまう。
Googleのペナルティを受ける可能性もある。

/etc/httpd/conf/httpd.conf

<VirtualHost *:80>
     ServerName dummy
     <Location />
        Order deny,allow
        Deny from all
     </Location>
</VirtualHost>

アクセス制御によるエラー

/var/log/httpd/error_log

client denied by server configuration: /var/www/dvh/xxx, referer: http://yyy.com
  • Aサーバ: http://example.com
  • Bサーバ: http://example.com/xxx

上記のようにプロキシサーバを経由し、ディレクトリでサーバ間を振り分けている場合、/xxx側ではApacheがエラーとなり403 forbidden となる。
この場合は、/xxx側のサーバでは、DNSアクセス制御は不要である。

[WordPress] ドメイン名変更手順

環境

項目 説明
OS Amazon Linux AMI 2017.03.1.20170812 x86_64 HVM GP2
Load Balancer ALB
DB RDS, MySQL
Apache 2.4
WordPress 4.5.3
MySQL 5.5
PHP 5.6

事前準備

DumpとコンテンツのBackupを取得しておく。
※私の場合は、WordPressプラグインのBackWPupを用いてAWS S3へ毎日Backupを行っている。

ドメインを取得後、管理画面からサイトアドレスを変更する。

添付画像のURL部分を変更する。

※管理画面から変更せずドメインを更新した場合、MySQLへ接続後Update文を流します。

mysql> select * from wp_options where option_name = 'siteurl','home' \G;
*************************** 1. row ***************************
option_id: 1
option_name: siteurl
option_value: http://before.com
autoload: yes
*************************** 1. row ***************************
option_id: 2
option_name: home
option_value: http://before.com
autoload: yes

mysql> update wp_options set option_value = 'http://after.com' where option_id = 1;
mysql> select * from wp_options where option_id = 1 \G;
*************************** 1. row ***************************
option_id: 1
option_name: siteurl
option_value: http://after.com
autoload: yes
1 row in set (0.00 sec)

旧ドメインの一括置換

DBに格納されたドメインの一括置換には以下のPHPスクリプトを用いる。

Database Search and Replace Script in PHP

サーバのドキュメントルート(デフォルト:/var/www/html/)に解凍したディレクトリを配置し、http://after.com/{解凍ディレクトリ名}へアクセスする。replacehttp://を含めずbefore.comを入力し、withhttp://を含めずafter.comを入力する。Dry-runでプレビューし、live runで実行する。

※置換後はdelete meボタンから該当ファイルを削除する。

トラブルシューティング

サイトが旧ドメインへリダイレクトされる

以下の定数値を、新しいドメインのDBへ変更する。

define('WP_HOME','https://halclan.net');
define('WP_SITEURL','https://halclan.net');

※一時的な措置であり、データベースが更新され次第削除する。

参考

WordPress の引越し

[Linux] 基礎コマンド

更新中。

ls

-R: ディレクトリ内容を再帰的に表示(全て表示)
-t: Timestamp(降順)
-r: リバース(Timestamp昇順)
-a: 拡張子含め表示

cp

# 最終更新日時と最新アクセス日時,所有者と所有グループ,アクセス権(パーミッション)を保持しつつ、ディレクトリを丸ごとコピーする。
$ cp -Rp {ディレクトリ名}

-p: オーナー,グループ,パーミッション,タイムスタンプを保持したままコピー
-f: 同名ファイルがある場合, 警告せず上書き
[Linux] “-f”オプションを付与してコマンドを実行しても、対話形式となってしまう場合がある

mkdir

複数ディレクトリを一気に作成

$ mkdir -p

find

# `2>/dev/null` は許可されていない旨のエラーを出力しないようにしている。
$ find / -name "{検索ファイル名}" -type f 2>/dev/null -print0

$ find . -name "{検索ファイル名}" -type f 2>/dev/null -print0 | xargs -0 grep "{ファイルに含まれる文字列}"

# 直近xx分以内に更新をかけたファイルをfindする
## 現在~分以内
$ find . -type f -mmin -10

## 現在~日以内
$ find . -type f -mtime 2

# 特定のディレクトリを除いて、find検索を行う。
find {検索パス} -type d -name {除外パス} -prune -o -type f -name "{検索ファイル名}" -print

# 7日以上前の".tar.gz"ファイルを削除する。
$ find {BK_PATH}/ -name "*.tar.gz" -type f -mtime +7 | xargs rm -fv

# 圧縮されたjarファイルの中から、該当のClassファイルを検索する。
$ find . -name "*.jar" -exec zipgrep "{検索文字列}" '{}' \;
$ for FILE in $(find . -name '*.jar') ; do jar -tvf $FILE | grep "{検索文字列}" ; done

grep

  • grep: 簡単な絞り込み。
  • egrep: より強力な正規表現(EREs)が利用可能。ファイルの中から指定されたパターンを検索。grepに-Eオプションをつけた場合と同じ挙動。
  • zgrep: gzipなどで圧縮されたファイルも検索可能。
# "xxx"を含む行すべてを表示
$ grep "xxx" test.html

# "xxx"を含まない行すべてを表示
$ grep --invert-match[-v] "xxx" test.html

# 最大検索数をnとし、それ以上の検索は中止
$ grep --max-count[-m] {n} "xxx" test.html

# 行数を表示
$ grep --line-number[-n] "xxx" test.html

# "xxx"の前後10行を表示
$ grep --context[-C] 10 "xxx" test.html

# "xxx"を含む行とその次の10行を表示
$ grep --after-context[-A] 10 "xxx" test.html

# "xxx"を含む行とその前の10行を表示
$ grep --before-context[-B] 10 "xxx" test.html

# 大文字/小文字を区別しない
$ grep --ignore-case[-i] "xxx" test.html

# ファイル内文字列検索
$ grep -rl "xxx" *

# 件数表示 (wc:word count)
$ grep -rl "xxx" * | wc -l
$ grep -rl "xxx" * | grep "cache" | wc -l

# 特定のディレクトリを除外
grep -rl "xxx" {検索パス} --exclude-dir={除外パス}

# 特定のファイルを除外
grep -e "xxx" --exclude {除外文字列} -ri {検索パス}

# 引数で指定した"xxx"にマッチする部分のみ表示。大文字/小文字を無視。"aaa",".bbb"ディレクトリを除外。xxxが含まれるが、"/tmp-xxx","test-xxx"は除外。
$ grep -ri --only-matching "xxx" . --exclude-dir={aaa,.bbb} | egrep -v '/tmp-xxx|/test-xxx'

awk

スペースで区切られた複数列のテキストデータを処理する。

$ head /var/log/httpd/access_log | awk '{print $1"   "$7" "$9}'
xxx.xxx.xxx.xxx   /healthCheck.html 200
xxx.xxx.xxx.xxx   /healthCheck.html 200
xxx.xxx.xxx.xxx   /healthCheck.html 200
xxx.xxx.xxx.xxx   /healthCheck.html 200
xxx.xxx.xxx.xxx   /healthCheck.html 200
xxx.xxx.xxx.xxx   /healthCheck.html 200
xxx.xxx.xxx.xxx   /healthCheck.html 200
xxx.xxx.xxx.xxx   /healthCheck.html 200
xxx.xxx.xxx.xxx   /healthCheck.html 200
xxx.xxx.xxx.xxx   /healthCheck.html 200

# "access_log"の1列目をユニークに抽出する
$ head -300 /var/log/httpd/access_log | awk '{print $1}' | sort -n | uniq -c
      5 127.0.0.1
    141 172.0.0.27
    141 172.00.13.248
     13 202.00.232.55

# "access_log"の1,7,9列目をユニークに抽出しつつ、ソートを行いLESSを起動する
$ cat /var/log/httpd/access_log | awk '{print $1"   "$7" "$9}' |sort |uniq -c|less
      1 111.111.111.111   /healthCheck.html 503
      8 111.111.111.111   / 200
      3 111.111.111.111   /test 200
     46 111.111.111.111   /api/getTest.html 200
     42 111.111.111.111   /api/getAreaTest.html 200

# Fオプションで区切り文字を指定
$ cat test.csv | awk -F',' '{print $2}'
 iii

# 例えばcsvでユーザー、HOST名がリスト化してあるものを、awsで接続用コマンドを出力する
$ cat test.csv | awk -F',' '{print "mysql -u"$2 " -p -h"$4}'
mysql -u developer -p -h test.com
mysql -u testuser -p -h test.com

nslookup

ドメインからIPを調べる。
DNSのサーバーに対して直接DNS要求を送り、その結果を表示。

$ nslookup xxx.com
Server:		xx.xx.x.x
Address:	xx.xx.x.x#53

Non-authoritative answer:
Name:	xxx.com
Address: xx.xx.xxx.xx

dig

DNS(ネームサーバー)の情報を調べる。

$ dig -t soa xxx.com

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.51.amzn1 <<>> -t soa xxx.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62640
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;xxx.com.		IN	SOA

;; ANSWER SECTION:
xxx.com.	60	IN	SOA	ns-1466.awsdns-55.org. awsdns-hostmaster.amazon.com. 1 xxx 900 xxx xxx

;; Query time: 26 msec
;; SERVER: xx.x.x.x#53(10.0.0.2)
;; WHEN: Tue Apr xx xx:xx:xx 2017
;; MSG SIZE  rcvd: xxx

各種バージョン確認

こちらの記事を参照。

curl

HTTPやFTPプロトコル経由でファイルのダウンロード、アップロード、サーバーの生死確認、APIの試打、スクレイピング等に利用する。

# ローカルIP確認
$ curl ifconfig.co

# レスポンス確認(ヘッダーのみ)
$ curl -I http://xxx.xxx.xxx.xxx:80/

# レスポンスをファイルに出力
$ curl -i http://xxx.xxx.xxx.xxx:80/ -O

ping

指定したIP、もしくはホスト名に対してパケットを送信し、応答を確認する。利用プロトコルはICMP。確認できるのは、OSI参照モデルのネットワーク層(IPレベル)まで。トランスポート層やアプリケーション層は確認不可。Pingは通るがWebが見れない場合は、Webサーバー側に問題があるのではないか、と予測できる。

$ ping {IPアドレス | ホスト名} [-c パケット送信回数] [-i 待機秒数] [-w 実行秒数] [-n IPからホストを検索しない]

telnet

単に経路が有効かどうかだけを調べたければ通常はpingコマンドを利用するが、接続先の特定ポートへ接続できるかを確認するにはtelnetコマンドを使う。

$ telnet [ポート番号]

dstat

サーバー全体のリソースを監視。

オプション 説明
-c CPU時間の割合
-d ディスクI/Oバイト数
-g ディスクからメモリへのI/Oバイト数
-i 割込状況
-l LoadAverageの状況
-m メモリの状況
-s Swap状況
-y システムの状態
$ dstat -Tclmdrn

ln

オプション 説明
-f 同一ファイルを上書きして強制的に作成する
-i 同一ファイルがあった場合確認する
-v 実行内容を出力
-n 同一ファイルがある場合は何もしない
$ ln -s /Users/developer/Dropbox/env/.zshrc /Users/developer

# リンクを削除(rmでも可)
$ unlink /Users/developer/.zshrc

tree

# ディレクトリのみ表示
$ tree -d

# ファイル・ディレクトリのサイズを表示
$ tree -s

# 現在の位置から表示させる階層の数を指定
$ tree -L 2

# ドットファイルも出力対象
$ tree -a

scp

# ローカルのファイルをリモートサーバーへ送信
$ scp /Users/user_name/file.php ec2-user@xxx.com:/home/ec2-user/{path}

# リモートサーバーのファイルをローカルへ転送
$ scp ec2-user@xxx.com:/home/ec2-user/{path}/file.php ~/Desktop/

# ポートを指定し、ディレクトリをコピーし、ローカルへ転送
$ scp -r -P 2222 ec2-user@xxx.com:/home/ec2-user/{ディレクトリ} ~/

# ~/.ssh/config の設定を読み込みつつ、scpを利用
$ scp dev-web:/home/ec2-user/test.conf ./

# "Permission denied" となる場合ssh-addを行う
$ ssh-add ~/.ssh/xxx.pem

# オプション
-p 最終修正時刻、最終アクセス時刻、パーミッションを引き継ぐ
-P ポートを指定

# 踏み台サーバを経由して転送
$ scp -o 'ProxyCommand ssh user@basition-host nc %h %p' ./path/to/copy/from user@remote-host:/path/to/copy/to

ssh

こちらの記事を参照。

圧縮

tar: http://webkaru.net/linux/tar-command/
gzip: http://webkaru.net/linux/gzip-command/

Current directoryで圧縮を行う。パス指定で操作すると事故を起こす。
tarの必須オプションは事故を起こすものが多い為、注意

# 連結したやり方
$ tar -cf archive.tar dir; gzip archive.tar
$ tar -zcf xxxx.tar.gz directory

# 分割したやり方
$ tar -cf archive.tar dir
$ gzip archive.tar

# 必須オプション
-c	新しくアーカイブを作成
# 任意オプション
-f アーカイブファイルを指定
-v 作成・展開するアーカイブのファイルリストを表示
-z gzip形式にアーカイブを圧縮・展開
-x アーカイブを展開

最高レベルで圧縮する (bashのみ)
ベストな圧縮をする場合、gzipを使わない。lzma7z を使う。

$ GZIP=-9 tar czf file.tar.gz /path/to/directory

絶対パスを指定して”tar: Removing leading `/’ from member names”のエラーが表示される場合は、”-C / {PATH}”で抑制する。
例) Shell Script等でDumpファイルをtarする場合等。

GZIP=-9 tar czf ${BACKUPDIR}/${DB_NAME}-dump-`date +%Y%m%d%H%M`.tar.gz -C / backups/databases/${DB_NAME}-dump.sql

zip作成

$ zip -r xxx.zip xxx

解凍

$ tar -zxf xxxx.tar.gz

ポート確認

# プロセスが使用しているポートを確認
$ lsof -i

# ポート番号から使用しているプログラムを確認
$ lsof -i:80

# 通信が確立しているtcpポートの状況を調べる
$ netstat -t

# 接続待ちをしているTCP、UDPポートを表示する
$ netstat -antu

du

Disk Used 。
個々のディスク使用量。

# public.shtml以下のディレクトリの容量をKバイト単位で表示する
$ du -k public.shtml
1024    public.shtml/images
364     public.shtml/doc
1905    public.shtml

# public.shtmlディレクトリのみの容量を表示する
(サブディレクトリの情報は表示しない)
$ du -s public.shtml
1905    public.shtml

# public.shtmlディレクトリの容量のみを表示する
$ du -sS public.shtml
517

$ du -sh *
4.0K	Gemfile
4.0K	Gemfile.lock
3.2M	cookbooks

NKF

# インストール
$ brew install nkf

# エンコードの確認
$ nkf -g foo.csv
UTF-8

# Shift-jisへ変換 (-s)
$ nkf -s foo.csv > bar.csv

# UTF-8へ変換 (-w)
$ nkf -w foo.csv > bar.csv

# UTF-8+unix改行コード(LF)へ変換
$ nkf -w -Lu foo.csv > bar.csv

# SHIFT-JIS+Windows改行コード(CRLF)へ変換
$ nkf -s -Lw foo.csv > bar.csv

# UTF-8へ変換+Macintosh改行コード(CR)へ変換
$ nkf -w -Lm foo.csv > bar.csv

whois

$ whois test.com
Domain Name: TEST.COM
Registrar: AMAZON REGISTRAR, INC.
Sponsoring Registrar IANA ID: 468
Whois Server: whois.registrar.amazon.com
Referral URL: http://registrar.amazon.com
Name Server: NS-xxxx.AWSDNS-55.ORG
Name Server: NS-xxxx.AWSDNS-03.CO.UK
Name Server: NS-xxx.AWSDNS-54.COM
Name Server: NS-xxx.AWSDNS-30.NET
Status: ok https://icann.org/epp#ok
Updated Date: 14-may-2017
Creation Date: 09-jul-2016
Expiration Date: 09-jul-2017

NTP

http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/set-time.html#configure_ntp

# NTP サービスを起動
$ sudo service ntpd start

# ブート時に NTP を開始
$ sudo chkconfig ntpd on

# NTP が有効かどうか
$ sudo chkconfig --list ntpd
ntpd           	0:off	1:off	2:on	3:on	4:on	5:on	6:off
# 実行レベル 2、3、4、および 5 で ntpd がオンになっていれば、適正。

# NTP が機能していることを確認
$ ntpstat

ip

$ ip -f inet -o addr show

監視

vmstat

メモリやCPUの情報だけでなく、スワップやプロセスの情報を出力。

$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 653116 165176 2561636    0    0     0     5   41   31  0  0 100  0  0
 0  0      0 653116 165176 2561636    0    0     0     0  211  499  0  0 100  0  0
 0  0      0 653084 165176 2561636    0    0     0    20  264  573  0  0 100  0  1

si(スワップイン), so(スワップアウト)が頻繁に動いている場合はスワップが発生している。他の項目としては、rは実行待ち状態のプロセス数、bは割り込み不可能なスリープ状態にあるプロセス数。memoryの項目はfreeと同様、ioはデバイスとのブロックの転送量、systemはコンテキストの毎秒の切り替えレート(割り込み回数・コンテキストスイッチの回数)、cpuはCPU使用率。

ps

psで特定のプロセスだけ確認する。

$ ps -C java ufw
$ ps -Cruby,nginx ufw

メモリ確認

$ cat /proc/meminfo |egrep -e "Active:|Inactive:|MemFree:"
MemFree:          208944 kB
Active:          3033956 kB
Inactive:         636568 kB

Swap

こちらの記事を参照。

top

こちらの記事を参照。

passwd

こちらの記事を参照。

user*

新規ユーザー追加

$ useradd {User_Name}

グループへ追加

# -Gのみで新しいサブグループを追加しない。既に設定されている他グループ設定が消える。
$ sudo usermod -aG {Group_Name} {User_Name}

# 指定グループの所属ユーザーを確認
$ getent group {Group_Name}

ユーザー削除

# -rオプションでhomeディレクトリごと削除
$ sudo userdel -r olduser

wget

ファイルをダウンロードする。

# 指定したURLからファイルを取得する
$ wget {URL}

# バックグラウンドでプロセスを実行する
$ wget -b {URL}

# 指定したファイルへログを出力する
$ wget -o /tmp/test.log {URL}

# ファイルが存在している場合は、ダウンロードしない
$ wget -nc {URL}

less

ファイルの中身を閲覧する。

# -N: 行数表示
# -M: カーセルの行数、ファイル名表示
# -i: 検索時大文字でない限り大文字/小文字を区別しない
# -S: テキストを折返し表示しない
$ less -NMiS {FILE_NAME}
less起動後のコマンド 説明
R 画面再描画
F “tail -f”と同様
Enter 1行進む
y 1行戻る
g 先頭へ
G 末尾へ
space 1画面戻進む
b 1画面戻る
q 終了

mail

受信したメールの確認をする。

$ mail
Heirloom Mail version 12.4 7/29/08.  Type ? for help.
&quot;/var/spool/mail/root&quot;: 2 messages 2 new
>N  1 developer@xxx  Tue Jun  6 22:18  17/770   &quot;*** SECURITY information for xxx ***&quot;
 N  2 developer@xxx  Tue Jun  6 22:19  17/779   &quot;*** SECURITY information for xxx ***&quot;
&amp;
Message  1:
From developer@xxx  Tue Jun  6 22:18:40 2017
Return-Path: &lt;developer@xxx&gt;
Date: Tue, 6 Jun 2017 22:18:40 +0900
To: root@xxx
From: developer@xxx
Auto-Submitted: auto-generated
Subject: *** SECURITY information for heart-core-dev ***
Status: R

xxx : Jun  6 22:18:40 : developer : user NOT in sudoers ; TTY=pts/0 ; PWD=/home/developer ; USER=root ; COMMAND=/bin/su -

>N  1 developer@xxx  Tue Jun  6 22:18  17/770   &quot;*** SECURITY information for xxx ***&quot;
 N  2 developer@xxx  Tue Jun  6 22:19  17/779   &quot;*** SECURITY information for xxx ***&quot;

|メールステータス|1,2,3…|developer@xxx|17/770|”*** SECURITY information for xxx ***”|
|N: 新着, U: 未読, R: 既読, S: セーブ済み|受信した順番|送信者|メール行数/文字数|題名|

yum

依存関係を考慮しつつパッケージ管理を行い、インストール/更新が可能。
こちらの記事を参照。

convmv

ファイル名のエンコードを変更する。

# Dry run
$ convmv -f sjis -t utf-8 *

$ convmv -f sjis -t utf-8 * --notest

# ディレクトリの場合
$ convmv -r -f sjis -t utf-8 * --notest

tr

文字の一括置換を行う。

split

ファイルを条件を指定して分割する。

watch

コマンドの定期実行。

$ brew install watch

# 何らかのスクリプトを実行している際に、ファイルサイズの変化等を監視する
# -e: 実行結果がエラーとなった場合に終了
# -c: カラー出力
# -n: 実行間隔(秒)
$ watch -e -c -n 1 ls -la

w

ログインユーザーの利用状況を確認する。

項目 説明
TTY 端末
FROM 接続元Ip
LOGIN@ ログイン日時
IDLE 入力待ち状態時間
JCPU 全プロセスの処理時間
PCPU 実行中プロセスの処理時間
WHAT 現在実行中のプロセス
$ w
 19:44:20 up 79 days,  2:14,  5 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
xxx      pts/0    111.111.111.111   15:05    2:37m  0.15s  0.00s sshd: xxx [priv]
xxx      pts/1    111.111.111.111   Wed18    2days  0.02s  0.00s sshd: xxx [priv]
xxx      pts/2    111.111.111.111   15:07    3:16m  0.04s  0.00s sshd: xxx [priv]
xxx      pts/3    111.111.111.111   15:09    1:16m  0.11s  0.00s sshd: xxx [priv]
xxx      pts/4    111.111.111.111.b 19:40    1.00s  0.00s  0.00s w