【问题标题】:Load balancing PHP built-in server?负载均衡 PHP 内置服务器?
【发布时间】:2017-02-12 00:31:15
【问题描述】:

我的开发环境由单线程的内置 PHP 服务器组成。效果很好:

APP_ENV=dev php -S localhost:8080 -c php.ini web/index.php

其中一个问题是内置服务器是单线程的。这使得许多并行 XHR 依次解析。最糟糕的是,它不能很好地模仿我们的生产环境。此设置中根本不存在一些与并发相关的前端问题。

我的问题:

我可以利用哪些现有解决方案将请求异步代理到同一 PHP 内置服务器的多个实例?

例如,我有几个终端会话在不同的端口上运行内置服务器,然后每个请求都被路由到这些实例中的不同实例。换句话说,我希望我的应用程序的多个实例使用最简单的设置并行运行(如果可能,不要使用 Apache 或 Nginx)。

【问题讨论】:

  • 你考虑过使用 PHP-FPM 吗?
  • 我建议不要这样做,因为它变得复杂。更好的解决方案是运行复制生产环境的 VM。这样可以在不影响本地设置的情况下进行更准确的测试。

标签: php multithreading load-balancing reverse-proxy


【解决方案1】:

super-server,如 inetd 或 tcpserver,效果很好。我是后者的粉丝:

tcpserver 等待传入的连接,并且对于每个连接, 运行您选择的程序。

有了这个,现在您想使用反向代理将 HTTP 协议从网络中拉出,然后将其交给特定于连接的 PHP 服务器。很简单:

$ cat proxy-to-php-server.sh
#!/bin/bash -x

# get a random port -- this could be improved
port=$(shuf -i 2048-65000 -n 1)

# start the PHP server in the background
php -S localhost:"${port}" -t "$(realpath ${1:?Missing path to serve})" &
pid=$!
sleep 1

# proxy standard in to nc on that port
nc localhost "${port}"

# kill the server we started
kill "${pid}"

好的,现在一切就绪。开始监听你的主端口:

tcpserver -v -1 0 8080 ./proxy-to-php-server.sh ./path/to/your/code/

在英语中是这样的:

  • tcpserver 开始在端口 8080 (0 8080) 上侦听所有接口,并在启动和每个连接时打印调试信息 (-v -1)
  • 对于该端口上的每个连接,tcpserver 生成代理助手,为给定的代码路径 (path/to/your/code/) 提供服务。专业提示:将其设为绝对路径。
  • 代理脚本在一个随机端口上启动一个专门构建的 PHP Web 服务器。 (这可以改进:脚本不检查端口是否在使用中。)
  • 然后代理脚本将其标准输入(来自 tcpserver 服务的连接)传递给专用服务器
  • 对话发生,然后代理脚本终止了专用服务器

这应该让你在球场上。我没有对它进行广泛的测试。 (仅适用于 GNU/Linux,特别是 Centos 6。)您需要调整代理对内置 PHP 服务器的调用以匹配您的用例。

请注意,严格来说,这不是一个“负载平衡”服务器:它只是一个并行的临时服务器。不要期望它有太多的生产质量!


安装tcpserver

$ curl -sS http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz | tar xzf -
$ cd ucspi-tcp-0.88/
$ curl -sS http://www.qmail.org/moni.csi.hu/pub/glibc-2.3.1/ucspi-tcp-0.88.errno.patch | patch -Np1
$ sed -i 's|/usr/local|/usr|' conf-home
$ make
$ sudo make setup check

【讨论】:

  • 首先,非常感谢@bishop 的工作,我可以解决我的问题。其次,我发现您可以通过将sleep 1 更改为sleep 0.1 来加快请求时间,如果您的sleep 命令支持小数秒,请检查您的系统。查看更多信息:serverfault.com/questions/469247/…
【解决方案2】:

我同意复制生产环境的虚拟副本是您的最佳选择。你不只是想引起问题,你想引起自己同样的问题。此外,几乎不能保证您会在备用设置下遇到所有相同的问题。

但是,如果您确实想这样做,那么您没有特别多的选择。您可以将传入请求定向到中间软件,然后将它们分派到 php 后端——这将是 Apache、Nginx 解决方案——或者你不这样做,请求由单个 php 线程直接处理。

如果您不愿意使用该插入软件,那么您和客户之间只有一层:网络。理论上,您可以为自己设置一个循环 DNS。你给自己多个 IP,加载一个 PHP 服务器来监听每个,然后让你的客户端连接在它们之间传播。请注意,这会将每个客户端分配给一个特定的进程——这可能不是您正在寻找的并行级别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    相关资源
    最近更新 更多