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"; }
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 等で
- 変数とか http://wiki.nginx.org/NginxHttpCoreModule#Variables
- http://wiki.nginx.org/IfIsEvil
- 制御構造っぽいの http://wiki.nginx.org/HttpRewriteModule
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
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
autossh
$ sshfs -o ssh_command=autossh HOST: /mnt/MOUNTPOINT
で何とか出来るかと思ったけど時間が経つとハングアップするので諦めた。