前段时间申请了一个阿里云的帐号,捣鼓了几天,把jenkins服务器从公司机房搬到上面,算是用上云服务了:)但是,碰到一个问题,80端口不能用,使用jenkins默认端口8080,可以访问,改为80端口就不能使用了。这个问题以前有遇到过,公司接入的商务光纤是有提供固定IP的,但是此IP的80端口被电信封掉了;还有个项目申请电信机房托管服务器也是一样,必须备案后才能开通80端口。现在阿里云上的80端口又不能用,看来也要备案了。。。。奇怪的是,阿里云没有任何关于80端口要如何开通的文档或者帮助,搜索百度谷歌,也找不到。因为其他工作排得很紧,就暂时拿8000端口凑合用了。
但是,没有80端口,不但用起来别扭,而且看上去也很业余。。。我下定决心得把这个问题搞定,我又看了一遍备案的帮助,还是不明觉厉,我决定找客服。为慎重起见,要再检查一遍,年前在服务器上装了个nodejs,正好可以拿来试试。写个Hello World,监听80端口
var http = require(‘http‘);
http.createServer(function(req,res) {
res.writeHead(200, {‘Content-Type‘:‘text/html‘});
res.write(‘<h1>Node.js</h1>‘);
res.end(‘<p>Hello World</p>‘);
}).listen(80);
console.log("HTTP server is listening at port 80.");
保存为server.js
运行 node server.js
然后在浏览器打开这个页面,当然,料想也是打不开的。
不过,等等...居然打开了...
看来阿里云并没有封80端口啊。
我赶紧关掉node,把jenkins切到80端口,还是不能访问,这是怎么回事?
打开log一看,有这么几行:
...
Caused by: java.io.IOException: Failed to listen on port 80
at winstone.HttpListener.getServerSocket(HttpListener.java:122)
at winstone.HttpListener.start(HttpListener.java:75)
at winstone.Launcher.spawnListener(Launcher.java:220)
... 8 more
Caused by: java.net.BindException: Permission denied
原来是权限不足导致的。当时想当然,居然没有检查log,该打该打~
jenkins服务是以jenkins帐号启动的,不是root帐号,没有权限访问1024以下的端口,有两种办法解决这个问题,一是用root帐号启动jenkins,不推荐;二是增加路由规则,将80端口的请求转发到8000端口,执行命令为:
iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 8000
网卡为eth1,因为阿里云服务器有两张网卡,eth0绑定的是内网地址。
错怪阿里了,其实阿里云没有封端口。