

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Membuat Layer Server Tomcat Kustom
<a name="create-custom"></a>

**penting**  
 AWS OpsWorks Stacks Layanan ini mencapai akhir masa pakai pada 26 Mei 2024 dan telah dinonaktifkan untuk pelanggan baru dan yang sudah ada. Kami sangat menyarankan pelanggan untuk memindahkan beban kerja mereka ke solusi lain sesegera mungkin. Jika Anda memiliki pertanyaan tentang migrasi, hubungi AWS Dukungan Tim di [AWS re:Post](https://repost.aws/) atau melalui [AWS Dukungan](https://aws.amazon.com/support) Premium.

**catatan**  
Topik ini menjelaskan cara menerapkan lapisan khusus untuk tumpukan Linux. Namun, prinsip dasar dan beberapa kode juga dapat disesuaikan untuk mengimplementasikan lapisan khusus untuk tumpukan Windows, terutama yang ada di bagian penerapan aplikasi.

Cara termudah untuk menggunakan paket non-standar pada instance OpsWorks Stacks adalah dengan [memperluas lapisan yang](workingcookbook-extend-package.md) ada. Namun, pendekatan ini menginstal dan menjalankan paket standar dan tidak standar pada instance lapisan, yang tidak selalu diinginkan. Pendekatan yang agak lebih menuntut tetapi lebih kuat adalah mengimplementasikan lapisan khusus, yang memberi Anda kendali hampir penuh atas instance lapisan, termasuk yang berikut ini: 
+ Paket mana yang diinstal
+ Bagaimana setiap paket dikonfigurasi
+ Cara menyebarkan aplikasi dari repositori ke instance

Baik menggunakan konsol atau API, Anda membuat dan mengelola lapisan khusus seperti lapisan lainnya, seperti yang dijelaskan dalam[Lapisan Kustom](workinglayers-custom.md). Namun, resep bawaan lapisan khusus hanya melakukan beberapa tugas yang sangat mendasar, seperti menginstal klien Ganglia untuk melaporkan metrik ke master Ganglia. Untuk membuat instance lapisan kustom lebih dari fungsional minimal, Anda harus menerapkan satu atau lebih buku masak khusus dengan resep Chef dan file terkait untuk menangani tugas menginstal dan mengonfigurasi paket, menerapkan aplikasi, dan sebagainya. Anda tidak perlu mengimplementasikan semuanya dari awal. Misalnya, jika Anda menyimpan aplikasi di salah satu repositori standar, Anda dapat menggunakan resep penerapan bawaan untuk menangani banyak pekerjaan menginstal aplikasi pada instance lapisan.

**catatan**  
Jika Anda baru mengenal Chef, Anda harus membaca terlebih dahulu[Buku masak 101](cookbooks-101.md), yang merupakan tutorial yang memperkenalkan dasar-dasar bagaimana menerapkan buku masak untuk melakukan berbagai tugas umum. 

Panduan berikut menjelaskan cara menerapkan lapisan khusus yang mendukung server aplikasi Tomcat. Lapisan ini didasarkan pada buku masak khusus bernama Tomcat, yang mencakup resep untuk menangani instalasi paket, penyebaran, dan sebagainya. Panduan ini mencakup kutipan dari buku masak Tomcat. Anda dapat mengunduh buku masak lengkap dari [GitHub repositorinya](https://github.com/amazonwebservices/opsworks-example-cookbooks/tree/master/tomcat). Jika Anda tidak terbiasa dengan [Opscode Chef](http://www.opscode.com/chef/), Anda harus membaca terlebih dahulu. [Buku Masak dan Resep](workingcookbook.md)

**catatan**  
OpsWorks Stacks menyertakan [lapisan Java App Server berfitur lengkap untuk penggunaan](layers-java.md) produksi. Tujuan dari buku masak Tomcat adalah untuk menunjukkan bagaimana menerapkan lapisan khusus, sehingga hanya mendukung versi terbatas Tomcat yang tidak menyertakan fitur seperti SSL. Untuk contoh implementasi berfitur lengkap, lihat buku masak [opsworks\$1java](https://github.com/aws/opsworks-cookbooks/tree/release-chef-11.10/opsworks_java) bawaan.

Buku masak Tomcat mendukung lapisan khusus yang instancenya memiliki karakteristik sebagai berikut:
+ Mereka mendukung server aplikasi Tomcat Java dengan front end Apache.
+ Tomcat dikonfigurasi untuk memungkinkan aplikasi menggunakan `DataSource` objek JDBC untuk terhubung ke instance MySQL terpisah, yang berfungsi sebagai penyimpanan data back end.

Buku masak untuk proyek ini melibatkan beberapa komponen utama:
+ [File atribut](create-custom-attributes.md) berisi pengaturan konfigurasi yang digunakan oleh berbagai resep.
+ [Resep penyiapan](create-custom-setup.md) ditetapkan ke acara [siklus hidup](workingcookbook-events.md) Pengaturan lapisan. Mereka berjalan setelah sebuah instance telah boot dan melakukan tugas-tugas seperti menginstal paket dan membuat file konfigurasi.
+ [Konfigurasi resep](create-custom-configure.md) ditetapkan ke acara Configure lifecycle layer. Mereka berjalan setelah perubahan konfigurasi tumpukan — terutama ketika instance online atau offline — dan menangani perubahan konfigurasi yang diperlukan.
+ [Resep deploy](create-custom-deploy.md) ditetapkan ke acara siklus hidup Deploy layer. Mereka berjalan setelah resep Pengaturan dan saat Anda menerapkan aplikasi secara manual untuk menginstal kode dan file terkait pada instance lapisan dan menangani tugas terkait, seperti memulai ulang layanan.

Bagian terakhir[Buat Stack dan Jalankan Aplikasi](create-custom-stack.md), menjelaskan cara membuat tumpukan yang mencakup lapisan khusus berdasarkan buku masak Tomcat dan cara menyebarkan dan menjalankan aplikasi JSP sederhana yang menampilkan data dari database MySQL yang berjalan pada instance milik lapisan MySQL yang terpisah.

**catatan**  
Resep buku masak Tomcat bergantung pada beberapa resep bawaan OpsWorks Stacks. *Untuk memperjelas asal setiap resep, topik ini mengidentifikasi resep menggunakan *buku masak Chef:: konvensi recipename*.*

**Topics**
+ [Berkas Atribut](create-custom-attributes.md)
+ [Resep Pengaturan](create-custom-setup.md)
+ [Konfigurasikan Resep](create-custom-configure.md)
+ [Menyebarkan Resep](create-custom-deploy.md)
+ [Buat Stack dan Jalankan Aplikasi](create-custom-stack.md)

# Berkas Atribut
<a name="create-custom-attributes"></a>

**penting**  
 AWS OpsWorks Stacks Layanan ini mencapai akhir masa pakai pada 26 Mei 2024 dan telah dinonaktifkan untuk pelanggan baru dan yang sudah ada. Kami sangat menyarankan pelanggan untuk memindahkan beban kerja mereka ke solusi lain sesegera mungkin. Jika Anda memiliki pertanyaan tentang migrasi, hubungi AWS Dukungan Tim di [AWS re:Post](https://repost.aws/) atau melalui [AWS Dukungan](https://aws.amazon.com/support) Premium.

Sebelum melihat resep, penting untuk terlebih dahulu memeriksa file atribut buku masak Tomcat, yang berisi berbagai pengaturan konfigurasi yang digunakan resep. Atribut tidak diperlukan; Anda cukup hardcode nilai-nilai ini dalam resep atau template Anda. Namun, jika Anda menentukan pengaturan konfigurasi menggunakan atribut, Anda dapat menggunakan konsol OpsWorks Stacks atau API untuk memodifikasi nilai dengan mendefinisikan atribut JSON kustom, yang lebih sederhana dan lebih fleksibel daripada menulis ulang resep atau kode template setiap kali Anda ingin mengubah pengaturan. Pendekatan ini memungkinkan Anda, misalnya, untuk menggunakan buku masak yang sama untuk beberapa tumpukan, tetapi mengkonfigurasi server Tomcat secara berbeda untuk setiap tumpukan. Untuk informasi selengkapnya tentang atribut dan cara menggantinya, lihat[Mengesampingkan Atribut](workingcookbook-attributes.md).

Contoh berikut menunjukkan file atribut lengkap,`default.rb`, yang terletak di direktori buku masak Tomcat. `attributes`

```
default['tomcat']['base_version'] = 6
default['tomcat']['port'] = 8080
default['tomcat']['secure_port'] = 8443
default['tomcat']['ajp_port'] = 8009
default['tomcat']['shutdown_port'] = 8005
default['tomcat']['uri_encoding'] = 'UTF-8'
default['tomcat']['unpack_wars'] = true
default['tomcat']['auto_deploy'] = true
case node[:platform]
when 'centos', 'redhat', 'fedora', 'amazon'
  default['tomcat']['java_opts'] = ''
when 'debian', 'ubuntu'
  default['tomcat']['java_opts'] = '-Djava.awt.headless=true -Xmx128m -XX:+UseConcMarkSweepGC'
end
default['tomcat']['catalina_base_dir'] = "/etc/tomcat#{node['tomcat']['base_version']}"
default['tomcat']['webapps_base_dir'] = "/var/lib/tomcat#{node['tomcat']['base_version']}/webapps"
default['tomcat']['lib_dir'] = "/usr/share/tomcat#{node['tomcat']['base_version']}/lib"
default['tomcat']['java_dir'] = '/usr/share/java'
default['tomcat']['mysql_connector_jar'] = 'mysql-connector-java.jar'
default['tomcat']['apache_tomcat_bind_mod'] = 'proxy_http' # or: 'proxy_ajp'
default['tomcat']['apache_tomcat_bind_config'] = 'tomcat_bind.conf'
default['tomcat']['apache_tomcat_bind_path'] = '/tc/'
default['tomcat']['webapps_dir_entries_to_delete'] = %w(config log public tmp)
case node[:platform]
when 'centos', 'redhat', 'fedora', 'amazon'
  default['tomcat']['user'] = 'tomcat'
  default['tomcat']['group'] = 'tomcat'
  default['tomcat']['system_env_dir'] = '/etc/sysconfig'
when 'debian', 'ubuntu'
  default['tomcat']['user'] = "tomcat#{node['tomcat']['base_version']}"
  default['tomcat']['group'] = "tomcat#{node['tomcat']['base_version']}"
  default['tomcat']['system_env_dir'] = '/etc/default'
end
```

Pengaturan itu sendiri dibahas nanti di bagian terkait. Catatan berikut berlaku secara umum:
+ Semua definisi node adalah `default` tipe, sehingga Anda dapat menggantikannya dengan atribut [JSON khusus](workingcookbook-json-override.md).
+ File ini menggunakan `case` pernyataan untuk mengatur beberapa nilai atribut secara kondisional berdasarkan sistem operasi instance.

  `platform`Node dihasilkan oleh alat Ohai Chef dan mewakili sistem operasi instance. 

# Resep Pengaturan
<a name="create-custom-setup"></a>

**penting**  
 AWS OpsWorks Stacks Layanan ini mencapai akhir masa pakai pada 26 Mei 2024 dan telah dinonaktifkan untuk pelanggan baru dan yang sudah ada. Kami sangat menyarankan pelanggan untuk memindahkan beban kerja mereka ke solusi lain sesegera mungkin. Jika Anda memiliki pertanyaan tentang migrasi, hubungi AWS Dukungan Tim di [AWS re:Post](https://repost.aws/) atau melalui [AWS Dukungan](https://aws.amazon.com/support) Premium.

Resep penyiapan ditetapkan ke acara [siklus hidup](workingcookbook-events.md) Pengaturan lapisan dan dijalankan setelah instance boot. Mereka melakukan tugas-tugas seperti menginstal paket, membuat file konfigurasi, dan memulai layanan. Setelah resep Pengaturan selesai berjalan, OpsWorks Stacks menjalankan [resep Deploy](create-custom-deploy.md) untuk menerapkan aplikasi apa pun ke instance baru.

**Topics**
+ [tomcat: :pengaturan](#create-custom-setup-setup)
+ [tomcat: :instal](#create-custom-setup-install)
+ [kucing jantan: :layanan](#create-custom-setup-service)
+ [kucing jantan: :container\$1config](#create-custom-setup-config)
+ [kucing jantan: :apache\$1tomcat\$1bind](#create-custom-setup-bind)

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

`tomcat::setup`Resep ini dimaksudkan untuk ditetapkan ke acara siklus hidup Pengaturan lapisan.

```
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`resep sebagian besar merupakan metarecipe. Ini termasuk satu set resep dependen yang menangani sebagian besar rincian menginstal dan mengkonfigurasi Tomcat dan paket terkait. Bagian pertama `tomcat::setup` menjalankan resep berikut, yang dibahas nanti: 
+ [tomcat: :instal](#create-custom-setup-install)Resepnya menginstal paket server Tomcat.
+ [kucing jantan: :layanan](#create-custom-setup-service)Resepnya mengatur layanan Tomcat.

Bagian tengah `tomcat::setup` mengaktifkan dan memulai layanan Tomcat:
+ [Sumber daya layanan](https://docs.chef.io/chef/resources.html#service) Chef memungkinkan layanan Tomcat saat boot.
+ [Sumber daya Chef bash](https://docs.chef.io/chef/resources.html#bash) menjalankan skrip Bash untuk memulai daemon otomatis, yang diperlukan untuk instance yang didukung Amazon EBS. Sumber daya kemudian memberi tahu `service` sumber daya untuk memulai ulang layanan Tomcat.

  Untuk informasi selengkapnya, lihat: [autofs](https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Storage_Administration_Guide/s2-nfs-config-autofs.html) (untuk Amazon Linux) atau [Autofs](https://help.ubuntu.com/community/Autofs) (untuk Ubuntu).

Bagian terakhir dari `tomcat::setup` membuat file konfigurasi dan menginstal dan mengkonfigurasi server Apache front-end:
+ [kucing jantan: :container\$1config](#create-custom-setup-config)Resep membuat file konfigurasi.
+ `apache2`Resep (yang merupakan singkatan dari`apache2::default`) adalah resep bawaan OpsWorks Stacks yang menginstal dan mengonfigurasi server Apache.
+ [kucing jantan: :apache\$1tomcat\$1bind](#create-custom-setup-bind)Resep mengkonfigurasi server Apache untuk berfungsi sebagai front-end untuk server Tomcat.

**catatan**  
Anda sering dapat menghemat waktu dan tenaga dengan menggunakan resep bawaan untuk melakukan beberapa tugas yang diperlukan. Resep ini menggunakan `apache2::default` resep bawaan untuk menginstal Apache daripada menerapkannya dari awal. Untuk contoh lain tentang cara menggunakan resep bawaan, lihat[Menyebarkan Resep](create-custom-deploy.md).

Bagian berikut menjelaskan resep Pengaturan buku masak Tomcat secara lebih rinci. Untuk informasi lebih lanjut tentang `apache2` resep, lihat [opsworks-cookbooks/apache2](https://github.com/aws/opsworks-cookbooks/tree/release-chef-11.4/apache2).

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

`tomcat::install `Resep menginstal server Tomcat, OpenJDK, dan pustaka konektor Java yang menangani koneksi ke server MySQL.

```
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'
```

Resep melakukan tugas-tugas berikut:

1. Membuat daftar paket yang akan diinstal, tergantung pada sistem operasi instans.

1. Menginstal setiap paket dalam daftar.

   [Sumber daya paket](https://docs.chef.io/chef/resources.html#id146) Chef menggunakan penyedia yang sesuai — `yum` untuk Amazon Linux dan `apt-get` untuk Ubuntu — untuk menangani instalasi. Penyedia paket menginstal OpenJDK sebagai ketergantungan Tomcat, tetapi pustaka konektor MySQL harus diinstal secara eksplisit.

1. Menggunakan [sumber daya tautan](https://docs.chef.io/chef/resources.html#link) Chef untuk membuat symlink di direktori lib server Tomcat ke pustaka konektor MySQL di JDK.

   Menggunakan nilai atribut default, direktori lib Tomcat `/usr/share/tomcat6/lib` dan pustaka konektor MySQL () ada di. `mysql-connector-java.jar` `/usr/share/java/`

`tomcat::remove_root_webapp`Resep menghapus aplikasi web ROOT (secara `/var/lib/tomcat6/webapps/ROOT` default) untuk menghindari beberapa masalah keamanan.

```
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`Pernyataan tersebut memastikan bahwa resep menghapus file hanya jika ada.

**catatan**  
Versi Tomcat ditentukan oleh `['tomcat']['base_version']` atribut, yang diatur ke 6 dalam file atribut. Untuk menginstal Tomcat 7, Anda dapat menggunakan atribut JSON khusus untuk mengganti atribut. Cukup [edit pengaturan tumpukan Anda](workingstacks-edit.md) dan masukkan JSON berikut di kotak **Custom Chef JSON**, atau tambahkan ke JSON kustom yang ada:  

```
{
  'tomcat' : {
    'base_version' : 7
  }
}
```
Atribut JSON kustom mengganti atribut default dan menetapkan versi Tomcat ke 7. Untuk informasi selengkapnya tentang atribut utama, lihat[Mengesampingkan Atribut](workingcookbook-attributes.md).

## kucing jantan: :layanan
<a name="create-custom-setup-service"></a>

`tomcat::service`Resepnya menciptakan definisi layanan 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
```

Resep menggunakan [sumber daya layanan](https://docs.chef.io/chef/resources.html#service) Chef untuk menentukan nama layanan Tomcat (tomcat6, secara default) dan menetapkan `supports` atribut untuk menentukan bagaimana Chef mengelola perintah restart, reload, dan status layanan pada sistem operasi yang berbeda.
+ `true`menunjukkan bahwa Chef dapat menggunakan skrip init atau penyedia layanan lain untuk menjalankan perintah
+ `false`menunjukkan bahwa Chef harus mencoba menjalankan perintah dengan cara lain.

Perhatikan bahwa `action` diatur ke`:nothing`. Untuk setiap peristiwa siklus hidup, OpsWorks Stacks memulai proses [Chef untuk mengeksekusi set](https://docs.chef.io/chef_client_overview.html#the-chef-client-run) resep yang sesuai. Buku masak Tomcat mengikuti pola umum memiliki resep yang membuat definisi layanan, tetapi tidak memulai ulang layanan. Resep lain di Chef run menangani restart, biasanya dengan memasukkan `notifies` perintah dalam `template` sumber daya yang digunakan untuk membuat file konfigurasi. Pemberitahuan adalah cara mudah untuk memulai ulang layanan karena mereka melakukannya hanya jika konfigurasi telah berubah. Selain itu, jika Chef run memiliki beberapa notifikasi restart untuk suatu layanan, Chef memulai ulang layanan paling banyak sekali. Praktik ini menghindari masalah yang dapat terjadi ketika mencoba memulai kembali layanan yang tidak sepenuhnya beroperasi, yang merupakan sumber umum kesalahan Tomcat.

 Layanan Tomcat harus ditentukan untuk setiap Chef run yang menggunakan notifikasi restart. `tomcat::service`Oleh karena itu termasuk dalam beberapa resep, untuk memastikan bahwa layanan ditentukan untuk setiap Chef menjalankan. Tidak ada penalti jika Chef run menyertakan beberapa contoh `tomcat::service` karena Chef memastikan bahwa resep dijalankan hanya sekali per run, terlepas dari berapa kali itu disertakan.

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

`tomcat::container_config`Resep membuat file konfigurasi dari file template buku masak.

```
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
```

Resep panggilan pertama`tomcat::service`, yang mendefinisikan layanan jika perlu. Sebagian besar resep terdiri dari dua [sumber template](https://docs.chef.io/chef/resources.html#template), yang masing-masing membuat file konfigurasi dari salah satu file template buku masak, menetapkan properti file, dan memberi tahu Chef untuk memulai ulang layanan.

### File Konfigurasi Lingkungan Tomcat
<a name="create-custom-setup-config-env"></a>

`template`Sumber daya pertama menggunakan file `tomcat_env_config.erb` template untuk membuat file konfigurasi lingkungan Tomcat, yang digunakan untuk mengatur variabel lingkungan seperti`JAVA_HOME`. Nama file default adalah argumen `template` sumber daya. `tomcat::container_config`menggunakan `path` atribut untuk mengganti nilai default dan memberi nama file konfigurasi `/etc/sysconfig/tomcat6` (Amazon Linux) atau `/etc/default/tomcat6` (Ubuntu). `template`Sumber daya juga menentukan pemilik file, grup, dan pengaturan mode dan mengarahkan Chef untuk tidak membuat file cadangan.

Jika Anda melihat kode sumber, sebenarnya ada tiga versi`tomcat_env_config.erb`, masing-masing dalam subdirektori yang berbeda dari `templates` direktori. `amazon`Direktori `ubuntu` dan berisi template untuk sistem operasi masing-masing. `default`Folder berisi template dummy dengan satu baris komentar, yang hanya digunakan jika Anda mencoba menjalankan resep ini pada instance dengan sistem operasi yang tidak didukung. `tomcat::container_config`Resepnya tidak perlu menentukan mana yang `tomcat_env_config.erb` akan digunakan. Chef secara otomatis memilih direktori yang sesuai untuk sistem operasi instans berdasarkan aturan yang dijelaskan dalam [Kekhususan File](http://docs.chef.io/templates.html#file-specificity).

`tomcat_env_config.erb`File untuk contoh ini sebagian besar terdiri dari komentar. Untuk mengatur variabel lingkungan tambahan, hapus komentar pada baris yang sesuai dan berikan nilai pilihan Anda.

**catatan**  
Pengaturan konfigurasi apa pun yang mungkin berubah harus didefinisikan sebagai atribut daripada di-hardcode dalam template. Dengan begitu, Anda tidak perlu menulis ulang template untuk mengubah pengaturan, Anda cukup mengganti atribut.

Template Amazon Linux hanya menetapkan satu variabel lingkungan, seperti yang ditunjukkan dalam kutipan berikut.

```
...
# 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 dapat digunakan untuk menentukan opsi Java seperti jalur perpustakaan. Menggunakan nilai atribut default, template tidak menetapkan opsi Java untuk Amazon Linux. Anda dapat mengatur opsi Java Anda sendiri dengan mengganti `['tomcat']['java_opts']` atribut, misalnya, dengan menggunakan atribut JSON kustom. Sebagai contoh, lihat [Membuat Tumpukan](create-custom-stack.md#create-custom-stack-stack).

Template Ubuntu menetapkan beberapa variabel lingkungan, seperti yang ditunjukkan dalam kutipan template berikut.

```
# 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 -%>
```

Menggunakan nilai atribut default, template menetapkan variabel lingkungan Ubuntu sebagai berikut:
+ `TOMCAT6_USER`dan`TOMCAT6_GROUP`, yang mewakili pengguna dan grup Tomcat, keduanya disetel ke`tomcat6`.

  Jika Anda menyetel ['tomcat'] ['base\$1version'] ke`tomcat7`, nama variabel diselesaikan ke `TOMCAT7_USER` dan`TOMCAT7_GROUP`, dan keduanya disetel ke. `tomcat7`
+ `JAVA_OPTS`diatur ke`-Djava.awt.headless=true -Xmx128m -XX:+UseConcMarkSweepGC`:
  + Pengaturan `-Djava.awt.headless` untuk `true` menginformasikan mesin grafis bahwa instance tanpa kepala dan tidak memiliki konsol, yang membahas perilaku yang salah dari aplikasi grafis tertentu.
  + `-Xmx128m`memastikan bahwa JVM memiliki sumber daya memori yang memadai, 128MB untuk contoh ini.
  + `-XX:+UseConcMarkSweepGC`menentukan pengumpulan sampah sapuan tanda bersamaan, yang membantu membatasi jeda yang disebabkan oleh pengumpulan sampah.

    Untuk informasi lebih lanjut, lihat: [Penyempurnaan Kolektor Sapu Tanda Bersamaan](http://docs.oracle.com/javase/6/docs/technotes/guides/vm/cms-6.html).
+ Jika versi Tomcat kurang dari 7, template tidak disetel`LC_ALL`, yang membahas bug Ubuntu.

**catatan**  
Dengan atribut default, beberapa variabel lingkungan ini hanya diatur ke nilai default mereka. Namun, secara eksplisit menyetel variabel lingkungan ke atribut berarti Anda dapat menentukan atribut JSON khusus untuk mengganti atribut default dan memberikan nilai khusus. Untuk informasi selengkapnya tentang atribut utama, lihat[Mengesampingkan Atribut](workingcookbook-attributes.md).

Untuk file template lengkap, lihat [kode sumber](https://github.com/amazonwebservices/opsworks-example-cookbooks/tree/master/tomcat).

### File Konfigurasi Server.xml
<a name="create-custom-setup-config-server"></a>

`template`Sumber daya kedua digunakan `server.xml.erb` untuk membuat [file `system.xml` konfigurasi](http://tomcat.apache.org/tomcat-7.0-doc/config/), yang mengkonfigurasi servlet/JSP wadah. `server.xml.erb`tidak berisi pengaturan khusus sistem operasi, sehingga ada di subdirektori `template` direktori. `default`

Template menggunakan pengaturan standar, tetapi dapat membuat `system.xml` file untuk Tomcat 6 atau Tomcat 7. Misalnya, kode berikut dari bagian server template mengonfigurasi pendengar dengan tepat untuk versi yang ditentukan.

```
<% 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 -%>
```

Template menggunakan atribut sebagai pengganti pengaturan hardcode sehingga Anda dapat dengan mudah mengubah pengaturan dengan mendefinisikan atribut JSON kustom. Contoh:

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

Untuk informasi selengkapnya, lihat [kode sumber](https://github.com/amazonwebservices/opsworks-example-cookbooks/tree/master/tomcat).

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

`tomcat::apache_tomcat_bind`Resepnya memungkinkan server Apache untuk bertindak sebagai front end Tomcat, menerima permintaan masuk dan meneruskannya ke Tomcat dan mengembalikan tanggapan ke klien. Contoh ini menggunakan [mod\$1proxy sebagai proxy/gateway](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
```

Untuk mengaktifkan`mod_proxy`, Anda harus mengaktifkan `proxy` modul dan modul berbasis protokol. Anda memiliki dua opsi untuk modul protokol: 
+ HTTP: `proxy_http`
+ [ JServ Protokol Apache](http://tomcat.apache.org/connectors-doc/ajp/ajpv13a.html) (AJP): `proxy_ajp`

  AJP adalah protokol Tomcat internal.

Kedua [sumber daya eksekusi](https://docs.chef.io/chef/resources.html#execute) resep menjalankan `a2enmod` perintah, yang memungkinkan modul yang ditentukan dengan membuat symlink yang diperlukan:
+ `execute`Sumber daya pertama memungkinkan `proxy` modul.
+ `execute`Sumber daya kedua memungkinkan modul protokol, yang diatur ke secara `proxy_http` default.

  Jika Anda lebih suka menggunakan AJP, Anda dapat menentukan JSON khusus untuk mengganti `apache_tomcat_bind_mod` atribut dan mengaturnya ke. `proxy_ajp` 

`apache2::service`Resepnya adalah resep bawaan OpsWorks Stacks yang mendefinisikan layanan Apache. Untuk informasi lebih lanjut, lihat [resep](https://github.com/aws/opsworks-cookbooks/blob/release-chef-11.4/apache2/recipes/service.rb) di GitHub repositori OpsWorks Stacks. 

Sumber `template` daya digunakan `apache_tomcat_bind.conf.erb` untuk membuat file konfigurasi, dinamai secara `tomcat_bind.conf` default. Ini menempatkan file di `['apache']['dir']/.conf.d` direktori. `['apache']['dir']`Atribut didefinisikan dalam file `apache2` atribut bawaan, dan diatur secara default ke `/etc/httpd` (Amazon Linux), atau `/etc/apache2` (Ubuntu). Jika `template` sumber daya membuat atau mengubah file konfigurasi, `notifies` perintah menjadwalkan restart layanan 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 -%>
```

Template menggunakan [ProxyPassReverse](https://httpd.apache.org/docs/2.0/mod/mod_proxy.html#proxypassreverse)arahan [ProxyPass](https://httpd.apache.org/docs/2.0/mod/mod_proxy.html#proxypass)dan untuk mengkonfigurasi port yang digunakan untuk melewati lalu lintas antara Apache dan Tomcat. Karena kedua server berada pada instance yang sama, mereka dapat menggunakan URL localhost dan keduanya disetel secara default ke. `http://localhost:8080`

# Konfigurasikan Resep
<a name="create-custom-configure"></a>

**penting**  
 AWS OpsWorks Stacks Layanan ini mencapai akhir masa pakai pada 26 Mei 2024 dan telah dinonaktifkan untuk pelanggan baru dan yang sudah ada. Kami sangat menyarankan pelanggan untuk memindahkan beban kerja mereka ke solusi lain sesegera mungkin. Jika Anda memiliki pertanyaan tentang migrasi, hubungi AWS Dukungan Tim di [AWS re:Post](https://repost.aws/) atau melalui [AWS Dukungan](https://aws.amazon.com/support) Premium.

Konfigurasi resep ditetapkan ke peristiwa [siklus hidup](workingcookbook-events.md) Konfigurasi lapisan, yang terjadi pada semua instance tumpukan setiap kali instance masuk atau keluar dari status online. Anda menggunakan Configure recipes untuk menyesuaikan konfigurasi instans untuk merespons perubahan, sebagaimana mestinya. Saat Anda menerapkan resep Konfigurasi, perlu diingat bahwa perubahan konfigurasi tumpukan mungkin melibatkan instance yang tidak ada hubungannya dengan lapisan ini. Resep harus dapat merespons dengan tepat, yang mungkin berarti tidak melakukan apa-apa dalam beberapa kasus.

## tomcat: :mengkonfigurasi
<a name="create-custom-configure-configure"></a>

`tomcat::configure`Resep ini ditujukan untuk acara siklus hidup Konfigurasi lapisan.

```
include_recipe 'tomcat::context'
# Optional: Trigger a Tomcat restart in case of a configure event, if relevant
# settings in custom JSON have changed (e.g. java_opts/JAVA_OPTS):
#include_recipe 'tomcat::container_config'
```

`tomcat::configure`Resepnya pada dasarnya adalah metarecipe yang menjalankan dua resep tergantung.

1. `tomcat::context`Resep membuat file konfigurasi konteks aplikasi web.

   File ini mengkonfigurasi sumber daya JDBC yang digunakan aplikasi untuk berkomunikasi dengan instance MySQL, seperti yang dibahas di bagian berikutnya. Menjalankan resep ini sebagai respons terhadap peristiwa konfigurasi memungkinkan layer untuk memperbarui file konfigurasi konteks aplikasi web jika lapisan database telah berubah.

1. Resep `tomcat::container_config` Pengaturan dijalankan lagi untuk menangkap perubahan apa pun dalam konfigurasi kontainer.

The `include` for `tomcat::container_config` dikomentari untuk contoh ini. Jika Anda ingin menggunakan JSON khusus untuk memodifikasi pengaturan Tomcat, Anda dapat menghapus komentar. Peristiwa siklus hidup Konfigurasi kemudian berjalan`tomcat::container_config`, yang memperbarui file konfigurasi terkait Tomcat, seperti yang dijelaskan dalam [kucing jantan: :container\$1config](create-custom-setup.md#create-custom-setup-config) dan memulai ulang layanan Tomcat.

## kucing jantan: :konteks
<a name="create-custom-configure-context"></a>

[Cookbook Tomcat memungkinkan aplikasi untuk mengakses server database MySQL, yang dapat berjalan pada instance terpisah, dengan menggunakan objek J2EE. DataSource](http://docs.oracle.com/javase/tutorial/jdbc/basics/sqldatasources.html) Dengan Tomcat, Anda dapat mengaktifkan koneksi dengan membuat dan menginstal file konfigurasi konteks aplikasi web untuk setiap aplikasi. File ini mendefinisikan hubungan antara aplikasi dan sumber daya JDBC yang akan digunakan aplikasi untuk berkomunikasi dengan database. Untuk informasi selengkapnya, lihat [Context Container](http://tomcat.apache.org/tomcat-7.0-doc/config/context.html).

Tujuan utama `tomcat::context` resep adalah untuk membuat file konfigurasi ini.

```
include_recipe 'tomcat::service'

node[:deploy].each do |application, deploy|
  context_name = deploy[:document_root].blank? ? application : deploy[:document_root]

  template "context file for #{application} (context name: #{context_name})" do
    path ::File.join(node['tomcat']['catalina_base_dir'], 'Catalina', 'localhost', "#{context_name}.xml")
    source 'webapp_context.xml.erb'
    owner node['tomcat']['user']
    group node['tomcat']['group']
    mode 0640
    backup false
    only_if { node['datasources'][context_name] }
    variables(:resource_name => node['datasources'][context_name], :webapp_name => application)
    notifies :restart, resources(:service => 'tomcat')
  end
end
```

Selain atribut buku masak Tomcat, resep ini menggunakan [konfigurasi tumpukan dan atribut penerapan](workingcookbook-json.md) yang diinstal OpsWorks Stacks dengan peristiwa Configure. Layanan OpsWorks Stacks menambahkan atribut ke objek node setiap instance yang berisi informasi yang biasanya diperoleh resep dengan menggunakan tas data atau mencari dan menginstal atribut pada setiap instance. Atribut berisi informasi terperinci tentang konfigurasi tumpukan, aplikasi yang diterapkan, dan data kustom apa pun yang ingin disertakan pengguna. Resep dapat memperoleh data dari konfigurasi tumpukan dan atribut penerapan dengan menggunakan sintaks simpul Chef standar. Untuk informasi selengkapnya, lihat [Konfigurasi Stack dan Atribut Deployment](workingcookbook-json.md). Dengan tumpukan Chef 11.10, Anda juga dapat menggunakan pencarian Chef untuk mendapatkan konfigurasi tumpukan dan data penyebaran. Untuk informasi selengkapnya, lihat [Menggunakan Pencarian Chef](workingcookbook-chef11-10.md#workingcookbook-chef11-10-search).

`deploy`atribut mengacu pada `[:deploy]` namespace, yang berisi atribut terkait penerapan yang ditentukan melalui konsol atau API, atau dihasilkan oleh layanan Stacks. OpsWorks `deploy`Atribut menyertakan atribut untuk setiap aplikasi yang di-deploy, dinamai dengan nama pendek aplikasi. Setiap atribut app berisi sekumpulan atribut yang menjadi ciri aplikasi, seperti root dokumen (`[:deploy][:appname][:document_root]`).

`context`Resep pertama memastikan bahwa layanan ditentukan untuk Chef ini dijalankan dengan menelepon[kucing jantan: :layanan](create-custom-setup.md#create-custom-setup-service). Kemudian mendefinisikan `context_name` variabel yang mewakili nama file konfigurasi, tidak termasuk ekstensi. `.xml` Jika Anda menggunakan root dokumen default, `context_name` disetel ke nama pendek aplikasi. Jika tidak, itu diatur ke root dokumen yang ditentukan. Contoh yang dibahas dalam [Buat Stack dan Jalankan Aplikasi](create-custom-stack.md) menetapkan root dokumen`"ROOT"`, sehingga konteksnya adalah ROOT dan file konfigurasi diberi nama`ROOT.xml`.

Sebagian besar resep melewati daftar aplikasi yang diterapkan dan untuk setiap aplikasi, menggunakan `webapp_context.xml.erb` template untuk membuat file konfigurasi konteks. Contoh ini hanya menggunakan satu aplikasi, tetapi definisi `deploy` atribut mengharuskan Anda untuk memperlakukannya sebagai daftar aplikasi apa pun.

`webapp_context.xml.erb`Template tidak spesifik sistem operasi, sehingga terletak di `templates` subdirektori direktori. `default`

Resep membuat file konfigurasi sebagai berikut:
+ Menggunakan nilai atribut default, nama file konfigurasi diatur ke `context_name.xml` dan diinstal di `/etc/tomcat6/Catalina/localhost/` direktori. 

  `['datasources']`Node dari atribut konfigurasi tumpukan berisi satu atau lebih atribut, yang masing-masing memetakan nama konteks ke sumber daya data JDBC yang akan digunakan aplikasi terkait untuk berkomunikasi dengan database. Node dan isinya didefinisikan dengan JSON kustom saat Anda membuat tumpukan, seperti yang dijelaskan nanti. [Buat Stack dan Jalankan Aplikasi](create-custom-stack.md) Contoh ini memiliki atribut tunggal yang mengaitkan nama konteks ROOT dengan sumber daya JDBC bernama jdbc/mydb.
+ Menggunakan nilai atribut default, pengguna dan grup file keduanya diatur ke nilai yang ditentukan oleh paket Tomcat: `tomcat` (Amazon Linux) atau `tomcat6` (Ubuntu).
+ `template`Sumber daya membuat file konfigurasi hanya jika `['datasources']` node ada dan menyertakan `context_name` atribut.
+ Sumber `template` daya mendefinisikan dua variabel, `resource_name` dan`webapp_name`.

  `resource_name`disetel ke nama sumber daya yang dikaitkan dengan `context_name` dan `webapp_name` disetel ke nama pendek aplikasi.
+ Sumber daya template memulai ulang layanan Tomcat untuk memuat dan mengaktifkan perubahan.

`webapp_context.xml.erb`Template terdiri dari `Context` elemen yang berisi `Resource` elemen dengan set atributnya sendiri.

`Resource`Atribut mencirikan konfigurasi konteks:
+ **nama —Nama** sumber daya JDBC, yang diatur ke `resource_name` nilai yang ditentukan dalam. `tomcat::context`

  Sebagai contoh, nama sumber daya diatur ke jdbc/mydb.
+ **auth** dan **ketik** —Ini adalah pengaturan standar untuk koneksi `DataSource` JDBC.
+ **MaxActive**, **MaxIdle**, dan **MaxWait** —Jumlah maksimum koneksi aktif dan idle, dan waktu tunggu maksimum untuk koneksi dikembalikan.
+ **nama pengguna**, dan **kata sandi** —Nama pengguna database dan kata sandi root, yang diperoleh dari `deploy` atribut.
+ **driverClassName**—Nama kelas driver JDBC, yang diatur ke driver MySQL.
+ **url —URL** koneksi.

  Awalan tergantung pada database. Ini harus diatur ke `jdbc:mysql` untuk MySQL, untuk Postgres`jdbc:postgresql`, `jdbc:sqlserver` dan untuk SQL Server. Contoh menyetel URL ke`jdbc:mysql://host_IP_Address:3306:simplejsp`, di *simplejsp* mana nama pendek aplikasi.
+ **pabrik** `DataSource` —Pabrik, yang diperlukan untuk database MySQL.

Untuk informasi selengkapnya tentang file konfigurasi ini, lihat DataSources topik [Menggunakan](http://wiki.apache.org/tomcat/UsingDataSources) wiki Tomcat.

# Menyebarkan Resep
<a name="create-custom-deploy"></a>

**penting**  
 AWS OpsWorks Stacks Layanan ini mencapai akhir masa pakai pada 26 Mei 2024 dan telah dinonaktifkan untuk pelanggan baru dan yang sudah ada. Kami sangat menyarankan pelanggan untuk memindahkan beban kerja mereka ke solusi lain sesegera mungkin. Jika Anda memiliki pertanyaan tentang migrasi, hubungi AWS Dukungan Tim di [AWS re:Post](https://repost.aws/) atau melalui [AWS Dukungan](https://aws.amazon.com/support) Premium.

Resep deploy ditetapkan ke acara siklus [hidup](workingcookbook-events.md) Deploy layer. Ini biasanya terjadi pada semua instance tumpukan setiap kali Anda menerapkan aplikasi, meskipun Anda secara opsional dapat membatasi acara hanya untuk instance tertentu. OpsWorks Stacks juga menjalankan resep Deploy pada instance baru, setelah resep Setup selesai. Tujuan utama dari resep Deploy adalah untuk menyebarkan kode dan file terkait dari repositori ke instance lapisan server aplikasi. Namun, Anda sering menjalankan resep Deploy di lapisan lain juga. Hal ini memungkinkan instance lapisan tersebut, misalnya, memperbarui konfigurasi mereka untuk mengakomodasi aplikasi yang baru diterapkan. Saat Anda menerapkan resep Deploy, ingatlah bahwa peristiwa Deploy tidak selalu berarti bahwa aplikasi sedang di-deploy ke instance. Ini bisa berupa pemberitahuan bahwa aplikasi sedang digunakan ke instance lain di tumpukan, untuk memungkinkan instance melakukan pembaruan yang diperlukan. Resepnya harus dapat merespons dengan tepat, yang mungkin berarti tidak melakukan apa-apa.

OpsWorks Stacks secara otomatis menyebarkan aplikasi dari jenis aplikasi standar ke lapisan server aplikasi bawaan yang sesuai. Untuk menerapkan aplikasi ke lapisan kustom, Anda harus menerapkan resep Deploy kustom yang mengunduh file aplikasi dari repositori ke lokasi yang sesuai pada instance. Namun, Anda sering dapat membatasi jumlah kode yang harus Anda tulis dengan menggunakan [buku masak deploy](https://github.com/aws/opsworks-cookbooks/tree/release-chef-11.4/deploy) bawaan untuk menangani beberapa aspek penerapan. Misalnya, jika Anda menyimpan file Anda di salah satu repositori yang didukung, buku masak bawaan dapat menangani detail pengunduhan file dari repositori ke instance lapisan. 

`tomcat::deploy`Resep ini dimaksudkan untuk ditetapkan ke peristiwa siklus hidup Deploy.

```
include_recipe 'deploy'

node[:deploy].each do |application, deploy|
  opsworks_deploy_dir do
    user deploy[:user]
    group deploy[:group]
    path deploy[:deploy_to]
  end

  opsworks_deploy do
    deploy_data deploy
    app application
  end
...
```

`tomcat::deploy`Resepnya menggunakan buku masak penerapan bawaan untuk aspek penerapan yang tidak spesifik untuk aplikasi. `deploy`Resep (yang merupakan singkatan dari `deploy::default` resep bawaan) adalah resep bawaan yang menangani detail pengaturan pengguna, grup, dan sebagainya, berdasarkan data dari atribut. `deploy`

Resepnya menggunakan dua definisi Chef bawaan, `opsworks_deploy_dir` dan `opworks_deploy` untuk menginstal aplikasi. 

`opsworks_deploy_dir`Definisi mengatur struktur direktori, berdasarkan data dari JSON penerapan aplikasi. Definisi pada dasarnya adalah cara yang nyaman untuk mengemas definisi sumber daya, dan terletak di `definitions` direktori buku masak. Resep dapat menggunakan definisi seperti sumber daya, tetapi definisi itu sendiri tidak memiliki penyedia terkait, hanya sumber daya yang termasuk dalam definisi. Anda dapat menentukan variabel dalam resep, yang diteruskan ke definisi sumber daya yang mendasarinya. Set `tomcat::deploy` resep`user`,`group`, dan `path` variabel berdasarkan data dari penyebaran JSON. Mereka diteruskan ke [sumber daya direktori](https://docs.chef.io/chef/resources.html#directory) definisi, yang mengelola direktori. 

**catatan**  
Pengguna dan grup aplikasi yang Anda gunakan ditentukan oleh `[:opsworks][:deploy_user][:group]` atribut `[:opsworks][:deploy_user][:user]` dan, yang ditentukan dalam file atribut [buku masak penerapan bawaan](https://github.com/aws/opsworks-cookbooks/blob/release-chef-11.4/deploy/attributes/deploy.rb). `deploy.rb` Nilai default `[:opsworks][:deploy_user][:user]` adalah `deploy`. Nilai default `[:opsworks][:deploy_user][:group]` tergantung pada sistem operasi instans:  
Untuk instance Ubuntu, grup defaultnya adalah`www-data`.
Untuk instance Amazon Linux yang merupakan anggota lapisan Rails App Server yang menggunakan Nginx dan Unicorn, grup defaultnya adalah. `nginx`
Untuk semua instance Amazon Linux lainnya, grup defaultnya adalah`apache`.
Anda dapat mengubah pengaturan dengan menggunakan JSON kustom atau file atribut kustom untuk mengganti atribut yang sesuai. Untuk informasi selengkapnya, lihat [Mengesampingkan Atribut](workingcookbook-attributes.md).

Definisi lain,`opsworks_deploy`, menangani detail memeriksa kode aplikasi dan file terkait dari repositori dan menerapkannya ke instance, berdasarkan data dari atribut. `deploy` Anda dapat menggunakan definisi ini untuk semua jenis aplikasi; detail penerapan seperti nama direktori ditentukan di konsol atau melalui API dan dimasukkan ke dalam `deploy` atribut. Namun, hanya `opsworks_deploy` berfungsi untuk empat [jenis repositori yang didukung](workingcookbook-installingcustom-repo.md): Git, Subversion, S3, dan HTTP. Anda harus menerapkan kode ini sendiri jika Anda ingin menggunakan jenis repositori yang berbeda.

Anda menginstal file aplikasi di `webapps` direktori Tomcat. Praktik yang umum adalah menyalin file secara langsung ke`webapps`. Namun, penerapan OpsWorks Stacks dirancang untuk mempertahankan hingga lima versi aplikasi pada sebuah instans, sehingga Anda dapat memutar kembali ke versi sebelumnya jika perlu. OpsWorks Oleh karena itu, tumpukan melakukan hal berikut:

1. Menyebarkan aplikasi ke direktori berbeda yang namanya berisi cap waktu, seperti. `/srv/www/my_1st_jsp/releases/20130731141527`

1. Membuat symlink bernama`current`, seperti`/srv/www/my_1st_jsp/current`, ke direktori unik ini.

1. Jika belum ada, buat symlink dari `webapps` direktori ke `current` symlink yang dibuat di Langkah 2.

Jika Anda perlu memutar kembali ke versi sebelumnya, ubah `current` symlink untuk menunjuk ke direktori berbeda yang berisi stempel waktu yang sesuai, misalnya, dengan mengubah target tautan. `/srv/www/my_1st_jsp/current`

Bagian tengah `tomcat::deploy` mengatur symlink. 

```
  ...
  current_dir = ::File.join(deploy[:deploy_to], 'current')
  webapp_dir = ::File.join(node['tomcat']['webapps_base_dir'], deploy[:document_root].blank? ? application : deploy[:document_root])

  # opsworks_deploy creates some stub dirs, which are not needed for typical webapps
  ruby_block "remove unnecessary directory entries in #{current_dir}" do
    block do
      node['tomcat']['webapps_dir_entries_to_delete'].each do |dir_entry|
        ::FileUtils.rm_rf(::File.join(current_dir, dir_entry), :secure => true)
      end
    end
  end

  link webapp_dir do
    to current_dir
    action :create
  end
  ...
```

Resep pertama menciptakan dua variabel, `current_dir` dan `webapp_dir` untuk mewakili `current` dan `webapp` direktori, masing-masing. Kemudian menggunakan `link` sumber daya untuk `webapp_dir` ditautkan`current_dir`. `deploy::default`Resep OpsWorks Stacks membuat beberapa direktori rintisan yang tidak diperlukan untuk contoh ini, sehingga bagian tengah kutipan menghapusnya.

Bagian terakhir dari `tomcat::deploy` restart layanan Tomcat, jika perlu.

```
  ...
  include_recipe 'tomcat::service'

  execute 'trigger tomcat service restart' do
    command '/bin/true'
    not_if { node['tomcat']['auto_deploy'].to_s == 'true' }
    notifies :restart, resources(:service => 'tomcat')
  end
end

include_recipe 'tomcat::context'
```

Resep pertama berjalan`tomcat::service`, untuk memastikan bahwa layanan ditentukan untuk menjalankan Chef ini. Kemudian menggunakan [sumber daya eksekusi](https://docs.chef.io/chef/resources.html#execute) untuk memberi tahu layanan untuk memulai ulang, tetapi hanya jika `['tomcat']['auto_deploy']` diatur ke`'true'`. Jika tidak, Tomcat mendengarkan perubahan dalam `webapps` direktorinya, yang membuat restart layanan Tomcat eksplisit tidak perlu. 

**catatan**  
`execute`Sumber daya tidak benar-benar mengeksekusi sesuatu yang substantif; `/bin/true` adalah skrip shell dummy yang hanya mengembalikan kode sukses. Ini digunakan di sini hanya sebagai cara mudah untuk menghasilkan pemberitahuan restart. Seperti disebutkan sebelumnya, menggunakan notifikasi memastikan bahwa layanan tidak dimulai ulang terlalu sering.

Terakhir, `tomcat::deploy` run`tomcat::context`, yang memperbarui file konfigurasi konteks aplikasi web jika Anda telah mengubah database back end. 

# Buat Stack dan Jalankan Aplikasi
<a name="create-custom-stack"></a>

**penting**  
 AWS OpsWorks Stacks Layanan ini mencapai akhir masa pakai pada 26 Mei 2024 dan telah dinonaktifkan untuk pelanggan baru dan yang sudah ada. Kami sangat menyarankan pelanggan untuk memindahkan beban kerja mereka ke solusi lain sesegera mungkin. Jika Anda memiliki pertanyaan tentang migrasi, hubungi AWS Dukungan Tim di [AWS re:Post](https://repost.aws/) atau melalui [AWS Dukungan](https://aws.amazon.com/support) Premium.

Bagian ini menunjukkan bagaimana menggunakan buku masak Tomcat untuk mengimplementasikan pengaturan tumpukan dasar yang menjalankan aplikasi halaman server Java sederhana (JSP) bernama SimpleJSP. Tumpukan terdiri dari lapisan kustom berbasis TomCustom TomCat bernama dan lapisan MySQL. SimpleJSP dikerahkan ke TomCustom dan menampilkan beberapa informasi dari database MySQL. Jika Anda belum terbiasa dengan dasar-dasar cara menggunakan OpsWorks Stacks, Anda harus membaca [Memulai dengan Chef 11 Linux Stacks](gettingstarted.md) terlebih dahulu.

## Aplikasi SimpleJSP
<a name="create-custom-stack-jsp"></a>

Aplikasi SimpleJSP menunjukkan dasar-dasar cara mengatur koneksi database dan mengambil data dari database MySQL stack.

```
<html>
  <head>
    <title>DB Access</title>
  </head>
  <body>
    <%@ page language="java" import="java.sql.*,javax.naming.*,javax.sql.*" %>
    <%
      StringBuffer output = new StringBuffer();
      DataSource ds = null;
      Connection con = null;
      Statement stmt = null;
      ResultSet rs = null;
      try {
        Context initCtx = new InitialContext();
        ds = (DataSource) initCtx.lookup("java:comp/env/jdbc/mydb");
        con = ds.getConnection();
        output.append("Databases found:<br>");
        stmt = con.createStatement();
        rs = stmt.executeQuery("show databases");
        while (rs.next()) {
          output.append(rs.getString(1));
          output.append("<br>");
        }
      }
      catch (Exception e) {
        output.append("Exception: ");
        output.append(e.getMessage());
        output.append("<br>");
      }
      finally {
        try {
          if (rs != null) {
            rs.close();
          }
          if (stmt != null) {
            stmt.close();
          }
          if (con != null) {
            con.close();
          }
        }
        catch (Exception e) {
          output.append("Exception (during close of connection): ");
          output.append(e.getMessage());
          output.append("<br>");
        }
      }
    %>
    <%= output.toString() %>
  </body>
</html>
```

SimpleJSP menggunakan `DataSource` objek untuk berkomunikasi dengan database MySQL. Tomcat menggunakan data dalam [file konfigurasi konteks aplikasi web](create-custom-configure.md#create-custom-configure-context) untuk membuat dan menginisialisasi `DataSource` objek dan mengikatnya ke nama logis. Kemudian mendaftarkan nama logis dengan layanan penamaan Java Naming and Directory Interface (JNDI). Untuk mendapatkan instance dari `DataSource` objek yang sesuai, Anda membuat `InitialContext` objek dan meneruskan nama logis sumber daya ke `lookup` metode objek, yang mengambil objek yang sesuai. Nama logis contoh SimpleJSP,`java:comp/env/jdbc/mydb`, memiliki komponen berikut:
+ Namespace root,`java`, yang dipisahkan dari sisa nama dengan titik dua (:). 
+ Setiap ruang nama tambahan, dipisahkan oleh garis miring maju (/).

  Tomcat secara otomatis menambahkan sumber daya ke `comp/env` namespace.
+ Nama resource, yang didefinisikan dalam file konfigurasi konteks aplikasi web dan dipisahkan dari ruang nama dengan garis miring ke depan.

  Nama sumber daya untuk contoh ini adalah`jdbc/mydb`. 

Untuk membuat koneksi ke database, SimpleJSP melakukan hal berikut:

1. Memanggil `getConnection` metode `DataSource` objek, yang mengembalikan `Connection` objek.

1. Memanggil `createStatement` metode `Connection` objek untuk membuat `Statement` objek, yang Anda gunakan untuk berkomunikasi dengan database.

1. Berkomunikasi dengan database dengan memanggil `Statement` metode yang sesuai.

   SimpleJSP memanggil `executeQuery` untuk mengeksekusi query SHOW DATABASES, yang mencantumkan database server.

`executeQuery`Metode mengembalikan `ResultSet` objek, yang berisi hasil query. SimpleJSP mendapatkan nama database dari `ResultSet` objek yang dikembalikan dan menggabungkan mereka untuk membuat string output. Akhirnya, contoh menutup`ResultSet`,`Statement`, dan `Connection` objek. Untuk informasi lebih lanjut tentang JSP dan JDBC, lihat [JavaServer Pages Technology](http://docs.oracle.com/javaee/5/tutorial/doc/bnagx.html) dan [JDBC](http://docs.oracle.com/javase/tutorial/jdbc/basics/) Basics, masing-masing.

Untuk menggunakan SimpleJSP dengan tumpukan, Anda harus memasukkannya ke dalam repositori. Anda dapat menggunakan salah satu repositori yang didukung, tetapi untuk menggunakan SimpleJSP dengan tumpukan contoh yang dibahas di bagian berikut, Anda harus memasukkannya ke dalam arsip S3 publik. Untuk informasi tentang cara menggunakan repositori standar lainnya, lihat. [Repositori Buku Masak](workingcookbook-installingcustom-repo.md)

**Untuk menempatkan SimpleJSP di repositori arsip S3**

1. Salin kode contoh ke file bernama `simplejsp.jsp` dan letakkan file dalam direktori bernama`simplejsp`.

1. Buat `.zip` arsip `simplejsp` direktori.

1. Buat bucket Amazon S3 publik, unggah `simplejsp.zip` ke bucket, dan buat file menjadi publik.

   Untuk penjelasan tentang cara melakukan tugas ini, lihat [Memulai Dengan Amazon Simple Storage Service](https://docs.aws.amazon.com/AmazonS3/latest/gsg/GetStartedWithS3.html).

## Membuat Tumpukan
<a name="create-custom-stack-stack"></a>

Untuk menjalankan SimpleJSP Anda memerlukan tumpukan dengan lapisan berikut.
+ Lapisan MySQL, yang mendukung server MySQL back end.
+ Lapisan khusus yang menggunakan buku masak Tomcat untuk mendukung instance server Tomcat.

**Untuk membuat tumpukan**

1. Di dasbor OpsWorks Stacks, klik **Add Stack** untuk membuat tumpukan baru dan klik **Advanced >>** untuk menampilkan semua opsi. Konfigurasikan tumpukan sebagai berikut.
   + **Nama —Nama** tumpukan yang ditentukan pengguna; contoh ini menggunakan. TomStack
   + **Gunakan buku masak Chef kustom** —Atur sakelar ke **Ya**, yang menampilkan beberapa opsi tambahan.
   + **Jenis repositori —Git**.
   + **URL Repositori** —. `git://github.com/amazonwebservices/opsworks-example-cookbooks.git`
   + **Custom Chef JSON** —Tambahkan JSON berikut:

     ```
     {
       "tomcat": {
         "base_version": 7,
         "java_opts": "-Djava.awt.headless=true -Xmx256m"
       },
       "datasources": {
         "ROOT": "jdbc/mydb"
       }
     }
     ```

   Untuk opsi yang tersisa, Anda dapat menerima default.

   JSON kustom melakukan hal berikut:
   + Mengganti `['base_version']` atribut buku masak Tomcat untuk mengatur versi Tomcat ke 7; nilai defaultnya adalah 6.
   + Mengganti `['java_opts']` atribut buku masak Tomcat untuk menentukan bahwa instance tanpa kepala dan menyetel ukuran heap maksimum JVM ke 256MB; nilai default tidak menetapkan opsi untuk instance yang menjalankan Amazon Linux.
   + Menentukan nilai `['datasources]` atribut, yang menetapkan nama sumber daya JDBC (jdbc/mydb) ke nama konteks aplikasi web (ROOT), seperti yang dibahas dalam. [kucing jantan: :konteks](create-custom-configure.md#create-custom-configure-context)

     Atribut terakhir ini tidak memiliki nilai default; Anda harus mengaturnya dengan JSON kustom.  
![\[Configuration Management interface showing Chef version options and custom JSON input field.\]](http://docs.aws.amazon.com/id_id/opsworks/latest/userguide/images/tom_add_stack.png)

1. Klik **Tambahkan layer**. Untuk **tipe Layer**, pilih **MySQL**. Kemudian klik **Add Layer**.

1. Klik **Instans** di panel navigasi dan kemudian klik **Tambahkan instance**. Klik **Add Instance** untuk menerima default. Pada baris untuk contoh, klik **mulai**.

1. Kembali ke halaman **Layers** dan klik **\$1 Layer** untuk menambahkan layer. Untuk **jenis Layer**, klik **Custom** .s Contoh menggunakan **TomCustom** dan **tomcustom** sebagai nama layer dan nama pendek, masing-masing.  
![\[Add Layer form with Custom layer type, Name, and Short name fields for creating a customized layer.\]](http://docs.aws.amazon.com/id_id/opsworks/latest/userguide/images/tom_add_custom_layer.png)

1. Pada halaman **Layers**, untuk layer kustom, klik **Resep** dan kemudian klik **Edit**. Di bawah **Resep Koki Kustom**, tetapkan resep buku masak Tomcat ke acara siklus hidup lapisan, sebagai berikut:
   + Untuk **Pengaturan**, ketik **tomcat::setup** dan klik **\$1**.
   + Untuk **Konfigurasi**, ketik **tomcat::configure** dan klik **\$1**.
   + Untuk **Deploy**, ketik **tomcat::deploy** dan klik **\$1**. Kemudian klik **Simpan**.

     .  
![\[Custom Chef Recipes interface showing setup, configure, and deploy steps with options.\]](http://docs.aws.amazon.com/id_id/opsworks/latest/userguide/images/tom_events.png)

1. Klik **Aplikasi** di panel navigasi dan kemudian klik **Tambahkan aplikasi**. Tentukan opsi berikut, lalu klik **Tambahkan Aplikasi**:
   + **Nama —Nama** aplikasi; contohnya menggunakan SimpleJSP dan nama pendek yang dihasilkan oleh OpsWorks Stacks adalah simplejsp.
   + **Jenis aplikasi** —Atur opsi ini ke **Lainnya**.

     OpsWorks Stacks secara otomatis menerapkan tipe aplikasi standar ke instance server terkait. Jika Anda menyetel **jenis Aplikasi** ke yang lain, OpsWorks Stacks cukup menjalankan resep Deploy, dan memungkinkan mereka menangani penerapan.
   + **Root dokumen** —Atur opsi ini ke**ROOT**.

     Nilai **root Document** menentukan nama konteks.
   + **Jenis repositori** **—Atur opsi ini ke Arsip S3.**
   + **URL Repositori** —Setel ini ke URL Amazon S3 aplikasi yang Anda buat sebelumnya.

   Gunakan pengaturan default untuk opsi lain.  
![\[Application settings form with fields for name, app type, document root, and source details.\]](http://docs.aws.amazon.com/id_id/opsworks/latest/userguide/images/tom_app.png)

1. Gunakan halaman **Instances** untuk menambahkan instance ke TomCustom layer dan memulainya. OpsWorks Stacks secara otomatis menjalankan resep Deploy pada instance baru setelah resep Setup selesai, jadi memulai instance juga menyebarkan SimpleJSP.

1. Saat TomCustom instans sedang online, klik nama instance pada halaman **Instances** untuk melihat detailnya. Salin alamat IP publik. Kemudian buat URL sebagai berikut: http:///tc/*publicIP*. *appname.jsp* Sebagai contoh, URL ini akan terlihat seperti**http://50.218.191.172/tc/simplejsp.jsp**.
**catatan**  
URL Apache yang meneruskan permintaan ke Tomcat diatur ke atribut default`['tomcat']['apache_tomcat_bind_path']`,. `/tc/` Root dokumen SimpleJSP diatur ke `ROOT` mana merupakan nilai khusus yang diselesaikan. `/` Oleh karena itu URL adalah “... /tc/simplejsp.jsp”.

1. Tempel URL dari langkah sebelumnya ke browser Anda. Anda akan melihat yang berikut ini:

   ```
   Databases found:
   information_schema
   simplejsp
   test
   ```
**catatan**  
Jika tumpukan Anda memiliki instance MySQL OpsWorks , Stacks secara otomatis membuat database untuk setiap aplikasi, dinamai dengan nama pendek aplikasi.