架构说明
前后端分离, nginx代理后端程序
例如下面配置:
location /bbbbb/api/
{
proxy_redirect off;
proxy_set_header Host $host:$server_port; #$server_port
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Nginx-Proxy true;
proxy_pass http://localhost:8082/xxxxx/api/;
}
出现 nginx 500 错误
例如下面的500 白页
这个一看就是nginx的500 页面,表示很有可能是后端程序出错,
但是一般后端程序,例如springboot 这种一般都有全局异常捕获(@ControllerAdvice),所以不应该出现跳转到nginx的 500 页面。
这里整理一下可能的情况:
1. 查看在异常捕获的时候,是否设置了HttpStatus
这种错误,一般nginx access_log 和 error_log 均无法看出异常信息!
例如下面的
/**
* 程序运行异常
*
* @param e Exception
* @return ResponseVO
*/
(HttpStatus.INTERNAL_SERVER_ERROR)
(Exception.class)
public ResponseVO<JSONObject> handleException(Throwable e) {
logger.error("程序运行异常--Throwable:", e);
String msg = i18nService.selectMsgByCode(CommonBusinessCode.SERVER_ERROR);
CurrentUserContext.remove();
return ResponseVO.create(ResponseVO.FAIL, msg,
i18nService.createErrorBody(
CommonBusinessCode.SERVER_ERROR, e.getMessage(), e.getClass().getSimpleName()));
}
对于全局异常捕获,没有必要再设置HttpStatus 为500,这个应该还是正常返回200,交由前端页面根据自定义的状态字段判断展示信息。
2. 其他情况均可以根据 access_log 和 error_log看出异常信息
- 硬盘空间满了 ,df -h ll -h 命令检查
- nginx配置文件错误 , nginx -t 命令检查
- too many open files,修改nginx的worker_rlimit_nofile参数,使用ulimit查看系统打开文件限制,修改/etc/security/limits.conf