In this article we would show a simple demonstration of using our own custom error pages which would be severed from Apache side with the static contents like image/HTML/etc files, however here we would using images and HTML pages as a repository. Custom error pages are been required by everyone in there production environments, becasue one would not like there clients to see the default error pages when some issue comes from the server side or by mistake your clients tries to access a non-existing page in your application, hence with this article you can show your own custom error pages using Apache for JBoss AS 7
We would be using the standalone mode for this article and in JBoss AS 7.1.0.CR1b version we have a different xml file called standalone-full.xml which would be used with Apache mod_jk.
Now there are few things which has to be noted here to achieve this configuration
- Add system-properties to give the jvmRoute
- Enable AJP protocol and add AJP port
Custom error pages in Apache for JBoss AS7
For this we would have to modify from both side Apache as well as JBoss AS7 side, hence lets see the configuration one at a time
Apache side configuration
Lets see what all configuration has to be made from Apache side
- You can configure mod_jk from the below article
- In the above article you just have to replace the Step-8 by the following content
- And in the Step-10 of above article replace it by the following content
Configuring mod_jk to connect to JBoss
In the following section of the above link: “Apache WebServer Configuration Part”
##### JBOSS ############# LoadModule jk_module modules/mod_jk.so # Include mod_jk's specific configuration file Include conf/mod_jk.conf Listen 10.10.10.10:80 # (1) Setting up the Alias for the "error" directory Alias /error/ "/etc/httpd/www/error/" # (2) Mapping the error codes with custom error pages ErrorDocument 404 /error/404_ErrorPage.html ErrorDocument 503 /error/MaintenancePage.html <VirtualHost 10.10.10.10:80> # (3) All the application context would go to "nodeA" JkMount /* nodeA # (4) Setting error code 404 for "MyApp" application JkMount /MyApp/* nodeA;use_server_errors=404 # Static files in the examples webapp are served by Apache Alias /images /etc/httpd/www/html/MyApp/images # All requests go to nodeA JkMount /* nodeA # Serve html, jpg, png etc using httpd JkUnMount /*.html nodeA JkUnMount /*.png nodeA JkUnMount /*.jpg nodeA JkUnMount /*.gif nodeA </VirtualHost> ###########################
Where: 10.10.10.10:80 is the “IP_ADDRESS:PORT” of your Apache box
##### JBOSS ############# # Define list of workers that will be used for mapping requests worker.list=nodeA,status # Status worker for managing load balancer worker.status.type=status # Define nodeA modify the host as your host IP or DNS name. worker.nodeA.port=8009 worker.nodeA.host=20.20.20.20 worker.nodeA.type=ajp13 worker.nodeA.ping_mode=A ###########################
Where: 20.20.20.20 is the “binding address” of your JBoss AS7 on which it is running and “8009” is the AJP port
So with the above configuration you can see that
- In the path “/etc/httpd/www/error/” would have all custom error pages with an alias “error”
- Mapping the custom error pages with the respective error codes
- All the application would be severed by “nodeA”
- If someone tires to access some page which is not present in the application would get our 404 custom error page.
Following are the custom error pages which we have created. Hope you like them.
MaintenancePage.html
<html> <head> <title>Middleware Magic - 503 Custom Error Page</title> </head> <body> <center><font color=maroon> <h1>Custom Maintenance Page</h1> <h2>Oops...You caught us down !!!.<br><br> <img src="/images/down.jpg"/><br><br> Please try after sometime...</h2><br> <img src="/images/MiddlewareMagic.png" width="150" height="150" /> <h1>Middleware Magic</h1> </font> </center> </body> </html>
404_ErrorPage.html
<html> <head> <title>Middleware Magic - 404 Custom Error Page</title> </head> <body> <center><font color=maroon> <h1>404 Error - Page Not Found</h1> <h2>Look's like your yesterday's HANGOVER has not gone...<br><br> <img src="/images/hangover.jpg" width="200" height="200"/><br><br> Try accessing the correct page !!!</h2><br> <img src="/images/MiddlewareMagic.png" width="150" height="150"/> <h1>Middleware Magic</h1> </font> </center> </body> </html>
JBoss AS7 side configuration
Lets see what all configuration has to be made from JBoss AS7 side
- As described earlier we would have to add the system-properties to give the jvmRoute which can be done by adding the “system-propertie” tag just after the extensions gets over, as shown below
- By default in JBoss AS7 AJP protocol and port are not their, hence we would have to enable and add them as shown below
<extensions> . . </extensions> <!-- Below system properties tag has been added --> <system-properties> <property name="jvmRoute" value="nodeA"/> </system-properties>
Enabling AJP protocol
<subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host"> <connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http"/> <!-- We have to enable the AJP protocol by adding below line --> <connector name="ajp" protocol="AJP/1.3" socket-binding="ajp" enabled="true"/>
Adding AJP port
<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}"> <socket-binding name="http" port="8080"/> <!-- We have to add the AJP port by adding below line --> <socket-binding name="ajp" port="8009"/>
The configuration has been done from both the ends, now comes the application which would be used to test the above configuration which have done.
Steps to create a test application
- Create a folder called MyApp
- In “MyApp” folder create index.jsp file and WEB-INF folder which has web.xml inside it and copy the below code in “web.xml”
- In “index.jsp” file copy the below code in it
- Once you have done with all this you now just have to create an WAR file out of this, for that you need to be in the MyApp folder and run the below command (make sure you have setted the java/bin in your PATH). Note: you would have to give the (.) dot at last as well
<web-app> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
<html> <head> <title>Middleware Magic - MyApp Static Page Test</title> </head> <body> <center><h3><font color=maroon>This page coming from JBoss AS7....</font></h3> <h1><font color=maroon>but image is coming from Apache!!! </font></h1> <img src="/images/MiddlewareMagic.png"/> <h1><font color=maroon>Middleware Magic </font></h1></center> </body> </html>
NOTE: You would have to give the image name with the extension which is present in the path “/etc/httpd/www/html/MyApp/images” from Apache side.
MyApp] jar -cvf MyApp.war .
Testing
Now just start your Apache and JBoss AS7 by keeping the “MyApp.war” in “/standalone/deployments” folder and hit the Apache URL with the context root of the application.
http://10.10.10.10:80/MyApp
You will notice that the JSP file is been picked up from JBoss AS7 but the image is been picked up from Apache which is getting displaced on the page, this means that the static content is been served from Apache.
Good our application is working fine, now lets try if your custom error pages work. Hence try hitting the below URL to check the custom 404 error page
http://10.10.10.10:80/MyApp/a.jsp
That’s working, let try the custom maintenance page, for that we would have to shut-down the JBoss AS7 server which would give us 503 error which means that the backend server is down, which we do sometime if we need to do a maintenance on the JBoss sever side. Thus bring down your running JBoss AS 7 server and hit the below link
http://10.10.10.10:80/MyApp
August 16th, 2013 on 3:34 pm
In #2 above
# (4) Setting error code 404 for “MyApp” application
JkMount /MyApp/* nodeA;use_server_errors=404
In my windows env it works where it points to jboss directly
JkMount /MyApp/* jboss7;use_server_errors=500
But in linux where it points to load balancer
JkMount /MyApp/* loadbalancer2;use_server_errors=500
This gives me error jk_handler::mod_jk.c (2372): Could not find a worker for worker name=loadbalancer2;use_server_errors=500
Any guess what’s the problem?
September 15th, 2015 on 10:34 pm
Hello, thank you for your post,
I tryied your solution and it’s working,
the problem is that
I have a “war” project in which i specified my “war customized 404 error page”
web.xml
404
/notFound.html
And with your solution, this “war customized 404 error page” is no longer reachable.
Is there a way to have the two 404 error pages ?
one for: http://host/MyWarAppalication/inexistentResource.jsp
and one for:
http://host/inexistentResource.jsp