在nginx反向代理上使用php处理错误,并向管理员发送邮件响应

在nginx反向代理上使用php处理错误,并向管理员发送邮件响应,php,email,nginx,error-handling,reverse-proxy,Php,Email,Nginx,Error Handling,Reverse Proxy,问题是: 一旦Nginx检测到错误,是否有办法从php访问服务器响应,并将服务器响应发送给管理员,同时向访问者显示自定义错误页面? 目前最好的解决办法是直接从后端服务器发送相关信息,但我不能强迫他们总是向我发送电子邮件。我想检测反向代理中的HTTP错误响应代码,并采取相应的行动,而不管后端服务器在做什么 目前,我可以将错误页面委托给PHP,从那里我可以向管理员发送一封邮件,其中包含我从nginx获得的有关请求的信息,但它会将所有内容检测为get请求,释放所有POST信息,我无法访问实际响应,因此

问题是: 一旦Nginx检测到错误,是否有办法从php访问服务器响应,并将服务器响应发送给管理员,同时向访问者显示自定义错误页面?

目前最好的解决办法是直接从后端服务器发送相关信息,但我不能强迫他们总是向我发送电子邮件。我想检测反向代理中的HTTP错误响应代码,并采取相应的行动,而不管后端服务器在做什么

目前,我可以将错误页面委托给PHP,从那里我可以向管理员发送一封邮件,其中包含我从nginx获得的有关请求的信息,但它会将所有内容检测为get请求,释放所有POST信息,我无法访问实际响应,因此我可以将其发送给管理员,所以基本上我发送了一份关于错误的非常不完整的报告

有没有办法不丢失POST信息,并在请求委托给PHP后从服务器读取响应?在显示自定义错误页面的同时,是否有其他方式发送错误页面

请记住,后端服务器是远程机器,不一定由我控制。这些服务器正在向Nginx发送它所需要的所有信息,以满足我的需要,这似乎是Nginx上的一个不足之处,但我希望有人能想出一个解决办法或其他什么

这是我当前的nginx设置(附加到
error\u页面
子句的GET参数是我找到的将有关生成错误的后端服务器的一些信息传递给PHP的唯一方法):

这是我从PHP发送的一封邮件的示例,该邮件请求生成了一个错误:

_SERVER
Array
(
    [USER] => www-data
    [HOME] => /var/www
    [FCGI_ROLE] => RESPONDER
    [QUERY_STRING] => err=500&svr=45.79.216.211:443&uperr=500&sT=1.476&pT=1.610
    [REQUEST_METHOD] => GET
    [CONTENT_TYPE] => multipart/form-data; boundary=----WebKitFormBoundarydq4hsdTNEzIU6Vve
    [CONTENT_LENGTH] => 9550
    [SCRIPT_FILENAME] => /usr/share/nginx/html/error.php
    [SCRIPT_NAME] => /error.php
    [REQUEST_URI] => /node/add/article
    [DOCUMENT_URI] => /error.php
    [DOCUMENT_ROOT] => /usr/share/nginx/html
    [SERVER_PROTOCOL] => HTTP/1.1
    [GATEWAY_INTERFACE] => CGI/1.1
    [SERVER_SOFTWARE] => nginx/1.4.6
    [REMOTE_ADDR] => 181.49.223.170
    [REMOTE_PORT] => 42033
    [SERVER_ADDR] => 172.31.55.210
    [SERVER_PORT] => 443
    [SERVER_NAME] => _
    [HTTPS] => on
    [REDIRECT_STATUS] => 200
    [HTTP_HOST] => hsbnoticias.com
    [HTTP_CONNECTION] => keep-alive
    [HTTP_CONTENT_LENGTH] => 9550
    [HTTP_CACHE_CONTROL] => max-age=0
    [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*\/*;q=0.8
    [HTTP_ORIGIN] => https://hsbnoticias.com
    [HTTP_UPGRADE_INSECURE_REQUESTS] => 1
    [HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36
    [HTTP_CONTENT_TYPE] => multipart/form-data; boundary=----WebKitFormBoundarydq4hsdTNEzIU6Vve
    [HTTP_REFERER] => https://hsbnoticias.com/node/add/article
    [HTTP_ACCEPT_ENCODING] => gzip, deflate
    [HTTP_ACCEPT_LANGUAGE] => es-ES,es;q=0.8,en;q=0.6
    [HTTP_COOKIE] => /* I removed this for security */
    [PHP_SELF] => /error.php
    [REQUEST_TIME_FLOAT] => 1456243321.1031
    [REQUEST_TIME] => 1456243321
)


_POST
Array
(
)


_GET
Array
(
    [err] => 500
    [svr] => 45.79.216.211:443
    [uperr] => 500
    [sT] => 1.476
    [pT] => 1.610
)

显然,PHP从GET请求中获取所有内容,因为根据nginx配置中的第11行,您将所有内容作为GET请求发送。nginx的行为是O.S.级别的,如果您想了解有关POST请求的更多信息,应该在PHP的全局错误处理页面中这样做。您可以使用
标题()
函数,如果需要的话,可以专门引用错误号。您能想出任何不将其作为GET请求发送的方法吗?我知道我可以在后端服务器上这样做,但我希望在代理中有一个额外的错误处理层,以防后端服务器不按预期运行,这是非常常见的,因为它们我们正在不断发展。请记住,后端服务器是远程机器,不一定由我控制。这些服务器正在向Nginx发送它所需的所有信息,以满足我的需求,这似乎是Nginx上的一个不足之处,但我希望有人能想出一个解决方法或其他方法……如果我正确理解@Xorifelse的话,他们建议在后端服务器中实现一个错误处理程序,并从该点发送电子邮件,而不是从代理发送。我认为这似乎是目前唯一的方法,但直接从代理服务器发送服务器的实际输出将更加可维护和解耦。您可以尝试将failover.php catch all添加到
try\u文件$uri/index.php。Nginx将尝试发布这些文件。
_SERVER
Array
(
    [USER] => www-data
    [HOME] => /var/www
    [FCGI_ROLE] => RESPONDER
    [QUERY_STRING] => err=500&svr=45.79.216.211:443&uperr=500&sT=1.476&pT=1.610
    [REQUEST_METHOD] => GET
    [CONTENT_TYPE] => multipart/form-data; boundary=----WebKitFormBoundarydq4hsdTNEzIU6Vve
    [CONTENT_LENGTH] => 9550
    [SCRIPT_FILENAME] => /usr/share/nginx/html/error.php
    [SCRIPT_NAME] => /error.php
    [REQUEST_URI] => /node/add/article
    [DOCUMENT_URI] => /error.php
    [DOCUMENT_ROOT] => /usr/share/nginx/html
    [SERVER_PROTOCOL] => HTTP/1.1
    [GATEWAY_INTERFACE] => CGI/1.1
    [SERVER_SOFTWARE] => nginx/1.4.6
    [REMOTE_ADDR] => 181.49.223.170
    [REMOTE_PORT] => 42033
    [SERVER_ADDR] => 172.31.55.210
    [SERVER_PORT] => 443
    [SERVER_NAME] => _
    [HTTPS] => on
    [REDIRECT_STATUS] => 200
    [HTTP_HOST] => hsbnoticias.com
    [HTTP_CONNECTION] => keep-alive
    [HTTP_CONTENT_LENGTH] => 9550
    [HTTP_CACHE_CONTROL] => max-age=0
    [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*\/*;q=0.8
    [HTTP_ORIGIN] => https://hsbnoticias.com
    [HTTP_UPGRADE_INSECURE_REQUESTS] => 1
    [HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36
    [HTTP_CONTENT_TYPE] => multipart/form-data; boundary=----WebKitFormBoundarydq4hsdTNEzIU6Vve
    [HTTP_REFERER] => https://hsbnoticias.com/node/add/article
    [HTTP_ACCEPT_ENCODING] => gzip, deflate
    [HTTP_ACCEPT_LANGUAGE] => es-ES,es;q=0.8,en;q=0.6
    [HTTP_COOKIE] => /* I removed this for security */
    [PHP_SELF] => /error.php
    [REQUEST_TIME_FLOAT] => 1456243321.1031
    [REQUEST_TIME] => 1456243321
)


_POST
Array
(
)


_GET
Array
(
    [err] => 500
    [svr] => 45.79.216.211:443
    [uperr] => 500
    [sT] => 1.476
    [pT] => 1.610
)