同时文件上传 return 403 forbidden with nginx, and php-fpm

Simultaneous file uploads return 403 forbidden with nginx, and php-fpm

我有一个允许通过拖放同时上传文件的应用程序。此应用程序当前:

这是我遇到的问题:

  1. 我上传了1张图片,1张成功,一切正常。
  2. 我上传2张图片,1张成功,第二次上传返回403
  3. 我上传了 3+ 张图片,1 次成功,所有其他请求返回 403,用户退出应用程序(会话过期)

只要有多个并发帖子,就会发生这种情况。它们不一定是文件上传。

此功能适用于除登台服务器以外的所有服务器。本地开发机器和生产机器没有这个问题。

文件通过拖放到页面上传。每个文件都通过 ajax 在单独的请求中上传。

大小无关紧要 小图像和大图像一样失败。

我正在寻找环境之间不匹配的配置参数,但差异尚不明显。有什么我应该检查的想法吗?

我的 nginx 站点配置:

server {
   listen       *:443 ssl;

   server_name  stagingsite.com ;

   ssl on;
   ssl_certificate           /site.crt;
   ssl_certificate_key       /site.key;
   ssl_session_cache         shared:SSL:10m;
   ssl_session_timeout       5m;
   ssl_protocols             TLSv1 TLSv1.1 TLSv1.2;
   ssl_ciphers               "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-    SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384: ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-   SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-   CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:    AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!  MD5:!PSK:!RC4";
 ssl_prefer_server_ciphers on;
 client_max_body_size 256m;
 index  index.html index.htm index.php;

 access_log            /var/log/nginx/site.access.log;
 error_log             /var/log/nginx/site.error.log;

 root /var/www/site/webroot;

 location / {
    root  /site/webroot;
    try_files $uri $uri/ /index.php$is_args$args;
    autoindex off;     
    index  index.html index.htm index.php;
 }

 location ~ \.php$ {
 set $path_info $fastcgi_path_info;
 fastcgi_index index.php;
 fastcgi_split_path_info ^(.+\.php)(/.*)$;
 try_files $uri $uri/ /index.php$is_args$args;
 include /etc/nginx/fastcgi_params;
 fastcgi_pass 127.0.0.1:9000;
 fastcgi_param SCRIPT_FILENAME $request_filename;
   }

   sendfile off;
} 

我找到了问题的答案。问题存在于 CakePhp2 的会话配置中。 auto-regenerate 选项设置为 true 会导致应用程序为每个请求生成一个新的会话 ID。第二个请求进来后,不知道新的session id。当第三个请求进来时,会话 ID 一起丢失了。

导致发现解决方案的资源在这里:

CakePHP 403 on AJAX request

我希望这个问题能帮助下一个遇到类似问题的人。