反向代理PHP:最佳实践?

我将NGINX设置为一个SSL反向代理,用于三个带有dynamic(PHP)和静态内容的小型Web应用程序。

当涉及到传递PHP请求时,什么会被认为是安全性和性能方面的最佳实践?

是否应该将它们传递到所请求的Web服务器(NGINX – 然后通过同一主机上的套接字或TCP传递给PHP-FPM)还是直接传递给PHP-FPM服务器?

我所有的Web应用程序和反向代理都在FreeBSD上分开的Jails中。 每个监狱都有自己的NGINXnetworking服务器和PHP-FPM(或uWSGI和Python)。

您的主要Nginx应该充当反向代理并将HTTP请求转发到每个应用程序的相应Web服务器。 如果主反向代理对应用程序的jail具有文件级访问权限,那么最好使用UNIX套接字与其Web服务器进行通信,但在您的情况下,您别无select,只能使用TCP。

使用TCP时,请务必设置keepalive参数,以便始终保持多个打开的连接,以便您不必在每个请求上打开和closures连接以获得更好的性能。 参数的参数是保持打开的连接数量,类似10就好了。

在你的jails中,那里的web服务器应该使用UNIX套接字与PHP-FPM进行通信以获得更好的性能(TCP的开销比UNIX套接字更多,所以尽可能使用后者)。

最后,我没有看到主要的反向代理直接与监狱内的PHP-FPM进行通信,但是这意味着您还应该根据监狱内的PHP-FPMconfiguration主要的反向代理。 这是我宁愿避免,我宁愿监狱是自包含,并在默认端口上公开一个HTTP端点,并有入狱Nginx处理所有的PHP-FPM的东西。 如果您需要更改PHP-FPM的相关内容,您只需在监狱中进行操作,而不必触摸主要的Nginx反向代理。

此外,我build议你尝试一个更轻的Web服务器的监狱像Lighttpd,因为你真的不需要太多的function在那里,即使Lighty的configuration语法是绝对可怕的,它不应该是一个问题。

关于你最后的评论

现在我只需要找出在后台设置哪些设置以及代理(cache-control,keepalive,error_page等)中的哪些设置。

我提到的keep-alive参数应该设置在主Nginx反向代理的upstream块中,并且只影响反向代理服务器内部的通信,并且与客户端和您的HTTP保持活动无关服务器。 对于浏览器和服务器之间的保持连接,应该在您身边的最后一个端点完成,这是反向代理。 另一方面,caching控制头文件是依赖于应用程序的(因为不同的应用程序可能需要不同的设置),应该在应用程序的监狱里单独设置。 尽量在每个应用程序的监狱里放置尽可能多的设置,并且只在连接级别设置(HTTP keepalive,TLS等)极端情况下修改反向代理的configuration。