9

Nginx1.0.0とPassenger3.0.7を使用してUbuntu8.04でRails3サイトを実行しています。

Nginx error.logで、メッセージが頻繁に表示されるようになりX-Accel-Mapping header missingました。グーグルは私をNginxドキュメントのドキュメントにRack::Sendfile導きます

これで、私のアプリはいくつかのドメインからアクセスでき、アプリで使用send_fileして、要求されたドメインに固有のファイルを配信しています。たとえば、でdomain1.com/favicon.icoファビコンを検索しpublic/websites/domain1/favicon.icoます。Rack::Sendfileこれは正常に機能し、ドキュメントのサンプルが示すように、Nginxを関与させて、それらのファイルを保存するプライベート領域を作成する必要はないと思います。

エラーメッセージを取り除くにはどうすればよいですか?

4

3 に答える 3

15

このメッセージは、nginx.conf で設定が欠落しているため、Rack::Sendfile無効になっていることを意味します...X-Accel-Redirect

Nginx + Passenger 3 + Rails 3.1を使用しています。

このページから情報を収集して、私はそれを理解しました:

http://wiki.nginx.org/X-accel

http://greenlegos.wordpress.com/2011/09/12/sending-files-with-nginx-x-accel-redirect

http://code.google.com/p/substruct/source/browse/trunk/gems/rack-1.1.0/lib/rack/sendfile.rb?r=355

x-sendfile を使用して Rails 2.3 経由で Nginx を介して大きなファイルを提供する

次の/download/1ように、独自のディレクトリ構造を持つストレージ ファイルにリクエストをマップするコントローラーがあります。nginx 直接storage/00/00/1storage/01/0f/15send_fileX-Accel-Redirect

コード内で私はこれを持っています:

send_file(
  '/var/www/shared/storage/00/00/01', 
  :disposition => :inline, 
  :filename => @file.name # an absolute path to the file which you want to send
)

この例の目的でファイル名を置き換えました

次に、これらの行を my に追加する必要がありましたnginx.conf:

server {
    # ... 

    passenger_set_cgi_param HTTP_X_ACCEL_MAPPING /var/www/shared/storage/=/storage/; 
    passenger_pass_header X-Accel-Redirect;

    location /storage {
      root /var/www/shared;
      internal;
    }

    # ...
}

パス/storageは外の世界からは見えず、内部のみです。

Rack::Sendfileヘッダーを取得し、そこからパスを抽出しX-Accel-Mappingて に置き換えます。次に、変更されたヘッダーを吐き出します。/var/www/shared/storage/storage...

X-Accel-Redirect: /storage/00/00/01

これはnginxによって処理されます。

ファイルが以前よりも 100 倍高速にダウンロードされ、ログにエラーが表示されないため、これが正しく機能していることがわかります。

お役に立てれば。

于 2011-09-19T12:17:02.660 に答える
1

NoICEが説明したのと同様の手法を使用しましたが、すべてのファイルを含む「ハードコーディングされた」ディレクトリを、ファイルを含むフォルダーを含むフォルダーを記述する正規表現に置き換えました。

難しいですね。これらを見てください(/etc/nginx/sites-available/my.web.site):

location /assets/(.+-[a-z0-9]+\.\w+) {
    root /home/user/my.web.site/public/assets/$1;
    internal;
}

location /images/(.+)(\?.*)? {
    root /home/user/my.web.site/public/images/$1;
    internal;
}

これは、このチェックで使用する必要があります。

location / {
    # ...

    if (-f $request_filename) {
        expires max;
        break;
    }

    # ...
}

Rails処理からの静的を防ぐため。

于 2012-11-14T11:01:21.810 に答える