Skip to main content

Simple HTTP Server in Python

Have you ever come across a need to share a file over a local network to a number of machines? Have you ever felt the need to share output of a task in text files available at a web-endpoint? Often, there is a requirement to quickly setup a light-weight web-server for such requirements. Python provides the easiest way to setup a simple HTTP server for such use cases with a single command.

Python comes pre-installed with Linux as many of the linux libraries use python in background. Therefore there is no extra overhead of installing python. With support for python2 getting stopped in April 2020, many of the newer versions of linux distros come with default python3. Therefore this post will focus on setting up an HTTP server using both python2 and python3. We will be using Ubuntu 16.04, however it will work for majority of the linux systems where python comes pre-installed.

Preparation

Steps to follow before starting the server:
  1. Make sure you are in the directory which you want to share via server. If you aren't, navigate to an existing location or create a new directory.
  2. Create or move the files and subdirectories that you want to share in the parent directory on which the server will run.
Once all the files and directories to be shared over web-server are in one place and you are in that parent directory, we are good to go ahead and start the server.

For the purposes of this post, I have setup httpserver_demo directory in my /root directory which contains following files and subdirectories:


Python 2

Execute the following python2 command to start a server on port 23456.
python -m SimpleHTTPServer 23456


Of course you can choose a port of your choice between 0 and 65536 but make sure not to use any of the reserved ports or ports in use.

I have setup my server on a virtualbox VM. The following is the output when I hit the port from web-browser on my host machine:

Python 3

Let's start this server on the same host but on a different port, say 65432. Execute following command for python3
python3 -m http.server 65432


Following is the browser output for directory python_files:


Permanent Setup

While the server is working, you might have noticed that the server process is started in the foreground i.e. the shell in which you have started the server doesn't give back the shell prompt after executing the command. It keeps on showing you the access logs of the server. This is problematic if you need to keep the server on even after you log out of the system or your ssh connection to the remote host (if you are working on a remote system) breaks. In such cases, to prevent the web-server from terminating, the web-server must be started in a background process or an alternative process detached from your shell session.

Starting the process in background

This is the simplest solution. Just append an "&" at the end of the above commands and it will start the web-server in a background process.

Starting the server in a screen or tmux session

This is the solution that you may use if you want to keep all the access logs in one place and want to check them later by connecting back to the process in the future. However, the details are out of the scope of this post.

Practical Uses

Python http server has come in handy many times in my day-to-day requirements. When I was conducting lab sessions for one of the courses in my university as a teaching assistant, python http server was my primary tool to share big files and starter code with all the students. And it was the fastest way considering the file transfers happened over internal network. I also used this option to publish daily reports about code differences between code on version control system and code in production during my job. These reports were further used to alert users using an alerting service. There are many such possible uses of this simple light-weight web-server.

Do give it a try and let me know your experience.

Comments

Popular posts from this blog

The Changing Nature of Reality Shows in India

It's been almost two decades since the modern day reality shows started in India. And the nature of these reality shows has changed drastically during this time. "Kaun Banega Crorepati (KBC)" is no longer a show just about knowledge, "Indian Idol" and "Sa Re Ga Ma Pa" are no longer just singing shows. They all have become entertainment shows. This post is an attempt to find out the reasons of this transition, analyze the current nature of these shows and assess their impact. Reasons of this change Competition from TV Serials / Soap Opera TV serials or Soap Opera as it is commonly known is very popular among the Indian masses. India being a country where family ties are very strong, for a long time, the main theme in most popular TV shows has been "family drama". Additionally, there is no dearth of TV channels, actors, producers and the crew. TV show and film production is a major employment generator in India. And so the episodes of serials a...

Local domain name resolution using /etc/hosts

The /etc/hosts file is a powerful mechanism for managing the information about hosts in the local network in the absence of a local DNS server. Setup We have 4 VMs in the local /24 network. The following are the details: vm-1-ubuntu-16-04 - 10.0.1.11 vm-2-ubuntu-16-04 - 10.0.1.12 vm-1-ubuntu-18-04 - 10.0.1.21 vm-2-ubuntu-18-04 - 10.0.1.22 The VMs are reachable via their IP address but not by their hostnames. This is problematic because we have to remember their IP addresses everytime we want to access these hosts. It is would be much simpler to remember and access the servers by their hostnames. For that we need some sort of mapping between the IP addresses and their corresponding host names. There are 3 common ways of achieving this mapping. Setup a DNS server which handles resolution for your local network. Use an existing DNS server of the local Internet Service Provider (ISP) or any other higher level ISP. Note that a public static IP address is required for this s...

Manage system hostname with hostnamectl

This article explains the simplest method to set hostname and Fully Qualified Domain Name (FQDN/fqdn) of any given system using hostnamectl Check that hostnamectl is present on the system by typing it in a shell. You will see output similar to the one given below. In case hostnamectl is not found, it is a good idea to install it. sudo apt update sudo apt install systemd-services Verify the static hostname given above using the following command: Also verify it by checking /etc/hostname file Change the hostname and set the desired hostname by running the following command and authenticating with the password. hostnamectl set-hostname <hostname> Start a new shell session or reconnect to the server to see the change in the hostname Again run above steps to verify that hostname has been changed correctly. Configure FQDN While the above process may suffice to identify the host in the local network, it is not enough when the host is to be identifi...