はじめに (対象読者・この記事でわかること)
この記事は、仮想環境(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
インストール完了後、以下のコマンドでバージョンを確認します。
Bashjava -version # openjdk version "11.0.x" ~ と出れば OK sudo systemctl start tomcat sudo systemctl enable tomcat
STEP2: ファイアウォールと SELinux で 8080 番を許可
CentOS 7 では firewalld がデフォルトで有効なので、8080/tcp を永続的に許可します。
Bashsudo firewall-cmd --permanent --add-port=8080/tcp sudo firewall-cmd --reload
次に SELinux で 8080 番を許可します。
Bashsudo 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 デフォルトページが表示されます。
もし「接続できない」場合は、以下を順に確認してください。
- ゲスト OS の IP が正しいか
ip addrで確認 - ホスト OS と同じセグメントか、
ping 192.168.1.50で疎通確認 - ファイアウォールで 8080 番が許可されているか
sudo firewall-cmd --list-allで確認 - SELinux で拒否ログが出ていないか
sudo ausearch -m avc -ts recentで確認
STEP4: 簡単な Servlet をデプロイして動作確認
~/hello/src/HelloServlet.java を作成します。
Javapackage 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!"); } } }
コンパイルとデプロイ用ディレクトリ作成
Bashmkdir -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 化してデプロイ
Bashcd ~/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 をリバースプロキシとして配置します。
Bashsudo 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>
Bashsudo systemctl enable --now httpd
これで、ホスト側ブラウザから
http://192.168.1.50/hello/hello
と 80 番でアクセス可能になります。
まとめ
本記事では、CentOS 7 に Tomcat 9 をインストールし、ファイアウォールと SELinux を正しく設定してホスト OS からブラウザでアクセスする方法を解説しました。
yumで Java・Tomcat を一括インストールfirewall-cmdとsemanageで 8080 番を許可- シンプルな Servlet をデプロイして動作確認
- トラブル時の「繋がらない」原因と切り分け方法
- オプションで Apache HTTP Server によるリバースプロキシ構成
この基本構成が理解できれば、次は Maven/Gradle でのビルド自動化、SSL 化、systemd カスタムサービス化、Docker 化へと発展できます。
次回以降、これらの発展テーマを深掘りした記事を予定しています。
参考資料
- Apache Tomcat 9公式ドキュメント
- CentOS 7 セキュリティガイド - firewalld 編
- SELinux ポートラベル付け - Red Hat エンタープライズ Linux 7 セキュリティガイド
- Java 11 インストール - CentOS Wiki
