【问题标题】:Using the PHP built-in server in production在生产中使用 PHP 内置服务器
【发布时间】:2014-10-08 12:43:08
【问题描述】:

我最近对 ​​PHP 5.4 的内置网络服务器感到好奇。从表面上看,虽然相当简单,但通过足够的工作,可以将传统上依赖于单独 Web 服务器(如 WordPress)的 PHP 应用程序作为独立脚本分发,您可以使用 php -S localhost:80 app.php 运行(或者,更有可能,'./wordpress.sh')。他们甚至可能附带自己的 PHP 解释器,该解释器具有应用程序所需的所有功能,这样就无需针对许多不同版本的语言。

这在某种程度上是在重新发明轮子,但它肯定会增加可移植性并降低最终用户的复杂性。

然而,我在documentation page上看到了以下内容:

此网络服务器旨在帮助应用程序开发。它也可用于测试目的或在受控环境中运行的应用程序演示。它并非旨在成为功能齐全的 Web 服务器。它不应该在公共网络上使用。

这显然是指诸如适当的文件系统安全性和提供正确的 HTTP 标头之类的问题,这些问题可以解决。然而,还有更多吗?在无法解决的生产环境中使用 PHP 的内置 Web 服务器是否存在固有的安全问题和/或技术限制?如果有,它们是什么?

【问题讨论】:

    标签: php security webserver


    【解决方案1】:

    我能想到很多你不想这样做的操作问题:

    • 日志记录
    • 重写
    • 节流
    • 效率(未测试,但我猜 Nginx 比 PHP 的内置非优化服务器快很多)
    • 与您拥有的任何其他扩展 Nginx、Apache 和 IIS(如 New Relic)的东西集成

    但是,有一个解决方案可以让您在使用内置 Web 服务器运行 PHP 的同时获得运行 Web 服务器的大部分优势。也就是说,您可以使用像 Nginx 这样的服务器作为 PHP 内置 Web 服务器的反向代理。在这种情况下,HTTP 成为 FastCGI 的替代品,类似于 Node.js 应用程序中内置 HTTP 服务器的常见用法。

    现在,由于我不是 PHP 作者之一,因此我无法在文档中详细说明警告。如果是我,由于上述原因,我不会单独运行 PHP,但我可能考虑在 Nginx 等真正的 Web 服务器后面运行它。不过对我来说,使用 PHP-FPM 设置 PHP 并没有那么困难,我将不再猜测内置服务器的适航性,该服务器被记录为仅用于测试。

    【讨论】:

    • 您可以使用内置网络服务器进行日志记录和重写。但是,与真正的网络服务器相比,效率和安全性可能存在问题......
    【解决方案2】:

    PHP 内置 Web 服务器的问题在于它是单线程

    这会影响性能和安全性。性能影响显然是一次只能为一个用户提供服务(直到一个请求完成,另一个无法启动)。

    安全隐患在于,使用发送少量数据的简单开放式套接字(类似于 Slow Loris)很容易对服务器执行 DOS。

    它对于没有拒绝服务风险的简单、一页、非交互式应用程序很有用。

    【讨论】:

      【解决方案3】:

      PHP 的内置服务器只支持 HTTP/1.0,这意味着客户端必须为每个请求建立一个新的 TCP/IP 连接。这很慢。

      【讨论】:

      • 我认为这个答案不是最新的。我使用 7.2.5 版本运行,例如 php -S localhost:8080 &。 curl -I localhost:8080 它说的是 HTTP/1.1。我还用 github.com/ijt/hammer 对它进行了负载测试(按了几次向上箭头),它至少在 hello world 上完成了数千个 QPS。也许由于其他原因它还没有准备好生产,但这不是原因。
      【解决方案4】:

      它不适合生产使用,可能无法正常处理崩溃和内存泄漏,从而引发稳定性问题。更重要的是,PHP 本身明确警告了这一点:

      警告此网络服务器旨在帮助应用程序开发。它也可用于测试目的或在受控环境中运行的应用程序演示。它并非旨在成为功能齐全的 Web 服务器。它不应该在公共网络上使用。

      http://php.net/manual/en/features.commandline.webserver.php

      【讨论】:

      • 引用包含在问题中,这不是答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-08
      • 2021-06-11
      • 2016-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多