這裡記錄我在 CentOS Linux 中安裝 Apache2 與 Tomcat8 伺服器的指令以及整合設定步驟。

Tomcat 配合 Apache 網頁伺服器,可以讓一台機器同時提供 Java 與 PHP 的執行環境,以下是在 CentOS Linux 中安裝 Apache 2 與 Tomcat 8 的步驟。

安裝 Apache 網頁伺服器

yum 安裝 Apache 網頁伺服器:

sudo yum install httpd

將 Apache 伺服器設定為開機自動啟動:

sudo systemctl enable httpd.service

立即啟動 Apache 伺服器:

sudo systemctl start httpd.service

檢查 Apache 伺服器的狀態:

sudo systemctl status httpd.service

HTTPS 加密網頁

若要讓 Apache 伺服器提供 HTTPS 安全加密網頁,可以安裝 nss 模組:

sudo yum install mod_nss

編輯 nss 模組的 /etc/httpd/conf.d/nss.conf 設定檔,把預設的 8443 連接埠改為標準的 443

#
# When we also provide SSL we have to listen to the 
# standard HTTP port (see above) and to the HTTPS port
#
# Note: Configurations that use IPv6 but not IPv4-mapped addresses need two
#       Listen directives: "Listen [::]:8443" and "Listen 0.0.0.0:443"
#
Listen 443

# [略]

##
## SSL Virtual Host Context
##

<VirtualHost _default_:443>

其餘的設定則依照自己的需求修改。接著重新啟動 Apache 伺服器,讓設定生效:

sudo systemctl restart  httpd.service

安裝完成後,請開啟瀏覽器,輸入伺服器的網址,檢查網頁是否正常,正常來說可以看到 Apache 的測試網頁。

安裝 Tomcat 伺服器

首先用 yum 安裝 Java SDK 1.8:

sudo yum install java-1.8.0-openjdk-devel

新增 tomcat 使用者群組:

sudo groupadd tomcat

新增 tomcat 使用者帳號:

sudo useradd -M -s /bin/nologin -g tomcat -d /opt/tomcat tomcat

由於 tomcat 這個帳號是專門用來執行 Tomcat 服務的帳號,所以不會有登入系統使用的情況,因此可將其登入的 shell 設定為 /bin/nologin,禁止該帳號登入,以增加系統安全性。

-d 是設定帳號的家目錄,這裡的 /opt/tomcat 就是等一下我們要安裝 Tomcat 的路徑,如果您想要把 Tomcat 安裝在不同的位置,可以自行修改這個路徑。

設定完 tomcat 帳號之後,接著就可以安裝 Tomcat 伺服器,首先從 Tomcat 官方網站下載 Tomcat 8 的 Binary Distributions:

wget http://ftp.tc.edu.tw/pub/Apache/tomcat/tomcat-8/v8.5.28/bin/apache-tomcat-8.5.28.tar.gz

建立安裝 Tomcat 的目錄,這裡我們將 Tomcat 安裝在 /opt/tomcat 中,首先建立這個目錄:

sudo mkdir /opt/tomcat

將 Tomcat 8 的壓縮檔解壓縮至該目錄中:

sudo tar xvf apache-tomcat-8*tar.gz -C /opt/tomcat --strip-components=1

設定檔案權限:

cd /opt/tomcat
sudo chgrp -R tomcat *
sudo chmod g+rwx conf
sudo chmod -R g+r conf

有些目錄需要讓 Tomcat 寫入資料,必須將目錄的擁有者改為 tomcat

sudo chown -R tomcat webapps/ work/ temp/ logs/

建立 /etc/systemd/system/tomcat.service 這個 Systemd 的設定檔:

sudo vi /etc/systemd/system/tomcat.service

檔案內容如下:

# Systemd unit file for tomcat
[Unit]
Description=Apache Tomcat Web Application Container
After=syslog.target network.target

[Service]
Type=forking

Environment=JAVA_HOME=/usr/lib/jvm/jre
Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat
Environment=CATALINA_BASE=/opt/tomcat
Environment='CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC'
Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'

ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/bin/kill -15 $MAINPID

User=tomcat
Group=tomcat

[Install]
WantedBy=multi-user.target

存檔之後,要重新載入 Systemd,讓新的 Tomcat 設定檔生效:

sudo systemctl daemon-reload

將 Tomcat 伺服器設定為開機自動啟動:

sudo systemctl enable tomcat

立即啟動 Tomcat 服務:

sudo systemctl start tomcat

如果要停止 Tomcat 服務,則執行:

sudo systemctl stop tomcat

整合 Apache 與 Tomcat 伺服器

正常來說 Apache 的網頁伺服器會使用 80 連接埠,而 Tomcat 會使用 8080,如果不想要使用連接埠來區分 Apache 與 Tomcat,可以透過 Apache 的 Proxy 設定,將某些網頁路徑導向至 Tomcat 伺服器,而對外則統一使用標準的 80 連接埠,而加密的 HTTPS 網頁則使用 443,這樣可以讓網址看起來比較漂亮,不會多出連接埠號。

Apache 的 proxy 模組可以讓外部的連線從 Apache 導向至內部的 Tomcat 伺服器,這裡我示範將 HTTPS 加密的所有連線都預設導向至 Tomcat,而 /static/ 這個路徑下的網頁則維持不變(由 Apache 處理)。

編輯 /etc/httpd/conf.d/nss.conf 設定檔,在 <VirtualHost> 的設定中加入:

ProxyPass /static/ !
ProxyPassReverse /static/ !
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/

這裡的 ajp://localhost:8009/ 是 Tomcat 內部用的位址,這個設定可讓 Apache 透過 AJP 協定將來自外部的連線導向至 Tomcat 伺服器。

設定檔修改之後,重新啟動 Apache 伺服器,讓新設定生效:

systemctl restart httpd.service

接下來開啟一般的 HTTPS 加密網頁,就會直接顯示 Tomcat 伺服器的內容,而如果是在 /static/ 路徑下的網頁則會由 Apache 處理,像是 PHP 或靜態的 HTML、CSS 與 JavaScript 等檔案就可以放在這裡。

參考資料:antoine hordezDigitalOceanHostPresto