Nginx:proxy_store_accessオプションが機能しないようです

Nginx:proxy_store_accessオプションが機能しないようです

Railsアプリ用のnginxを介してファイルのアップロードを処理するためにProxy_passを使用しており、ファイル権限を除いてうまく機能します。現在の構成ブロックは次のとおりです。

location ~ ^my_filename_regex$ {

  limit_except POST { deny all; }
  client_body_temp_path      /path/to/app/tmp;
  client_body_in_file_only   on;
  client_body_buffer_size    128K;
  client_max_body_size       1000M;

  # try_files $uri @slow-rails;
  proxy_pass                 http://elrs;
  proxy_pass_request_headers on;
  proxy_set_header           X-FILE $request_body_file; 
  proxy_set_body             off;
  proxy_redirect             off;

  # might not need?
  proxy_read_timeout         3m;
} 

elrsは私が定義したアップストリームで、私のローカルRailsサーバー(127.0.0.1:3000)だけを指します。

ファイルが通過し、tmpの場所に保存されます。ここでrequest.headers['X-FILE']以下の内容を読んでいます。

問題は、ファイルが他のユーザー(nginxが実行されているwww-data)が所有しており、読み取るグループがないため、sudo chmodRailsアプリケーションで操作しないとファイルをインポートできないことです。それは非常に脆弱で信頼できないことが判明しました。

-rw------- 1 www-data www-data 1430753 Feb 23 13:36 /path/to/app/tmp/0057375433

このページに基づいて: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass このオプションを追加しました

      proxy_store_access user:rw group:rw all:r;

私の考えでは、 に設定することが-rw-rw-r--私の目的に適していると思います。ただし、nginxを再起動して再試行した後もパスします-rw-------。つまり、新しいオプションが機能しないようです。

誰が私が間違っているのか、問題をどのように診断できるのかを知ることができますか? Nginxバージョン1.9.7を使用しています。

実際、ngx_http_proxy_moduleがインストールされているかどうか100%確信できません。それ以外の場合、Proxy_passエントリは完全に失敗すると思われますが、おそらくそうではない可能性があります。このモジュールがあるかどうかをテストする方法は?

ありがとう、マックス

編集:また、別のフォルダを使用して一時ファイルを作成しようとしたときにngnixもフォルダの所有権を持っていることを確認しました。つまり、ファイルのアップロードを実行する前に、フォルダは所有していmax:maxますwww-data:max。関連している。

答え1

これを行う唯一の方法は、src/os/unix/ngx_files.c(または必要な権限)でファイル生成マスクを編集して変更した後にnginxを再コンパイルすることです。ngx_open_tempfile06000660

この値のため、nginx initスクリプトでumaskを変更することは役に立ちません0600

プロキシモジュールなどの利用可能な構成設定はuser:ありません。group:other:client_body_temp_path

この関数ngx_open_tempfileが読み取った変数accessでさえ、次のモジュールのように呼び出す以外のものに設定することができます0600ngx_conf_set_access_slot

src/http/modules/ngx_http_uwsgi_module.c
171:      ngx_conf_set_access_slot,

src/http/modules/ngx_http_dav_module.c
102:      ngx_conf_set_access_slot,

src/http/modules/ngx_http_scgi_module.c
111:      ngx_conf_set_access_slot,

src/http/modules/ngx_http_fastcgi_module.c
254:      ngx_conf_set_access_slot,

src/http/modules/ngx_http_proxy_module.c
291:      ngx_conf_set_access_slot,

nginxコアの一部であるクライアントコードでは機能しません。したがって、再コンパイルする必要があります。

アプリケーションが属するグループのディレクトリを更新することに加えて、nginxが書き込むファイルがそのグループの所有になる0600ように、そのディレクトリにgid()を設定する必要があります。0660chgrp your_app_server_groupclient_body_temp_pathchmod g+s your_app_server_group

答え2

私のプロジェクトで同様の問題に直面しました。私の目標は、Nginxがアップロードを処理し、それをDjangoアプリケーションに渡すことです。 Djangoアプリケーションに問題があってもアップロードが成功し、ディスクに保存されることを願っています。

@jaygoobyの言葉が正しいです。ソースコードを変更しないと、Nginxに他のユーザー、グループ、または権限でファイルを書き込むように指示することはできません。

しかし、あなたは使用することができますファイルシステムバインディングこのフォルダを指す追加のマウントポイントを作成しますclient_body_temp_path

BindFSのインストール
Ubuntuで:apt-get install bindfs
他のオペレーティングシステムを使用している場合は、次の点を確認してください。ファイルシステムバインディングウェブサイト。

フォルダの作成
フォルダがあることを確認してください。適切な所有権と権限を割り当てます。

mkdir /var/local/incoming
mkdir /var/local/processing

client_body_temp_path私はフォルダを指しましたincoming。フォルダprocessingは自動化されたミラーとして機能し、適切な所有権と権限を持つファイルへのアクセスを提供します。

マウントポイントの設定
/etc/fstab再起動後にフォルダが自動的にマウントされるように、次の行を追加します。sudo mount -aをすばやくリロードできますfstab

/var/local/incoming /var/local/processing
fuse.bindfs force-user=myUser,force-group=myGroup,perms=ug+rw 0 0

このコマンドは、processingフォルダーをフォルダーにマウントしincoming、所有者/グループをオーバーライドし、読み取り+書き込み権限を割り当てるように指示します。

アプリケーションのファイル処理
$request_body_fileタイトルから抽出されます(例:X-FILE質問に示すように)。その後、/var/local/incomingparhを再構築すると、/var/local/processing問題なくファイルを使用できます。

関連情報