Play Framework POST 端点返回超时 - 504
Play Framework POST endpoint returning Time Out - 504
我是 运行 一个基于 Play Framework 2.5.10 的 REST API 作品。它 运行 通过 NGINX 反向路由,我能够到达所有 GET 端点,但我在所有 POST 端点上都超时,所有这些消耗 JSON.
请注意,在开发环境中,它工作正常,我能够到达所有这些端点,但在生产环境中,无论是通过 IP 连接还是通过反向路由 DNS,我都会在 POST 上超时。
非常感谢解决此问题的任何指示。
server {
listen 80;
server_name subdomain.domain.com;
location / {
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
send_timeout 300;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass http://xxx.xxx.xxx.xxx:3000;
}
}
试图访问
的路由
POST /auth controllers.Application.authenticate()
是否需要在 nginx 上定义所有路由?
添加授权码
@BodyParser.Of(BodyParser.Json.class)
public Result authenticate(){
JsonNode json = request().body().asJson();
EncryptUtil secure = null;
secure=EncryptUtil.getSecurityUtility();
String command = "login";
String logincommand = json.findPath("command").asText();
if (logincommand.equals(command)){
String email = json.findPath("email").textValue();
String password = json.findPath("password").textValue();
Logger.info("Passwords::"+password+"\t"+secure.getEncryptedUserPassword(password.trim()));
UserAccount user=UserAccount.findByEmail(email);
if(user!=null){
if(!(secure.getDecryptedUserPassword(user.password).equals(password))){
return status(400,"Invalid credentials");
}else {
if (user.accountstatus == Boolean.FALSE){
result.put("error","Account Deactivated Contact Admin");
return status(400,"Account Deactivated Contact Admin");
} else {
String authToken = user.createToken();
ObjectNode authTokenJson = Json.newObject();
authTokenJson.put(AUTH_TOKEN, authToken);
response().setCookie(Http.Cookie.builder(AUTH_TOKEN, authToken).withSecure(ctx().request().secure()).build());
JsonNode userJson = Json.toJson(user);
return status(200,userJson);
}
}
}
else{
result.put("Error", "Invalid User");
Logger.info(result.toString());
return status(400,"Invalid Credentials");
}
} else{
return globalFunctions.returnBadRequest(command);
}
}
如果你的POST请求体很大,连接很慢and/ornginx存储临时文件的介质很慢,这可能是nginx默认的请求缓冲造成的.
在其日志文件中,nginx 还应警告大型正文被缓存到磁盘。
如果这是您的问题,您可以使用以下指令禁用缓冲请求,该指令在 http
、server
和 location
节中有效:
proxy_request_buffering off;
请注意,在某些情况下,这将阻止故障转移到备份服务器,以防您使用该功能。如果没有,你很好。
另见 http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_request_buffering
如果需要,您可以有选择地禁用请求缓冲,例如仅针对某些 location
或仅针对 POST
方法。
我是 运行 一个基于 Play Framework 2.5.10 的 REST API 作品。它 运行 通过 NGINX 反向路由,我能够到达所有 GET 端点,但我在所有 POST 端点上都超时,所有这些消耗 JSON.
请注意,在开发环境中,它工作正常,我能够到达所有这些端点,但在生产环境中,无论是通过 IP 连接还是通过反向路由 DNS,我都会在 POST 上超时。
非常感谢解决此问题的任何指示。
server {
listen 80;
server_name subdomain.domain.com;
location / {
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
send_timeout 300;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass http://xxx.xxx.xxx.xxx:3000;
}
}
试图访问
的路由POST /auth controllers.Application.authenticate()
是否需要在 nginx 上定义所有路由?
添加授权码
@BodyParser.Of(BodyParser.Json.class)
public Result authenticate(){
JsonNode json = request().body().asJson();
EncryptUtil secure = null;
secure=EncryptUtil.getSecurityUtility();
String command = "login";
String logincommand = json.findPath("command").asText();
if (logincommand.equals(command)){
String email = json.findPath("email").textValue();
String password = json.findPath("password").textValue();
Logger.info("Passwords::"+password+"\t"+secure.getEncryptedUserPassword(password.trim()));
UserAccount user=UserAccount.findByEmail(email);
if(user!=null){
if(!(secure.getDecryptedUserPassword(user.password).equals(password))){
return status(400,"Invalid credentials");
}else {
if (user.accountstatus == Boolean.FALSE){
result.put("error","Account Deactivated Contact Admin");
return status(400,"Account Deactivated Contact Admin");
} else {
String authToken = user.createToken();
ObjectNode authTokenJson = Json.newObject();
authTokenJson.put(AUTH_TOKEN, authToken);
response().setCookie(Http.Cookie.builder(AUTH_TOKEN, authToken).withSecure(ctx().request().secure()).build());
JsonNode userJson = Json.toJson(user);
return status(200,userJson);
}
}
}
else{
result.put("Error", "Invalid User");
Logger.info(result.toString());
return status(400,"Invalid Credentials");
}
} else{
return globalFunctions.returnBadRequest(command);
}
}
如果你的POST请求体很大,连接很慢and/ornginx存储临时文件的介质很慢,这可能是nginx默认的请求缓冲造成的.
在其日志文件中,nginx 还应警告大型正文被缓存到磁盘。
如果这是您的问题,您可以使用以下指令禁用缓冲请求,该指令在 http
、server
和 location
节中有效:
proxy_request_buffering off;
请注意,在某些情况下,这将阻止故障转移到备份服务器,以防您使用该功能。如果没有,你很好。
另见 http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_request_buffering
如果需要,您可以有选择地禁用请求缓冲,例如仅针对某些 location
或仅针对 POST
方法。