기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
설정 레시피
중요
이 AWS OpsWorks Stacks 서비스는 2024년 5월 26일에 만료되었으며 신규 및 기존 고객 모두에 대해 비활성화되었습니다. 가능한 한 빨리 워크로드를 다른 솔루션으로 마이그레이션하는 것이 좋습니다. 마이그레이션에 대한 질문이 있는 경우 AWS re:Post
설정 레시피는 계층의 설정 수명 주기 이벤트에 할당되고 인스턴스 부팅 후 실행됩니다. 이 레시피는 패키지 설치, 구성 파일 생성, 서비스 시작과 같은 작업을 수행합니다. 설정 레시피 실행이 완료되면 AWS OpsWorks Stacks는 배포 레시피를 실행하여 앱을 새 인스턴스에 배포합니다.
tomcat::설정
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 레시피는 Tomcat 서버 패키지를 설치합니다.
-
tomcat::service 레시피는 Tomcat 서비스를 설정합니다.
tomcat::setup
의 중간 부분은 Tomcat 서비스를 활성화하고 시작합니다.
tomcat::setup
의 마지막 부분은 구성 파일을 생성하고 프런트 엔드 Apache 서버를 설치하고 구성합니다.
-
tomcat::container_config 레시피는 구성 파일을 생성합니다.
-
apache2
레시피(의 약어apache2::default
)는 Apache 서버를 설치하고 구성하는 AWS OpsWorks Stacks 기본 제공 레시피입니다. -
tomcat::apache_tomcat_bind 레시피는 Apache 서버가 Tomcat 서버의 프런트 엔드로 기능하도록 구성합니다.
참고
내장 레시피를 사용하여 일부 필요한 작업을 수행하면 시간과 노력을 아낄 수 있는 경우가 자주 있습니다. 이 레시피는 처음부터 Apache를 구현하는 것이 아니라 내장 apache2::default
레시피를 사용하여 Apache를 설치합니다. 내장 레시피를 사용하는 방법의 또 하나의 예는 Deploy 레시피 단원을 참조하세요.
다음 섹션에서는 Tomcat 쿡북의 설정 레시피에 대해 보다 자세히 설명합니다. apache2
레시피에 대한 자세한 정보는 opsworks-cookbooks/apache2
tomcat::install
tomcat::install
레시피는 Tomcat 서버, Open JDK및 내SQL 서버에 대한 연결을 처리하는 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'
이 레시피가 수행하는 작업은 다음과 같습니다.
-
인스턴스의 운영 체제에 따라 설치할 패키지의 목록을 생성합니다.
-
목록의 각 패키지를 설치합니다.
Chef 패키지 리소스
는 Amazon Linux의 경우 yum
와 Ubuntu의 경우apt-get
인 적절한 공급자를 사용하여 설치를 처리합니다. 패키지 공급자는 OpenJDK을 Tomcat 종속성으로 설치하지만 내SQL 커넥터 라이브러리는 명시적으로 설치해야 합니다. -
Chef 링크 리소스를
사용하여 Tomcat 서버의 lib 디렉터리에의 내SQL 커넥터 라이브러리에 대한 symlink를 생성합니다JDK. 기본 속성 값을 사용하면 Tomcat lib 디렉터리는
/usr/share/tomcat6/lib
이고 내SQL 커넥터 라이브러리(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 속성을 사용하여 속성을 재정의할 수 있습니다. 스택 설정을 편집하고 사용자 지정 Chef JSON 상자에 다음을 입력하거나 기존 사용자 지정 JSON에 추가하면 됩니다JSON.
{ 'tomcat' : { 'base_version' : 7 } }
사용자 지정 JSON 속성은 기본 속성을 재정의하고 Tomcat 버전을 7로 설정합니다. 속성 재정의에 대한 자세한 정보는 속성 재정의 단원을 참조하세요.
tomcat::service
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 서비스 리소스supports
속성을 설정하여 Chef가 운영 체제별로 서비스의 restart, reload 및 status 명령을 관리하는 방법을 정의합니다.
-
true
는 Chef가 init 스크립트 또는 그 밖의 서비스 공급자를 사용하여 명령을 실행할 수 있음을 나타냅니다. -
false
는 Chef가 다른 수단을 사용하여 명령을 실행하려 시도해야 함을 나타냅니다.
action
은 :nothing
로 설정됩니다. 각 수명 주기 이벤트에 대해 AWS OpsWorks Stacks는 Chef 실행notifies
리소스에 template
명령을 포함시켜 재시작을 처리합니다. 알림은 서비스를 재시작하는 편리한 방법입니다. 구성이 변경된 경우에만 서비스를 재시작하기 때문입니다. 또한 Chef 실행에 특정 서비스에 대한 재시작 알림이 여러 개일 경우 Chef는 서비스를 한 번만 재시작합니다. 이 방법은 완전히 작동하지 않는 서비스를 재시작하려고 시도할 때 발생할 수 있는 문제를 방지하기 위한 것으로, 이 문제는 Tomcat 오류의 일반적인 원인입니다.
Tomcat 서비스는 재시작 알림을 사용하는 모든 Chef 실행에 대해 정의되어야 합니다. tomcat::service
는 여러 레시피에 포함되어 서비스가 모든 Chef 실행에 대해 정의되도록 합니다. Chef 실행에 tomcat::service
인스턴스가 여러 번 포함되더라도 Chef는 포함 횟수와 상관없이 Chef 실행당 한 번만 레시피를 실행하므로 페널티는 없습니다.
tomcat::container_config
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개의 템플릿 리소스
Tomcat 환경 구성 파일
첫 번째 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
이 예제의 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_OPTS 라이브러리 경로와 같은 Java 옵션을 지정하는 데 사용할 수 있습니다. 기본 속성 값을 사용할 경우 템플릿은 Amazon Linux에 대해 어떤 Java 옵션도 설정하지 않습니다. 예를 들어 사용자 지정 ['tomcat']['java_opts']
속성을 사용하여 속성을 재정의하여 자체 Java 옵션을 설정할 수 JSON 있습니다. 예시는 스택 생성에서 확인하십시오.
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_version']을
tomcat7
로 설정할 경우 변수 이름이TOMCAT7_USER
및TOMCAT7_GROUP
로 확인되고, 모두tomcat7
로 설정됩니다. -
JAVA_OPTS
가-Djava.awt.headless=true -Xmx128m -XX:+UseConcMarkSweepGC
로 설정됩니다.-
-Djava.awt.headless
를true
로 설정하면 그래픽 엔진에게 인스턴스가 헤드리스이고 콘솔이 없음을 알려줍니다. 이는 일부 그래픽 애플리케이션의 동작 오류를 해결합니다. -
-Xmx128m
이 예제에서는에 128MB의 적절한 메모리 리소스JVM가 있는지 확인합니다. -
-XX:+UseConcMarkSweepGC
는 동시 마크 스윕 가비지 수집을 지정합니다. 이는 가비지 수집으로 유발되는 일시 중지를 제한하는 데 도움이 됩니다.자세한 정보는 Concurrent Mark Sweep Collector Enhancements
를 참조하세요.
-
-
Tomcat 버전이 7 미만일 경우 템플릿이
LC_ALL
을 설정 해제합니다. 이는 Ubuntu 버그를 해결합니다.
참고
기본 속성을 사용할 경우 이러한 환경 변수 중 일부가 기본값으로 설정됩니다. 그러나 환경 변수를 속성으로 명시적으로 설정하면 사용자 지정 JSON 속성을 정의하여 기본 속성을 재정의하고 사용자 지정 값을 제공할 수 있습니다. 속성 재정의에 대한 자세한 정보는 속성 재정의 단원을 참조하세요.
전체 템플릿 파일은 source code
Server.xml 구성 파일
두 번째 template
리소스는 server.xml.erb
를 사용하여 서블릿/JSP 컨테이너를 구성하는 system.xml
구성 파일을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
tomcat::apache_tomcat_bind
tomcat::apache_tomcat_bind
레시피는 Apache 서버가 Tomcat의 프런트 엔드로 동작하여 수신 요청을 수신하고, 요청을 Tomcat으로 전달하고, 응답을 클라이언트로 반환하도록 설정합니다. 이 예제에서는 mod_proxy
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 프로토콜
(AJP): proxy_ajp
AJP는 내부 Tomcat 프로토콜입니다.
레시피의 두 실행 리소스a2enmod
명령을 실행합니다. 따라서 필요한 symlink를 생성하여 지정된 모듈을 활성화할 수 있습니다.
-
첫 번째
execute
리소스는proxy
모듈을 활성화합니다. -
두 번째
execute
리소스는 프로토콜 모듈을 활성화합니다. 이 모듈은 기본적으로proxy_http
로 설정됩니다.를 사용하려는 경우
apache_tomcat_bind_mod
속성을 재정의하고 로 설정JSON하도록 사용자 지정을 정의할 AJP수 있습니다proxy_ajp
.
apache2::service
레시피는 Apache 서비스를 정의하는 AWS OpsWorks Stacks 기본 제공 레시피입니다. 자세한 내용은 AWS OpsWorks Stacks GitHub 리포지토리의 레시피
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 -%>
템플릿은 ProxyPasshttp://localhost:8080
.