我们的服务器针对随机请求显示大量 500 内部错误页面。我们知道应用程序正在运行,因为我们的代码经过了单元测试。服务器设置是 Nginx,Unicorn 在 Ubuntu 10.4 LTS 上运行单个 Rails 应用程序。
据我们所知,请求在传递到 Unicorn 之前就失败了,因为 Unicorn 的日志文件或我们的 Airbrake(我们正在使用的另一个日志服务)中没有日志条目,但 Nginx 的日志文件确实显示了 500 个状态条目。服务器处于正常负载下,因此没有耗尽 RAM 或其他问题。
Nginx error.log 文件实际上并没有提供任何有用的信息。没有任何条目表明文件问题或资源问题。
我该如何继续寻找这个问题?
谢谢
这是我们网站的 nginx 配置:
# This is the socket that unicorn listens to
upstream unicorn {
server unix:/tmp/unicorn.sock;
}
server {
listen 80;
client_max_body_size 10m;
server_name oursite.com;
root /var/www/current/public;
access_log /var/log/nginx/access.log;
error_page 500 502 503 504 /var/www/shared/500.html;
if ($http_user_agent ~* (majestic12|easou|Sogou|baidu|ahrefs) ) {
return 403;
}
location / {
# auth_basic "Restricted";
# auth_basic_user_file /var/www/shared/.htpasswd;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_max_temp_file_size 0;
if (-f $request_filename) {
break;
}
if (-f $document_root/system/maintenance.html) {
rewrite ^(.*)$ /system/maintenance.html last;
break;
}
if (-f $request_filename/index.html) {
rewrite (.*) $1/index.html break;
}
if (-f $request_filename.html) {
rewrite (.*) $1.html break;
}
if (!-f $request_filename) {
proxy_pass http://unicorn;
break;
}
}
}
答案1
如果 rails 错误日志中没有任何内容,则可能是 HTTP 错误 503(后端不可用)或 504(后端超时)。确切的错误和原因将在 nginx 错误日志中。这两个错误都是因为 unicorn 无法满足所有 HTTP 请求。
你可以做几件事:
- 在 unicorn.rb 中增加 worker_processes
- 在 nginx.conf 中增加 proxy_read_timeout
- 添加第二个 Unicorn 服务器,并通过将其添加到上游 Unicorn 来实现两者之间的负载平衡