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/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

ポート 80 にバインドするには、Tomcat を root として実行する必要があります。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 アプリケーションのバグにより、これらの権限で任意のコードが実行され、リモートの攻撃者にシステムへのルート アクセスが与えられる可能性があります。

デフォルトの Tomcat ポートは、この理由 (他の理由も含む) により、特権のない 8080 になっています。バインドにスーパーユーザー権限は必要ないため、Tomcat は通常のシステム ユーザーとして実行できます。

ポート 80 経由で Tomcat がホストする Web アプリケーションにアクセスする必要がある場合は、Tomcat インスタンスの前に Apache などの Web サーバーを配置する必要があります。このサーバーはポート 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>

関連情報