您的位置:首页 > 运维架构 > Nginx

Nginx 405 method not alllowed

2017-08-31 16:34 537 查看
当我用nginx 作为文件服务器提供下载服务的时候,正常情况下都可以去下载访问。

之前的方式是用nginx作为前端web服务,然后proxy_pass 代理到后端的apache上面。下载访问量增大的话 会增加内网之间的传输,同时云机内网之间有带宽限制,必然会导致一些访问失败。因此尝试直接把文件放在nginx服务下,使用浏览器访问一切都正常ok

第二天业务的部分量下降严重,排查其中一个业务下载全部失败。问过开发后,发现全部是post请求下载。尝试模拟post请求下载 报错

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


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

解决方案一、

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

upstream fee {
server 192。168.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;

4000
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

……………….

经测试成功



以上三种方式,应该还有其他方案 。条条大路通罗马
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: