macos - sierra - ir: el servidor http no funciona en osx
descargar mac os sierra (4)
Me gustaría ver el resultado de ''ifconfig -a''.
Esto huele como un problema de configuración local; No puedo reproducir esto en OS X 10.11.4, Go 1.6
Mi WAG es que un dispositivo de túnel está realmente usando 127.0.0.1, no el dispositivo de vuelta de bucle.
El servidor http de ejemplo no funciona para mí. Código fuente:
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe("127.0.0.1:8080", nil)
}
Cuando trato de conectar todo lo que obtengo es:
$ curl 127.0.0.1:8080
curl: (7) Failed to connect to 127.0.0.1 port 8080: Operation timed out
$ nc -v -G 5 127.0.0.1 8080
nc: connectx to 127.0.0.1 port 8080 (tcp) failed: Operation timed out
Mientras que nc intenta conectar, tcpdump muestra solo paquetes SYN:
$ tcpdump -i lo0 port 8080
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo0, link-type NULL (BSD loopback), capture size 262144 bytes
18:21:30.906638 IP localhost.52799 > localhost.http-alt: Flags [S], seq 3375761924, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 118569352 ecr 0,sackOK,eol], length 0
18:21:31.006824 IP localhost.52799 > localhost.http-alt: Flags [S], seq 3375761924, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 118569452 ecr 0,sackOK,eol], length 0
18:21:31.106989 IP localhost.52799 > localhost.http-alt: Flags [S], seq 3375761924, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 118569552 ecr 0,sackOK,eol], length 0
18:21:31.208141 IP localhost.52799 > localhost.http-alt: Flags [S], seq 3375761924, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 118569653 ecr 0,sackOK,eol], length 0
18:21:31.308288 IP localhost.52799 > localhost.http-alt: Flags [S], seq 3375761924, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 118569753 ecr 0,sackOK,eol], length 0
18:21:31.408336 IP localhost.52799 > localhost.http-alt: Flags [S], seq 3375761924, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 118569853 ecr 0,sackOK,eol], length 0
18:21:31.609143 IP localhost.52799 > localhost.http-alt: Flags [S], seq 3375761924, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 118570053 ecr 0,sackOK,eol], length 0
18:21:32.011215 IP localhost.52799 > localhost.http-alt: Flags [S], seq 3375761924, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 118570453 ecr 0,sackOK,eol], length 0
18:21:32.812512 IP localhost.52799 > localhost.http-alt: Flags [S], seq 3375761924, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 118571253 ecr 0,sackOK,eol], length 0
18:21:34.414686 IP localhost.52799 > localhost.http-alt: Flags [S], seq 3375761924, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 118572853 ecr 0,sackOK,eol], length 0
Y aquí está la última parte de la salida dtruss del lado del servidor (comenzando desde la llamada al socket):
socket(0x2, 0x1, 0x0) = 3 0
fcntl(0x3, 0x2, 0x1) = 0 0
fcntl(0x3, 0x3, 0x0) = 2 0
fcntl(0x3, 0x4, 0x6) = 0 0
setsockopt(0x3, 0xFFFF, 0x20) = 0 0
setsockopt(0x3, 0xFFFF, 0x4) = 0 0
bind(0x3, 0xC8200BA6AC, 0x10) = 0 0
listen(0x3, 0xFDE8, 0x10) = 0 0
kqueue(0x3, 0xFDE8, 0x10) = 4 0
fcntl(0x4, 0x2, 0x1) = 0 0
kevent(0x4, 0xC8200558C0, 0x2) = 0 0
getsockname(0x3, 0xC82005592C, 0xC820055928) = 0 0
accept(0x3, 0xC820055AA4, 0xC820055A94) = -1 Err#35
kevent(0x4, 0x0, 0x0) = 0 0
select(0x0, 0x0, 0x0, 0x0, 0x700000080DE8) = 0 0
Nada más aparece cuando ejecuto nc, por lo que ni siquiera se da cuenta de los intentos de conexión.
No tengo el firewall habilitado, todo lo demás funciona, solo los programas Go tienen este problema (en particular, no puedo usar docker-machine)
¿Cómo lo arreglo?
Editar: Supongo que # Err35 es:
#define EDEADLK 35 /* Resource deadlock would occur */
... ¿wat?
Edit2:
- ir: versión go1.6 darwin / amd64
- OSX: 10.11.4
El servidor no está saliendo, escucha indefinidamente.
Edit3:
Intenté tanto "ir a construir" como "ir a correr", sin diferencia
Usar localhost en lugar de 127.0.0.1 - sin diferencia
Usando w.Write([]byte(fmt.Sprintf("Hi there, I love %s!", r.URL.Path[1:]))
lugar - no hay diferencia. Btw - dice nc: connectx to 127.0.0.1 port 8080 (tcp) failed: Operation timed out
, por lo que el nc: connectx to 127.0.0.1 port 8080 (tcp) failed: Operation timed out
conexión expiró, no el de lectura
ifconfig -a y netstat -r salida: https://gist.github.com/mabn/ed171f180725b563d32bb86d5ec61988
¿Tiene Cisco Anyconnect instalado? Si es así, busca websecurity_uninstall.sh
y desinstala websecurity
sudo /opt/cisco/anyconnect/bin/websecurity_uninstall.sh
Reenvía el puerto 8080 al puerto 5001 y no puede usar netstat, lsof o cualquiera de las herramientas normales para ver por qué nada puede usar el puerto 8080.
Estoy seguro de que revisó esto, pero ¿por casualidad tiene filtrado de paquetes (pfctl) o algún otro firewall activado? Ver https://superuser.com/questions/505128/deny-access-to-a-port-from-localhost-on-osx
¡Lo arreglé! Recordé que un rato antes intenté aumentar el límite de conexiones en mi máquina y apliqué los cambios descritos aquí: https://apple.stackexchange.com/a/169606
Revertirlos solucionó el problema. Esto es lo que ayudó:
sudo rm /etc/sysctl.conf
sudo sysctl kern.ipc.somaxconn=128
sudo rm /Library/LaunchDaemons/limit.maxproc.plist
sudo rm /Library/LaunchDaemons/limit.maxfiles.plist
Por cierto: después de un poco más de investigación descubrí que:
- el problema era que accept () syscall volvía EAGAIN cada vez pero no aceptaba ninguna conexión
- se comportó igual para las conexiones sin bloqueo en los programas C y Java
Pero todavía no sé por qué exactamente estaba roto.