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 chmod
Railsアプリケーションで操作しないとファイルをインポートできないことです。それは非常に脆弱で信頼できないことが判明しました。
-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_tempfile
0600
0660
この値のため、nginx initスクリプトでumaskを変更することは役に立ちません0600
。
プロキシモジュールなどの利用可能な構成設定はuser:
ありません。group:
other:
client_body_temp_path
この関数ngx_open_tempfile
が読み取った変数access
でさえ、次のモジュールのように呼び出す以外のものに設定することができます0600
。ngx_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()を設定する必要があります。0660
chgrp your_app_server_group
client_body_temp_path
chmod 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/incoming
parhを再構築すると、/var/local/processing
問題なくファイルを使用できます。