我有一个docker compose文件,它结合了nginx和php,如下所示:
nginx:
image: nginx
ports:
- "80:80"
- "2443:2443"
links:
- phpfpm
volumes:
- ./nginx/anonymous.conf:/etc/nginx/conf.d/anonymous.conf
- ./logs/nginx-error.log:/var/log/nginx/error.log
- ./logs/nginx-access.log:/var/log/nginx/access.log
- ./public:/usr/share/nginx/html
phpfpm:
image: php:fpm
expose:
- "2443"
volumes:
- ./public:/usr/share/nginx/html
我可以在我已经制作的虚拟主机的浏览器上看到我的网站index.php
页面,让我们说anonymous.com
现在在我的phpfpm容器中,我启动了一个基于Ratchet
的套接字服务器,它正在侦听端口2443
// bin/server.php
$webSocketServer = new WsServer(new Chat());
$server = IoServer::factory(
new HttpServer($webSocketServer), 2443);
$server->run();
这就是我在phpfpm
容器
php /usr/share/nginx/html/bin/server.php
我的理解是,因为我已经公开2443
并且我的ngnix
和phpfpm
容器已关联。我可以通过转到phpfpm
telnet anonymous.com 2443
容器上运行的套接字服务器
但它没有联系。这是输出
$ telnet anonymous.com 2443
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.
请注意,以前当我同时使用nginx和php-fpm在单个容器上时,每件事都运行正常。所以我确信PHP没有任何问题。它只是我无法弄清楚如何从外部世界访问套接字服务器。
由于
更新
如果我使用我的phpfpm
容器ip并通过浏览器端口2443使用它,它的工作正常。但问题是我不能依靠容器ip作为它的全部动态。
答案 0 :(得分:1)
使用基于Ratchet的套接字服务器时,我遇到了类似的问题(相同的输出)。我的只是一个PHP容器(=没有nginx / apache / ...)。 这是因为给了工厂的第三个参数:
$server = IoServer::factory(
new HttpServer($webSocketServer), 2443, '127.0.0.1'
);
删除127.0.0.1
(然后使用默认的0.0.0.0
值)可以解决此问题。
答案 1 :(得分:0)
您应该使用服务名称作为主机名。因此,要从nginx
连接到phpfpm
,请使用phpfpm:2443