CentOS 7 上の Tomcat で実行されている Web アプリケーションにポートを開いて直接アクセスするにはどうすればよいでしょうか? Tomcat は Apache httpd リバース プロキシの背後で実行されていますが、テスト目的で各アプリを直接公開するポートを開いて、Tomcat で実行されているアプリに直接アクセスしたいと考えています。
と を使用して、firewalld でポート 8080 と 8081 を開くとfirewall-cmd --add-port=8080/tcp
、または、または とfirewall-cmd --add-port=8081/tcp
入力したときに、それらのポートで実行されているアプリにアクセスできるようになります。これらのアプリは、httpd 経由でアクセスした場合にもアクセスできます。 server.ip.addr:8080
server.ip.addr:8081
anydomainontheserver.com:8080
anydomainontheserver.com:8081
ただし、ポート 8082、8083、8084 で実行されているアプリに直接アクセスしようとすると、404 エラーが返されます。ポート 8082 と 8083 で実行されているアプリは、ドメイン名を介して httpd 経由で 100% アクセス可能であるにもかかわらず、この状態になります。また、ポート 8084 で実行されているアプリは、ほとんどの場合、ドメイン名を介して httpd 経由でアクセスできます。いずれの場合も、 と入力してfirewall-cmd --add-port=808x
経由でアプリにアクセスしようとしましたserver.ip.addr:808x
がanydomainontheserver.com:808x
、いずれの場合も 404 エラーが発生しました。firewalld で ajp ポートのポートを開いて、ブラウザーに と と入力してみましたserver.ip.addr:80xx
がanydomainontheserver.com:80xx
、エラー番号を指定しないとページを取得できないというブラウザー エラー メッセージが表示されました。
では、テスト目的でポート 8082、8083、8084 で実行されているアプリに Tomcat 経由で直接アクセスするにはどうすればよいでしょうか?
入力するとfirewall-cmd --list-all
次のようになります:
public (default, active)
interfaces: enp3s0
sources:
services: dhcpv6-client http imaps openvpn smtp ssh
ports: 8009/tcp 8083/tcp 8011/tcp 8084/tcp 8010/tcp 8080/tcp 8081/tcp 8013/tcp 8012/tcp 8082/tcp
masquerade: yes
forward-ports:
icmp-blocks:
rich rules:
入力するとnano /etc/httpd/conf.d/virtualhosts.conf
次のようになります:
<VirtualHost *:443>
ServerName www.vpndomain.com
ServerAlias vpndomain.com
ErrorLog /var/log/httpd/vpndomain_com_error.log
CustomLog /var/log/httpd/vpndomain_com_requests.log combined
SSLEngine on
SSLProxyEngine on
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
ProxyPass / ajp://server.ip.addr:8009/
ProxyPassReverse / ajp://server.ip.addr:8009/
</VirtualHost>
Listen 444
<VirtualHost *:444>
ServerName www.vpndomain.com
ServerAlias vpndomain.com
ErrorLog /var/log/httpd/vpndomain_com_error.log
CustomLog /var/log/httpd/vpndomain_com_requests.log combined
SSLEngine on
SSLProxyEngine on
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
ProxyPass / ajp://server.ip.addr:8010/
ProxyPassReverse / ajp://server.ip.addr:8010/
</VirtualHost>
<VirtualHost www.domain1.com:80>
ServerName www.domain1.com
ServerAlias domain1.com
ErrorLog /var/log/httpd/domain1_com_error.log
CustomLog /var/log/httpd/domain1_com_requests.log combined
ProxyPass / ajp://server.ip.addr:8011/
ProxyPassReverse / ajp://server.ip.addr:8011/
</VirtualHost>
<VirtualHost www.domain2.com:80>
ServerName www.domain2.com
ServerAlias domain2.com
ErrorLog /var/log/httpd/domain2_com_error.log
CustomLog /var/log/httpd/domain2_com_requests.log combined
ProxyPass / ajp://server.ip.addr:8012/
ProxyPassReverse / ajp://server.ip.addr:8012/
</VirtualHost>
<VirtualHost www.domain3.com:80>
ServerName www.domain3.com
ServerAlias domain3.com
ErrorLog /var/log/httpd/domain3_com_error.log
CustomLog /var/log/httpd/domain3_com_requests.log combined
ProxyPass / ajp://server.ip.addr:8013
ProxyPassReverse / ajp://server.ip.addr:8013
</VirtualHost>
そして、`nano /opt/tomcat/conf/server.xml と入力すると、次のようになります。
<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="ermapp_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
<Service name="Upload">
<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8444" />
<Connector port="8010" protocol="AJP/1.3" redirectPort="8444" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps_upload" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="uploadapp_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
<Service name="Public">
<Connector port="8082" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8445" />
<Connector port="8011" protocol="AJP/1.3" redirectPort="8445" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
</Realm>
<Host name="domain1.com" appBase="webapps_public" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="domain1_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
<Service name="domain2">
<Connector port="8083" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8446" />
<Connector port="8012" protocol="AJP/1.3" redirectPort="8446" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
</Realm>
<Host name="domain2.com" appBase="webapps_domain2" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="domain2_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
<Service name="domain3">
<Connector port="8084" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8447" />
<Connector port="8013" protocol="AJP/1.3" redirectPort="8447" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
</Realm>
<Host name="domain3.com" appBase="webapps_domain3" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="domain3_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
答え1
httpd プロキシは AJP ポートを使用していますが、直接アクセスしようとすると HTTP ポートが使用されます。
httpd プロキシを切り替えて HTTP ポートを使用するようにすると、まだ動作しますか、それとも 404 が表示されますか?
プロキシが HTTP を使用しているときに httpd 経由で 404 が返される場合は、Tomcat の HTTP コネクタに問題があります。
プロキシが HTTP ポートを使用しているときに httpd 経由でも動作する場合、問題はおそらくアプリ自体の内部にあります。
答え2
より安全な方法で目標を達成するには、SSH トンネリングを使用します。Tomcat やプロキシの設定変更は不要です。クライアントと Tomcat サーバーの間に SSH トンネルを作成し、ローカル クライアント マシンでアプリケーションが実行しているかのようにポートにローカルでアクセスします。Tomcat のポート TCP 8082、8083、8084 でリッスンしているサービスが 3 つあります。そのため、3 つの SSH トンネルを作成します。Tomcat の IP アドレスが 10.10.10.254 で、ユーザーが bob であると仮定します。
クライアント マシンから、次のように 3 つの SSH トンネルを作成します。
$ ssh -fnN -L 8082:localhost:8082 [email protected]
$ ssh -fnN -L 8083:localhost:8083 [email protected]
$ ssh -fnN -L 8084:localhost:8084 [email protected]
3 つのアプリが Web アプリであると仮定すると、クライアント マシンで Web ブラウザーを開き、次の場所に移動します。
http://localhost:8082
http://localhost:8083
http://localhost:8084