Tomcat8设置端口为80

Tomcat8设置端口为80

我关注了http://www.mogilowski.net/lang/en-us/2014/04/22/install-apache-tomcat-8-on-debian-7-wheezy-with-virtual-hosts-and-apache2-integration/在 VPS 上安装 tomcat,版本 8.0.20...

我正在尝试将端口更改为 80,但没有办法做到这一点,我已经尝试过:

http://beginlinux.com/server/ubuntu/changing-the-port-on-tomcat

但似乎不起作用,从 catalina.out 内部日志中获取此错误:

25-Feb-2015 01:32:23.879 SEVERE [main] org.apache.catalina.core.StandardService.initInternal Failed to initialize connector [Connector[HTTP/1.1-$
org.apache.catalina.LifecycleException: Failed to initialize component [Connector[HTTP/1.1-80]]
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:106)
    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:851)
    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:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:310)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:484)
Caused by: org.apache.catalina.LifecycleException: Protocol handler initialization failed
    at org.apache.catalina.connector.Connector.initInternal(Connector.java:962)     
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)                  
    ... 12 more
Caused by: java.net.SocketException: Permission denied
    at sun.nio.ch.Net.bind0(Native Method)
    at sun.nio.ch.Net.bind(Net.java:444)
    at sun.nio.ch.Net.bind(Net.java:436)
    at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:214)            
    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:732)
    at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:457)           
    at org.apache.coyote.http11.AbstractHttp11JsseProtocol.init(AbstractHttp11JsseProtocol.java:120)
    at org.apache.catalina.connector.Connector.initInternal(Connector.java:960)
    ... 13 more

这是我的连接器端口,它有什么问题?

<Connector port="80" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="443" />

答案1

您需要以 root 身份运行 Tomcat,以便它能够绑定到端口 80。所有低于 1024 的端口都需要超级用户权限才能绑定。

这也是堆栈跟踪中的最后一个异常试图告诉您的内容:

Caused by: java.net.SocketException: Permission denied
    at sun.nio.ch.Net.bind0(Native Method)
    at sun.nio.ch.Net.bind(Net.java:444)
    at sun.nio.ch.Net.bind(Net.java:436)
    at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:214)            
    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:732)
    at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:457)           
    at org.apache.coyote.http11.AbstractHttp11JsseProtocol.init(AbstractHttp11JsseProtocol.java:120)
    at org.apache.catalina.connector.Connector.initInternal(Connector.java:960)
    ... 13 more

简短的警告,但不要将其变成一个扩展的安全讨论:从安全角度来看,通常不建议以超级用户权限运行 Tomcat(或任何 Java 应用程序)。Tomcat 托管的 Web 应用程序中的错误可能会导致使用这些权限执行任意代码,从而可能使远程攻击者获得系统的 root 访问权限。

出于这个原因(还有其他原因),默认 Tomcat 端口是无特权的 8080。它不需要超级用户权限来绑定,因此 Tomcat 可以作为普通系统用户运行。

如果您确实需要通过端口 80 访问 Tomcat 托管的 Web 应用程序,则应在 Tomcat 实例前面放置一个 Web 服务器(如 Apache)。它会侦听端口 80,并将请求反向代理到 Tomcat。这样更安全,尤其是因为 Apache 在绑定到端口 80 后会放弃其超级用户权限。

执行此操作的 Apache 虚拟主机配置可能如下所示:

<VirtualHost *:80>
    ServerAdmin webmaster
    ServerName foo.example.com

    ProxyPreserveHost on
    ProxyRequests off
    ProxyPass        / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
</VirtualHost>

相关内容