Quick Http Server
For many years I used to use python -mSimpleHTTPServer
whenever I wanted to start an HTTP server to surface folder as a set of static files. It is however no longer available in python 3 which I think says a lot about maintainers of python as a language - retaining backwards compatibility never seemed to be a priority.
On python 3 you can use python3 -m http.server
.
If you’re familiar with nginx and/or don’t want to continue using python for that simple purpose you can also use nginx, provided that you have it in one form or another - e.g. as a docker image on your local system.
Here are a few examples how to use it:
- Surface local folder, you must have a local html file in it, e.g. via
echo '<h1>Hello</h1>' > index.html
:
docker run --rm -it --network host -v $(pwd):/usr/share/nginx/html:ro --name local-nginx nginx
Above command uses host network, which may or may not be what you want. It is simple enough, albeit not secure if you expose port 80
to the outside world. Simply remove that if you’re OK with default docker network configuration or use port mapping. For added security, you can replace --network host
with -p 127.0.0.1:8080:80
which will bind port 80
that nginx will listen to to the port 8080
on your local network interface, i.e. in the latter case it will not be accessible outside your local host.
- A more complicated example would be using your own
nginx.conf
, e.g.:
docker run --rm -it -p 127.0.0.1:8080:80 -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro nginx
Key parts in the above example:
-p 127.0.0.1:8080:80
maps port 80 that nginx listens to to the localhost port8080
.$(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro
assumes that you havenginx.conf
in the current folder and maps it in read only mode to/etc/nginx/nginx.conf
file in the docker container with nginx which is configured by default to pick up its configuration from that location.
For starter, here is the minimalistic nginx.conf
example:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
gzip on;
server {
listen 80;
server_name localhost;
location / {
add_header Content-Type text/html;
return 200 '<html><body>Hello World</body></html>';
}
}
}