• 前段时间申请了一个阿里云的帐号,捣鼓了几天,把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绑定的是内网地址。

    错怪阿里了,其实阿里云没有封端口。