k6 将本地主机重定向到环回
k6 redirects localhost to loopback
我在 Mac 上,我正在尝试 运行 我的 k6 脚本针对 http://localhost:4200
(angular 应用程序)在本地。
angular 应用程序正在 运行ning,我可以通过浏览器访问它并使用 curl
。
我的 k6 脚本将基础 URL 设置为 http://localhost:4200
。然而,所有请求都被 http://127.0.0.1:4200
提出,而被 MacOS.
拒绝
如何强制 k6 不将 localhost
重写为环回地址?
编辑
添加 curl -vv
的各种输出。
localhost:4200
* Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 4200 (#0)
> GET / HTTP/1.1
> Host: localhost:4200
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< X-Powered-By: Express
< Access-Control-Allow-Origin: *
< Content-Type: text/html; charset=utf-8
< Accept-Ranges: bytes
< Content-Length: 942
< ETag: W/"3ae-UQojFJZul+b6hEhgbvnN6wFCVuA"
< Date: Thu, 20 Jan 2022 21:38:55 GMT
< Connection: keep-alive
< Keep-Alive: timeout=5
<
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>MyApp</title>
<base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="assets/scripts/apm.js"></script>
<link rel="apple-touch-icon" sizes="180x180" href="/assets/images/apple-touch-icon.png">
<link rel="icon" type="image/x-icon" href="favicon.ico">
<link rel="icon" type="image/png" sizes="32x32" href="/assets/images/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/assets/images/favicon-16x16.png">
<link rel="manifest" href="/site.webmanifest">
<link rel="stylesheet" href="styles.css"></head>
<body>
<app-root></app-root>
<script src="runtime.js" type="module"></script><script src="polyfills.js" type="module"></script><script src="styles.js" defer></script><script src="vendor.js" type="module"></script><script src="main.js" type="module"></script></body>
</html>
* Connection #0 to host localhost left intact
* Closing connection 0
127.0.0.1:4200
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connection failed
* connect to 127.0.0.1 port 4200 failed: Connection refused
* Failed to connect to 127.0.0.1 port 4200: Connection refused
* Closing connection 0
curl: (7) Failed to connect to 127.0.0.1 port 4200: Connection refused
编辑 2
主机文件
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost
# Added by Docker Desktop
# To allow the same kube context to work on the host and the container:
127.0.0.1 kubernetes.docker.internal
没有应用程序在端口 4200 上侦听您的 IPv4 地址 127.0.0.1
。 127.0.0.1 是 IPv4 环回地址。当 k6 向 localhost
发出请求时,此主机名解析为 IPv4 127.0.0.1.
但是,您的应用程序似乎正在侦听端口 4200 以获取您的 IPv6 地址 ::1
。 ::1 是 IPv6 环回地址。 curl
将主机名 localhost
解析为其 IPv6 地址。
您如何将应用程序绑定到端口?通常,当绑定到主机的所有接口时,您会使用特殊的 IP 地址 0.0.0.0
.
我看到一个潜在的解决方案:
- 使您的应用程序绑定到 IPv4 和 IPv6,通常通过绑定到地址
0.0.0.0
. 来完成
- 更改您的 k6 脚本以直接连接到 IPv6
::1
- 指定
--dns "policy=preferIPv6"
或将 dns:{policy:"preferIPv6"}
添加到您的 options
(自 0.29.0 起)
- 在您的 OS 中禁用 IPv6。这是一个巨大的变化,我不推荐它
- 更改主机文件以将本地主机解析为 IPv4 地址
我在 Mac 上,我正在尝试 运行 我的 k6 脚本针对 http://localhost:4200
(angular 应用程序)在本地。
angular 应用程序正在 运行ning,我可以通过浏览器访问它并使用 curl
。
我的 k6 脚本将基础 URL 设置为 http://localhost:4200
。然而,所有请求都被 http://127.0.0.1:4200
提出,而被 MacOS.
如何强制 k6 不将 localhost
重写为环回地址?
编辑
添加 curl -vv
的各种输出。
localhost:4200
* Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 4200 (#0)
> GET / HTTP/1.1
> Host: localhost:4200
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< X-Powered-By: Express
< Access-Control-Allow-Origin: *
< Content-Type: text/html; charset=utf-8
< Accept-Ranges: bytes
< Content-Length: 942
< ETag: W/"3ae-UQojFJZul+b6hEhgbvnN6wFCVuA"
< Date: Thu, 20 Jan 2022 21:38:55 GMT
< Connection: keep-alive
< Keep-Alive: timeout=5
<
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>MyApp</title>
<base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="assets/scripts/apm.js"></script>
<link rel="apple-touch-icon" sizes="180x180" href="/assets/images/apple-touch-icon.png">
<link rel="icon" type="image/x-icon" href="favicon.ico">
<link rel="icon" type="image/png" sizes="32x32" href="/assets/images/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/assets/images/favicon-16x16.png">
<link rel="manifest" href="/site.webmanifest">
<link rel="stylesheet" href="styles.css"></head>
<body>
<app-root></app-root>
<script src="runtime.js" type="module"></script><script src="polyfills.js" type="module"></script><script src="styles.js" defer></script><script src="vendor.js" type="module"></script><script src="main.js" type="module"></script></body>
</html>
* Connection #0 to host localhost left intact
* Closing connection 0
127.0.0.1:4200
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connection failed
* connect to 127.0.0.1 port 4200 failed: Connection refused
* Failed to connect to 127.0.0.1 port 4200: Connection refused
* Closing connection 0
curl: (7) Failed to connect to 127.0.0.1 port 4200: Connection refused
编辑 2
主机文件
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost
# Added by Docker Desktop
# To allow the same kube context to work on the host and the container:
127.0.0.1 kubernetes.docker.internal
没有应用程序在端口 4200 上侦听您的 IPv4 地址 127.0.0.1
。 127.0.0.1 是 IPv4 环回地址。当 k6 向 localhost
发出请求时,此主机名解析为 IPv4 127.0.0.1.
但是,您的应用程序似乎正在侦听端口 4200 以获取您的 IPv6 地址 ::1
。 ::1 是 IPv6 环回地址。 curl
将主机名 localhost
解析为其 IPv6 地址。
您如何将应用程序绑定到端口?通常,当绑定到主机的所有接口时,您会使用特殊的 IP 地址 0.0.0.0
.
我看到一个潜在的解决方案:
- 使您的应用程序绑定到 IPv4 和 IPv6,通常通过绑定到地址
0.0.0.0
. 来完成
- 更改您的 k6 脚本以直接连接到 IPv6
::1
- 指定
--dns "policy=preferIPv6"
或将dns:{policy:"preferIPv6"}
添加到您的options
(自 0.29.0 起) - 在您的 OS 中禁用 IPv6。这是一个巨大的变化,我不推荐它
- 更改主机文件以将本地主机解析为 IPv4 地址