はじめに (対象読者・この記事でわかること)

この記事は、仮想環境(VirtualBox・VMware 等)に CentOS をインストールし、そこに Apache と Java Servlet 環境(Tomcat)を立てたい方、さらにホスト OS(Windows / macOS / Linux)のブラウザから動作を確認したい方向けです。
記事を読み終えると、「CentOS 7 に Apache Tomcat をインストール → 簡単な Servlet をデプロイ → ホスト側ブラウザで http://192.168.x.x:8080/サンプル を開いて動作確認」までの一連の流れがスクリプトコマンド レベルで再現できるようになります。SELinux やファイアウォールでつまずきやすいポイントも解説しているので、環境構築で「なぜ繋がらない?」と悩んでいる方も最後まで読み進めてください。

前提知識

  • Linux の基本コマンド(cd, ls, sudo, vi 等)が使える
  • Java のクラス・コンパイルの概念を知っている(Servlet の基礎知識があれば尚良い)
  • VirtualBox または VMware などで CentOS 7 をインストール済みであること
  • ホスト OS とゲスト OS がブリッジまたはホストオンリーアダプターで通信できる状態であること

なぜ「Apache+Java」なのか

Web アプリケーションを Java で書く場合、Servlet/JSP コンテナが必須です。
代表的なコンテナである Apache Tomcat はオープンソースで軽量、かつ Apache HTTP Server とは別物ですが、名前が似ていて混乱しがちです。
本記事では「Apache Tomcat」を単に「Tomcat」と呼び、HTTP リバースプロキシとして使う場合は「Apache HTTP Server」と明記します。
CentOS にはデフォルトで firewalld と SELinux が有効になっているため、単に yum install してもホスト側からアクセスできないケースが多いのが現状です。
そこで、「Tomcat 単体で動かし、ファイアウォールと SELinux を最小限で許可する」 という構成を取り、手順を簡潔にしてあります。Apache HTTP Server を使ったリバースプロキシ構成は応用編として最後に紹介します。

CentOS 7 に Tomcat 9 をインストールしてホストブラウザからアクセスするまで

STEP1: 必要なパッケージをインストール

CentOS 7 の場合、デフォルトリポジトリに Tomcat 9 は含まれていないため、EPEL リポジトリを有効にして入手します。

Bash
# EPEL リポジトリを有効化 sudo yum -y install epel-release # Java 11(Tomcat 9 以降は Java 8 以上が必須) sudo yum -y install java-11-openjdk-devel # Tomcat 9 本体と管理者用 Web アプリを一括インストール sudo yum -y install tomcat tomcat-webapps tomcat-admin-webapps

インストール完了後、以下のコマンドでバージョンを確認します。

Bash
java -version # openjdk version "11.0.x" ~ と出れば OK sudo systemctl start tomcat sudo systemctl enable tomcat

STEP2: ファイアウォールと SELinux で 8080 番を許可

CentOS 7 では firewalld がデフォルトで有効なので、8080/tcp を永続的に許可します。

Bash
sudo firewall-cmd --permanent --add-port=8080/tcp sudo firewall-cmd --reload

次に SELinux で 8080 番を許可します。

Bash
sudo semanage port -a -t http_port_t -p tcp 8080 # すでに許可済みの場合は "already defined" と出ますが無視して OK

これで、ゲスト OS 内で curl http://localhost:8080 を実行すると Tomcat ロゴページの HTML が返ってきます。

STEP3: ホスト OS からゲスト IP へアクセス

VirtualBox のブリッジ接続であれば、ゲスト OS に割り当てられた IP(例:192.168.1.50)に対して、ホスト側ブラウザから

http://192.168.1.50:8080

と入力すれば、Tomcat デフォルトページが表示されます。
もし「接続できない」場合は、以下を順に確認してください。

  1. ゲスト OS の IP が正しいか ip addr で確認
  2. ホスト OS と同じセグメントか、ping 192.168.1.50 で疎通確認
  3. ファイアウォールで 8080 番が許可されているか sudo firewall-cmd --list-all で確認
  4. SELinux で拒否ログが出ていないか sudo ausearch -m avc -ts recent で確認

STEP4: 簡単な Servlet をデプロイして動作確認

~/hello/src/HelloServlet.java を作成します。

Java
package com.example; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/plain;charset=UTF-8"); try (PrintWriter out = res.getWriter()) { out.println("Hello from CentOS + Tomcat + Java!"); } } }

コンパイルとデプロイ用ディレクトリ作成

Bash
mkdir -p ~/hello/WEB-INF/classes javac -cp /usr/share/java/tomcat-servlet-api.jar HelloServlet.java mv com/example/HelloServlet.class ~/hello/WEB-INF/classes/

~/hello/WEB-INF/web.xml を作成

Xml
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" version="5.0"> <servlet> <servlet-name>hello</servlet-name> <servlet-class>com.example.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>

WAR 化してデプロイ

Bash
cd ~/hello jar -cvf hello.war * sudo cp hello.war /var/lib/tomcat/webapps/

数秒後、Tomcat が自動展開されるので、ブラウザで

http://192.168.1.50:8080/hello/hello

にアクセスすると、

Hello from CentOS + Tomcat + Java!

と表示されれば成功です。

ハマりどころと解決策

症状: ホスト側ブラウザで ERR_CONNECTION_TIMED_OUT

原因1: ファイアウォールが 8080 番を拒否
sudo firewall-cmd --list-all で 8080/tcp が services もしくは ports に含まれているか確認。含まれていなければ --add-port=8080/tcp し再読込。

原因2: SELinux によって http_port_t に 8080 番が割り当てられていない
sudo semanage port -l | grep 8080 で確認。割り当てがなければ sudo semanage port -a -t http_port_t -p tcp 8080

原因3: ネットワークモードが NAT のまま
→ VirtualBox のネットワーク設定を「ブリッジアダプター」または「ホストオンリーアダプター」に変更し、ゲスト OS を再起動。

症状: http://localhost:8080 では見えるがホストから見えない

これは、Tomcat が 127.0.0.1:8080 のみでリッスンしているケース。
/etc/tomcat/server.xml<Connector port="8080" …>address="0.0.0.0" を明示的に追記して Tomcat を再起動すると解消します。

応用編: Apache HTTP Server 経由で 80 番で公開

本番環境では 80 番でサービスしたい場合、Apache HTTP Server をリバースプロキシとして配置します。

Bash
sudo yum -y install httpd sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --reload sudo setsebool -P httpd_can_network_connect 1

/etc/httpd/conf.d/tomcat.conf を作成

<VirtualHost *:80>
    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:8080/
    ProxyPassReverse / http://127.0.0.1:8080/
</VirtualHost>
Bash
sudo systemctl enable --now httpd

これで、ホスト側ブラウザから

http://192.168.1.50/hello/hello

と 80 番でアクセス可能になります。

まとめ

本記事では、CentOS 7 に Tomcat 9 をインストールし、ファイアウォールと SELinux を正しく設定してホスト OS からブラウザでアクセスする方法を解説しました。

  • yum で Java・Tomcat を一括インストール
  • firewall-cmdsemanage で 8080 番を許可
  • シンプルな Servlet をデプロイして動作確認
  • トラブル時の「繋がらない」原因と切り分け方法
  • オプションで Apache HTTP Server によるリバースプロキシ構成

この基本構成が理解できれば、次は Maven/Gradle でのビルド自動化、SSL 化、systemd カスタムサービス化、Docker 化へと発展できます。
次回以降、これらの発展テーマを深掘りした記事を予定しています。

参考資料