Search code examples
apacheglassfishubuntu-servermod-jk

How to setup glassfish 4.1.1 behind apache on Ubuntu 16.04 server


I want to setup Apache and Glassfish on Ubuntu 16.04 server. I have installed

  • apache2
  • libapache2-mod-jk
  • glassfish

The following are the steps I have followed

Configuring the MPM module

Set MaxRequestWorkers to 400 in /etc/apache2/mods-available/mpm_event.conf

Configuring the JK Module

<IfModule mod_jk.c>
  JkWorkersFile /usr/share/glassfish4/glassfish/domains/<domain-doamin1>/config/workers.properties
  JkLogFile /var/log/apache2/mod_jk.log
  JkLogLevel error
  JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
  JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
  JkRequestLogFormat "%w %V %T"
  JkMountCopy all
    </IfModule>

JkMount /myapp/* ajp13
<Location "/myapp/WEB-INF/">
  require all denied
</Location>

Create a workers.properties file in your GlassFish domain's config directory

worker.list=ajp13
worker.ajp13.type=ajp13
worker.ajp13.host=localhost
worker.ajp13.port=8009
# load balancing only: worker.ajp13.lbfactor=50
connection_pool_size=10
connection_pool_timeout=600
worker.ajp13.socket_keepalive=False
worker.ajp13.socket_timeout=30

Create the JK listener in GlassFish using these commands

asadmin create-http-listener --listenerport 8009 --listeneraddress 0.0.0.0 --defaultvs server jk-listener

asadmin set server-config.network-config.network-listeners.network-listener.jk-listener.jk-enabled=true

then I restarted glassfish domain successfully but when i try to restart apache2 with sudo /etc/init.d/apache2 restart I get the error below

[....] Restarting apache2 (via systemctl): apache2.serviceJob for apache2.service failed because the control process exited with error code. See "systemctl status apache2.service" and "journalctl -xe" for details. failed!

This error occurs when I edit the file jk.conf located under /etc/apache2/mods-available/jk.conf

Where am I going wrong. Is there a complete guide to accomplishing this? Finally the newer apache2 doesn't have the file httpd.conf and all the tutorials allover the Internet rely upon this file. Thanks in advance.


Solution

  • Since your objective is just to forward requests from Apache to GlassFish, not to loadbalance requests from Apache to multiple GlassFish servers, I would recommend avoiding mod_jk. You can certainly achieve your goal with it, but if you are new to the concepts involved, you will find it difficult to understand and maintain.

    Instead you can use mod_proxy and, optionally, mod_proxy_ajp.

    First, a definition:


    AJP vs HTTP

    AJP is a protocol like HTTP, but binary rather than text based. It has no secure/insecure options like HTTPS/HTTP since it is normally used behind a firewall and performs much better than HTTP for these scenarios. When you mark any GlassFish network listener as jk-enabled, you are enabling AJP communication, rather than HTTP.

    You've installed Apache via the ubuntu apache2 package which has its own example structure to configuration which is different to the layout you would get if you downloaded and unzipped it. This has advantages, but we need to understand the Apache configuration file before getting to that.


    Apache Configuration

    Generally, you will see internet guides refer to httpd.conf as the configuration file to edit. This is just the default "parent" configuration file. In Debian/Ubuntu systems (and their derivations, like Linux Mint), the file to look for is apache2.conf.

    This file is read, and its directives applied, from top to bottom, so if you have set the same property to two different values, the second will apply. (More accurately, they will both apply but the first will only apply until the second setting is read).

    This file can also specifically "include" files and folders (where any *.conf file in an included folder will be included). These will be read in and merged with the main configuration at the point where the "include" statement is written. So the very last line in the main configuration file (if it is not specifying another file) will be the last line of configuration to be set, no matter what.


    Debian config layout

    I would highly recommend you read the opening comment in the apache2.conf file, since it will tell you all you need to know about the layout. Suffice it to say that keeping all the config in one file is very painful to maintain. The Debian package separates configuration into three categories:


    sites Sites are single configuration files for a website or web project. This could be anything: PHP, static HTML or a Java EE application deployed to an app server like GlassFish.

    mods Modules are subdivided into *.load files which load the actual libraries needed to run them, and *.conf files which have global configuration for the modules. Note that this configuration applies to every site that uses the module, so it is best to put any site/app specific module configuration in the appropriate site.conf file

    conf These files are just for any other general configuration which fits into a nice group. This could be SSL configuration like keystore and truststore locations.


    When you look at the directory structure, you will see that each of these have 2 folders: *-available and *-enabled. This is because the Debian Apache package comes with 6 helper tools, a2ensite and a2dissite; a2enmod and a2dismod; a2enconf and a2disconf. The idea is that you follow these rules:

    • Never directly edit the apache2.conf file
    • only ever add or change files in the *-available folders
    • Use the helper tools to enable or disable sites/modules/conf files.

    Answer

    So to (finally) answer your question, I would do the following steps:

    1. Enable mod_proxy_ajp a2enmod mod_proxy_ajp

    2. Create a new myApp.conf in sites-available. You can copy the default one, which is a good example. Assuming you have just want to forward all requests to GlassFish, you can use the default VirtualHost settings of ` which will process a request for any hostname on port 80. Use port 443 if you want to add HTTPS.

    3. Add ProxyPass and ProxyPassReverse directives to the location of your server. If Apache and GlassFish are on the same server, it is likely you will want to use ajp://localhost:8080

       ProxyPass            /      ajp://host_name:0000
       ProxyPassReverse     /      ajp://host_name:0000
      

    Note: This assumes you are using AJP. If that causes you problems, switch to HTTP by changing ajp to http above and disabling the jk-listener in GlassFish.

    1. Once you have completed your myApp.conf configuration, remember to disable the default site:

      a2dissite 000-default-site.conf
      

      And enable your new site:

      a2ensite myApp.conf
      

    Those commands will appropriately modify the main apache2.conf and create the appropriate links in the sites-enabled folder.

    That should be all you need. Now, everything that points to your hostname after the root / of the URL will be forwarded to the root context / of GlassFish.