Nginx 405 method not alllowed

当我用nginx 作为文件服务器提供下载服务的时候,正常情况下都可以去下载访问。
之前的方式是用nginx作为前端web服务,然后proxy_pass 代理到后端的apache上面。下载访问量增大的话 会增加内网之间的传输,同时云机内网之间有带宽限制,必然会导致一些访问失败。因此尝试直接把文件放在nginx服务下,使用浏览器访问一切都正常ok
第二天业务的部分量下降严重,排查其中一个业务下载全部失败。问过开发后,发现全部是post请求下载。尝试模拟post请求下载 报错

<html>
<head><title>405 Not Allowedtitle>head>
<body bgcolor="white">
<center><h1>405 Not Allowedh1>center>
<hr><center>nginx/1.0.11center>
body>
html>

报错405请求方式不被允许,查完资料发现nginx 默认不支持post请求静态文件。同时浏览器默认所有请求都是get方式。现在问题很明确了需要去解决nginx post方式请求静态文件


解决方案一、
既然之前支持post请求 我可以根据request_method 将所有post请求转发至后端apache (这里的post请求量不是很大,影响不是很大)。

 upstream fee {
   server 192168.1.32:80 weight=1 max_fails=3 fail_timeout=10s;
    }


----------


     location /statics/
   {
         access_log logs/down_log re;
        if ($request_method = POST){
          access_log logs/post re;
         proxy_pass http://fee;
          }

        root /source_package/static_file;  
        autoindex on;                     
        autoindex_exact_size off;           
        autoindex_localtime on;
   }

经测试有效,同时可以顺便分离开相应的日志文件,方便统计。
解决方案二、
proxy_pass 转发静态文件接收的POST请求到GET方式

upstream post {
           server localhost:89;
         } 
.............................
 error_page 405 =200 @405;
 location @405
        {
        root /data/www/test/;
        proxy_method GET;
        proxy_pass http://post;
   }
   .........................
   server {
   listen 89;
    server_name _;
    root /data/www/test/;
} 

经测试有效,这样依赖 也支持cdn下载
方案三、
我查到资料是修改源码
nginx源码目录/src/http/modules/ngx_http_static_module.c

if (r->method & NGX_HTTP_POST) { 
     return NGX_HTTP_NOT_ALLOWED; 
}
注释掉如下:
/*if (r->method & NGX_HTTP_POST) {
     return NGX_HTTP_NOT_ALLOWED; 
} 
*/

重新编译configure、make 不要make install
make 结束后在/ objs 目录下的 nginx至安装的Nginx目录下,重启Nginx生效
记得备份之前的 /sbin/下的nginx
……………….
经测试成功
Nginx 405 method not alllowed_第1张图片
以上三种方式,应该还有其他方案 。条条大路通罗马

你可能感兴趣的:(nginx,post)