经常遇到一些监听地址不是 IP:Port 而是 unix socket 的程序,这些程序如果使用的是 HTTP 协议,unix socket 接口也可以用 curl 访问。
例如 ingress-nginx 的监听地址为 unix:/tmp/nginx-status-server.sock:
server {
listen unix:/tmp/nginx-status-server.sock;
set $proxy_upstream_name "internal";
keepalive_timeout 0;
gzip off;
access_log off;
location /healthz {
return 200;
}
location /nginx_status {
stub_status on;
}
... 省略...
}
用 curl 访问它的 unix socket 的方法如下:
$ curl --unix-socket /tmp/nginx-status-server.sock http://localhost/nginx_status
Active connections: 77
server accepts handled requests
64273 64273 971368
Reading: 0 Writing: 12 Waiting: 65
--unix-socket
指定 unix socket 文件的地址, http://localhost/nginx_status
是要请求的路径。
注意 localhost 可以根据实际情况更改成其它数值但不可省略,如果省略后变成 http://nginx_status,那么 nginx_status 会被认作是 Host,Path 被认为是 /:
$ curl -v --unix-socket /tmp/nginx-status-server.sock http://nginx_status
* Expire in 0 ms for 6 (transfer 0xe464ab3dd0)
* Trying /tmp/nginx-status-server.sock...
* Expire in 200 ms for 4 (transfer 0xe464ab3dd0)
* Connected to nginx_status (/tmp/nginx-status-server.sock) port 80 (#0)
> GET / HTTP/1.1
> Host: nginx_status
> User-Agent: curl/7.64.0
> Accept: */*