

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 설정 레시피
<a name="create-custom-setup"></a>

**중요**  
이 AWS OpsWorks Stacks 서비스는 2024년 5월 26일에 수명이 종료되었으며 신규 및 기존 고객 모두에서 비활성화되었습니다. 가능한 한 빨리 워크로드를 다른 솔루션으로 마이그레이션하는 것이 좋습니다. 마이그레이션에 대한 질문이 있는 경우 [AWS re:Post](https://repost.aws/) 또는 [AWS Premium Support](https://aws.amazon.com/support)를 통해 AWS Support 팀에 문의하세요.

설정 레시피는 계층의 설정 [수명 주기](workingcookbook-events.md) 이벤트에 할당되고 인스턴스 부팅 후 실행됩니다. 이 레시피는 패키지 설치, 구성 파일 생성, 서비스 시작과 같은 작업을 수행합니다. Setup 레시피 실행이 완료되면 OpsWorks Stacks는 [Deploy 레시피](create-custom-deploy.md)를 실행하여 앱을 새 인스턴스에 배포합니다.

**Topics**
+ [tomcat::설정](#create-custom-setup-setup)
+ [tomcat::install](#create-custom-setup-install)
+ [tomcat::service](#create-custom-setup-service)
+ [tomcat::container\$1config](#create-custom-setup-config)
+ [tomcat::apache\$1tomcat\$1bind](#create-custom-setup-bind)

## tomcat::설정
<a name="create-custom-setup-setup"></a>

`tomcat::setup` 레시피는 계층의 설정 수명 주기 이벤트에 할당됩니다.

```
include_recipe 'tomcat::install'
include_recipe 'tomcat::service'

service 'tomcat' do
  action :enable
end

# for EBS-backed instances we rely on autofs
bash '(re-)start autofs earlier' do
  user 'root'
  code <<-EOC
    service autofs restart
  EOC
  notifies :restart, resources(:service => 'tomcat')
end

include_recipe 'tomcat::container_config'
include_recipe 'apache2'
include_recipe 'tomcat::apache_tomcat_bind'
```

`tomcat::setup` 레시피는 대체로 메타 레시피입니다. Tomcat 및 관련 패키지를 설치하고 구성하는 세부 작업을 대부분 처리하는 일련의 종속 레시피가 포함됩니다. `tomcat::setup`의 첫 번째 부분은 다음 레시피를 실행합니다(각 레시피에 대해서는 나중에 설명).
+ [tomcat::install](#create-custom-setup-install) 레시피는 Tomcat 서버 패키지를 설치합니다.
+ [tomcat::service](#create-custom-setup-service) 레시피는 Tomcat 서비스를 설정합니다.

`tomcat::setup`의 중간 부분은 Tomcat 서비스를 활성화하고 시작합니다.
+ Chef [서비스 리소스](https://docs.chef.io/chef/resources.html#service)는 부팅 시 Tomcat 서비스를 활성화합니다.
+ Chef [bash 리소스](https://docs.chef.io/chef/resources.html#bash)는 Bash 스크립트를 실행하여 Amazon EBS 지원 인스턴스에 필요한 autofs 대몬(daemon)을 시작합니다. 그런 다음 이 리소스는 `service` 리소스에 Tomcat 서비스를 재시작하라고 알립니다.

  자세한 정보는 [autofs](https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Storage_Administration_Guide/s2-nfs-config-autofs.html)(Amazon Linux) 또는 [Autofs](https://help.ubuntu.com/community/Autofs)(Ubuntu)를 참조하세요.

`tomcat::setup`의 마지막 부분은 구성 파일을 생성하고 프런트 엔드 Apache 서버를 설치하고 구성합니다.
+ [tomcat::container\$1config](#create-custom-setup-config) 레시피는 구성 파일을 생성합니다.
+ `apache2` 레시피(의 약어`apache2::default`)는 Apache 서버를 설치하고 구성하는 OpsWorks Stacks 기본 제공 레시피입니다.
+ [tomcat::apache\$1tomcat\$1bind](#create-custom-setup-bind) 레시피는 Apache 서버가 Tomcat 서버의 프런트 엔드로 기능하도록 구성합니다.

**참고**  
내장 레시피를 사용하여 일부 필요한 작업을 수행하면 시간과 노력을 아낄 수 있는 경우가 자주 있습니다. 이 레시피는 처음부터 Apache를 구현하는 것이 아니라 내장 `apache2::default` 레시피를 사용하여 Apache를 설치합니다. 내장 레시피를 사용하는 방법의 또 하나의 예는 [Deploy 레시피](create-custom-deploy.md) 단원을 참조하세요.

다음 섹션에서는 Tomcat 쿡북의 설정 레시피에 대해 보다 자세히 설명합니다. `apache2` 레시피에 대한 자세한 정보는 [opsworks-cookbooks/apache2](https://github.com/aws/opsworks-cookbooks/tree/release-chef-11.4/apache2)를 참조하세요.

## tomcat::install
<a name="create-custom-setup-install"></a>

`tomcat::install `레시피는 Tomcat 서버, OpenJDK, 그리고 MySQL 서버 연결을 처리하는 Java 커넥터 라이브러리를 설치합니다.

```
tomcat_pkgs = value_for_platform(
  ['debian', 'ubuntu'] => {
    'default' => ["tomcat#{node['tomcat']['base_version']}", 'libtcnative-1', 'libmysql-java']
  },
  ['centos', 'redhat', 'fedora', 'amazon'] => {
    'default' => ["tomcat#{node['tomcat']['base_version']}", 'tomcat-native', 'mysql-connector-java']
  },
  'default' => ["tomcat#{node['tomcat']['base_version']}"]
)

tomcat_pkgs.each do |pkg|
  package pkg do
    action :install
  end
end

link ::File.join(node['tomcat']['lib_dir'], node['tomcat']['mysql_connector_jar']) do
  to ::File.join(node['tomcat']['java_dir'], node['tomcat']['mysql_connector_jar'])
  action :create
end

# remove the ROOT webapp, if it got installed by default
include_recipe 'tomcat::remove_root_webapp'
```

이 레시피가 수행하는 작업은 다음과 같습니다.

1. 인스턴스의 운영 체제에 따라 설치할 패키지의 목록을 생성합니다.

1. 목록의 각 패키지를 설치합니다.

   Chef [패키지 리소스](https://docs.chef.io/chef/resources.html#id146)는 Amazon Linux의 경우 `yum`와 Ubuntu의 경우 `apt-get`인 적절한 공급자를 사용하여 설치를 처리합니다. 패키지 공급자가 OpenJDK를 Tomcat 종속성으로 설치하지만, MySQL 커넥터 라이브러리는 명시적으로 설치되어야 합니다.

1. Chef [링크 리소스](https://docs.chef.io/chef/resources.html#link)를 사용하여 Tomcat 서버의 라이브러리 디렉터리에서 JDK 내 MySQL 커넥터 라이브러리에 대한 symlink를 생성합니다.

   기본 속성 값을 사용할 경우 Tomcat 라이브러리 디렉터리는 `/usr/share/tomcat6/lib`이고, MySQL 커넥터 라이브러리(`mysql-connector-java.jar`)는 `/usr/share/java/`에 위치합니다.

`tomcat::remove_root_webapp` 레시피는 ROOT 웹 애플리케이션(기본적으로 `/var/lib/tomcat6/webapps/ROOT`)을 제거하여 일부 보안 문제를 방지합니다.

```
ruby_block 'remove the ROOT webapp' do
  block do
    ::FileUtils.rm_rf(::File.join(node['tomcat']['webapps_base_dir'], 'ROOT'), :secure => true)
  end
  only_if { ::File.exists?(::File.join(node['tomcat']['webapps_base_dir'], 'ROOT')) && !::File.symlink?(::File.join(node['tomcat']['webapps_base_dir'], 'ROOT')) }
end
```

`only_if` 문은 파일이 존재하는 경우에만 레시피가 파일을 제거하도록 합니다.

**참고**  
Tomcat 버전은 `['tomcat']['base_version']` 속성에 의해 지정되는데, 속성 파일에서 6으로 설정되어 있습니다. Tomcat 7을 설치하려면 사용자 지정 JSON 속성을 사용하여 속성을 재정의할 수 있습니다. [스택 설정을 편집](workingstacks-edit.md)하고 다음 JSON을 [**사용자 지정 Chef JSON**] 상자에 입력하거나 기존의 사용자 지정 JSON에 추가하면 됩니다.  

```
{
  'tomcat' : {
    'base_version' : 7
  }
}
```
사용자 지정 JSON 속성은 기본 속성을 재정의하고 Tomcat 버전을 7로 설정합니다. 속성 재정의에 대한 자세한 정보는 [속성 재정의](workingcookbook-attributes.md) 단원을 참조하세요.

## tomcat::service
<a name="create-custom-setup-service"></a>

`tomcat::service` 레시피는 Tomcat 서비스 정의를 생성합니다.

```
service 'tomcat' do
  service_name "tomcat#{node['tomcat']['base_version']}"

  case node[:platform]
  when 'centos', 'redhat', 'fedora', 'amazon'
    supports :restart => true, :reload => true, :status => true
  when 'debian', 'ubuntu'
    supports :restart => true, :reload => false, :status => true
  end

  action :nothing
end
```

이 레시피는 Chef [서비스 리소스](https://docs.chef.io/chef/resources.html#service)를 사용하여 Tomcat 서비스 이름(기본적으로 tomcat6)을 지정하고 `supports` 속성을 설정하여 Chef가 운영 체제별로 서비스의 restart, reload 및 status 명령을 관리하는 방법을 정의합니다.
+ `true`는 Chef가 init 스크립트 또는 그 밖의 서비스 공급자를 사용하여 명령을 실행할 수 있음을 나타냅니다.
+ `false`는 Chef가 다른 수단을 사용하여 명령을 실행하려 시도해야 함을 나타냅니다.

`action`은 `:nothing`로 설정됩니다. 각 수명 주기 이벤트에 대해 OpsWorks Stacks는 [Chef 실행](https://docs.chef.io/chef_client_overview.html#the-chef-client-run)을 시작하여 적절한 레시피 세트를 실행합니다. Tomcat 쿡북은 레시피가 서비스 정의를 생성하지만 서비스를 재시작하지는 않는 일반 패턴을 따릅니다. Chef 실행의 다른 레시피가 일반적으로 구성 파일을 생성하는 데 사용된 `notifies` 리소스에 `template` 명령을 포함시켜 재시작을 처리합니다. 알림은 서비스를 재시작하는 편리한 방법입니다. 구성이 변경된 경우에만 서비스를 재시작하기 때문입니다. 또한 Chef 실행에 특정 서비스에 대한 재시작 알림이 여러 개일 경우 Chef는 서비스를 한 번만 재시작합니다. 이 방법은 완전히 작동하지 않는 서비스를 재시작하려고 시도할 때 발생할 수 있는 문제를 방지하기 위한 것으로, 이 문제는 Tomcat 오류의 일반적인 원인입니다.

 Tomcat 서비스는 재시작 알림을 사용하는 모든 Chef 실행에 대해 정의되어야 합니다. `tomcat::service`는 여러 레시피에 포함되어 서비스가 모든 Chef 실행에 대해 정의되도록 합니다. Chef 실행에 `tomcat::service` 인스턴스가 여러 번 포함되더라도 Chef는 포함 횟수와 상관없이 Chef 실행당 한 번만 레시피를 실행하므로 페널티는 없습니다.

## tomcat::container\$1config
<a name="create-custom-setup-config"></a>

`tomcat::container_config` 레시피는 쿡북 템플릿 파일에서 구성 파일을 생성합니다.

```
include_recipe 'tomcat::service'

template 'tomcat environment configuration' do
  path ::File.join(node['tomcat']['system_env_dir'], "tomcat#{node['tomcat']['base_version']}")
  source 'tomcat_env_config.erb'
  owner 'root'
  group 'root'
  mode 0644
  backup false
  notifies :restart, resources(:service => 'tomcat')
end

template 'tomcat server configuration' do
  path ::File.join(node['tomcat']['catalina_base_dir'], 'server.xml')
  source 'server.xml.erb'
  owner 'root'
  group 'root'
  mode 0644
  backup false
  notifies :restart, resources(:service => 'tomcat')
end
```

이 레시피는 먼저 `tomcat::service`를 호출합니다. 필요할 경우 이 레시피가 서비스를 정의합니다. 레시피의 대부분은 2개의 [템플릿 리소스](https://docs.chef.io/chef/resources.html#template)로 구성되는데, 각각 쿡북의 템플릿 파일 중 하나에서 구성 파일을 생성하고, 파일 속성을 설정하고, Chef에 서비스를 재시작하라고 알립니다.

### Tomcat 환경 구성 파일
<a name="create-custom-setup-config-env"></a>

첫 번째 `template` 리소스는 `tomcat_env_config.erb` 템플릿 파일을 사용하여 Tomcat 환경 구성 파일을 생성합니다. 이 파일은 `JAVA_HOME`과 같은 환경 변수를 설정하는 데 사용됩니다. 기본 파일 이름은 `template` 리소스의 인수입니다. `tomcat::container_config`는 `path` 속성을 사용하여 기본값을 재정의하고 구성 파일을 `/etc/sysconfig/tomcat6`(Amazon Linux) 또는 `/etc/default/tomcat6` (Ubuntu)로 명명합니다. 또한 `template` 리소스는 파일의 소유자, 그룹 및 모드 설정을 지정하고 Chef에게 백업 파일을 생성하지 않도록 지시합니다.

소스 코드를 보면 실제로 세 버전의 `tomcat_env_config.erb`가 각각 `templates` 디렉터리의 서로 다른 하위 디렉터리에 위치합니다. `ubuntu` 및 `amazon` 디렉터리에는 해당 운영 체제용 템플릿이 들어 있습니다. `default` 폴더에는 명령줄 하나로 구성된 더미 템플릿이 들어 있습니다. 이 템플릿은 지원되지 않는 운영 체제를 사용하는 인스턴스에서 이 레시피를 실행하려고 시도할 경우에만 사용됩니다. `tomcat::container_config` 레시피는 사용할 `tomcat_env_config.erb`를 지정할 필요가 없습니다. Chef가 [File Specificity](http://docs.chef.io/templates.html#file-specificity)에 기술된 규칙에 따라 인스턴스의 운영 체제에 적합한 디렉터리를 선택합니다.

이 예제의 `tomcat_env_config.erb` 파일은 대부분 주석으로 구성되어 있습니다. 추가 환경 변수를 설정하려면 해당 줄의 주석 처리를 해제하고 원하는 값을 제공하면 됩니다.

**참고**  
변경될 수 있는 구성 설정은 템플릿에서 하드코딩하는 것보다는 속성으로 정의해야 합니다. 그러면 설정을 변경하기 위해 템플릿을 재작성할 필요 없이 속성을 재정의하기만 하면 됩니다.

Amazon Linux 템플릿은 다음 코드에 나와 있듯이 하나의 환경 변수만 설정합니다.

```
...
# Use JAVA_OPTS to set java.library.path for libtcnative.so
#JAVA_OPTS="-Djava.library.path=/usr/lib"

JAVA_OPTS="${JAVA_OPTS} <%= node['tomcat']['java_opts'] %>"

# What user should run tomcat
#TOMCAT_USER="tomcat"
...
```

JAVA\$1OPTS를 사용하여 라이브러리 경로와 같은 Java 옵션을 지정할 수 있습니다. 기본 속성 값을 사용할 경우 템플릿은 Amazon Linux에 대해 어떤 Java 옵션도 설정하지 않습니다. `['tomcat']['java_opts']` 속성을 재정의하여(예를 들어 사용자 지정 JSON 속성을 사용하여) 자체 Java 옵션을 설정할 수 있습니다. 예제는 [스택 생성](create-custom-stack.md#create-custom-stack-stack) 섹션을 참조하세요.

Ubuntu 템플릿은 다음 템플릿 코드에 나와 있듯이 여러 환경 변수를 설정합니다.

```
# Run Tomcat as this user ID. Not setting this or leaving it blank will use the
# default of tomcat<%= node['tomcat']['base_version'] %>.
TOMCAT<%= node['tomcat']['base_version'] %>_USER=tomcat<%= node['tomcat']['base_version'] %>
...
# Run Tomcat as this group ID. Not setting this or leaving it blank will use
# the default of tomcat<%= node['tomcat']['base_version'] %>.
TOMCAT<%= node['tomcat']['base_version'] %>_GROUP=tomcat<%= node['tomcat']['base_version'] %>
...
JAVA_OPTS="<%= node['tomcat']['java_opts'] %>"

<% if node['tomcat']['base_version'].to_i < 7 -%>
# Unset LC_ALL to prevent user environment executing the init script from
# influencing servlet behavior.  See Debian bug #645221
unset LC_ALL
<% end -%>
```

기본 속성 값을 사용하면 템플릿은 다음과 같이 Ubuntu 환경 변수를 설정합니다.
+ `TOMCAT6_USER` 및 `TOMCAT6_GROUP`(Tomcat 사용자 및 그룹을 표시)이 모두 `tomcat6`으로 설정됩니다.

  ['tomcat']['base\$1version']을 `tomcat7`로 설정할 경우 변수 이름이 `TOMCAT7_USER` 및 `TOMCAT7_GROUP`로 확인되고, 모두 `tomcat7`로 설정됩니다.
+ `JAVA_OPTS`가 `-Djava.awt.headless=true -Xmx128m -XX:+UseConcMarkSweepGC`로 설정됩니다.
  + `-Djava.awt.headless`를 `true`로 설정하면 그래픽 엔진에게 인스턴스가 헤드리스이고 콘솔이 없음을 알려줍니다. 이는 일부 그래픽 애플리케이션의 동작 오류를 해결합니다.
  + `-Xmx128m`은 JVM이 적절한 메모리 리소스를 사용하도록 지정합니다(이 예제에서는 128MB).
  + `-XX:+UseConcMarkSweepGC`는 동시 마크 스윕 가비지 수집을 지정합니다. 이는 가비지 수집으로 유발되는 일시 중지를 제한하는 데 도움이 됩니다.

    자세한 정보는 [Concurrent Mark Sweep Collector Enhancements](http://docs.oracle.com/javase/6/docs/technotes/guides/vm/cms-6.html)를 참조하세요.
+ Tomcat 버전이 7 미만일 경우 템플릿이 `LC_ALL`을 설정 해제합니다. 이는 Ubuntu 버그를 해결합니다.

**참고**  
기본 속성을 사용할 경우 이러한 환경 변수 중 일부가 기본값으로 설정됩니다. 하지만 명시적으로 환경 변수를 속성으로 설정하면 사용자 지정 JSON 속성을 정의하여 기본 속성을 재정의하고 사용자 지정 값을 제공할 수 있습니다. 속성 재정의에 대한 자세한 정보는 [속성 재정의](workingcookbook-attributes.md) 단원을 참조하세요.

전체 템플릿 파일은 [source code](https://github.com/amazonwebservices/opsworks-example-cookbooks/tree/master/tomcat)를 참조하세요.

### Server.xml 구성 파일
<a name="create-custom-setup-config-server"></a>

두 번째 `template` 리소스는 `server.xml.erb`를 사용하여 서블릿/JSP 컨테이너를 구성하는 [`system.xml` 구성 파일](http://tomcat.apache.org/tomcat-7.0-doc/config/)을 생성합니다. `server.xml.erb`에는 운영 체제별 설정이 없으므로 `template` 디렉터리의 `default` 하위 디렉터리에 위치합니다.

템플릿은 표준 설정을 사용하지만 Tomcat 6 또는 Tomcat 7에 대해 `system.xml` 파일을 생성할 수 있습니다. 예를 들어 템플릿의 서버 섹션에서 발췌된 다음 코드는 리스너를 지정된 버전에 따라 적절하게 구성합니다.

```
<% if node['tomcat']['base_version'].to_i > 6 -%>
  <!-- Security listener. Documentation at /docs/config/listeners.html
  <Listener className="org.apache.catalina.security.SecurityListener" />
  -->
<% end -%>
  <!--APR library loader. Documentation at /docs/apr.html -->
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
  <Listener className="org.apache.catalina.core.JasperListener" />
  <!-- Prevent memory leaks due to use of particular java/javax APIs-->
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<% if node['tomcat']['base_version'].to_i < 7 -%>
  <!-- JMX Support for the Tomcat server. Documentation at /docs/non-existent.html -->
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
<% end -%>
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<% if node['tomcat']['base_version'].to_i > 6 -%>
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<% end -%>
```

템플릿은 하드코딩된 설정 대신 속성을 사용합니다. 따라서 사용자 지정 JSON 속성을 정의하여 간편하게 설정을 변경할 수 있습니다. 예제:

```
<Connector port="<%= node['tomcat']['port'] %>" protocol="HTTP/1.1"
           connectionTimeout="20000"
           URIEncoding="<%= node['tomcat']['uri_encoding'] %>"
           redirectPort="<%= node['tomcat']['secure_port'] %>" />
```

자세한 정보는 [source code](https://github.com/amazonwebservices/opsworks-example-cookbooks/tree/master/tomcat)를 참조하세요.

## tomcat::apache\$1tomcat\$1bind
<a name="create-custom-setup-bind"></a>

`tomcat::apache_tomcat_bind` 레시피는 Apache 서버가 Tomcat의 프런트 엔드로 동작하여 수신 요청을 수신하고, 요청을 Tomcat으로 전달하고, 응답을 클라이언트로 반환하도록 설정합니다. 이 예제에서는 [mod\$1proxy](https://httpd.apache.org/docs/2.2/mod/mod_proxy.html)를 Apache 프록시/게이트웨이로 사용합니다.

```
execute 'enable mod_proxy for apache-tomcat binding' do
  command '/usr/sbin/a2enmod proxy'
  not_if do
    ::File.symlink?(::File.join(node['apache']['dir'], 'mods-enabled', 'proxy.load')) || node['tomcat']['apache_tomcat_bind_mod'] !~ /\Aproxy/
  end
end

execute 'enable module for apache-tomcat binding' do
  command "/usr/sbin/a2enmod #{node['tomcat']['apache_tomcat_bind_mod']}"
  not_if {::File.symlink?(::File.join(node['apache']['dir'], 'mods-enabled', "#{node['tomcat']['apache_tomcat_bind_mod']}.load"))}
end

include_recipe 'apache2::service'

template 'tomcat thru apache binding' do
  path ::File.join(node['apache']['dir'], 'conf.d', node['tomcat']['apache_tomcat_bind_config'])
  source 'apache_tomcat_bind.conf.erb'
  owner 'root'
  group 'root'
  mode 0644
  backup false
  notifies :restart, resources(:service => 'apache2')
end
```

`mod_proxy`를 활성화하려면 `proxy` 모듈과 프로토콜 기반 모듈을 활성화해야 합니다. 프로토콜 모듈에는 두 가지 옵션을 사용할 수 있습니다.
+ HTTP: `proxy_http`
+ [Apache JServ Protocol](http://tomcat.apache.org/connectors-doc/ajp/ajpv13a.html)(AJP): `proxy_ajp`

  AJP는 내부 Tomcat 프로토콜입니다.

레시피의 두 [실행 리소스](https://docs.chef.io/chef/resources.html#execute)가 모두 `a2enmod` 명령을 실행합니다. 따라서 필요한 symlink를 생성하여 지정된 모듈을 활성화할 수 있습니다.
+ 첫 번째 `execute` 리소스는 `proxy` 모듈을 활성화합니다.
+ 두 번째 `execute` 리소스는 프로토콜 모듈을 활성화합니다. 이 모듈은 기본적으로 `proxy_http`로 설정됩니다.

  AJP를 사용할 경우 사용자 지정 JSON을 정의하여 `apache_tomcat_bind_mod` 속성을 재정의하고 `proxy_ajp`로 설정할 수 있습니다.

`apache2::service` 레시피는 Apache 서비스를 정의하는 OpsWorks Stacks 기본 제공 레시피입니다. 자세한 내용은 OpsWorks Stacks GitHub 리포지토리의 [레시피](https://github.com/aws/opsworks-cookbooks/blob/release-chef-11.4/apache2/recipes/service.rb)를 참조하세요.

`template` 리소스는 `apache_tomcat_bind.conf.erb`를 사용하여 구성 파일을 생성하며, 이 파일의 기본 이름은 `tomcat_bind.conf`입니다. 그리고 리소스는 이 구성 파일을 `['apache']['dir']/.conf.d` 디렉터리에 저장합니다. `['apache']['dir']` 속성은 내장된 `apache2` 속성 파일에 정의되어 있으며, 기본적으로 `/etc/httpd`(Amazon Linux) 또는 `/etc/apache2`(Ubuntu)로 설정됩니다. `template` 리소스가 구성 파일을 생성하거나 변경할 경우 `notifies` 명령이 Apache 서비스 재시작을 예약합니다.

```
<% if node['tomcat']['apache_tomcat_bind_mod'] == 'proxy_ajp' -%>
ProxyPass <%= node['tomcat']['apache_tomcat_bind_path'] %> ajp://localhost:<%= node['tomcat']['ajp_port'] %>/
ProxyPassReverse <%= node['tomcat']['apache_tomcat_bind_path'] %> ajp://localhost:<%= node['tomcat']['ajp_port'] %>/
<% else %>
ProxyPass <%= node['tomcat']['apache_tomcat_bind_path'] %> http://localhost:<%= node['tomcat']['port'] %>/
ProxyPassReverse <%= node['tomcat']['apache_tomcat_bind_path'] %> http://localhost:<%= node['tomcat']['port'] %>/
<% end -%>
```

템플릿은 [ProxyPass](https://httpd.apache.org/docs/2.0/mod/mod_proxy.html#proxypass) 및 [ProxyPassReverse](https://httpd.apache.org/docs/2.0/mod/mod_proxy.html#proxypassreverse) 명령을 사용하여 Apache와 Tomcat 간에 트래픽을 전달하는 데 사용되는 포트를 구성합니다. 두 서버는 동일한 인스턴스에서 실행되므로 localhost URL을 사용할 수 있으며 모두 기본적으로 `http://localhost:8080`으로 설정됩니다.