Getting Started with Xinetd

Xinetd is a light-weight and straightfoward HTTP server. Not as powerful as Nginx, but it's great for simple things like configuring health checks.

Xinetd is a super-server daemon that stands for “Extended Internet Daemon”. It’s a super-server because it provides access to other servers. It was designed to conserve system resources that would normally require multiple servers that stay idle most of the time. Given that’s its simple to install, lightweight, and supports access-controls, I end up using it in a variety of situations. One of the most common use-cases for me is to use it to set up health checks in AWS EC2 for elastic load balancers. You can just run Xinetd, point it to, say, a PHP file, that will run all your health checks and return a HTTP response, which will be returned to the ELB. The advantage is that I get to configure health checks for a variety of services and not rely on those services themselves. It can be configured to health check pretty much whatever I want.

Let’s do a basic tutorial to get you started. We’re going to be doing this on a Vagrant machine running Ubuntu.

Installing Xinetd

Installing Xinetd is pretty simple. Just run:

apt-get install xinetd

Once the installation is complete, have a look at /etc/xinetd.conf, and you will find that it includes files in /etc/xinetd.d. Go to /etc/xinetd.d and you can see a lot of sample configurations.

Testing It Out

Create a new file called /etc/xinetd.d/ayush and add the following in it:

service ayush
{
        log_type                = syslog
        log_on_success          = PID HOST DURATION USERID EXIT
        log_on_failure          = ATTEMPT HOST USERID
        socket_type             = stream
        protocol                = tcp
        wait                    = no
        server                  = /usr/bin/php
        user                    = ubuntu
        only_from               = 127.0.0.1
        server_args             = /tmp/ayush.php
        log_on_success          += DURATION
        nice                    = 10
        disable                 = no
}

Here we’re telling Xinetd to run the /tmp/ayush.php file using PHP whenever a call comes in.

Now add the following line at the end of /etc/services:

ayush 60321/tcp

Here we’re declaring the port and protocol for our new service.

Let’s create our /tmp/ayush.php file. Add the following content in it:

<?php
$response="Hello, World!";

echo"HTTP/1.1 200 OK" . PHP_EOL;
echo"Content-Type: text/plain" . PHP_EOL;
echo"Connection: close" . PHP_EOL;
echo"Content-Length: ".strlen($response) . PHP_EOL;
echo PHP_EOL;

echo $response;

Restart Xinetd using:

service xinetd restart

Now run curl http://localhost:60321, and you should see

Hello, World!

And that’s it!

What we just did was pretty simple. We created a new service for Xinetd in its configuration directory. We called the service ayush, but you can call it whatever you want. We create an entry for the same service in /etc/services, where we define the TCP port the service will use. In the configuration, we specified that it will execute a PHP file when called, which we then defined in /tmp/ayush.php. In the PHP file, remember to send the right headers and include a line-break or you might run in to the dreaded curl: (56) Recv failure: Connection reset by peer, which is still unresolved. But that’s no reason to give up on this awesome tool.

Have questions? Use the comments section below.

Resources

← previous post
Getting City, Country and ISP of an IP address using Maxmind GeoIP

next post →
Fixing ValueError('unknown locale: %s' % localename) in Python

37TechnologyView source