Nginx upload module

upload_set_form_field は ngx_http_upload_append_field で処理してるみたいだけど、変数をセットする処理が見当たらない気がする。というかここでは parser 的な処理しかされてない、意味がわかんない。いきなり request body の validation 始めてるし。
というかこのモジュールが何をするためのものか理解できない。upload_pass で飛ぶのはいいけどアップロードされたファイルの格納先はどこなんだよ。


追記:
http://blog.martinfjordvald.com/2010/08/file-uploading-with-php-and-nginx/
これバックエンドに投げるのが前提なのね…すっげーわかりにくい

nginx の knowhow

nginx すごいですね。conf がめちゃくちゃになるのが難点ですが。apache よりはマシですかね。
nginx + ngx_postgres + postgresql + ajax もすごいですね。 cgi とか fcgi とか wsgi とかなにそれ食えるの状態。

現在、"$" をエスケープする方法はない

http://forum.nginx.org/read.php?2,218536,218556#msg-218559

    geo $d {
        default "$";
    }

    set $var '$d'; # とかするしかない。

    if ($foo ~ '^foo$'){ # これは大丈夫だったりする
        return 200;
    }

ngx_postgres などキャッシュ機能がない addon を使用するときは自分に向けて reverse proxy する

ngx_postgres はすげー便利ですがキャッシュ機能が見当たらないので reverse proxy で loopback して無理やりキャッシュします。
なんか奇妙な感じですが。

user  www-data;
http {
    # required: chwon www-data:www-data /var/cache/nginx/loopback
    proxy_cache_path /var/cache/nginx/loopback
        keys_zone=loopback:4m max_size=50m;
    # required: chown www-data:www-data /var/tmp/nginx
    proxy_temp_path /var/tmp/nginx;
    proxy_cache_key $scheme://$host$request_uri$is_args$args;
    server {
        location /foo/ {
            proxy_cache loopback;
            proxy_cache_valid 1m;
            proxy_pass http://127.0.0.1:80/path/;
        }
    }
}

正規表現で文字列を抽出するときは if を使用する

if ($foo ~ "^(\d+)-(\d+)$"){
    set $var "$1,$2";
}

ファイルを URL にマッピングする

ディレクトリじゃなくてファイルを直接指定したい時に。

location = /path/to/file { # "=" は必須です
    default_type "text/html"; # 指定しないと default_type の値が使用されます
    alias /home/www-data/html/file.html;
}

application/json

nginx デフォルトの mime.types ファイルには json がないので次の行を追加しましょう。

application/json                      json;
# nginx.conf などでこのように指定するのはダメ。types は 2 回以上使用できない
types {
    application/json                      json;
}

Install ubuntu-12.04-alternate-i386.iso from USBStick/grub4dos

https://help.ubuntu.com/community/Installation/FromUSBStick/ のページは古いのでうまくいかない。
UNetbootin 先生にやってもらった結果、次のような記述となった。

title ubuntu-12.04-alternate-i386.iso
find --set-root /ubuntu-12.04-alternate-i386.iso
map /ubuntu-12.04-alternate-i386.iso (0xff)
map --hook
root (0xff)
kernel /install/netboot/ubuntu-installer/i386/linux initrd=/install/netboot/ubuntu-installer/i386/initrd.gz vga=788 -- quiet
initrd /install/netboot/ubuntu-installer/i386/initrd.gz

[python] Requests

軽々しく print/traceback を使うな

logger = logging.getLogger(__name__); logger.error, logger.exception でいいから。直接吐かないで。
gevent 0.13.7 の gevent.greenlet.Greenlet._report_error が丁寧にエラーを書きだしてくれるので適当に無効にします。

import sys, io
sys.stderr = io.BytesIO()

request --> response with context

こうだよ

>>> import requests
>>> response = requests.get(
...    'http://www.google.com/',
...    hooks={'response': lambda response: setattr(response, 'context', 'Hello')},
...    )
>>> print(response.context)
Hello

Nginx

  • 設定ファイルは上から下に評価されるわけではない
    • location の順序だけでなく、location 内部の各種設定も含む
    • configure する際に読み込む順番でも変わる?
  • if はネストできないし、and/or で複数の条件を設定できない
  • スクリプト言語の埋め込みができる
    • Perl は標準でサポート
    • Lua のモジュールもある
    • JavaScript のモジュールもあるが node.js と互換がないし、ビルドも面倒でオススメではない
    • if 等との使い分けはその時々のバランス考えて
  • 設定ファイルのデバッグは echo, Lua/print 等で

break, if, return, set

build Nginx on Ubuntu 11.04

ubuntu でのビルド手順と個人的な設定。

% mkdir nginx; cd nginx
% git clone https://github.com/simpl/ngx_devel_kit
% git clone https://github.com/simpl/ngx_http_set_hash
% git clone https://github.com/calio/form-input-nginx-module
% git clone https://github.com/agentzh/echo-nginx-module
% git clone https://github.com/agentzh/encrypted-session-nginx-module
% git clone https://github.com/agentzh/set-misc-nginx-module
% git clone https://github.com/agentzh/rds-json-nginx-module
% git clone https://github.com/FRiCKLE/ngx_postgres

% sudo apt-get install build-essential libpcre3-dev libxml2-dev libxslt1-dev libgd2-noxpm-dev libgeoip-dev postgresql-server-dev-9.1 luajit libluajit-5.1-dev
% wget http://nginx.org/download/nginx-1.2.1.tar.gz
% tar xf nginx-1.2.0.tar.gz
% cd nginx-1.2.0
% LUAJIT_LIB=/usr/local/lib/ LUAJIT_INC=/usr/include/luajit-2.0 \
  ./configure --prefix=/usr/local/nginx \
    --sbin-path=/usr/sbin/nginx \
    --conf-path=/etc/nginx/nginx.conf \
    --http-log-path=/var/log/nginx/access.log \
    --error-log-path=/var/log/nginx/error.log \
    --http-client-body-temp-path=/var/lib/nginx/body \
    --http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
    --http-proxy-temp-path=/var/lib/nginx/proxy \
    --http-scgi-temp-path=/var/lib/nginx/scgi \
    --http-uwsgi-temp-path=/var/lib/nginx/uwsgi \
    --lock-path=/var/lock/nginx.lock \
    --pid-path=/var/run/nginx.pid \
    --with-debug --with-http_gzip_static_module --with-http_realip_module \
    --with-http_ssl_module --with-http_sub_module --with-ipv6 \
    --with-sha1=/usr/include/openssl --with-md5=/usr/include/openssl \
    --add-module=../ngx_devel_kit \
    --add-module=../set-misc-nginx-module \
    --add-module=../echo-nginx-module \
    --add-module=../lua-nginx-module \
    --add-module=../encrypted-session-nginx-module \
    --add-module=../form-input-nginx-module \
    --add-module=../ngx_postgres \
    --add-module=../rds-json-nginx-module \
    --add-module=../ngx_http_set_hash
% make; sudo make install

リモート越しに PostgreSQL のデータを移行する

移行先で .pgpass を設定してパスワードなしで psql を実行できるようにしておく。SSH もパスワードの入力なしで接続できるようにしておく。

$ cat > ~/.pgpass
localhost:*:*:USER:PASSWD
^D
$ chmod 600 ~/.pgpass
$ pg_dump -h localhost -U USER -c DBNAME | ssh -i /PATH/TO/PRIVATE_KEY_FILE -p PORT USER@HOST psql -h localhost -U USER -f /dev/stdin DBNAME

Ubuntu で autofs で sshfs して cifs

なんでもいいので root からリモートホストにパスワードを聞かれずに SSH でログインできるようにしておく。ssh-keygen でパスフレーズなしの鍵を作るのが無難。

sshfs と autofs をインストールする。

$ sudo apt-get install sshfs autofs

/etc/fuse.conf

user_allow_other

/etc/default/autofs

デフォルトではまともな出力が得られないので、安定するまでは debug にしておく。気休め程度の出力しか得られないが。

LOGGING="debug"

/etc/autofs.master

+auto.master はコメントアウトしないと syntax error がどうの言われる。

#+auto.master
/mnt/sshfs /etc/auto.sshfs --timeout=30,--ghost

/etc/auto.sshfs

大文字のところは環境に合わせて設定する。UID, GID は id で調べる。オプション等は適当に。セパレーターは \t なのかな。
マウントは root で実行されるようなので IdentityFile はフルパスで明示的に指定した方が良い。LOGGING="debug" にしても connect できなかったとしか言わないので。
ここで細かな設定を行うよりも、/root/.ssh/config に書いて 2 行目のようにした方が分かりやすい。

MOUNTPOINT        -fstype=fuse,uid=UID,gid=GID,port=PORT,IdentityFile=/PATH/TO/PRIVATE_KEY_FILE,rw,nodev,nonempty,noatime,reconnect,allow_other,hard_remove,compression=yes,max_read=65536,max_write=65536      sshfs\#USER@HOST:
MOUNTPOINT2 -fstype=fuse,allow_other :sshfs\#NAME_AT_CONFIG\:/

動作確認

autofs をリスタートして動作するか確認する。

$ sudo service autofs restart

後は適当に使う。smbd で Windows 向けに公開してもいい。dokan sshfs よりはずっと安定してる。

autossh

$ sshfs -o ssh_command=autossh HOST: /mnt/MOUNTPOINT

で何とか出来るかと思ったけど時間が経つとハングアップするので諦めた。