我有一个包含 Nginx 容器和 PHP-FPM 容器的 Docker Compose 文件。有时在我的 PHP 应用程序中,我在同一服务器上创建 cURL,因此请求将是 localhost/my/uri/。
来自 PHP-FPM 的 cURL 请求将登陆 PHP-FPM 的 80 端口,这当然不是我想要的。我想要的是请求发送到我的主机的端口 80,该端口映射到 Nginx 容器上的端口 80。
为此,我添加了一个 extra_hosts 条目:
my-php-8:
container_name: my-php-8
image: php:8.3.8-fpm
expose:
- '9000'
extra_hosts:
- localhost:host-gateway
volumes:
- ./www/html/:/var/www/html/
问题是
/etc/hosts
文件在 127.0.0.1 localhost
添加的行之前仍然有 extra_hosts
: my.host.ip.number localhost
。
这是
/ect/hosts
文件:
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
192.168.65.254 localhost
172.23.0.5 494edd959b5a
我不知道怎么做,但在我的应用程序的 PHP-FPM 7.2 的早期版本中,一切正常,因为 cURL 在无法到达 127.0.0.1 时尝试了正确的 IP。使用 PHP_FPM 8.3,第一个请求失败,但不会重试 /etc/hosts 文件中的其他 IP。
curl -v localhost
在PHP-FPM 7.2上的结果:
* Trying ::1...
* TCP_NODELAY set
* Expire in 150000 ms for 3 (transfer 0x565181b35f50)
* Expire in 200 ms for 4 (transfer 0x565181b35f50)
* connect to ::1 port 80 failed: Connection refused
* Trying 127.0.0.1...
* TCP_NODELAY set
* Expire in 150000 ms for 3 (transfer 0x565181b35f50)
* connect to 127.0.0.1 port 80 failed: Connection refused
* Trying 192.168.65.254...
* TCP_NODELAY set
* Expire in 150000 ms for 3 (transfer 0x565181b35f50)
* Connected to localhost (192.168.65.254) port 80 (#0)
> GET / HTTP/1.1
> Host: localhost
> User-Agent: curl/7.64.0
> Accept: */*
>
< HTTP/1.1 403 Forbidden
< Server: nginx
< Date: Fri, 02 Aug 2024 10:02:51 GMT
< Content-Type: text/html
< Content-Length: 162
< Connection: keep-alive
< Vary: Accept-Encoding
<
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx</center>
</body>
</html>
curl -v localhost
在PHP-FPM 7.8上的结果:
* Trying 127.0.0.1:80...
* connect to 127.0.0.1 port 80 failed: Connection refused
* Trying [::1]:80...
* connect to ::1 port 80 failed: Connection refused
* Failed to connect to localhost port 80 after 0 ms: Couldn't connect to server
* Closing connection 0
curl: (7) Failed to connect to localhost port 80 after 0 ms: Couldn't connect to server
我正在寻找一种方法从
127.0.0.1 localhost
中删除 /etc/hosts
线。我尝试过手动编辑或从 Dockerfile 编辑它,但我没有权限。
或者我想让 cURL 尝试 /etc/hosts 中的每条记录。
谢谢大家否决了这个问题。我看到我做错了什么😅
如果有人遇到同样的问题,这就是我所做的:
我使用的是 Mac,因此我在我的
127.0.0.1
文件中添加了一条任意名称为“my.app”的记录,指向 /etc/hosts
。
然后,我在
extra_hosts: - my.app:host-gateway
中添加了一个docker-compose.yaml
。
现在一切正常。就是这样!