【发布时间】:2014-07-11 06:42:30
【问题描述】:
我有在puma Web 服务器上运行的 Rails 4.1 应用程序。我使用 nginx 作为代理服务器。几天前,一切都很顺利。我更新了我的应用程序,突然一些 POST 请求开始重定向到相同的 url,但作为 GET 请求。我试过回滚到以前的工作版本,没有成功。
我发现了非常有趣的行为。我用curl 测试了我的API。
- 如果我对 url 进行了
POST请求http://myapp.com/tasks/easy_task/calculate/它重定向到相同的 url 但作为GET请求。 - 然后我向
http://myapp.com/做了POSTrequest,返回404 - 然后我向
http://myapp.com/tasks做了POSTrequest,返回404 - 然后我向
http://myapp.com/tasks/easy_task做了POSTrequest,返回404 - 然后我向
http://myapp.com/tasks/easy_task/calculate做了POSTrequest,返回200。耶!
当我使用 chrome 的应用程序 Postman 时,也发生了同样的事情。首先它重定向,但经过前面的步骤后它运行良好。
我在我的其他应用程序中使用这个应用程序。我使用RestClient 发出http 请求。当我尝试发出 POST 请求时,它会引发异常 RestClient::MovedPermanently (301 Moved Permanently)。
- 我将
nginx重新安装到1.7.3。 - 重启的服务器(虚拟机)
- 重新部署我的应用,部署以前的版本
- 没有成功:(
我在 stackoverflow 上发现了类似的问题,但没有一个给我提供解决此问题的线索。我希望你能帮助我解决这个问题。提前致谢!
类似的问题: - POST request turns into GET request - POST request mysteriously turn into GET request
nginx 配置:
$ cat /etc/nginx/sites-enabled/myapp.com.conf
# The file generated by Chef for mycompany
upstream myapp_mycompany_com {
server unix:/tmp/myapp.com-puma.sock;
}
server {
server_name myapp.com;
listen 80;
access_log /var/log/nginx/myapp.com-access.log;
error_log /var/log/nginx/myapp.com-error.log;
root /home/projects/mycompany/myapp.com/current/public;
gzip on;
gzip_types text/plain text/xml application/xml application/xml+rss
text/css text/javascript application/javascript application/json;
error_page 551 =503 @maintenance;
location @maintenance {
rewrite ^(.*)$ /system/maintenance.html break;
}
set $maintenance 0;
if (-f $document_root/system/maintenance.html) {
set $maintenance 1;
}
if ($request_uri = /favicon.ico) {
# Browsers will try to get favicon if it's not returned with 200ok status
set $maintenance 0;
}
if ($maintenance) {
# There can be several reasons for 503 error. We custom return 551 error
# to ensure maintenance.html is only shown when it's really maintenance
return 551;
}
rewrite ^/(.*)/$ /$1 permanent; # Truncate trailing slashes
try_files $uri @rails;
expires -1;
location = /favicon.ico {
try_files $uri =204;
access_log off;
log_not_found off;
}
location @rails {
proxy_pass http://myapp_mycompany_com;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_intercept_errors on;
expires -1;
}
error_page 500 502 503 504 /500.html;
error_page 403 /403.html;
error_page 404 /404.html;
client_max_body_size 50M;
keepalive_timeout 10;
}
彪马
$ bundle exec puma -d -e production -b unix:///tmp/myapp.com-puma.sock --pidfile /home/projects/mycompany/myapp.com/shared/tmp/pids/puma.pid
$
access.log 示例
123.123.123.123 - - [11/Jul/2014:05:44:17 +0000] "POST /tasks/easy_task/calculate/ HTTP/1.1" 301 184 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2073.0 Safari/537.36"
123.123.123.123 - - [11/Jul/2014:05:44:17 +0000] "GET /tasks/easy_task/calculate HTTP/1.1" 404 713 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2073.0 Safari/537.36"
...
123.123.123.123 - - [11/Jul/2014:06:04:17 +0000] "POST / HTTP/1.1" 404 713 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2073.0 Safari/537.36"
123.123.123.123 - - [11/Jul/2014:06:04:26 +0000] "POST /tasks HTTP/1.1" 404 713 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2073.0 Safari/537.36"
123.123.123.123 - - [11/Jul/2014:06:04:36 +0000] "POST /tasks/easy_task HTTP/1.1" 404 713 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2073.0 Safari/537.36"
123.123.123.123 - - [11/Jul/2014:06:04:42 +0000] "POST /tasks/easy_task/calculate HTTP/1.1" 200 104 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2073.0 Safari/537.36"
【问题讨论】:
-
可能 404 所有这些答案都是由您的 Rails 应用程序生成的。可以显示 nginx error.log 吗?
-
nginx 的 error.log 为空。所有 404 错误都是 rails 应用程序的错误。当 301 时,rails 应用程序甚至没有收到请求。我关闭了 rails 应用程序,无论如何我得到了 301。
标签: ruby-on-rails nginx rest-client puma