Browse Source

[COOK-489] support for deploying php applications

Seth Chisamore 13 years ago
parent
commit
4cd58157ba

+ 82 - 18
README.md

@@ -6,8 +6,9 @@ This cookbook is initially designed to be able to describe and deploy web applic
 * Rails
 * Java
 * Django
+* PHP
 
-Other application stacks (PHP, etc) will be supported as new recipes at a later date.
+Other application stacks (Rack, WSGI, etc) will be supported as new recipes at a later date.
 
 This cookbook aims to provide primitives to install/deploy any kind of application driven entirely by data defined in an abstract way through a data bag.
 
@@ -15,7 +16,7 @@ This cookbook aims to provide primitives to install/deploy any kind of applicati
 Requirements
 ============
 
-Chef 0.8 or higher required.
+Chef 0.9.14 or higher required.
 
 The following Opscode cookbooks are dependencies:
 
@@ -25,11 +26,8 @@ The following Opscode cookbooks are dependencies:
 * tomcat
 * python
 * gunicorn
-
-The following are also dependencies, though the recipes are considered deprecated, may be useful for future development.
-
-* `ruby_enterprise`
-* `passenger_enterprise`
+* apache2
+* php
 
 ---
 Recipes
@@ -52,7 +50,7 @@ Using the node's `run_state` that contains the current application in the search
 * create an application specific virtualenv
 * install required packages and pips
 * set up the deployment scaffolding
-* creates settings_local.py file with the database connection information if required
+* creates `settings_local.py` file with the database connection information if required
 * performs a revision-based deploy
 
 This recipe can be used on nodes that are going to run the application, or on nodes that need to have the application code checkout available such as supporting utility nodes or a configured load balancer that needs static assets stored in the application repository.
@@ -90,7 +88,7 @@ Requires `gunicorn` cookbook.
 
 Gunicorn is installed, default attributes are set for the node and an app specific gunicorn config and runit service are created.
 
-`java_webapp`
+java_webapp
 -----------
 
 Using the node's `run_state` that contains the current application in the search, this recipe will:
@@ -107,17 +105,29 @@ The servlet container context configuration (`context.xml`) exposes the followin
 
 This recipe assumes some sort of build process, such as Maven or a Continuous Integration server like Hudson, will create a deployable artifact and make it available for download via HTTP (such as S3 or artifactory).
 
-`passenger_apache2`
--------------------
+mod\_php\_apache2
+-----------------
+
+Requires `apache2` cookbook. Sets up a mod_php vhost template for the application using the `apache2` cookbook's `web_app` definition. See data bag example below.
+
+passenger_apache2
+-----------------
 
-Requires `apache2` and `passenger_apache2` cookbooks. The `recipe[apache2]` entry should come before `recipe[application]` in the run list.
+Requires `apache2` and `passenger_apache2` cookbooks. Sets up a passenger vhost template for the application using the `apache2` cookbook's `web_app` definition. Use this with the `rails` recipe, in the list of recipes for a specific application type. See data bag example below.
 
-    "run_list": [
-      "recipe[apache2]",
-      "recipe[application]"
-    ],
+php
+---
 
-Sets up a passenger vhost template for the application using the `apache2` cookbook's `web_app` definition. Use this with the `rails` recipe, in the list of recipes for a specific application type. See data bag example below.
+Using the node's `run_state` that contains the current application in the search, this recipe will:
+
+* install required packages and pears/pecls
+* set up the deployment scaffolding
+* creates a `local_settings.php` (specific file name and project path is configurable) file with the database connection information if required
+* performs a revision-based deploy
+
+This recipe can be used on nodes that are going to run the application, or on nodes that need to have the application code checkout available such as supporting utility nodes or a configured load balancer that needs static assets stored in the application repository.
+
+Since PHP projects do not have a standard `local_settings.php` file (or format) that contains database connection information. This recipe assumes you will provide a template in an application specific cookbook.  See additional notes in the 'Application Data Bag' section below.
 
 rails
 -----
@@ -217,10 +227,64 @@ Note about `databases`, the data specified will be rendered as the `settings_loc
 
 Note about pips, the version is optional. If specified, the version will be passed as a parameter to the resource. Otherwise it will use the latest available version per the default `:install` action for the python_pip package provider.
 
-The `local_settings_file_name` value may be used to supply an alternate name for the environment specific `settings_local.py`, since Django projects do not have a standard name for this file.
+The `local_settings_file` value may be used to supply an alternate name for the environment specific `settings_local.py`, since Django projects do not have a standard name for this file.
 
 An example is data bag item is included in this cookbook at `examples/data_bags/apps/django_app.json`.
 
+PHP version additional notes
+----------------------------
+
+Note about `databases`, the data specified will be rendered as the `local_settings.php` file. In the `database` cookbook, this information is also used to set up privileges for the application user, and create the databases.
+
+Note about pears/pecls, the version is optional. If specified, the version will be passed as a parameter to the resource. Otherwise it will use the latest available version per the default `:install` action for the php_pear package provider.
+
+The `local_settings_file` value is used to supply the name, and relative local project path, for the environment specific `local_settings.php`, since PHP projects do not have a standard name (or location) for this file.
+
+For applications that look for this file in the project root just supply a name:
+
+MediaWiki:
+
+    "local_settings_file": "LocalSettings.php"
+    
+Wordpress:
+
+    "local_settings_file": "wp-config.php"
+
+For applications that expect the file nested within the project root, you can supply a relative path:
+
+CakePHP:
+
+    "local_settings_file": "app/config/database.php"
+
+The template used to render this `local_settings.php` file is assumed to be provided in an application specific cookbook named after the application being deployed.  For example if you were deploying code for an application named `mediawiki` you would create a cookbook named `mediawiki` and in that cookbook place a template named `LocalSettings.php.erb`:
+
+    mediawiki/
+    ├── files
+    │   └── default
+    │       └── schema.sql
+    ├── metadata.rb
+    ├── README.md
+    ├── recipes
+    │   ├── db_bootstrap.rb
+    │   └── default.rb
+    └── templates
+        └── default
+            └── LocalSettings.php.erb
+
+The template will be passed the following variables which can be used to dynamically fill values in the ERB:
+
+* path - fill path to the 'current' project path
+* host - database master fqdn
+* database - environment specific database information from the application's data bag item
+* app - Ruby mash representation of the complete application data bag item for this app, useful if other arbitrary config data has been stashed in the data bag item.
+
+A few example `local_settings` templates are included in this cookbook at `examples/templates/defaults/*`:
+
+* MediaWiki - LocalSettings.php.erb
+* Wordpress - wp-config.php.erb
+
+An example is data bag item is included in this cookbook at `examples/data_bags/apps/php_app.json`.
+
 ---
 Usage
 =====

+ 6 - 5
examples/data_bags/apps/java_app.json

@@ -19,11 +19,12 @@
     "name of the role used by database master, typically named after the app 'my_app_database_master'",
     "my_app_database_master"
   ],
-  "wars": {
-    "production": {
-      "source": "source url of WAR file to deploy",
-      "checksum": "SHA256 (or portion thereof) of the WAR file to deploy"
-    }
+  "repository": "git@github.com:company/my_app.git",
+  "revision": {
+    "production": "commit hash, branch or tag to deploy"
+  },
+  "force": {
+    "production": "true or false w/o quotes to force deployment, see the rails.rb recipe"
   },
   "databases": {
     "production": {

+ 63 - 0
examples/data_bags/apps/php_app.json

@@ -0,0 +1,63 @@
+{
+  "id": "my_app",
+  "server_roles": [
+    "application specific role(s), typically the name of the app, e.g., my_app",
+    "my_app"
+  ],
+  "type": {
+    "my_app": [
+      "recipes in this application cookbook to run for this role",
+      "php",
+      "mod_php_apache2"
+    ]
+  },
+  "database_slave_role": [
+    "name of the role used by database slaves, typically named after the app, 'my_app_database_slave'",
+    "my_app_database_slave"
+  ],
+  "database_master_role": [
+    "name of the role used by database master, typically named after the app 'my_app_database_master'",
+    "my_app_database_master"
+  ],
+  "repository": "git@github.com:company/my_app.git",
+  "revision": {
+    "production": "commit hash, branch or tag to deploy"
+  },
+  "force": {
+    "production": "true or false w/o quotes to force deployment, see the rails.rb recipe"
+  },
+  "databases": {
+    "production": {
+      "reconnect": "true",
+      "encoding": "utf8",
+      "username": "db_user",
+      "adapter": "mysql",
+      "password": "awesome_password",
+      "database": "db_name_production"
+    }
+  },
+  "mysql_root_password": {
+    "production": "password for the root user in mysql"
+  },
+  "mysql_debian_password": {
+    "production": "password for the debian-sys-maint user on ubuntu/debian"
+  },
+  "mysql_repl_password": {
+    "production": "password for the 'repl' user for replication."
+  },
+  "snapshots_to_keep": {
+    "production": "if using EBS, integer of the number of snapshots we're going to keep for this environment."
+  },
+  "deploy_to": "path to deploy, e.g. /srv/my_app",
+  "owner": "owner for the application files when deployed",
+  "group": "group for the application files when deployed",
+  "packages": {
+    "package_name": "specific packages required for installation at the OS level to run the app like libraries and specific version, e.g.",
+    "curl": "7.19.5-1ubuntu2"
+  },
+  "pears": {
+    "pear_name": "specific gems required for installation to run the application, and if a specific version is required, e.g.",
+    "mongo": "1.1.4"
+  },
+  "local_settings_file": "some/realative/path/LocalSettings.php"
+}

+ 101 - 0
examples/templates/default/LocalSettings.php.erb

@@ -0,0 +1,101 @@
+<?php
+# This file was automatically generated by Chef.
+#
+# See includes/DefaultSettings.php for all configurable settings
+# and their default values, but don't forget to make changes in _this_
+# file, not there.
+#
+# Further documentation for configuration settings may be found at:
+# http://www.mediawiki.org/wiki/Manual:Configuration_settings
+
+# Protect against web entry
+if ( !defined( 'MEDIAWIKI' ) ) {
+	exit;
+}
+
+## Uncomment this to disable output compression
+# $wgDisableOutputCompression = true;
+
+## Basics
+$IP             = "<%= @path %>";
+
+## The URL base path to the directory containing the wiki;
+## defaults for all runtime URL paths are based off of this.
+## For more information on customizing the URLs please see:
+## http://www.mediawiki.org/wiki/Manual:Short_URL
+$wgScriptPath       = "";
+$wgScriptExtension  = ".php";
+
+## The relative URL path to the skins directory
+$wgStylePath        = "$wgScriptPath/skins";
+
+$wgLogo         ="http://chef-quick-starts.s3.amazonaws.com/mediawiki_opscode.png";
+
+## Database settings
+$wgDBtype       = "<%= @database['adapter'] %>";
+$wgDBserver     = "<%= @host %>";
+$wgDBname       = "<%= @database['database'] %>";
+$wgDBuser       = "<%= @database['username'] %>";
+$wgDBpassword   = "<%= @database['password'] %>";
+
+## Shared memory settings
+$wgMainCacheType    = CACHE_NONE;
+$wgMemCachedServers = array();
+
+## To enable image uploads, make sure the 'images' directory
+## is writable, then set this to true:
+$wgEnableUploads  = false;
+$wgUseImageMagick = true;
+$wgImageMagickConvertCommand = "/usr/bin/convert";
+
+# InstantCommons allows wiki to use images from http://commons.wikimedia.org
+$wgUseInstantCommons  = false;
+
+## If you use ImageMagick (or any other shell command) on a
+## Linux server, this will need to be set to the name of an
+## available UTF-8 locale
+$wgShellLocale = "en_US.utf8";
+
+## If you want to use image uploads under safe mode,
+## create the directories images/archive, images/thumb and
+## images/temp, and make them all writable. Then uncomment
+## this, if it's not already uncommented:
+#$wgHashedUploadDirectory = false;
+
+## If you have the appropriate support software installed
+## you can enable inline LaTeX equations:
+$wgUseTeX           = false;
+
+## Set $wgCacheDirectory to a writable directory on the web server
+## to make your wiki go slightly faster. The directory should not
+## be publically accessible from the web.
+#$wgCacheDirectory = "$IP/cache";
+
+# Site language code, should be one of ./languages/Language(.*).php
+$wgLanguageCode = "en";
+
+$wgSecretKey = "5bcf0c2322863d3ad09a001528c4a14492859a623bf574cdc773cd75ed7ce055";
+
+# Site upgrade key. Must be set to a string (default provided) to turn on the
+# web installer while LocalSettings.php is in place
+$wgUpgradeKey = "db81965ebefdff41";
+
+## Default skin: you can change the default skin. Use the internal symbolic
+## names, ie 'standard', 'nostalgia', 'cologneblue', 'monobook', 'vector':
+$wgDefaultSkin = "vector";
+
+## For attaching licensing metadata to pages, and displaying an
+## appropriate copyright notice / icon. GNU Free Documentation
+## License and Creative Commons licenses are supported so far.
+#$wgEnableCreativeCommonsRdf = true;
+$wgRightsPage = ""; # Set to the title of a wiki page that describes your license/copyright
+$wgRightsUrl  = "";
+$wgRightsText = "";
+$wgRightsIcon = "";
+# $wgRightsCode = ""; # Not yet used
+
+# Path to the GNU diff3 utility. Used for conflict resolution.
+$wgDiff3 = "/usr/bin/diff3";
+
+# Enabled Extensions. Most extensions are enabled by including the base extension file here
+# but check specific extension documentation for more details

+ 76 - 0
examples/templates/default/wp-config.php.erb

@@ -0,0 +1,76 @@
+<?php
+/** 
+ * The base configurations of the WordPress.
+ *
+ * This file has the following configurations: MySQL settings, Table Prefix,
+ * Secret Keys, WordPress Language, and ABSPATH. You can find more information by
+ * visiting {@link http://codex.wordpress.org/Editing_wp-config.php Editing
+ * wp-config.php} Codex page. You can get the MySQL settings from your web host.
+ *
+ * This file is used by the wp-config.php creation script during the
+ * installation. You don't have to use the web site, you can just copy this file
+ * to "wp-config.php" and fill in the values.
+ *
+ * @package WordPress
+ */
+
+// ** MySQL settings - You can get this info from your web host ** //
+/** The name of the database for WordPress */
+define('DB_NAME', '<%= @database['database'] %>');
+
+/** MySQL database username */
+define('DB_USER', '<%= @database['username'] %>');
+
+/** MySQL database password */
+define('DB_PASSWORD', '<%= @database['password'] %>');
+
+/** MySQL hostname */
+define('DB_HOST', '<%= @host %>');
+
+/** Database Charset to use in creating database tables. */
+define('DB_CHARSET', 'utf8');
+
+/** The Database Collate type. Don't change this if in doubt. */
+define('DB_COLLATE', '');
+
+/**#@+
+ * Authentication Unique Keys.
+ *
+ * Change these to different unique phrases!
+ * You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/ WordPress.org secret-key service}
+ * You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
+ *
+ * @since 2.6.0
+ */
+define('AUTH_KEY', '<%= @app['wordpress']['auth_key'] %>');
+define('SECURE_AUTH_KEY', '<%= @app['wordpress']['secure_auth_key'] %>');
+define('LOGGED_IN_KEY', '<%= @app['wordpress']['logged_in_key'] %>');
+define('NONCE_KEY', '<%= @app['wordpress']['nonce_key'] %>');
+/**#@-*/
+
+/**
+ * WordPress Database Table prefix.
+ *
+ * You can have multiple installations in one database if you give each a unique
+ * prefix. Only numbers, letters, and underscores please!
+ */
+$table_prefix  = 'wp_';
+
+/**
+ * WordPress Localized Language, defaults to English.
+ *
+ * Change this to localize WordPress.  A corresponding MO file for the chosen
+ * language must be installed to wp-content/languages. For example, install
+ * de.mo to wp-content/languages and set WPLANG to 'de' to enable German
+ * language support.
+ */
+define ('WPLANG', '');
+
+/* That's all, stop editing! Happy blogging. */
+
+/** WordPress absolute path to the Wordpress directory. */
+if ( !defined('ABSPATH') )
+	define('ABSPATH', dirname(__FILE__) . '/');
+
+/** Sets up WordPress vars and included files. */
+require_once(ABSPATH . 'wp-settings.php');

File diff suppressed because it is too large
+ 0 - 0
metadata.json


+ 4 - 2
metadata.rb

@@ -3,16 +3,18 @@ maintainer_email "cookbooks@opscode.com"
 license          "Apache 2.0"
 description      "Deploys and configures a variety of applications defined from databag 'apps'"
 long_description  IO.read(File.join(File.dirname(__FILE__), 'README.md'))
-version          "0.99.4"
+version          "0.99.5"
 recipe           "application", "Loads application databags and selects recipes to use"
 recipe           "application::django", "Deploys a Django application specified in a data bag with the deploy_revision resource"
 recipe           "application::gunicorn", "Sets up the deployed Django application with Gunicorn as the web server"
 recipe           "application::java_webapp", "Deploys a Java web application WAR specified in a data bag with the remote_file resource"
+recipe           "application::mod_php_apache2", "Sets up a deployed PHP application as a mod_php virtual host in Apache2"
 recipe           "application::passenger_apache2", "Sets up a deployed Rails application as a Passenger virtual host in Apache2"
+recipe           "application::php", "Deploys a PHP application specified in a data bag with the deploy_revision resource"
 recipe           "application::rails", "Deploys a Rails application specified in a data bag with the deploy_revision resource"
 recipe           "application::tomcat", "Sets up the deployed Java application with Tomcat as the servlet container"
 recipe           "application::unicorn", "Sets up the deployed Rails application with Unicorn as the web server"
 
-%w{ runit unicorn apache2 passenger_apache2 tomcat python gunicorn }.each do |cb|
+%w{ runit unicorn apache2 passenger_apache2 tomcat python gunicorn apache2 php }.each do |cb|
   depends cb
 end

+ 53 - 0
recipes/mod_php_apache2.rb

@@ -0,0 +1,53 @@
+#
+# Cookbook Name:: application
+# Recipe:: mod_php_apache2
+#
+# Copyright 2011, Opscode, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+app = node.run_state[:current_app]
+
+node.default['apache']['listen_ports'] = [ "8080" ]
+
+include_recipe "apache2"
+include_recipe "apache2::mod_rewrite"
+include_recipe "apache2::mod_deflate"
+include_recipe "apache2::mod_headers"
+include_recipe "apache2::mod_php5"
+
+server_aliases = [ "#{app['id']}.#{node['domain']}", node.fqdn ]
+
+if node.has_key?("ec2")
+  server_aliases << node.ec2.public_hostname
+end
+
+web_app app['id'] do
+  docroot "#{app['deploy_to']}/current"
+  template 'php.conf.erb'
+  server_name "#{app['id']}.#{node['domain']}"
+  server_aliases server_aliases
+  log_dir node['apache']['log_dir']
+end
+
+if ::File.exists?(::File.join(app['deploy_to'], "current"))
+  d = resources(:deploy => app['id'])
+  d.restart_command do
+    service "apache2" do action :restart; end
+  end
+end
+
+apache_site "000-default" do
+  enable false
+end

+ 144 - 0
recipes/php.rb

@@ -0,0 +1,144 @@
+#
+# Cookbook Name:: application
+# Recipe:: php
+#
+# Copyright 2011, Opscode, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+app = node.run_state[:current_app]
+
+include_recipe "php"
+
+###
+# You really most likely don't want to run this recipe from here - let the
+# default application recipe work it's mojo for you.
+###
+
+node.default['apps'][app['id']][node.app_environment]['run_migrations'] = false
+
+# the PHP projects have no standard local settings file name..or path in the project
+local_settings_full_path = app['local_settings_file'] || 'LocalSettings.php'
+local_settings_file_name = local_settings_full_path.split(/[\\\/]/).last
+
+## First, install any application specific packages
+if app['packages']
+  app['packages'].each do |pkg,ver|
+    package pkg do
+      action :install
+      version ver if ver && ver.length > 0
+    end
+  end
+end
+
+## Next, install any application specific gems
+if app['pears']
+  app['pears'].each do |pear,ver|
+    php_pear pear do
+      action :install
+      version ver if ver && ver.length > 0
+    end
+  end
+end
+
+directory app['deploy_to'] do
+  owner app['owner']
+  group app['group']
+  mode '0755'
+  recursive true
+end
+
+directory "#{app['deploy_to']}/shared" do
+  owner app['owner']
+  group app['group']
+  mode '0755'
+  recursive true
+end
+
+if app.has_key?("deploy_key")
+  ruby_block "write_key" do
+    block do
+      f = ::File.open("#{app['deploy_to']}/id_deploy", "w")
+      f.print(app["deploy_key"])
+      f.close
+    end
+    not_if do ::File.exists?("#{app['deploy_to']}/id_deploy"); end
+  end
+
+  file "#{app['deploy_to']}/id_deploy" do
+    owner app['owner']
+    group app['group']
+    mode '0600'
+  end
+
+  template "#{app['deploy_to']}/deploy-ssh-wrapper" do
+    source "deploy-ssh-wrapper.erb"
+    owner app['owner']
+    group app['group']
+    mode "0755"
+    variables app.to_hash
+  end
+end
+
+if app["database_master_role"]
+  dbm = nil
+  # If we are the database master
+  if node.run_list.roles.include?(app["database_master_role"][0])
+    dbm = node
+  else
+  # Find the database master
+    results = search(:node, "run_list:role\\[#{app['database_master_role'][0]}\\] AND app_environment:#{node['app_environment']}", nil, 0, 1)
+    rows = results[0]
+    if rows.length == 1
+      dbm = rows[0]
+    end
+  end
+
+  # Assuming we have one...
+  if dbm
+    template "#{app['deploy_to']}/shared/#{local_settings_file_name}" do
+      source "#{local_settings_file_name}.erb"
+      cookbook app["id"]
+      owner app["owner"]
+      group app["group"]
+      mode "644"
+      variables(
+        :path => "#{app['deploy_to']}/current",
+        :host => dbm['fqdn'],
+        :database => app['databases'][node['app_environment']],
+        :app => app
+      )
+    end
+  else
+    Chef::Log.warn("No node with role #{app['database_master_role'][0]}, #{local_settings_file_name} not rendered!")
+  end
+end
+
+## Then, deploy
+deploy_revision app['id'] do
+  revision app['revision'][node.app_environment]
+  repository app['repository']
+  user app['owner']
+  group app['group']
+  deploy_to app['deploy_to']
+  action app['force'][node.app_environment] ? :force_deploy : :deploy
+  ssh_wrapper "#{app['deploy_to']}/deploy-ssh-wrapper" if app['deploy_key']
+
+  purge_before_symlink([])
+  create_dirs_before_symlink([])
+  symlinks({})
+  symlink_before_migrate({
+    local_settings_file_name => local_settings_full_path
+  })
+end

+ 34 - 0
templates/default/php.conf.erb

@@ -0,0 +1,34 @@
+<VirtualHost *:8080>
+  ServerName <%= @params[:server_name] %>
+  ServerAlias <% @params[:server_aliases].each do |a| %><%= "#{a}" %> <% end %>
+  DocumentRoot <%= @params[:docroot] %>
+  RewriteEngine On
+  
+  <Directory <%= @params[:docroot] %>>
+    Options FollowSymLinks
+    AllowOverride None
+    Order allow,deny
+    Allow from all
+  </Directory>
+  
+  <Directory />
+    Options FollowSymLinks
+    AllowOverride None
+  </Directory>
+
+  <Location /server-status>
+    SetHandler server-status
+
+    Order Deny,Allow
+    Deny from all
+    Allow from 127.0.0.1
+  </Location>
+
+  LogLevel info
+  ErrorLog <%= node[:apache][:log_dir] %>/<%= @params[:name] %>-error.log
+  CustomLog <%= node[:apache][:log_dir] %>/<%= @params[:name] %>-access.log combined
+
+  RewriteEngine On
+  RewriteLog <%= node[:apache][:log_dir] %>/<%= @application_name %>-rewrite.log
+  RewriteLogLevel 0
+</VirtualHost>

Some files were not shown because too many files changed in this diff