jump to navigation

Java HTTP proxy settings February 18, 2011

Posted by Anoop Somasundaran in Java, Linux, Tomcat, Unix.
Tags: , , , ,
add a comment

Some of you might have come across http connectivity issues especially when you setup your java application on staging or production servers. Due to security reasons, access to internet/external URLs within an organization is often through proxy servers. When I was trying to setup one of the java web applications on staging and production servers, the application was throwing an exception – ‘java.net.ConnectException: Connection refused’ when it tries to make an HTTP connection to get the content. However we were not getting this error in our development environment. I was almost sure that the problem could be because of the proxy servers used in the production and staging setup. The proxy server was blocking outbound traffic from the application servers.

After some trial and error attempts, I found the following solution to fix this issue.

I was using tomcat as the application server and I had to add the following lines in catalina.sh

JAVA_OPTS="$JAVA_OPTS -Dhttp.proxyHost=ProxyURL"
JAVA_OPTS="$JAVA_OPTS -Dhttp.proxyPort=ProxyPort"
JAVA_OPTS="$JAVA_OPTS -Dhttp.proxyUser=UserName" (Optional)
JAVA_OPTS="$JAVA_OPTS -Dhttp.proxyPassword=Password" (Optional)

Note: Please don’t copy and paste the above lines into Linux environment. The double quotes might give you issues on Linux if you copy double quotes from windows. I have faced this issue several times 😦

This problem can also be resolved by adding the following lines in your code.
System.getProperties().put("http.proxyHost", "ProxyURL");
System.getProperties().put("http.proxyPort", "ProxyPort");
System.getProperties().put("http.proxyUser", "UserName"); (Optional)
System.getProperties().put("http.proxyPassword", "Password"); (Optional)

Adding the settings at the server level seems to be a much better option though.

Advertisements

Shell script to compare two directories and copy missing files January 20, 2010

Posted by Anoop Somasundaran in Linux, Unix.
Tags: ,
4 comments

The following shell script compares two directories and copies missing files from the source directory to the destination directory. Please note that script doesn’t compare sub-directories. You can execute the scrip by supplying two parameters – source directory and destination directory.

/bin/bash
#####################################################################
# Created by Anoop Somasundaran
# This script takes two parameters- from_directory and to_directory.
# It finds the file differences and copy the files to the destination directory.
# Only missing files are copied. Sub directories are not considered
#####################################################################

# Check the number of input parameters. If two parameters are given go ahead, else exit
if [ $# -eq 2 ]
then
FROMDIR=$1
TODIR=$2
else
echo "Usage: script.sh fromdir todir"
exit
fi

# Validate from_directory
if [ ! -d "${FROMDIR}" ]
then
echo "Directory ${FROMDIR} does not exist!!"
exit
fi

# Validate to_directory
if [ ! -d "${TODIR}" ]
then
echo "Directory ${TODIR} does not exist!!"
exit
fi

cd ${FROMDIR}
for i in `find . -type f`
do
if [ ! -f ${TODIR}/$i ]
then
cp $i ${TODIR}/$i
fi

done

How to run the above script?

1) Copy the above script into a .sh file (script.sh)
2) You need to supply the complete path for source and destination directories while running the script.

$sh /home/script.sh /tmp/test1/ /tmp/test2/

Configuring Apache VirtualHost and Tomcat using mod_jk on Linux December 27, 2009

Posted by Anoop Somasundaran in Apache, Servers, Tomcat, Unix.
Tags: , , ,
3 comments

In one of my projects I was asked to configure Apache Virtual host and Tomcat on Linux. Though I had found few useful links in Google, I couldn’t find a complete tutorial which could satisfy my requirements. Hence I had to take points from different tutorials to configure Apache virtualhost and tomcat.

Given below is the configuration which worked for me.

Tomcat configuration:

I have described how to setup virtual host in tomcat in one of my earlier posts.
If you have only one application running on tomcat then you can simply keep it inside the webapps/ROOT folder and virtual host setup may not be required. If you want to remove the application name coming up in the url (localhost:8080/application), you need to either keep the application inside ROOT folder of webapps(this would be possible if you have only one application) or you need to setup virtual host. I had to setup virtual hosts in tomcat since I had multiple applications running on the tomcat.

Step 1: Configuring Tomcat server.xml

Add the following entry in server.xml (TOMCAT_HOME/conf/server.xml). This should be added below to <Host name=”localhost” ..>…….</Host>

<Host name="www.domain1.com" appBase="/opt/tomcat/www.domain1.com" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"/>

<Host name="www.domain2.com" appBase="/opt/tomcat/www.domain2.com" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"/>

Step 2: Deploying the applications

Create folders http://www.domain1.com and http://www.domain2.com inside TOMCAT_HOME. Copy the webapp1 to http://www.domain1.com and webapp2 to http://www.domain2.com. Rename both webapp1 and webapp2 to ROOT (ensure ROOT should be in uppercase).

The following should exist after the completion of step2.

TOMCAT_HOME/www.domain1.com/ROOT/webapp1_contents
TOMCAT_HOME/www.domain2.com/ROOT/webapp2_contents

Step 3: Enabling Tomcat Manager Console for the new hosts

The default tomcat manager console (http://localhost:8080/manager/html) will not be available for the new hosts. Manager Console needs to be enabled for the application deployed under each virtual host. This can be done by following the below steps.

Create folders http://www.domain1.com and http://www.domain2.com under TOMCAT_HOME/conf/Catalina/. Copy manager.xml from TOMCAT_HOME/conf/Catalina/localhost/ to TOMCAT_HOME/conf/Catalina/www.domain1.com/ and TOMCAT_HOME/conf/Catalina/www.domain1.com/.

The tomcat manager console for the hosts http://www.domain1.com and http://www.domain2.com can be accessed using the URLs http://www.domain1.com:8080/manager/html and http://www.domain2.com:8080/manager/html respectively.

Step 4: Adding host entry for each virtualhost

In production/staging environments normally the domain would be mapped to the IP of the machine. However in development environments we need to map the IP with the virtualhost. This can be done by adding a host entry in the host file. The ‘hosts’ file is typically located at C:\WINDOWS\system32\drivers\etc\hosts on windows and /etc/hosts on UNIX

Machine-IP http://www.domain1.com
Machine-IP http://www.domain2.com

Step 5: verifying the virtualhosts

Restart the Tomcat Server and check whether the webapp1 and webapp2 are accessible using the URLs http://www.domain1.com:8080 and http://www.domain2.com:8080 respectively.

Apache configuration:

Installing and configuring mod_jk connector:

Mod_jk can be used as a connector between Apache and tomcat. You may need to download the connector from the url http://www.apache.org/dist/tomcat/tomcat-connectors/jk/source/.

Follow the steps given below to install and configure the mod_jk

Unzip the tar file
tar -xvzf tomcat-connectors-1.2.26-src.tar.gz

Move the connector to the appropriate folder
mv tomcat-connectors-1.2.26-src /opt/tomcat-connectors

Building the connector:

Go to the native folder of the connector and run the buildconf command

./buildconf.sh

Check whether apx (Apache Extension Tool) is installed on the machine. If it is installed it is normally located at /usr/sbin/apxs or /usr/bin/apxs directory. You can use the find command to find out the apx installation directory

find / -name apxs

If apx is not installed, it has to be installed before continuing with the setup. It can be installed using the yum command.

yum install httpd-devel

Configuring the connector
This has to be executed from the native folder inside the connector directory.
./configure --with-apxs=/usr/sbin/apxs
Note: apxs(2) should be pointed to the correct installation directory in the above command

Making the connector
make

This will produce a modjk.so file. Copy the file to modules folder of apache.

cp /opt/apache-tomcat-connectors/native/apache-2.0/mod_jk.so /etc/httpd/modules/

Configuring workers file:

Create the file workers.properties in the folder /etc/httpd/conf/

$cd /etc/httpd/conf/
$touch workers.properties

Copy the content given below in to the workers.properties

workers.tomcat_home=/opt/tomcat
workers.java_home= /opt/jdk1.6.0_11
ps=/
worker.list=app1worker,app2worker
worker.app1worker.port=8009
worker.app1worker.host=www.domain1.com
worker.app1worker.type=ajp13
worker.app2worker.port=8009
worker.app2worker.host=www.domain1.com
worker.app2worker.type=ajp13

Configuring httpd.conf:

  • Including the mod_jk.so module in the module section
  • LoadModule jk_module /etc/httpd/modules/mod_jk.so

  • Including the mod_jk.so properties above the virtual host section
  • JkWorkersFile "/etc/httpd/conf/workers.properties"
    JkLogFile "/etc/httpd/logs/mod_jk.log"
    JkLogLevel info
    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"

    Adding virtual host for the application
    It is possible to setup name-based (More than one web site per IP address) and IP-based (An IP address for each web site) virtual hosts in Apache. You can choose the type of virtual hosts based on your requirement. In my case, I had different websites sharing the same IP and hence I had to setup name-based virtualhosts. More about virtualhosts is available on Apache website (http://httpd.apache.org/docs/2.0/vhosts/).

  • Add the following in the beginning of the virtual host section in httpd.conf
  • NameVirtualHost *:80

  • Add the vitual host directive for each application in httpd.conf
  • <VirtualHost *:80>
    ServerAdmin admin@www.mydomain1.com
    DocumentRoot "/opt/tomcat/mydomain1/ROOT/"
    ServerName http://www.mydomain1.com
    ErrorLog logs/www.mydomain1.com_log
    CustomLog logs/www.mydomain1.com_log combined
    JkMount / app1worker
    JkMount /* app1worker
    </VirtualHost>

    <VirtualHost *:80>
    ServerAdmin admin@www.mydomain2.com
    DocumentRoot "/opt/tomcat/mydomain2ROOT/"
    ServerName http://www.mydomain2com
    ErrorLog logs/www.mydomain2com_log
    CustomLog logs/www.mydomain2com_log combined
    JkMount / app2orker
    JkMount /* app2worker
    </VirtualHost>

Restart Apache:
Restart apache server for the above changes to take effect. Now webapp1 and webapp2 should be accessible using the URLs http://www.domain1.com and http://www.domain2.com respectively.