事情是这样的 …

自己用 SpringBoot 写了一个服务端,然后前端 React 部分,为了避免跨域,使用了 express-http-proxy

结果:

1
2
// port 3000
server.use('/api', proxy('http://localhost:8080/api/v1'));

加上这个之后始终访问 localhost:3000/api/* 报 404 。

然而,proxy 换任何地址都可以,比如 https://www.baidu.com,就唯独 http://localhost:8080/api/v1 这个就是 404。

一度以为 express-http-proxy 对 localhost 的处理出现了 bug。

两个晚上之后,突然想到了电脑上后台跑着 nginx , 8080 端口的请求可能又被代理了。一看 nginx.config, 果然如此。

想着关了 nginx 吧。

然后就 sudo nginx -s stop

1
nginx: [error] open() "/usr/local/var/run/nginx.pid" failed (2: No such file or directory)

上网搜了一下,大概是 nginx 在启动的时候会创建 nginx.pid,在重启和关闭的时候都会检测 nginx.pid 是否存在。关闭时删除。

碰到这个问题,一般只需要 sudo nginx 再启动一下 nginx 就行了。结果执行后,又出现了这个问题:

1
nginx: [emerg] bind() to 0.0.0.0:8080 failed (48: Address already in use)

但是没仔细看,不就是端口被占用吗,然后找了半天的 48 端口,NM,这和 nginx 有啥关系。

后来发现是 8080 被 SpringBoot 的内置 tomcat 占用,导致启动的时候,nginx 不能绑定 8080 端口。

论认真严谨的重要性。