我们在nginx中使用client_body_in_file_only选项,以允许通过Ajax上传文件。配置看起来像这样:
location ~ ^(\/path1|\path2)$ {
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;
#this option is a quick hack to make sure files get saved on (ie this type of request goes to) on a specific server
proxy_pass http://admin;
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;
}
这可以工作,但是处理请求的Web服务器进程(Mongrel)必须先对sudo
中传入的临时文件进行headers['X-FILE']
,然后才能对其执行任何操作。这是因为临时文件具有600
权限。
我对这种方法不满意,该方法要求我们编辑/etc/sudoers
文件以允许Web服务器用户无需密码即可执行sudo chmod
。感觉很不安全。
使用nginx配置是否可以将所创建的临时文件的权限更改为例如775?
编辑:我只是尝试在nginx初始化配置中更改umask
选项的值,然后重新启动nginx,但这没有帮助。它曾经在0022
,我将其更改为0002
。在这两种情况下,它都具有600个权限。
EDIT2:我还尝试在nginx配置的proxy_redirect
行下添加此行。
proxy_store_access user:rw group:rw all:r;
但是,它没有任何区别-它仍然只有user:rw
答案 0 :(得分:4)
浏览nginx
源,看来唯一可以修改临时文件权限的机制是请求的request_body_file_group_access
属性,可以在ngx_http_write_request_body()
中进行查询:
if (r->request_body_file_group_access) {
tf->access = 0660;
}
但是即使如此,您也只能使用0660
,而且它似乎不是用户可设置的属性,只能由ngx_http_dav
模块使用。
权限最终在ngx_open_tempfile()
中设置,默认情况下为0600
:
fd = open((const char *) name, O_CREAT|O_EXCL|O_RDWR, access ? access : 0600);
因此,目前似乎没有基于配置的解决方案。如果您愿意/能够从源代码构建nginx
,则一种可能性是应用一个简单的补丁程序来将权限设置为您想要的ngx_http_write_request_body()
中的任何内容:
+ tf->access = 0644;
+
if (r->request_body_file_group_access) {
tf->access = 0660;
}
rb->temp_file = tf;
我对此进行了测试,并获得了以下内容:第一个文件未经修改即被上传,第二个文件也随之添加:
$ ls -al /tmp/upload/
total 984
drwxr-xr-x 2 nobody root 12288 Feb 18 13:42 .
drwxrwxrwt 16 root root 12288 Feb 18 14:24 ..
-rw------- 1 nobody nogroup 490667 Feb 18 13:40 0000000001
-rw-r--r-- 1 nobody nogroup 490667 Feb 18 13:42 0063184684
答案 1 :(得分:3)
似乎目前无法配置文件权限,但是有一个official feature request。
文件权限始终为0600,使应用程序根本无法读取文件。 [...]当前是不支持的方案:[Nginx]使用默认权限[0600]创建临时文件(除非设置了
request_body_file_group_access
,但不幸的是该属性不可设置)。
该机票于2018年10月开放,优先顺序不高。