http/Nginx

2010年04月20日

このエントリーをはてなブックマークに追加

何度か繰り返しているので書き残す

自分用メモ

▼検証環境

  • Ubuntu 8.04 (i386)
  • Amazon EC2(ami-5d59be34 canonical-cloud-us/ubuntu-hardy-20090422-i386.manifest.xml)

▼戦略

  • ひとまずパッケージからNginxをインストール
  • /etc/default/nginxを修正
  • Nginxをソースからビルドして/opt/nginx/へインストール
作業内容

▼パッケージでnginxをインストール

$ sudo apt-get install nginx

▼ビルド依存パッケージをインストール

$ sudo apt-get install gcc make libc6-dev libssl-dev

▼nginxをビルド

$ cd /tmp/
$ wget http://sysoev.ru/nginx/nginx-0.7.65.tar.gz
$ wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.02.tar.gz

$ tar zxvf nginx-0.7.65.tar.
$ tar zxvf pcre-8.02.tar.gz

$ cd nginx-0.7.65

$ ./configure \
 --prefix=/opt/nginx \
 --with-pcre=/tmp/pcre-8.02 \
 --with-http_realip_module
$ make

▼nginxをインストール

$ sudo make install

▼インストール後のnginx状態を確認

$ /opt/nginx/sbin/nginx -V
nginx version: nginx/0.7.65
built by gcc 4.2.4 (Ubuntu 4.2.4-1ubuntu4)
configure arguments: --prefix=/opt/nginx --with-pcre=/tmp/pcre-8.02 --with-http_realip_module

▼起動設定ファイル修正(新規追加)

$ sudo vi /etc/default/nginx
DAEMON=/opt/nginx/sbin/nginx
DAEMON_OPTS='-c /opt/nginx/conf/nginx.conf'

▼nginx.conf生成

$ cd /opt/nginx/conf/
$ sudo mv -i nginx.conf nginx.conf.0
$ sudo vi nginx.conf

▼nginx.conf生成

user www-data;
worker_processes  4;

error_log  /var/log/nginx/error-passenger.log;
pid        /var/run/nginx-passenger.pid;

events {
    worker_connections  1024;
}

http {
    include       /opt/nginx/conf/mime.types;
    include       /opt/nginx/conf/conf.d/*.conf; # ex. passenger.conf
    default_type  application/octet-stream;

    access_log  /var/log/nginx/access-passenger.log;

    proxy_redirect          off;
    proxy_set_header        Host            $host;
    proxy_set_header        X-Real-IP       $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_connect_timeout   1;
    proxy_send_timeout      90;
    proxy_read_timeout      90;
    proxy_buffers           32 4k;

    sendfile       on;
    tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    tcp_nodelay        on;

    gzip  on;

    include vh/*.conf;
}

▼VirtualHost用設定ファイルディレクトリ作成

$ sudo mkdir vh
$ sudo vi vh/ec2.conf

▼vh/ec2.conf生成

server {
    listen 80;
    server_name ec2.example.com;

    # mod_real_ip
    set_real_ip_from        10.0.0.0/8;
    real_ip_header     X-FORWARDED-FOR;

    error_page  404              /404.html;
}

▼nginx起動

$ sudo /etc/init.d/nginx start



編集
@hansode at 21:30|PermalinkComments(0)TrackBack(0)
このエントリーをはてなブックマークに追加

バージョン番号を隠蔽したい

▼検証環境

  • Ubuntu 8.04 (i386)
  • Linux 2.6.24-6-xen
  • Nginx 0.7.65
作業内容

▼nginx.confを修正

> server_tokens off;

リロードして設定を反映させる

▼動作確認

$ HEAD http://ec2.example.com/path/to/page
404 Not Found
Connection: close
Date: Tue, 20 Apr 2010 10:03:48 GMT
Server: nginx
Content-Length: 162
Content-Type: text/html
Client-Date: Tue, 20 Apr 2010 10:03:48 GMT
Client-Peer: 184.73.69.193:80
Client-Response-Num: 1

Serverフィールドの値が「nginx」のみとなった事を確認。




編集
@hansode at 21:00|PermalinkComments(0)TrackBack(0)
このエントリーをはてなブックマークに追加

apt-getだけで完結しなかった

▼検証環境

  • Ubuntu 8.04 (i386)

作業内容

▼fcgiwrap依存パッケージ

$ sudo apt-get install libfcgi-dev

▼fcgiwrapをビルド・インストール

$ cd /tmp
$ wget http://github.com/gnosek/fcgiwrap/tarball/master
$ tar zxvf gnosek-fcgiwrap-28ac6f9.tar.gz
$ cd gnosek-fcgiwrap-28ac6f9/
$ make
$ sudo install -m 755 fcgiwrap /usr/local/bin/fcgiwrap

▼spawn-fcgiをビルド・インストール

$ cd /tmp
$ wget http://freshmeat.net/urls/fe79d49e03a1762e9faf02b1ea482490
$ tar zxvf spawn-fcgi-1.6.3.tar.gz
$ cd spawn-fcgi-1.6.3
$ ./configure
$ make
$ sudo make install

▼spawn-fcgi起動スクリプト配置: /etc/init.d/spawn-fcgi

#!/bin/sh
#

NAME=spawn-fcgi
DESC=spawn-fcgi
PIDFILE=/var/run/$NAME.pid
PROGRAM=/usr/local/bin/spawn-fcgi
ADDR=127.0.0.1
PORT=9000
USER=www-data
GROUP=www-data
FCGIWRAP=/usr/local/bin/fcgiwrap


if [ -f /etc/default/spawn-fcgi ]; then
        . /etc/default/spawn-fcgi
fi

set -e

case "$1" in
        start)
                echo -n "Starting $DESC: "
                $PROGRAM -f $FCGIWRAP -P $PIDFILE -a $ADDR -p $PORT -u $USER -g $GROUP
                echo "$NAME."
                ;;
        stop)
                echo -n "Stopping $DESC: "
                [ -f $PIDFILE ] || exit 1
                PID=`cat $PIDFILE`
                kill $PID
                echo "$NAME."
                ;;
        restart)
                $0 stop
                sleep 1
                $0 start
                ;;
        *)
                echo "Usage: /etc/init.d/$NAME [start|stop]" >&2
                exit 1;
                ;;
esac

exit 0

▼spawn-fcgiを起動対象サービスに追加

$ sudo chmod +x /etc/init.d/spawn-fcgi
$ sudo /usr/sbin/update-rc.d -f spawn-fcgi defaults
$ sudo /etc/init.d/spawn-fcgi start

▼nginx.conf編集

    location ~ ^/cgi-bin/.*\.cgi$
    {
      fastcgi_pass    127.0.0.1:9000;
      fastcgi_read_timeout    5m;
      fastcgi_index    index.cgi;
      include    /opt/nginx/conf/fastcgi_params;
    }

serverディレクティブ内に追記




編集
@hansode at 18:30|PermalinkComments(0)TrackBack(0)

2010年04月13日

このエントリーをはてなブックマークに追加

ソフトウェア輸出禁止国などを設定する場合に重宝する

例えば日本からの接続のみ403にしたい。(…なんて事は滅多にないだろう)

delegated-apnic-latestから、IPアドレス範囲リストを生成し、HttpAccessModuleでdeny設定しても良い。
それよりも、GeoLite Countryと言う国別IPアドレスを利用するのが手っ取り早い。

▼材料

▼geo.confを生成

$ wget http://sysoev.ru/nginx/nginx-0.7.65.tar.gz
$ tar zxvf nginx-0.7.65.tar.gz
$ wget http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
$ unzip GeoIPCountryCSV.zip
$ perl ./nginx-0.7.65/contrib/geo2nginx.pl < ./GeoIPCountryWhois.csv > geo.conf
$ sudo mv -i geo.conf /etc/nginx/.

▼nginx.confを修正

geo $geo {
        default  --;
        include /etc/nginx/geo.conf; # ←GeoIPCountryWhois.csvから生成
}

location / {
        if ($geo = 'JP') {
                return 403;
        }
}

後はNginxに設定を反映させれば完了。


▼運用へ向けて

  • geo.confの定期メンテナンスを忘れない事
  • cronを利用した自動更新や、Puppetなどを利用しても良いだろう



編集
@hansode at 21:20|PermalinkComments(0)TrackBack(0)

2010年04月12日

このエントリーをはてなブックマークに追加

access_logを覗いたら、接続元がELBのIPアドレスだった

ElasticLoadbaBancing(以降、ELB)に限った話ではない。
Nginxの上にロードバランサーをおいた場合に発生する現象。


▼問題点

  • ELB経由の場合、REMOTE_ADDRはELBのIPアドレスとなる

▼解決策

▼注意点

  • 場合によってはNginxを再インストールする必要がある。
    • $ configure --with-http_realip_module
    • デフォルトのモジュールではないので、大半の場合、再構築が必要となる

▼nginx.conf

set_real_ip_from    10.0.0.0/8; # ELBのIPアドレス範囲
real_ip_header X-FORWARDED-FOR; # 書き換え対象HTTPヘッダーフィールド

これにより、access_logには、クライアントの接続元IPアドレスが記録されるようになる。




編集
@hansode at 21:40|PermalinkComments(0)TrackBack(0)