0

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.

qualebs
  • 1,291
  • 2
  • 17
  • 34
  • This set up may be a bit more complex than what you actually need. If this is all your configuration, it won't work because you haven't told Apache where to forward requests to. Also, you have defined a worker in your properties file, but it looks like you aren't doing anything with it. Are you just trying to forward 1 apache to 1 glassfish? – Mike Dec 05 '16 at 08:48
  • yes mike that is precisely what I want to do. – qualebs Dec 06 '16 at 10:02

1 Answers1

2

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.

Mike
  • 4,852
  • 1
  • 29
  • 48
  • Thank you for this answer it helped a lot. But one more thing. As it stands when I enter my domain name on the browser it sends me to my glassfish server's default page. What do I need to change in order to see my applications `index.jsp` page instead? – qualebs Dec 09 '16 at 08:06
  • 1
    Wait, I just added my sites context root to the proxypass/reverse directive and voila! it worked. thanks a lot man you have been very helpful God bless you. – qualebs Dec 09 '16 at 08:15
  • No problem, glad to help – Mike Dec 09 '16 at 08:30