それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Apacheのリバースプロキシで特定のパスをプロキシしない。

Apacheのmod_proxyの設定をしたのでメモをする。

今回は、リバースプロキシ+ある特定のパスだけ、除外条件を書いて別サーバーへプロキシした。

インストール

takuya@host $ sudo aptitude install apache2   #apache2のインストール
takuya@host $ sudo a2enmod proxy              #mod_proxyを有効化
takuya@host $ sudo a2enmod proxy_http         #httpのプロキシを使う

このほかにも

  • proxy_balancer(プロキシ機能を使ったロードバランサ)
  • proxy_ftp ftpサーバーのプロキシ機能がある。
  • proxy_ajp apache tomcat アプリケーション間通信プロキシなどがある。
  • proxy_connect #connect メソッド(HTTPSのプロキシで使う)サポート

などがあります。

Apacheプロキシの設定

Proxyの設定は次のファイルに記述します。Apache全体をプロキシとして使う場合は次の設定。

/etc/apache2/mods-enabled/proxy.conf
#リバースプロキシの設定例
<IfModule mod_proxy.c>
  #リバースプロキシはOff
  #フォワードプロキシを作るときにOnにする。
  ProxyRequests Off
  <Proxy *>
    AddDefaultCharset off
    Order deny,allow
    Allow from all  #リバースプロキシなので制限をしない。
  </Proxy>
  #プロキシ経由であることをヘッダに記述しない
  ProxyVia Off 
  #リクエストは192.168.10.10にへ委譲する
  ProxyPass / http://192.168.10.10/
  ProxyPassReverse http://192.168.10.10 /
</IfModule>

VirtualhostやLocationディレクティブごとに設置も出来る。細かく設定すれば、、URLごとにプロキシしたり、このホストはプロキシ、このホストはプロキシしないなどのホスト単位のプロキシも出来る。さらにHTTPの通信内容を書き換える場合(Cookieの値を書き換えるなど)をする場合は、mod_rewriteと組み合わせて使えばいい。


具体的な設定例

あるディレクトリだけプロキシしない

全てのURLをリバースプロキシするが、特定のURLだけプロキシしない。あるパスだけ除外するとき。除外設定は"!"をつけることで対応できます。ただし、設定が上から下へ処理されるため、除外設定は全体の設定より上にあること。順番が大事。

/etc/apache2/mods-enabled/proxy.conf
<IfModule mod_proxy.c>
  #省略
  # path=/zabbix/ へのリクエストはプロキシしない
  ProxyPass /zabbix/ ! 
  # path=/phpmyadmin/ へのリクエストはプロキシしない
  ProxyPass /phpmyadmin/ ! 
  # path=/p2 へのリクエストはリバースプロキシから除外する。
  ProxyPass /p2 ! 
  
  # 全体(path= /) へのリクエストは192.168.10.10にへ委譲する
  ProxyPass / http://192.168.10.10/
  ProxyPassReverse http://192.168.10.10 /
</IfModule>

ポイントは次の2点

  1. ProxyPassの末尾に 「!」 をつける
  2. 順番を先頭にする。

ある特定のURLだけプロキシする。

Locationディレクティブが使えます。locationディレクティブは必要に応じて使う方が設定が分かりやすいです。乱用は避けた方が良いでしょう。

<Location /images >
  #Proxy設定
</Location>

Locationよりは、Proxyディレクティブが良いと思う。複雑なマッチングを行なうのであれば、Mod_rewiteした方が良い。

Locationディレクティブを使いたく無い。この理由は、プロキシ設定が一カ所に集まらないため。Locationディレクティブ+Proxy設定は設定が多岐にわたるので面倒です。

通常のマッチングであればMod_rewiteの方が見通しが良い。ProxyロードバランサやAJPを組み合わせなら、Locationでも良いが、Mod_rewiteとが面倒なので、設定が散らばってあとで苦労するかも。

あるドメインだけをプロキシしたい

特定のドメインだけをリバースプロキシしたいと思う場合、これはVirtualhostのディレクティブに記述します。

<Virtualhost example.co.jp:80>
  #Proxy設定
</Virtualhost >

Cookieのドメインを書き換える。

シングルサインオンなどで、Cookieのドメインを弄る必要があるときは次のようにします。

ProxyPassReverseCookieDomain 書き換え前のドメイン 書き換え後のドメイン

文字コード変換コマンドの nkfの使い方と実例をまとめました。

Linux文字コード変換コマンドする方法

LinuxはUTF8が普通になりました。EUC環境もまだまだ多く文字コード変換が必要になることもあります。

文字コード変換コマンド nkf

使い方
nkf オプション ファイル [> 出力ファイル]

よく使うオプション

オプション一覧
-e           : EUCコードを出力
-s           : Shift-JISコードを出力
-w           : UTF-8コードを出力(BOM無し)
-g           : 自動判別の結果を表示
--overwrite  : 引数のファイルに直接上書き

覚え方 -w / -W 大文字小文字はペア。
入力は大文字、出力は小文字。sjis-> utf8なら、入力-S 出力 -w で -Sw。入力は自動判別で十分で余り使うことがないので最後に書いた。

使用例

文字コードチェック

 nkf -g readme.txt
UTF8に変換
nkf -w --overwrite readme.txt
nkf -g readme.txt #結果を確認

元の文字コードは自動判別 。ファイルを書き換える。元のファイルを変換して上書きします。

そのほかの使用例

元ファイルを残すときは --overwriteをつけない

EUC-JPに変換

nkf -e --overwrite readme.txt
Shift-JIS(cp932)に文字コード変換
nkf -s --overwrite readme.txt
utf8 に文字コード変換
nkf -w --overwrite readme.txt
JISコード(ISO-2022-JP)に文字コード変換
nkf -j --overwrite readme.txt

iso-2022-jpはメールで使われます*1

複数ファイルをまとめて変換するサンプル

ディレクトリ内部のHTMLファイルをすべて文字コード変換する。

文字コード・改行を変換 →UTF-8/unix形式(LF)に変換

文字コードと改行をコードを合わせて変換できる。

$ nkf -w -Lu --overwrite *.html # *.htmlでまとめて変換
文字コードSJIS、改行→windows(CRLF)に変換
$ nkf -s -Lw --overwrite *.html

文字コードと同時に改行コードもウィンドウズに合わせる。

改行コード関連
-Lu          : unix改行形式(LF)に変換
-Lw          : windows改行形式(CRLF)に変換
-Lm          : macintosh改行形式(CR)に変換

よくある間違い

$ nkf -w readme.txt > readme.txt

上書きできません。入力ファイルと出力ファイルが同じなので、うまくいきません。中身が空っぽになる。

  • --overwriteオプション
  • 別名で保存してmvコマンドで移動する。

オプション一覧

-j(省略可能) : JISコード(ISO-2022-JP)を出力
-e           : EUCコードを出力
-s           : Shift-JISコードを出力
-w           : UTF-8コードを出力(BOM無し)
-Lu          : unix改行形式(LF)に変換
-Lw          : windows改行形式(CRLF)に変換
-Lm          : macintosh改行形式(CR)に変換
-g(--guess)  : 自動判別の結果を表示
--overwrite  : 引数のファイルに直接上書き
--version    : バージョン情報を表示

文字コードの判別がオカシイ時

入力されたエンコーディング判別が、間違っている時に、指定文字コードで強制的に読み込ませたい

```
nkf -S -w ## sjis として読み込んで utfで表示
```

大文字にすると、入力指定ができる。

-E           : EUCコードを入力
-S           : Shift-JISコードを入力
-W           : UTF-8コードを入力

同じことをPHP

RubyPerlのコマンドはあふれているので、敢えて、PHPで挑んでるもの。

PHPで文字コード変換コマンド作成

いままでは、このようなPHPRubyで処理していた。よく考えるとAptで専用プログラムインストールした方が早いよね。

2017-06-14

いくつか追記

2018-07-27

関連資料を追加

*1:GmailUTF-8対応なので最近はメールもUTF-8でOK

rsyncの基本的な使い方。

rsyncの基本的な使い方を覚えましょう。

昔、WinSCPLinuxサーバーからLinuxサーバーへ転送しているのを見たことがあった。WinSCPWindows経由してたわけです。それをみて「Rsync使わないの?」「よく解りませんし、前にグチャグチャになったことがあるので」と答えが返ってきてヘナっとなった。「SCPの方が確実ですよ」と言われたこともある。まぁそうなんだけど。

WinSCPでなんてやってないでさ、Rsyncでパパットできるようになりませんか。Winscpでサーバー間の同期が出来ないので、ローカルのWindows経由は止めましょう。転送待ちですとか言わないようにしよう。

rsyncの特徴

  • 更新されたファイルだけを転送できる
  • Gzipで圧縮転送が可能
  • 使ってないファイルを消せる。
切れても途中から再開できる

転送再開ができるのがcp /scp転送と大きく違うところでしょう。

まずはこれだけ覚えよう 基本

rsync -avz [元] [先]

よく使うオプション

 --delete        :完全同期モード、不要なファイルは消す
 --update        :新規作成されたスキップする (既存の更新のみ
 --ignore-time   :更新されてないファイルは転送しない。
 -v, --verbvose  :処理中のファイル名を表示する。
 -l, --links     : シンボリックリンクを作り直す。
 -n, --dry-run   :転送をテストする。

本番環境でRsyncをミスると致命的です。使って覚えるしか無いのです。緊張する場面でも無理なく使えるように練習しましょう。

練習しましょう。使って覚えましょう。scp -r /cp -r に頼らず、Rsyncでコピーする習慣をつけましょう。

例:ホームディレクトリを別サーバーに移動する

rsync -av takuya@192.168.1.10:/home/takuya/ takuya@192.168.100.23:/home/takuya
転送する。
rsync -a SRC/ DIST

基本的には -aをつけます。-a は省略形です -a は-rlptgoD です。

コピーを作る

rsync -avz /var/www/example.com/ /home/www/example.com

コピー元にファイルを送る

rsync -avz  /home/www/example.com/ /var/www/example.com

コピー元にファイルの削除も反映させる。

rsync -avz --delete  /home/www/example.com/ /var/www/example.com

他の人の作業結果を消さないようにする

rsync -avz --update --delete  /home/www/example.com/ /var/www/example.com

他の人の作業結果を取り込む

rsync -avz --update --delete  /var/www/example.com/  /home/www/example.com

更新ファイルだけ転送

更新ファイルだけを転送するには、具体的オプションを指定します。


rsync -I /home/www/example.com/ /var/www/example.com
#または
rsync --ignore-times /home/www/example.com/ /var/www/example.com 

サーバー間の移動の場合

サーバー間でファイル移動する。このときユーザー情報を転送しません。
パーミッションや、ユーザー情報を転送しないようにします。

転送すると困ることが多いです。uid/gid/modeを無視します。

サーバー間でコピーの例
rsync -rItD /home/www/example.com/ www-data@192.168.2.1:/var/www/example.com

サーバー側の他の更新ファイルを上書きしない。

サーバー側も更新ファイルを持っている場合、サーバー側にある、新しいファイルを上書きすると困ります。サーバーに大勢がファイルを追加する場合。サーバーの新しいファイルを維持する。

サーバー側の方が新しければ、上書きしない
rsync -rItD --update /home/www/example.com/ www-data@192.168.2.1:/var/www/example.com

テストモード

rsync -nave /home/www/example.com/ www-data@192.168.2.1:/var/www/example.com
#-n を追加した。

まず、転送をテストしましょう。転送テストでミスが見つかります。

転送先を転送元に一致させる。

二つのディレクトリを全く同じ構造にする。

rsync -av --delete /home/www/example.com/ /var/www/example.com
#--deleteをつける

スラッシュをつけ忘れると悲劇が起こります。スラッシュには注意しましょう。コピペするときによく間違います。

サーバー側に合わせる。
rsync -av --delete /var/www/example.com/ /home/www/example.com/ 
#先例からSRC/DISTが逆になった。
サーバー側の更新ファイルをだけを持ってくる
rsync -av --update 192.168.2.100:/var/www/example.com /home/www/example.com/

#--delete の代りに--updateを使う。

よくある間違い

末尾のスラッシュを忘れる。または、末尾にスラッシュをつけ忘れる

rsync -av /var/www 192.168.2.1:/var/www #←スラッシュに注意

/var/www/www が出来てしまう。

cpコマンドと同じです。

cp /var/www  /var/www2    #/var/www2/www/index.html になる
cp /var/www/ /var/www2    #/var/www2/index.html     になる
コピー先にスラッシュ

つけてもつけなくても動作は同じ。つけても意味がないのでつけないことにしましょう。

Rsyncで文字化けする。

Rsyncで文字化けする場合はiconvオプションを使うことで回避できる。

rsync -avzu --iconv=CP932,UTF-8 (バックアップ元) (バックアップ先)

ただし--iconvオプションが使えるのはRsyncバージョン3.0以降らしい。

最後に

"--progress"オプションをつけると・・・?チョット嬉しい。

追記

2016-10-28 ちょっと書き換え