使用Mac OS进行web开发时,会遇到80端口已经被占用的情况。

解决这个问题可以通过以下几个步骤:

1、使用 lsof -P -i tcp:port 查看端口进程,

例如: lsof -P -i tcp:8080

yg-mac:~ homer$ lsof -P -i tcp:8080 
COMMAND  PID  USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
eclipse  607 homer  171u  IPv6 0x8cb9ac6aa821e285      0t0  TCP localhost:50632->localhost:8080 (CLOSE_WAIT)
java    1403 homer   45u  IPv6 0x8cb9ac6aaca41d45      0t0  TCP *:8080 (LISTEN)

查看当前占用8080端口的进程,如果有就kill掉。

高亮显示端口号

lsof -P -i tcp:8080 | grep 8080                 // 端口

lsof -P -i tcp:8080 | grep -i "listen"         // 推荐

 

2、关闭mac自带apache的启动

sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist

打开mac自带apache的启动

sudo launchctl load -w /System/Library/LaunchDaemons/org.apache.httpd.plist

3、最常见的一条,mac禁止了普通用户访问1024以下的端口,包括80端口

想要通过80端口访问则需要通过端口转发,命令如下:

sudo ipfw add fwd 127.0.0.1,1081 tcp from any to 127.0.0.1 80 in

大致意思是做端口转发,80端口打到1081上,这样web服务都指向了nginx的1081(相当于原来的80端口)

 

老版本OS X使用ipfw端口转发,但新版本 OSX Yosemite (10.10.3) 以后,已经无法使用ipfw,而是换成了pf

pf 转发步骤:

1. 新建 com.pow

vim /etc/pf.anchors/com.pow

rdr pass on lo0 inet proto tcp from any to any port 80 -> 127.0.0.1 port 8088
rdr pass on lo0 inet proto tcp from any to any port 80 -> 127.0.0.1 port 8088

rdr on lo0 inet proto tcp from any to 127.0.0.1 port 80 -> 127.0.0.1 port 8088

其中,lo0为ifconfig时查询到的网卡的名字  80是tomcat端口,8088为转发的端口

注意: 在段落末尾一定要加换行,否则会报syntax error错误。

 

2. pfctl 命令检测配置文件

sudo pfctl -vnf /etc/pf.anchors/com.pow

 

3. 配置 pf.conf

vim /etc/pf.conf

添加内容如下红色字体:

#
# com.apple anchor point
#
scrub-anchor "com.apple/*"
nat-anchor "com.apple/*"
rdr-anchor "com.apple/*"

rdr-anchor "pow"
dummynet-anchor "com.apple/*"
anchor "com.apple/*"
load anchor "com.apple" from "/etc/pf.anchors/com.apple"

load anchor "pow" from "/etc/pf.anchors/com.pow"

转发端口配置

1. 手动临时设置转发端口:

sysctl -w net.inet.ip.forwarding=1

2. 永久文件设置转发端口

sudo vim /etc/sysctl.conf

添加内容:

net.ip.forwarding=1
net.inet6.ip6.forwarding=1

执行命令使生效:

sysctl -p          // mac os x 下不生效,无此命令...

3. 查看生效转发端口

sudo sysctl -a | grep forward

yg-mac:Java homer$ sudo sysctl -a | grep forward
net.inet.ip.forwarding: 1
net.inet6.ip6.forwarding: 0

说明: 1 - 表示生效, 0 - 表示未生效 

 

4. 生效配置

sudo pfctl -evf /etc/pf.anchors/com.pow           // OSX Yosemite以后版本

sudo pfctl -f /etc/pf.conf          // OSX Yosemite以前版本

 

5. 开机启动

sudo pfctl -e        // 开启开机启动
sudo pfctl -d        // 关闭开机启动

 

 

ipfw 命令(OSX Yosemite 10.10.3 以前版本有的命令):

ipfw (Internet Protocol FireWall)

a、查看规则:

$ sudo ipfw list

00100 fwd 127.0.0.1,1081 tcp fromany to 127.0.0.1 dst-port 80 in
65535 allow ip from any to any

b、删除规则:

sudo ipfw delete 100

c、新增规则:

sudo ipfw add fwd 127.0.0.1,1081tcp from any to 127.0.0.1 80 in

 

Mac 开启远程登录端口号

Mac Pro 系统,默认是关闭了ssh远程登录的端口号连接,需要开启才可以ssh连接

1)打开偏好设置 ——> 共享

2)勾选远程登录——>所有用户,如下图

 

 

参考推荐

Mac OS X 系统命令查看系统版本号

Mac brew 安装软件