blob: ff67c3ca5de7495952b145ba11fa94e90484f65e [file] [log] [blame]
type=page
status=published
title=Configuring HTTP Load Balancing
next=rolling-upgrade.html
prev=named-configurations.html
~~~~~~
= Configuring HTTP Load Balancing
[[GSHAG00009]][[abdgs]]
[[configuring-http-load-balancing]]
== 7 Configuring HTTP Load Balancing
This chapter describes how to configure HTTP load balancing on {productName} 7.
The following topics are addressed here:
* link:#abdgx[Setting Up HTTP Load Balancing]
For information on other types of load balancing, see
link:jms.html#abdbk[Configuring Java Message Service High Availability]
and link:rmi-iiop.html#fxxqs[RMI-IIOP Load Balancing and Failover].
[[abdgx]][[GSHAG00202]][[setting-up-http-load-balancing]]
=== Setting Up HTTP Load Balancing
This section describes how to set up load balancing for {productName}.
The following topics are addressed here:
* link:#abdgy[Prerequisites for Setting Up HTTP Load Balancing]
* link:#gksdt[Configuring {productName} with Apache HTTP Server and `mod_jk`]
* link:#CHDCCGDC[Configuring {productName} with Apache HTTP Server and `mod_proxy_ajp`]
* link:#abdgz[HTTP Load Balancer Deployments]
[[abdgy]][[GSHAG00281]][[prerequisites-for-setting-up-http-load-balancing]]
==== Prerequisites for Setting Up HTTP Load Balancing
Before configuring your load balancer, you must:
* Install a supported web server and configure it. If using the `mod_jk`
or `mod_proxy_ajp` modules, the only supported web server is Apache HTTP Server 2.2.x.
* Configure the `mod_jk` connector module, as described in
link:#gksdt[Configuring {productName} with Apache HTTP Server and `mod_jk`],
or configure the `mod_proxy_ajp` connector module, as
described in link:#CHDCCGDC[Configuring {productName} with Apache
HTTP Server and `mod_proxy_ajp`].
* Create {productName} clusters or server instances to participate in load balancing.
* Deploy applications to these clusters or instances.
[[gksdt]][[GSHAG00282]][[configuring-glassfish-server-with-apache-http-server-and-mod_jk]]
==== Configuring {productName} with Apache HTTP Server and `mod_jk`
{productName} 7 can be configured for load balancing with Apache
HTTP Server as a front end by enabling the Apache `mod_jk` connector
module. To enable the `mod_jk` module in {productName}, set the
{productName} `jk-enabled` `network-listener` attribute. You can also
create `jk-connectors` under different virtual-servers using the
`jk-enabled` `network-listener` attribute.
[[gksde]][[GSHAG00143]][[to-configure-the-mod_jk-connector-module]]
===== To Configure the `mod_jk` Connector Module
1. Install http://httpd.apache.org/docs/2.2/install.html[Apache HTTP Server]
(`http://httpd.apache.org/docs/2.2/install.html`) and
http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html[mod_jk]
(`http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html`).
2. Configure `workers.properties` and `httpd.conf`. For example:
* `apache2/config/workers.properties`
+
[source]
----
# Define 1 real worker using ajp13
worker.list=worker1
# Set properties for worker1 (ajp13)
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
----
* `apache2/conf/httpd.conf`
+
[source]
----
LoadModule jk_module /Users/Amy/apache2/modules/mod_jk-1.2.25-httpd-2.2.4.so
JkWorkersFile /Users/Amy/apache2/conf/worker.properties
# Where to put jk logs
JkLogFile /Users/Amy/apache2/logs/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel debug
# Select the log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
# JkOptions indicate to send SSL KEY SIZE,
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
# JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"
# Send everything for context /examples to worker named worker1 (ajp13)
JkMount /examples/* worker1
----
3. Start Apache HTTP Server.
4. Create a jk-enabled network listener by using the
link:reference-manual/create-network-listener.html#GSRFM00046[`create-network-listener`] subcommand.
+
[source]
----
asadmin> create-network-listener --protocol http-listener-1 \
--listenerport 8009 --jkenabled true jk-connector
----
5. If you are using the `glassfish-jk.properties` file, set the
`jk-configuration-file` property of the network listener to the
fully-qualified file name of the `glassfish-jk.properties` file.
+
[source]
----
asadmin> set server-config.network-config.network-listeners.network-listener.\
jk-connector.jk-configuration-file=domain-dir/config/glassfish-jk.properties
----
6. If you expect to need more than five threads for the listener,
increase the maximum threads in the `http-thread-pool` pool:
+
[source]
----
asadmin> set configs.config.server-config.thread-pools.thread-pool.\
http-thread-pool.max-thread-pool-size=value
----
7. Restart {productName}.
[[GSHAG00065]][[gktpu]]
Example 7-1 `httpd.conf` File for Load Balancing
This example shows an `httpd.conf` file that is set for load balancing.
[source]
----
LoadModule jk_module /usr/lib/httpd/modules/mod_jk.so
JkWorkersFile /etc/httpd/conf/worker.properties
# Where to put jk logs
JkLogFile /var/log/httpd/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel debug
# Select the log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
# JkOptions indicate to send SSL KEY SIZE,
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
# JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"
# Send all jsp requests to GlassFish
JkMount /*.jsp worker1
# Send all glassfish-test requests to GlassFish
JkMount /glassfish-test/* loadbalancer
----
[[GSHAG00066]][[gktpe]]
Example 7-2 `workers.properties` File for Load Balancing
This example shows a `workers.properties` or `glassfish-jk.properties`
file that is set for load balancing. The `worker.worker*.port` should
match with JK ports you created.
[source]
----
worker.list=worker1,worker2,loadbalancer
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
worker.worker1.lbfactor=1
worker.worker1.socket_keepalive=1
worker.worker1.socket_timeout=300
worker.worker2.type=ajp13
worker.worker2.host=localhost
worker.worker2.port=8010
worker.worker2.lbfactor=1
worker.worker2.socket_keepalive=1
worker.worker2.socket_timeout=300
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=worker1,worker2
----
[[CHDCCGDC]][[GSHAG494]][[configuring-glassfish-server-with-apache-http-server-and-mod_proxy_ajp]]
==== Configuring {productName} with Apache HTTP Server and `mod_proxy_ajp`
{productName} 7 can be configured for load balancing with Apache
HTTP Server as a front end by enabling the Apache `mod_proxy_ajp`
connector module. To enable the `mod_proxy_ajp` module in {productName}, set the {productName} `jk-enabled` `network-listener`
attribute. You can also create `jk-connectors` under different
virtual-servers using the `jk-enabled` `network-listener` attribute.
[[GSHAG495]][[sthref22]]
[[to-configure-the-mod_proxy_ajp-connector-module]]
===== To Configure the `mod_proxy_ajp` Connector Module
1. Install http://httpd.apache.org/docs/2.2/install.html[Apache HTTP Server]
(`http://httpd.apache.org/docs/2.2/install.html`).
2. Configure `httpd.conf`. For example:
+
[source]
----
LoadModule proxy_module /usr/lib/httpd/modules/mod_proxy.so
LoadModule proxy_ajp_module /usr/lib/httpd/modules/mod_proxy_ajp.so
Listen 1979
NameVirtualHost *:1979
<VirtualHost *:1979>
ServerName localhost
ErrorLog /var/log/apache2/ajp.error.log
CustomLog /var/log/apache2/ajp.log combined
<Proxy *>
AddDefaultCharset Off
Order deny,allow
Allow from all
</Proxy>
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/
</VirtualHost>
----
3. Start Apache HTTP Server.
4. Create a jk-enabled network listener by using the `create-network-listener` subcommand.
+
[source]
----
asadmin> create-network-listener --protocol http-listener-1 \
--listenerport 8009 --jkenabled true jk-connector
----
5. If you expect to need more than five threads for the listener,
increase the maximum threads in the `http-thread-pool` pool:
+
[source]
----
asadmin> set configs.config.server-config.thread-pools.thread-pool.\
http-thread-pool.max-thread-pool-size=value
----
6. Restart {productName}.
[[abdgz]][[GSHAG00284]][[http-load-balancer-deployments]]
==== HTTP Load Balancer Deployments
You can configure your load balancer in different ways, depending on
your goals and environment, as described in the following sections:
* link:#abdha[Using Clustered Server Instances]
* link:#abdhc[Using Multiple Standalone Instances]
[[abdha]][[GSHAG00232]][[using-clustered-server-instances]]
===== Using Clustered Server Instances
The most common way to deploy the load balancer is with a cluster or
clusters of server instances. By default all the instances in a cluster
have the same configuration and the same applications deployed to them.
The load balancer distributes the workload between the server instances
and requests fail over from an unhealthy instance to a healthy one. If
you've configured HTTP session persistence, session information persists
when the request is failed over.
If you have multiple clusters, requests can be load balanced across
clusters but are only failed over between the instances in a single
cluster. Use multiple clusters in a load balancer to easily enable
rolling upgrades of applications. For more information, see
link:rolling-upgrade.html#abdik[Upgrading Applications Without Loss of Availability].
[NOTE]
====
Requests cannot be load balanced across clusters and standalone instances.
====
[[abdhc]][[GSHAG00233]][[using-multiple-standalone-instances]]
===== Using Multiple Standalone Instances
It is also possible to configure your load balancer to use multiple
standalone instances, and load balance and failover requests between
them. However, in this configuration, you must manually ensure that the
standalone instances have homogenous environments and the same
applications deployed to them. Because clusters automatically maintain a
homogenous environment, for most situations it is better and easier to
use clusters.
[TIP]
====
Load balancing across multiple standalone instances only provides
failover for requests, and any associated HTTP session data will not be
failed over. This is another reason why using a cluster, which can
provide session failover, is a more desirable load balancing
configuration.
====