我正在尝试构建轻量级api服务器,需要使用以下技术处理许多req / sec:
> 7.1-cli-alpine(docker image) – 小内存/磁盘空间,不需要Web服务器
> ReactPHP – 用于事件驱动编程的低级库(非阻塞I / O操作的完美选择)
这就是我把所有东西放在一起的方式.附:这个项目代号为fly-pony
文件夹结构:https://i.stack.imgur.com/a2TPB.png
泊坞窗,compose.yml:
flying_pony_PHP_service:
container_name: flying_pony_PHP_service
build:
context: ./service
dockerfile: Dockerfile
ports:
- "9195:8080"
volumes:
- ./service:/app
服务/ Dockerfile:
FROM PHP:7.1-cli-alpine
ADD . /app
copY entrypoint.sh /entrypoint.sh
ENTRYPOINT /entrypoint.sh
服务/ entrypoint.sh
#!/bin/sh
/app/service.PHP
服务/ service.PHP
#!/usr/local/bin/PHP
<?PHP
require __DIR__ . '/vendor/autoload.PHP';
$loop = React\EventLoop\Factory::create();
$server = new React\Http\Server(function (Psr\Http\Message\ServerRequestInterface $request) {
$path = $request->getUri()->getPath();
$method = $request->getmethod();
if ($path === '/') {
if ($method === 'GET') {
return new React\Http\Response(200, array('Content-Type' => 'text/plain'), "Welcome to react-PHP version of flying pony api :)\n");
}
}
return new React\Http\Response(404, ['Content-Type' => 'text/plain'], 'Not found');
});
$socket = new React\Socket\Server(8080, $loop);
$server->listen($socket);
$loop->run();
当项目构建并运行时,我确认使用docker-compose ps并获得以下内容:
➜ flying_pony_PHP git:(reactPHP) docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------
flying_pony_PHP_service /bin/sh -c /entrypoint.sh Up 0.0.0.0:9195->8080/tcp
flying_pony_PHP_worker /bin/sh -c /entrypoint.sh Up
flying_pony_redis docker-entrypoint.sh redis ... Up 0.0.0.0:6379->6379/tcp
因为一切都是建立和运行的;我在我的主机上访问过:http://localhost:9195并且页面没有加载(空响应错误).但是,如果我ssh到我的flying_pony_PHP_service容器并运行此命令:curl http:// localhost:8080 – 它正在工作(即ReactPHP http服务器响应,我收到上面定义的欢迎消息).
所以,我的问题是,为什么端口映射不能按预期工作?或者这不是端口映射相关,不知何故来自容器的响应没有通过?
正如您所看到的,所有内容都正确连接并且ReactPHP中的Web服务器在内部工作,但它无法在外部访问/正常工作?
如果我使用像apache / Nginx这样的东西,我对端口映射没有任何问题.有任何想法吗?附:对不起,很长的帖子;试图在人们逐一要求之前提供所有细节.
解决方法:
这是因为如果没有明确提供接口,则ReactPHP的TCP套接字侦听127.0.0.1(localhost)(source). 127.0.0.1不是来自容器外部的accessibe – 你应该监听0.0.0.0(意思是“所有接口”).
代替
$socket = new React\Socket\Server(8080, $loop);
使用
$socket = new React\Socket\Server('0.0.0.0:8080', $loop);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。