2012年2月20日月曜日

return アクセス拒否にするには

if と return を使うことによって
Apacheでいうところのdenyが実装できます。

server {
     if ($remote_addr = '***.***.***.***') {
         return 403;
     }
}

$remote_addrにクライアントのIPアドレスが格納されています。
ifの判断記号を変更することによりネットワークも指定できますね。

if ($remote_addr ~ '***.***.***.') {
    return 403;
}


$http_refererにはアクセス元のURLが格納されます。
例なので、google関連からのアクセスは遮断してます。

if ($http_referer ~* 'google') {
    return 403;
}


rewrite URLに「www」付きで統一

今回は、rewriteの書き方を投稿します。

server {

    if ($http_host = sample.com) {
        rewrite (.*) http://www.sample.com$1 last;
    }

}


$http_hostには、ドメイン名が格納されます。
そのため、sample.comにアクセスしてきた場合
http://www.sample.com$1に書き換えます。

【小言】
もっとrewriteについては、動作確認が必要ぽい。
応用が大いに効く。

ただ、応用しなければならないURIは考えなおしたほうがいい。

favicon.ico ファビコンのアクセスログを出力しない

faviocnの設置していない時に
以下の設定を行えば、ログへの出力をoffに出来ます。

server {
    location = /favicon.ico { access_log off; log_not_found off; }
}


【小言】
ファビコンはMicrosoftが強引に標準化したイメージしかない。

Webでfacivonが作成できるらしい。
http://www.favicon.cc/

2012年2月17日金曜日

if の判定記号

if 文にはお世話になります。

それは、rewrite可否の判定だったり、動的・静的コンテンツの判断だったり
または、モバイル対応だったりと

必ず覚えておきましょう。


server及びlocationディレクティブ内でしか使えません。

if (A = B) {
    ~処理~ 
}


###
# ifの後にはスペースが必要です。
# 守らないと以下の構文エラーが出ます。
# nginx: [emerg] unknown directive "if(A =B" in /etc/nginx/nginx.conf:12  
#
# if (    構文OK
# if(     構文NG
###

###
# また、判定記号は、以下のようになっています。
#
~    BAに含まれるか
!~  BAに含まれないか
~*   BAに含まれるか(大文字小文字を問わず)
!~*  BAに含まれないか(大文字小文字を問わず)
=    ABが完全一致か
!=   ABが異なるか
-f   ファイルが存在するか
!-f  ファイルが存在しないか
-d   ディレクトリが存在するか
!-d  ディレクトリが存在しないか
-e   ファイル、ディレクトリ、またはシンボリックリンクが存在するか
!-e   ファイル、ディレクトリ、またはシンボリックリンクが存在しないか
-x    実行可能であるか
!-x   実行不可であるか

参考
http://wiki.nginx.org/HttpRewriteModule#if


【小言】
よく使います。

モバイルからのアクセス対応



ここでは、スマートフォンからアクセスされた場合に
サブドメインを付与し、別のページに遷移させるよう設定します。

例:
モバイル向け(サブ)ドメイン:m.sample.com
PC向けドメイン:sample.com


### PC向けには、デフォルトであることを明示しましょう
server {
    listen        80;
    server_name m.sample.com;

    if ($http_user_agent !~* Android|iPhone|iPod) {
        rewrite (.*) http://sample.com$1 last;
    }

    location / {
        root   /var/www/mobile;
        index  index.html;
    }
}

server {
    listen        80;
    server_name sample.com default_server;

    if ($http_user_agent ~* Android|iPhone|iPod) {
        rewrite (.*) http://m.sample.com$1 last;
    }

    location / {
        root   /var/www/html;
        index  index.html;
    }
}

### モバイルのUser-Agentは、把握しきれないくらい多いです。
# 最初は、access.logを確認しつつ、必要であれば追加しましょう。

筆者自身も、どんな端末なのか知らないものが多い一覧
2.0\ 2MMP
240×320
400X240
AvantGo
BlackBerry
Blazer
Cellphone
Danger
DoCoMo
Elaine/3.0
EudoraWeb
Googlebot-Mobile
hiptop
IEMobile
KYOCERA/WX310K
LG/U990
MIDP-2.
MMEF20
MOT-V
NetFront
Newt
Nintendo\ Wii
Nitro
Nokia
Opera\ Mini
Palm
PlayStation\ Portable
portalmmm
Proxinet
ProxiNet
SHARP-TQ-GX10
SHG-i900
Small
SonyEricsson
Symbian\ OS
SymbianOS
TS21i-10
UP.Browser
UP.Link
webOS
Windows\ CE
WinWAP
YahooSeeker/M1A1-R2D2
iPhone
iPod
Android
BlackBerry9530
LG-TU915\ Obigo
LGE\ VX
webOS
Nokia5800

さくらVPS 借りた後の初期設定

VPS: さくらVPS512
OS:  CentOS5.5 x86_64



■ホスト名変更
/etc/sysconfig/network
HOSTNAME=***

■IPv6無効
/etc/sysconfig/network
NETWORKING_IPV6=no

/etc/modprof.conf
    alias ipv6 off
    options ipv6 disable=1

■ 32bit RPMの削除&yum update
yum erase *.i386 *.i686
yum update

■ SSHの設定
/etc/ssh/sshd_config

# ポート番号を 22 (デフォルト)から10022へ変更する
#Port 22
Port 10022

# SSHのプロトコルをSSH2のみ対応
Protocol 2

# rootでのログインを不可
PermitRootLogin no

# パスワードでのログインを許可
PasswordAuthentication yes

# パスワードなしでのログインを不可
PermitEmptyPasswords no

# hoge というユーザだけログインを許可
AllowUsers hoge

■ FireWallの設定(サンプル)
/etc/sysconfig/iptables

# Generated by iptables-save v1.3.5 on Mon Jan 30 21:54:37 2012
*filter
:INPUT DROP [3:228]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [6:760]
-A INPUT -i lo -j ACCEPT
-A INPUT -s 10.0.0.0/255.0.0.0 -j DROP
-A INPUT -s 172.16.0.0/255.240.0.0 -j DROP
-A INPUT -s 192.168.0.0/255.255.0.0 -j DROP
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 10022 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
COMMIT
# Completed on Mon Jan 30 21:54:37 2012

■不要なデーモンのOFF

/sbin/chkconfig auditd off
/sbin/chkconfig autofs off
/sbin/chkconfig avahi-daemon off
/sbin/chkconfig bluetooth off
/sbin/chkconfig cups off
/sbin/chkconfig firstboot off
/sbin/chkconfig gpm off
/sbin/chkconfig haldaemon off
/sbin/chkconfig hidd off
/sbin/chkconfig kudzu off
/sbin/chkconfig lvm2-monitor off
/sbin/chkconfig mcstrans off
/sbin/chkconfig mdmonitor off
/sbin/chkconfig messagebus off
/sbin/chkconfig netfs off
/sbin/chkconfig nfslock off
/sbin/chkconfig pcscd off
/sbin/chkconfig portmap off
/sbin/chkconfig rawdevices off
/sbin/chkconfig restorecond off
/sbin/chkconfig rpcgssd off
/sbin/chkconfig rpcidmapd off
/sbin/chkconfig smartd off
/sbin/chkconfig xfs off
/sbin/chkconfig sendmail off

■日本語対応
vi /etc/sysconfig/i18n

-------------------------------
LANG="C"
SYSFONT="latarcyrheb-sun16"
-------------------------------
↓↓↓↓↓↓↓↓↓↓↓
-------------------------------
LANG="ja_JP.UTF-8"
SUPPORTED="ja_JP.UTF-8:ja_JP:ja"
SYSFONT="latarcyrheb-sun16"
-------------------------------

2012年2月16日木曜日

ロードバランサーとして使う

nginxをロードバランサとしても動作することができます。

ロードバランサーは、個人ではとても買えません。
nginxならば性能は劣りますが、十分に実運用可能と思います。

有名所のロードバランサーは下記。
「F5 BIG-IP 1600」:299万円
「NetScaler 7000」:306万円
NetScalerは、GoogleやYahoo、Amazon、Mixiでも使用されています。

NetScalerの構築は、視覚的に簡単で便利なんですけどね。

### これが一番単純な書き方
### 2つのサーバに対してラウンドロビンで振り分けられる。
http {
  upstream backend {
    server 127.0.0.1:80;
    server 127.0.0.2:80;
  }

  server {
    listen 80;
    server_name sample.com;
    location / {
      proxy_pass http://backend;
    }
  }
}


### upstream項目に、少しオプションを使います。

### パターン1
# 以下の割合で、バランシングされるよう設定します。
# 127.0.0.1に80%
# 127.0.0.2に20%
# デフォルト:weight=1

  upstream backend {
    server 127.0.0.1:80 weight=4;
    server 127.0.0.2:80;
  }

### パターン2
# 同じIPアドレスから接続された場合
# 常に同じサーバに転送する
# そのサーバが動作不能の場合は、別のサーバに転送する

  upstream backend {
    ip_hash;
    server 127.0.0.1:80;
    server 127.0.0.2:80;
  }


### パターン3
# fail_timeoutの期間内にmax_failsの回数だけ試行します。
# デフォルト:max_fails=1 fail_timeout=10
# backupは、正常時にはバランシングされませんが
# backup以外のサーバが動作不能の場合に、転送されます。
  upstream backend {
    server 127.0.0.1:80 max_fails=3 fail_timeout=30;
    server 127.0.0.2:80 max_fails=3 fail_timeout=30;
    server 127.0.0.3:80 backup;
  }


### パターン4
#
# downを設定すると、そのサーバは除外されます
#

  upstream backend {
    server 127.0.0.1:80 down;
    server 127.0.0.2:80;
  }


ここが参考になります。
http://mickeyben.com/2009/12/30/using-nginx-as-a-load-balancer.html

【小言】
OSSのロードバランサーには、LVSというのもあります。
簡単に、L4ロードバランサーを構築できるものですが
サーバ台数をいかに減らしてインフラを整えるかと考えると
どうせならnginxとかapacheも、フロントとしても動いてもらいたいもんです。
L7ロードバランサーの設定も手軽です。

nginxとは

nginxとは

公式:http://nginx.org/ja/
WIKI:http://wiki.nginx.org/NginxJa

nginx [えんじんえっくす] は、ロシアで開発された
軽量&高速なHTTP とリバースプロキシのサーバ、メールプロキシサーバです。

NginxはC10K問題に 取り組むべく開発された一握りのサーバのうちの一つです。
従来のサーバとは異なり、Nginxはリクエストの処理をスレッドに依存していません。
その代わりにもっとスケーラブルな(非同期の)イベント駆動アーキテクチャを使用しています。
このアーキテクチャはメモリ使用量が少ないだけでなく、最も重要な事 として、
稼働時のメモリ使用量が予測可能であるということです。

同時リクエスト数が1万リクエストもなかったとしても、Nginxのハイパフォーマンスや
メモリ消費量の少なさの恩恵を受ける事はできるでしょう。
Nginx は小規模な VPS から大規模なサーバからなるクラスタまで
対応する拡張性を備えています。

ネットクラフトによる2011年12月の調査結果
によると、Apache > IIS > nginxとなり、全ドメインの中で3番目に多く使われている

有名どころでは、以下のようなサービスで使用されている。 
WordPress, Hulu, SourceForge,

【小言】
これをnginx + Apache(mod_php)で採用することにした。
  • リバースプロキシ&静的コンテンツ担当nginx
  • 動的コンテンツ担当Apache + PHP
Apacheを使わなくても、nginx + fastcgiでも可能ですが
nginxのシンプルさ & Apacheの機能の豊富さが一番面白いかなと思いました。

「ApacheにはMicrosoftのWordのように100万ものオプションがあるが、
実際には必要なオプションは6つだけである。nginxのオプションは6つだけである。
 ただ、その6つ内5つのオプションについては、Apacheの50倍高速に動作する。」
— Chris Lea —