Ich folgte diesemhttp://www.mogilowski.net/lang/en-us/2014/04/22/install-apache-tomcat-8-on-debian-7-wheezy-with-virtual-hosts-and-apache2-integration/um Tomcat auf einem VPS, Version 8.0.20, zu installieren …
Ich versuche, den Port auf 80 zu ändern, aber es geht nicht. Ich habe Folgendes versucht:
http://beginlinux.com/server/ubuntu/changing-the-port-on-tomcat
aber es scheint nicht zu funktionieren. In den Protokollen tritt dieser Fehler von catalina.out auf:
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
Dies ist mein Anschlussport. Was ist damit falsch?
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="443" />
Antwort1
Sie müssen Tomcat als Root ausführen, damit eine Bindung an Port 80 möglich ist. Für alle Ports unter 1024 sind zum Binden Superuser-Berechtigungen erforderlich.
Dies ist auch, was Ihnen die letzte Ausnahme im Stacktrace mitteilen möchte:
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
Eine kurze Warnung, ohne dass dies zu einer ausführlichen Sicherheitsdiskussion wird: Aus Sicherheitsgründen ist es im Allgemeinen keine gute Idee, Tomcat (oder möglicherweise eine Java-Anwendung) mit Superuser-Berechtigungen auszuführen. Fehler in einer auf Tomcat gehosteten Webanwendung könnten dazu führen, dass mit diesen Berechtigungen beliebiger Code ausgeführt wird, wodurch ein Remote-Angreifer möglicherweise Root-Zugriff auf das System erhält.
Aus diesem (unter anderem) Grund ist der Standard-Tomcat-Port der nicht privilegierte 8080. Für die Bindung sind keine Superuser-Berechtigungen erforderlich, und daher kann Tomcat als normaler Systembenutzer ausgeführt werden.
Wenn Sie wirklich über Port 80 auf die von Tomcat gehostete Webanwendung zugreifen müssen, sollten Sie der Tomcat-Instanz einen Webserver wie Apache voranstellen. Dieser lauscht auf Port 80 und leitet die Anfrage per Reverse-Proxy an Tomcat weiter. Dies ist sicherer, nicht zuletzt, weil Apache seine Superuser-Berechtigungen nach der Bindung an Port 80 aufgibt.
Eine Apache-Virtual-Host-Konfiguration, die dies ermöglicht, könnte folgendermaßen aussehen:
<VirtualHost *:80>
ServerAdmin webmaster
ServerName foo.example.com
ProxyPreserveHost on
ProxyRequests off
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
</VirtualHost>