Author Archive

, | 2 Comments | 5月 8th, 2011

上にいたマスコット

去年のGWも西日本だったのですが、北のほうは昨年の夏に行ったので、また西日本に行くことにしました。

大まかなルートとしては、4日東京発->浜松(泊)->名古屋->神戸(泊)->愛媛(泊)->尾道->出雲(泊)->8日東京着 という4泊5日コースでした。E-mobile の HTC Aria を持って行ったのですが、E-mobileは都心部以外ほとんどつながりませんでした。街と街の間はともかく、愛媛、出雲辺りは街の何処に行っても圏外でちょっと悲しかったです。写真は iPhone でポチポチ撮ってた感じ。

去年のGWはETCが無かったので、ひたすら下道を走っていたけれども、今年はETCもつけたし、上限1000円もそのうち終わるという噂だったので、高速もちょこちょこ使いました。

More »

| 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 | 11月 20th, 2010

 忘れやすいので、 accepts_nested_attributes_for の使い方についてメモ。

 Company に複数の Employees がいるとき。

class Company
has_many :employees
accepts_nested_attributes_for :employees
end
 
class Employee
  belongs_to :company
end

View で、下記のように fields_for を使う。Company作成時に、1人の Employee を同時に作る時の例

< %= form_for @company do |f| %>
  name < %= f.text_field :name %><!-- Company の name -->
  < %= f.fields_for :employees do |employee_form| %>
    employees name %lt;%= employee_form.text_field :name %><!-- Employee の name -->
  < % end  %>
  < %= f.submit "Create" %>
< % end %>

コントローラでは、特に何もしなくていいです。

def create
  @company = Company.create!(params[:company])
  redirect_to @company
end
download the hurt locker