欢迎光临千百叶网
详情描述
CentOS下Tomcat虚拟主机配置详细教程

一、环境准备

1.1 系统要求

  • CentOS 7/8
  • Java JDK 1.8+
  • Tomcat 8/9

1.2 安装必要软件

# 安装Java(以JDK 8为例)
yum install -y java-1.8.0-openjdk-devel

# 验证Java安装
java -version

# 下载Tomcat(以Tomcat 9为例)
wget https://downloads.apache.org/tomcat/tomcat-9/v9.0.85/bin/apache-tomcat-9.0.85.tar.gz

# 解压
tar -xzf apache-tomcat-9.0.85.tar.gz -C /opt/

# 创建软链接
ln -s /opt/apache-tomcat-9.0.85 /opt/tomcat

二、配置虚拟主机

2.1 目录结构准备

# 创建虚拟主机目录结构
mkdir -p /var/www/example1.com/{WEB-INF,public_html}
mkdir -p /var/www/example2.com/{WEB-INF,public_html}

# 创建测试页面
cat > /var/www/example1.com/public_html/index.jsp << 'EOF'
<!DOCTYPE html>
<html>
<head>
    <title>Example1 Site</title>
</head>
<body>
    <h1>Welcome to Example1.com</h1>
    <p>Server time: <%= new java.util.Date() %></p>
</body>
</html>
EOF

cat > /var/www/example2.com/public_html/index.jsp << 'EOF'
<!DOCTYPE html>
<html>
<head>
    <title>Example2 Site</title>
</head>
<body>
    <h1>Welcome to Example2.com</h1>
    <p>This is the second virtual host</p>
</body>
</html>
EOF

# 设置权限
chown -R tomcat:tomcat /var/www/

2.2 配置server.xml

编辑 /opt/tomcat/conf/server.xml

<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">

    <!-- 原有配置保持不变 -->
    <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
    <!-- ... 其他监听器 ... -->

    <Service name="Catalina">

        <!-- 修改默认连接器,支持更多主机 -->
        <Connector port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443"
                   URIEncoding="UTF-8" />

        <!-- 虚拟主机配置 -->
        <Engine name="Catalina" defaultHost="localhost">

            <!-- 默认localhost主机 -->
            <Host name="localhost" appBase="webapps"
                  unpackWARs="true" autoDeploy="true">
                <Context path="" docBase="ROOT" reloadable="true" />
                <Valve className="org.apache.catalina.valves.AccessLogValve"
                       directory="logs"
                       prefix="localhost_access_log" suffix=".txt"
                       pattern="%h %l %u %t &quot;%r&quot; %s %b" />
            </Host>

            <!-- 第一个虚拟主机 example1.com -->
            <Host name="example1.com" appBase="/var/www/example1.com"
                  unpackWARs="true" autoDeploy="true">
                <Context path="" docBase="public_html" reloadable="true" />
                <Alias>www.example1.com</Alias>
                <Valve className="org.apache.catalina.valves.AccessLogValve"
                       directory="/var/www/example1.com/logs"
                       prefix="example1_access_log" suffix=".txt"
                       pattern="%h %l %u %t &quot;%r&quot; %s %b" />
            </Host>

            <!-- 第二个虚拟主机 example2.com -->
            <Host name="example2.com" appBase="/var/www/example2.com"
                  unpackWARs="true" autoDeploy="true">
                <Context path="" docBase="public_html" reloadable="true" />
                <Alias>www.example2.com</Alias>
                <Valve className="org.apache.catalina.valves.AccessLogValve"
                       directory="/var/www/example2.com/logs"
                       prefix="example2_access_log" suffix=".txt"
                       pattern="%h %l %u %t &quot;%r&quot; %s %b" />
            </Host>

            <!-- 更多虚拟主机可以继续添加 -->

        </Engine>
    </Service>
</Server>

2.3 使用context.xml单独配置(推荐方式)

创建独立的Context配置文件:

# 创建example1的context配置
cat > /opt/tomcat/conf/Catalina/example1.com/ROOT.xml << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="/var/www/example1.com/public_html"
         reloadable="true"
         crossContext="true">

    <!-- 资源链接配置 -->
    <Resources className="org.apache.catalina.webresources.StandardRoot">
        <PreResources className="org.apache.catalina.webresources.DirResourceSet"
                      base="/var/www/example1.com/shared-lib"
                      webAppMount="/WEB-INF/lib" />
    </Resources>

    <!-- 环境变量 -->
    <Environment name="app_name" value="Example1 Application"
                 type="java.lang.String" override="false"/>

</Context>
EOF

# 创建example2的context配置
cat > /opt/tomcat/conf/Catalina/example2.com/ROOT.xml << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="/var/www/example2.com/public_html"
         reloadable="true">

    <!-- Session配置 -->
    <Manager className="org.apache.catalina.session.PersistentManager"
             saveOnRestart="true"
             maxActiveSessions="1000">
        <Store className="org.apache.catalina.session.FileStore"
               directory="/var/www/example2.com/sessions" />
    </Manager>

</Context>
EOF

三、优化配置

3.1 配置虚拟主机管理器(可选)

编辑 /opt/tomcat/conf/tomcat-users.xml

<?xml version="1.0" encoding="UTF-8"?>
<tomcat-users>
    <!-- 添加管理员用户 -->
    <role rolename="manager-gui"/>
    <role rolename="manager-script"/>
    <role rolename="admin-gui"/>
    <user username="admin" password="your_secure_password" 
          roles="manager-gui,manager-script,admin-gui"/>
</tomcat-users>

3.2 配置访问控制

编辑 /opt/tomcat/webapps/manager/META-INF/context.xml,修改远程访问限制:

<Context antiResourceLocking="false" privileged="true" >
    <!-- 修改Valve配置,允许特定IP -->
    <Valve className="org.apache.catalina.valves.RemoteAddrValve"
           allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|192\.168\.\d+\.\d+" />
</Context>

四、测试配置

4.1 修改本地hosts文件(测试用)

# 在测试客户端机器上修改hosts
echo "192.168.1.100 example1.com www.example1.com" >> /etc/hosts
echo "192.168.1.100 example2.com www.example2.com" >> /etc/hosts

4.2 启动Tomcat

# 启动服务
/opt/tomcat/bin/startup.sh

# 查看日志
tail -f /opt/tomcat/logs/catalina.out

4.3 测试访问

# 使用curl测试
curl http://example1.com:8080/
curl http://example2.com:8080/

# 或者直接在浏览器访问
# http://example1.com:8080
# http://example2.com:8080

五、高级配置

5.1 配置SSL/TLS(HTTPS)

# 生成自签名证书(生产环境请使用正规CA证书)
keytool -genkey -alias tomcat -keyalg RSA -keystore /opt/tomcat/conf/keystore.jks -validity 365 -keysize 2048

# 修改server.xml添加HTTPS连接器
cat >> /opt/tomcat/conf/server.xml << 'EOF'
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
           maxThreads="150" SSLEnabled="true">
    <SSLHostConfig>
        <Certificate certificateKeystoreFile="conf/keystore.jks"
                     certificateKeystorePassword="changeit"
                     type="RSA" />
    </SSLHostConfig>
</Connector>
EOF

5.2 配置连接池

在Context配置中添加:

<Context>
    <Resource name="jdbc/mydb" auth="Container"
              type="javax.sql.DataSource"
              maxTotal="100" maxIdle="30"
              maxWaitMillis="10000"
              username="dbuser" password="dbpass"
              driverClassName="com.mysql.cj.jdbc.Driver"
              url="jdbc:mysql://localhost:3306/mydb"/>
</Context>

六、创建启动脚本

创建systemd服务文件 /etc/systemd/system/tomcat.service

[Unit]
Description=Apache Tomcat Web Application Container
After=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=/opt/tomcat/bin/shutdown.sh

User=tomcat
Group=tomcat
UMask=0007
RestartSec=10
Restart=always

[Install]
WantedBy=multi-user.target

启用服务:

systemctl daemon-reload
systemctl enable tomcat
systemctl start tomcat

七、故障排查

7.1 常见问题及解决

问题1:虚拟主机无法访问

# 检查日志
tail -f /opt/tomcat/logs/catalina.out
tail -f /opt/tomcat/logs/localhost.log

# 检查端口
netstat -tlnp | grep 8080

# 检查SELinux
setenforce 0  # 临时关闭测试

问题2:权限错误

# 修复目录权限
chown -R tomcat:tomcat /var/www/
chmod -R 755 /var/www/

问题3:内存不足

# 修改内存设置
export JAVA_OPTS="-Xms512m -Xmx1024m -XX:MaxPermSize=256m"

八、最佳实践建议

分离配置:将不同站点的配置分开存放 日志管理:每个虚拟主机使用独立的日志目录 安全性
  • 定期更新Tomcat和Java
  • 移除默认应用(docs, examples等)
  • 使用强密码
  • 配置防火墙规则
监控
  • 配置访问日志
  • 监控JVM内存使用
  • 设置日志轮转

九、维护脚本示例

创建维护脚本 /usr/local/bin/tomcat-manager.sh

#!/bin/bash
TOMCAT_HOME="/opt/tomcat"
LOG_DIR="/var/log/tomcat"

case "$1" in
    start)
        $TOMCAT_HOME/bin/startup.sh
        ;;
    stop)
        $TOMCAT_HOME/bin/shutdown.sh
        ;;
    restart)
        $0 stop
        sleep 5
        $0 start
        ;;
    status)
        ps aux | grep tomcat | grep -v grep
        ;;
    clean-logs)
        find $TOMCAT_HOME/logs -name "*.log" -mtime +7 -delete
        find $TOMCAT_HOME/logs -name "*.txt" -mtime +7 -delete
        ;;
    *)
        echo "Usage: $0 {start|stop|restart|status|clean-logs}"
        exit 1
esac

总结

通过以上配置,您可以在单台CentOS服务器上运行多个Tomcat虚拟主机。每个站点都有独立的:

  • 文档根目录
  • 日志文件
  • 配置上下文
  • 资源隔离

建议在生产环境中结合Nginx/Apache作为反向代理,实现负载均衡和SSL终端。