バーチャルホストのアスタリスクの挙動

バーチャルホストの設定でアスタリスクを使う使わないで挙動が違うので、気をつける。

アスタリスクはすべてのアドレスにマッチしますので、主サーバは リクエストを扱いません。www.example.com は 最初にあるため、優先順位は一番高くなり、default もしくは primary のサーバと考えることができます。つまり、リクエストが どの ServerName ディレクティブにもマッチしない場合、 一番最初の VirtualHost により扱われます。

バーチャルホストの例 - Apache HTTP サーバ バージョン 2.4

 

こんな設定にしました。

<virtualhost *:80>
  ServerName      ec2.example.com
  ServerAlias     ec2.example.com
  VirtualDocumentRoot    /home/ec2/public_html
  CustomLog       "|/usr/local/apache/bin/rotatelogs /usr/local/apache/logs/ec2/%Y%m%d.log 86400 540" combined
  ErrorLog        "|/usr/local/apache/bin/rotatelogs /usr/local/apache/logs/ec2/error_log.%Y%m%d 86400 540"
  ServerAdmin     webmaster@ec2.example.com
  UserDir         disabled
</virtualhost>
    

バイナリデータからファイルの種類を取得する

Android4系でフォームからアップロードした画像ファイルがどうしても Content-Type でファイルの種類を取得できなかったので(application/octet-stream になってしまう)、
バイナリデータからファイルの種類を取得してみた。

http://www.gfd-dennou.org/member/morikawa/memo/binary_regexp_check.htm

PostgreSQL 8.1 の count(*) を高速化


PostgreSQL 8.1 で count(*) の取得が遅いので高速化してみた。

↓高速化対応前


ec_shop=> EXPLAIN ANALYZE SELECT count(*) FROM order WHERE is_settled = 't' AND delete_flag = 'f';
                                                         QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=146378.16..146378.17 rows=1 width=0) (actual time=3108.970..3108.971 rows=1 loops=1)
   ->  Seq Scan on order  (cost=0.00..144762.80 rows=646145 width=0) (actual time=0.241..3091.596 rows=21089 loops=1)
         Filter: (is_settled AND (NOT delete_flag))
 Total runtime: 3109.115 ms
(4 rows)



↓高速化対応後


ec_shop=> EXPLAIN ANALYZE SELECT count(*) FROM order WHERE id > 0 AND is_settled = 't' AND delete_flag = 'f';
                                                                        QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=133584.15..133584.17 rows=1 width=0) (actual time=540.989..540.990 rows=1 loops=1)
   ->  Bitmap Heap Scan on order  (cost=8744.16..133045.70 rows=215382 width=0) (actual time=311.333..524.769 rows=21089 loops=1)
         Recheck Cond: (id > 0)
         Filter: (is_settled AND (NOT delete_flag))
         ->  Bitmap Index Scan on order_idx_is_settled  (cost=0.00..8744.16 rows=430763 width=0) (actual time=306.146..306.146 rows=21092 loops=1)
               Index Cond: ((id > 0) AND (is_settled = true))
 Total runtime: 541.263 ms
(7 rows)



INDEX を利用しているカラムを指定(上の例では id )する事で検索するレコード行数を制限した。
結果、検索する行数が減って結果の表示が速くなった。


↓参考
https://wiki.postgresql.org/wiki/Slow_Counting/ja
https://www.postgresql.jp/document/8.1/html/performance-tips.html


こういうのパズルみたいで楽しい。

リバースプロキシの効果

例えば、サーバを複数台で冗長化している場合、プライマリサーバとセカンダリ以下のサーバでファイルの同期が完了しておらず、若干の差が出る場合がある。

 

今回はMTで作業していたのだけれど、プレビューをする場合はプレビュー用のファイルを書き出された瞬間アクセスするので、セカンダリ以下のサーバに割り当てられた場合プレビューが出来ない場合がある。

 

そういう時にリバースプロキシを使うと良い。

 

ProxyPassMatch /(.*)mt-preview-(.+).html http://primary.www.example.com/$1mt-preview-$2.html

(今回はこんな感じで設定した)

こうすると、mt-preview-が付いたファイルにアクセスした時は必ずプライマリサーバを見る事になる。

homebrewにしたらsshfsができなくなった

すでにosxfuseが入っていて、その後homebrewを入れた。

そしたら今まで使っていたsshfsができなくなった。

[shiotaro@shiotakazuhiro-no-MacBook-Air] ~
% sshfs webservice@test.localhost.vm:/home/webservice ./Desktop/mount
this OSXFUSE library version is incompatible with the OSXFUSE kernel extension

バージョンが変わってしまったらしく、OSXFUSEをアップデートしたら治りました。
もし同じ状況に遭遇したらアップデートすることで治るかもしれません。

 

▼参考

http://www.d-wood.com/blog/2014/02/10_5451.html

※こちらのページの「osxfuseをアンインストールする」をunistallではなくupdateを選択