Posts Tagged ‘nginx’

| No Comments | 4月 14th, 2011

Nginx のデフォルトの設定だと、レスポンスヘッダに Nginxのバージョンが含まれているので、セキュリティ的には外した方がベターです。

Server nginx/0.8.53

みたいになっています。

設定で、下記のように server_token off; と書けばバージョンが外れて

Server nginx

という表記になります。デフォルトの4xx, 5xx のページの下部にあるNginxの表記からもバージョンが外れます。古いバージョンだと、エラーページのバージョンは外れないかも。

http {
    server_tokens off;
    ...
}

とすれば全体で有効になり、server ディレクティブの中に記載すれば、その server のみで非表示になります。

| No Comments | 4月 14th, 2011

 Nginx がついに version1.0.0 でリリースされましたね!Nginx は速いのと設定ファイルが書きやすいので大好きです。

 Nginx で特定IPアドレスからのアクセスを許可するには、allow, deny を使う。初めにマッチしたところで評価が終了するようなので、deny all; と先頭に書いてしまうと誰も見られなくなってしまうので注意。サブネットでの指定も、単一IPアドレスでの指定もいけます。

server {
    listen       80;
    server_name  ecpplus.net;
 
    allow 192.168.1/24;
    allow 111.111.111.111;
    deny all;
    ...
}

のようにします。location ディレクティブの中に入れても大丈夫です。 /admin 以下のみ制限を掛けたい場合は、下記のようにします。

server {
    listen       80;
    server_name  ecpplus.net;
 
    location ~^/admin {
        allow 192.168.1.10;
        deny all;
    }
    ...
}

, | No Comments | 11月 22nd, 2010

 Nginx で認証つきで大容量ファイルをダウンロードさせたい時は、X-Accel-Redirect を使います。Rails のファイル操作を介さず、Nginxで直接クライアントへデータを送れます。Lighttpd とか Apache でいうところの、X-sendfile と同じような感じでしょうか。
Lighttpd の場合はこちら -> Rails&Lighttpdで大容量ファイルをダウンロード【変なヤバいもんログ内】

 ヘッダに、X-Accel-Redirect でパスを指定して、そのパスを Nginx 側で受けるだけですinternal って付けるのがポイントです。そうすると、このように内部からしか参照できなくなります。外からそのパスを叩いても見れないということになります。

 Rails2以前の場合は自分でヘッダに値を設定する必要があり、Rails3以降は設定を変更するだけでいけるようです。

# Rails2以前
def download
  # 認証処理などを挟むことができます。  
  path = "/bigfiles/long_movie.mp4"
  response.headers['X-Accel-Redirect'] = path
  response.headers['Content-Type'] = "application/force-download" 
  response.headers['Content-Disposition'] = "attachment; filename=\"#{File.basename(path)}\"" 
  response.headers['Content-length'] = File.size(RAILS_ROOT + path)
  render :nothing => true
end
 
# Rails3
def download
  # 認証処理などを挟むことができます。  
  path = "/bigfiles/long_movie.mp4"
  send_file path, 
             :type => "application/force-download",
             :disposition => "attachment; filename=\"#{File.basename(path)}\""
end
 
# config/environments/production.rb
# 下記行をコメントアウト (Apache, lighttpd の場合はこの行を使う)
# config.action_dispatch.x_sendfile_header = "X-Sendfile"
# 下記の行を有効にする (nginxの場合はこの行を使う)
config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect'
location / {
    client_max_body_size    200m;
    proxy_read_timeout 60;
    proxy_connect_timeout 60;
    proxy_pass http://railsapp;
}

location /bigfiles {
    # -> /path/to/railsroot/bigfiles
    root /path/to/railsroot/;
    internal;
}

gist に上げてあります。https://gist.github.com/708959

補足

 逆に、ちょっとしたアプリを動かすときに、いちいち nginx の設定とかせずに Unicorn とかから直接ファイルを送りたい場合もあります。Rails3になってから、config/environments/productioin.rb がデフォルトのままだと send_file すると 0bytes になってしまいます。

 下記の2行をコメントアウトしておくと、Unicorn なりで直接ファイル送信ができるようになります。

# config.action_dispatch.x_sendfile_header = "X-Sendfile"
# config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect'

 ついでに、静的ファイルも Unicorn なりで表示したいような手抜き構成のときは、下記の設定もお忘れなく。

config.serve_static_assets = false

, | No Comments | 7月 17th, 2010

 ログインページや管理画面など、セキュアにしたいページにだけSSLをかける。というのを nginx でやる方法。

 たとえば、/admin 以下、 /login 以下をSSLにして、それ意外のページは非SSLにしたい場合です。細かい設定は端折って、upstream appserver でバックエンドのサーバが設定されてるときです。

    # HTTP setting
    server {
        listen       80;
        server_name  localhost;

        location ~ ^/(admin|login) {
            rewrite ^(.*) https://$http_host$1;
            break;
        }

        location / {
            proxy_pass http://appserver;
        }
    }

    # HTTPS setting
    server {
        listen       443;
        server_name  localhost;

        ssl                  on;
        ssl_certificate      server.pem;
        ssl_certificate_key  server.key;
        ssl_session_timeout  5m;

        ssl_protocols  SSLv2 SSLv3 TLSv1;
        ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
        ssl_prefer_server_ciphers   on;

        location ~ ^/(admin|login) {
            proxy_pass http://appserver;
            break;
        }

        location / {
            rewrite ^(.*) http://$http_host$1;
        }
    }

 こんな感じにすると、http://host/login とかでアクセスが来ると、 https://host/login にリダイレクトされます。逆に、 https://host/top でアクセスが来ると、http://host/top にリダイレクトされます。

 break; とすると、それ以降のマッチングは行われないので、書いとくといいですね。

| No Comments | 3月 8th, 2010

nginx.conf で、下記のような感じで、 large_client_header_buffers の 値を上げれば良いみたいです。

    client_header_buffer_size 64k;
    large_client_header_buffers 4 64k;
download the hurt locker