用户反馈OA在Linux下用启动tomcat应用报权限不够异常。其实原因很简单,网络上搜一下,是可以解决的。既然反馈我们就整理一下解决方案,希望能给遇到同样问题的有用户有所帮助。
异常内容如下:
11-Sep-2018 16:43:32.679 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-80"]
11-Sep-2018 16:43:32.705 SEVERE [main] org.apache.coyote.AbstractProtocol.init Failed to initialize end point associated with ProtocolHandler ["http-nio-80"]
java.net.SocketException: 权限不够
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Net.java:433)
at sun.nio.ch.Net.bind(Net.java:425)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:343)
at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:730)
at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:456)
at org.apache.coyote.http11.AbstractHttp11JsseProtocol.init(AbstractHttp11JsseProtocol.java:120)
at org.apache.catalina.connector.Connector.initInternal(Connector.java:960)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
at org.apache.catalina.core.StandardService.initInternal(StandardService.java:567)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:842)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
at org.apache.catalina.startup.Catalina.load(Catalina.java:576)
at org.apache.catalina.startup.Catalina.load(Catalina.java:599)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:310)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:484)
【解决步骤一】
原因其实是因为在linux下,如果使用1024以下的端口则需要root权限,所以用户当前使用的不是root权限,是权限不足而无法使用80端口,所以会报权限不够异常。把tomcat的HTTP端口改为非80端口且大于1024的端口,比如8080即可。
在server.xml中修改端口号。
【解决步骤二】
如果一定要使用80端口访问OA应用,那么还有办法吗?答案是肯定的,我们可以使用iptables命令解决。
我们可以通过以下命令设置将80端口转发到8080端口,这样访问tomcat绑定的8080端口是可以的,/etc/hosts绑定本地到日常的域名也可以通过80端口自动转发,这样就很方便了。
转发iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
取消iptables -t nat -A OUTPUT -p tcp -d 127.0.0.1 –dport 80 -j REDIRECT –to-ports 8080
【附linux端口转发】
查看当前80端口的转发规则,使用命令:
iptables -t nat -L -n | grep 80
查看当前8080端口的转发规则,使用命令:
iptables -t nat -L -n | grep 8080
查看当前XX端口的转发规则,使用命令:
iptables -t nat -L -n | grep XX
删除当前80端口转发到8080端口的转发规则:
iptables -t nat -D PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80
删除当前8080端口转发到80端口的转发规则:
iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
删除当前A端口转发到B端口的转发规则:
iptables -t nat -D PREROUTING -p tcp --dport B -j REDIRECT --to-port A
【小贴士】
我们是不建议在linux上用root权限运行OA系统的,因为root权限太,增加系统的安全风险.