mongoose/UserManual.md
2013-02-05 18:00:49 +00:00

9.4 KiB

NOTE: THIS MANUAL IS WORK IN PROGRESS

Overview

Mongoose is small and easy to use web server. It is self-contained, and does not require any external software to run.

On Windows, mongoose iconifies itself to the system tray icon when started. Right-click on the icon pops up a menu, where it is possible to stop mongoose, or configure it, or install it as Windows service.

On UNIX and Mac, mongoose is a command line utility. Running mongoose in terminal, optionally followed by configuration parameters (mongoose [OPTIONS]) or configuration file name (mongoose [config_file_name]) starts the web server. Mongoose does not detach from terminal. Pressing Ctrl-C keys would stop the server.

When started, mongoose first searches for the configuration file. If configuration file is specified explicitly in the command line, i.e. mongoose path_to_config_file, then specified configuration file is used. Otherwise, mongoose would search for file mongoose.conf in the same directory where binary is located, and use it. Configuration file is a sequence of lines, each line containing command line argument name and it's value. Empty lines, and lines beginning with #, are ignored. Here is the example of mongoose.conf file:

# mongoose.conf file
document_root c:\www
listening_ports 8080,8043s
ssl_certificate c:\mongoose\ssl_cert.pem

When configuration file is processed, mongoose process command line arguments, if they are specified. Command line arguments therefore can override configuration file settings. Command line arguments must start with -. For example, if mongoose.conf has line document_root /var/www, and mongoose has been started as mongoose -document_root /etc, then /etc directory will be served as document root, because command line options take priority over configuration file.

Mongoose can also be used to modify .htpasswd passwords file:

mongoose -A <htpasswd_file> <realm> <user> <passwd>

Usage Examples

  • How to share a Windows folder: copy mongoose executable to a folder and double-click the executable. The folder should be accessible via http://localhost:8080 in any browser.

  • How to start mongoose at UNIX startup time in daemon mode, serving directory /var/www: put this line in the system startup script: /path/to/mongoose -listening_ports 80 -document_root /var/www &

  • How to serve user home directories using URL rewrite: mongoose -url_rewrite_patterns /~joe/=/home/joe/,/~bill=/home/bill/

Configuration Options

     -C cgi_pattern
         All files that fully match cgi_pattern are treated as CGI.
         Default pattern allows CGI files be anywhere. To restrict CGIs to
         certain directory, use e.g. "-C /cgi-bin/**.cgi".  Default:
         "**.cgi$|**.pl$|**.php$"

     -E cgi_environment
         Extra environment variables to be passed to the CGI script in
         addition to standard ones. The list must be comma-separated list
         of X=Y pairs, like this: "VARIABLE1=VALUE1,VARIABLE2=VALUE2".
         Default: ""

     -G put_delete_passwords_file
         PUT and DELETE passwords file. This must be specified if PUT or
         DELETE methods are used. Default: ""

     -I cgi_interpreter
         Use cgi_interpreter as a CGI interpreter for all CGI scripts
         regardless script extension.  Mongoose decides which interpreter
         to use by looking at the first line of a CGI script.  Default:
         "".

     -P protect_uri
         Comma separated list of URI=PATH pairs, specifying that given
         URIs must be protected with respected password files. Default: ""

     -R authentication_domain
         Authorization realm. Default: "mydomain.com"

     -S ssi_pattern
         All files that fully match ssi_pattern are treated as SSI.
         Unknown SSI directives are silently ignored. Currently, two SSI
         directives are supported, "include" and "exec".  Default:
         "**.shtml$|**.shtm$"

     -T throttle
         Limit download speed for clients.  throttle is a comma-separated
         list of key=value pairs, where key could be a '*' character
         (limit for all connections), a subnet in form x.x.x.x/mask (limit
         for a given subnet, for example 10.0.0.0/8), or an URI prefix
         pattern (limit for the set of URIs, for example /foo/**). The
         value is a floating-point number of bytes per second, optionally
         followed by a `k' or `m' character, meaning kilobytes and
         megabytes respectively. A limit of 0 means unlimited rate. The
         last matching rule wins. For example, "*=1k,10.0.0.0/8" means
         limit everybody to 1 kilobyte per second, but give people from
         10/8 subnet unlimited speed. Default: ""

     -a access_log_file
         Access log file. Default: "", no logging is done.

     -d enable_directory_listing
         Enable/disable directory listing. Default: "yes"

     -e error_log_file
         Error log file. Default: "", no errors are logged.

     -g global_passwords_file
         Location of a global passwords file. If set, per-directory
         .htpasswd files are ignored, and all requests must be authorised
         against that file.  Default: ""

     -i index_files
         Comma-separated list of files to be treated as directory index
         files.  Default: "index.html,index.htm,index.cgi"

     -l access_control_list
         Specify access control list (ACL). ACL is a comma separated list
         of IP subnets, each subnet is prepended by '-' or '+' sign. Plus
         means allow, minus means deny. If subnet mask is omitted, like
         "-1.2.3.4", then it means single IP address. Mask may vary from 0
         to 32 inclusive. On each request, full list is traversed, and
         last match wins. Default setting is to allow all. For example, to
         allow only 192.168/16 subnet to connect, run "mongoose
         -0.0.0.0/0,+192.168/16".  Default: ""

     -m extra_mime_types
         Extra mime types to recognize, in form "extension1=type1,exten-
         sion2=type2,...". Extension must include dot.  Example: "mongoose
         -m .cpp=plain/text,.java=plain/text". Default: ""

     -p listening_ports
         Comma-separated list of ports to listen on. If the port is SSL, a
         letter 's' must be appeneded, for example, "-p 80,443s" will open
         port 80 and port 443, and connections on port 443 will be SSL-ed.
         It is possible to specify an IP address to bind to. In this case,
         an IP address and a colon must be prepended to the port number.
         For example, to bind to a loopback interface on port 80 and to
         all interfaces on HTTPS port 443, use "mongoose -p
         127.0.0.1:80,443s". Default: "8080"

     -r document_root
         Location of the WWW root directory. Default: "."

     -s ssl_certificate
         Location of SSL certificate file. Default: ""

     -t num_threads
         Number of worker threads to start. Default: "10"

     -u run_as_user
         Switch to given user's credentials after startup. Default: ""

     -w url_rewrite_patterns
         Comma-separated list of URL rewrites in the form of "pattern=sub-
         stitution,..." If the "pattern" matches some prefix of the
         requested URL, then matched prefix gets substituted with "substi-
         tution".  For example, "-w /con-
         fig=/etc,**.doc|**.rtf=/path/to/cgi-bin/handle_doc.cgi" will
         serve all URLs that start with "/config" from the "/etc" direc-
         tory, and call handle_doc.cgi script for .doc and .rtf file
         requests. If some pattern matches, no further matching/substitu-
         tion is performed (first matching pattern wins). Use full paths
         in substitutions. Default: ""

     -x hide_files_patterns
         A prefix pattern for the files to hide. Files that match the pat-
         tern will not show up in directory listing and return 404 Not
         Found if requested. Default: ""

Common Problems


  • PHP doesn't work - getting empty page, or 'File not found' error. The reason for that is wrong paths to the interpreter. Remember that with PHP, correct interpreter is php-cgi.exe (php-cgi on UNIX). Solution: specify full path to the PHP interpreter, e.g. mongoose -cgi_interpreter /full/path/to/php-cgi

Embedding

Embedding Mongoose is easy. Somewhere in the application code, mg_start() function must be called. That starts the web server in a separate thread. When it is not needed anymore, mg_stop() must be called. Application code can pass configuration options to mg_start(), and also specify callback functions that Mongoose should call at certain events. hello.c provides a minimalistic example.

Common pattern is to implement begin_request callback, and serve static files from memory, and/or construct dynamic replies on the fly. Here is my embed.c gist that shows how to easily any data can be embedded directly into the executable. If such data needs to be encrypted, then encrypted database or encryption dongles would be a better choice.

Other Resources

  • Presentation made by Arnout Vandecappelle at FOSDEM 2011 on 2011-02-06 in Brussels, Belgium, called "Creating secure web based user interfaces for Embedded Devices" (pdf | odp)
  • Linux Journal article by Michel J.Hammel, 2010-04-01, called Mongoose: an Embeddable Web Server in C