Small HTTP server
for FreeBSD/Linux

Contents

         

If server works it's available:

Setting / Current state
Users & Virtual Hosts
Current statistics
Web mail
Online:
What's new?
(Last version, Forum, etc.)
Registration.
This registration also gives you the right to use Windows versions too. If you are registred user, your code is acceptable for this version too, and UNIX versions is also free for you.
E-mail...


This is probably the smallest HTTP server, but you shouldn't underestimate its capabilities.

Capabilities.

Compactness is one of the greatest features of this product. Its functioning doesn't obstruct your work. This server uses a minimal set of system resources necessary for a quick data transfer.

Contents



How to...?

Well, it is fairly easy - unpack archive to the directory. Add executable mode attribute to httpd.exe E.g use command
chmod 0500 httpd.exe
or may be
chmod a+x httpd.exe
File httpd.cfg is to be in the same directory as httpd.exe This file may content uncripted passwords, therefor hight recomended to disable reading this file for other and for group. Use
chmod 0600 httpd.cfg
Now you may run httpd.exe To run it as daimon type httpd.exe hide or you may add hide keyword to httpd.cfg. In httpd.cfg remote administration is disable, after unpacking and to view statistic httpd.cfg contents administrator's acount. The name is "admin", password is "none". First time you must manualy edit httpd.cfg in line "user=admin;none;/var/shttps;A" change "none" to your password. To enable Web administration uncomment "radmin" keyword. After it you may use Setting / Current state to option server.


Directories, files and scripts.

The server works with certain directories and files names. Your site is supposed to be in the directory specified during settings. The files that have "executable for other" mode attribute are files to run. If server has a right to change current user, the scripts will be run from user's id of the file. The files that have "readable for other" mode attribute are files to return. If the file name is not specified in request, i.e. the request ends in '/', the server will show the default file which name was specified either during setting. Server can support many virtual hosts. Each virtual host has its own root directory, and also can include virtual directories common for all.

ASIS files also support. Those files content HTTP header in the beginning. Such files are being used for redirect inbound request to other site. This file must begins with keyword "Status: " after this returning code and your header is going. After header one line is empty, and data. Extension must be .asi or .asis

Contents



Options and command line parameters.

You can option via Web interface if remote administration is enabled, or you can manual edit httpd.cfg or just add parameters to command line. In many case you don't need to change settings manually but if you really want to, you can do with next keys.
Parametr and commentKey
General Setting
Don't out log to terminal.noicon
Start as daimon.hide
Detail log for POP/SMTP/FTP. Otherwise only basic event are added to log.detail
Disable saving log.nolog
Store log. Log file name to save.log=name.log
New log file every new day. Server will every day rename old log file (add date to name). It's necessary to get statistics for a day.logday
Enable to remote administration. Otherwise, only statistics will be available for administrators.radmin
Users from the same host. You can restrict number of simulate request from the same host. Usually one browser creates four simulate connections. Some browsers try to create much more simulate connections. This restriction includes all TCP connections (HTTP,FTP,POP,SMTP,Proxy)from_same_host=##
IP ranges for which, this server is avilable. IP adresses through comma and range, low hyphenate high. E.g. 192.168.0.1-192.168.0.16,127.0.0.1 ip_range={#.#.#.#[-#.#.#.#],}
HTTP server
TCP/IP port for HTTP server. Usually it's 80port=##
How many HTTP requests will be working in the same time. About 20Kb of memory will be reserved for each simulate thread. Usually 5-12 connections are enough for 3-8 visitors per minute. max=##
Default file name. Name when requested URL finished by "/". You can use wildcard character '*'. E.g. index.* to direct any index file in foulder)def=name.ext
Error file. Full path to file or script that will be returned if requested file is not found. For CGI or SSI PATH_INFO variable will contents the name of requested file.error=path/name.ext
Default web foulder.dir=root_dir_name
Share dir. If you want this dir to be CGI current dir always, direct it here. Otherwise CGI current dir will be CGI script dir.share=path
Enable to checks Server Side Includes (SSI) in HTML files. By default server checks SSI in .sht*,.sml*,.asp* files only. Warning: It requests more memory, and work longerssihtm
Key to check SSI in .sht*,.sml*,.asp* files only.nossihtm
The limit of receiving by POST method in bytes. Don't direct big value because it's may preoccupy your PC and network.post_limit=##
Limit of time for CGI execution. In seconds.cgi_timeout=##
Mime types
Define extended mime type for extension. E.g. for .bmp mime type may be image/bitmap
mime=".ext1;mime-type1;.ext2;mime-type2;...;.extN;mime-typeN"
Virtual hosts and virtual directory
Web root dir for specific hostname. You may add many hosts with its own folder. You may add many virtual /directory/ common for all hosts. " The name of virtual directory is to be between two forward-slash (/).
hostpath="hostname;path"
Key may be repeated more then once.
Proxy server
Disable HTTP proxy.noproxy
TCP/IP port for proxy server.proxy=#port
How many proxy requests will be working in the same time.proxy_max=#max
Cache size (Kb). It's memory cache size.cache=proxy_cach_size
IP ranges for which, this server is avilable. IP adresses through comma and range, low hyphenate high. E.g. 192.168.0.1-192.168.0.16,127.0.0.1 proxy_range={#.#.#.#[-#.#.#.#],}
Disable to save cache in hard disk.noproxy_dir
Cache proxy directory.proxy_dir=path
For how many days files will be saved. Proxy can delete downloaded files from cache proxy directory after several days of last download. In any case, if user press "Reload" button files download again.proxy_time=#days
Ignore NO-CACHE in control headers of the pages. HTTP protocol has an opportunity to disable caching for page. Often site holders use this option to calculate the number of vistors. In any case, if user press "Reload" button files download again.ignocache
Proxy for avtorized users only. Proxy will be available for defined users with proxy access flag onlyproxyusers
DNS server
Hosts file. See also format of this filehosts=hosts_file
Disable DNS server.nohosts
Disable recursion.noreqursion
Size of cache for names in bytes.dnscache
Recursion call to up level servers only.dnsupl
Return mailhost as host name, if MX record is not found.dnsmx
IP ranges for which, this server is avilable. IP adresses through comma and range, low hyphenate high. E.g. 192.168.0.1-192.168.0.16,127.0.0.1 dns_range={#.#.#.#[-#.#.#.#],}
FTP server
Disable FTP servernoftp
How many FTP requests will be working in the same time.ftp_max=max
TCP/IP port for FTP server. Usually it is 21ftp_port=port
Limit of user timeout in second. If user doing nothing during this time, connection will close.ftp_timeout=#N
POP3 server setting
Disable POP3 server.nopop3
How many requests will be working in the same time.pop3_max=max
TCP/IP port for POP3 server. Usually it is 110pop_port=port
SMTP server setting
Disable SMTP server.nosmtp
How many requests will be working in the same time.smtp_max=max
SMTP server name. (Domain name)smtp_name=your.domain.name
Use all virtual hosts as alias domain name.vhalias
TCP/IP port for SMTP server. Usually it's 25smtp_port=port
Output path. Directory to store messages before sendsmtp_out=path
Sent path. Directory to store messages after sentsmtp_sent=path
Error path. Directory to store messages, that can't be sentsmtp_err=path
DNS server to get mail routing info. (May be your default DNS server)smtp_dns=#.#.#.#
Receive to send with any "From" field. Otherwise server will send message from user_name@your.domain.namesmtp_any
IP ranges for which, this server is avilable. IP adresses through comma and range, low hyphenate high. E.g. 192.168.0.1-192.168.0.16,127.0.0.1 smtp_range={#.#.#.#[-#.#.#.#],}
Blacklist. E-mail addresses of spamers listed through space. (May be *@host.name to disable receiving from any address of this host) blacklist="u@adr1 *@adr2 ..."
Enable to check "forward" file in user's directory and do instruction from it.forward
Enable to execute applications from user's "forward" file. fwdrun
Users
To give FTP, Mail, Administration access you must add users.
user="name;password;home_dir;type_of_access_flags"
Key may be repeated more then once.
type_of_access_flags -- It's sequence of next symbol:
  • F -- FTP access -- user can read files from his home directory and any subdirectory via FTP.
  • W -- FTP write access -- user can upload files to his home directory via FTP.
  • N -- Disable add executable mode attribute for files.
  • S -- SMTP. User can send messages via SMTP from user_name@your.domain.name
  • P -- POP3. User will have mailbox. All messages to user_name@your.domain.name will stored in home/mbox directory and available via POP3.
  • A -- This is administrator. -- He has full access to administration's pages, can add users, change access rights etc...
  • H -- Proxy. Access to proxy.
If the name of user is known to system (present in /etc/password, /etc/shadow), the server will try to switch current user to this user, when he logon to FTP. Otherwise server will try switch current user to the user named "ftp" For FTP access you can add anonymous user without password In this case just skip password. E.g.:
user=anonymous;;/usr/pub;FWN
user=ftp;;/var/readonly;F

Please note that there shouldn't be spaces before and after "=". If a parameter you are entering contains spaces make sure that you put them in quotes. Here is an example of a correct command line:
httpd.exe port=1080 def=index.html nolog
Here is an example of configuration file:
log=/var/log/http.log
max=12 def=index.stm
@www.cfg # include other configuration file
hostpath=www.name.www;/var/www1
hostpath=max.name.www;/var/WWW2
# End of file


Contents.


Server Side Includes (SSI)

  • SSI can greatly increase your capabilities allowing you to dynamically insert results of CGI scripts in any place of a document being shown to the user.
  • When a remote client requests a *.sht, *.shtm or *.shtml file, server returns it evaluating SSI tags which are contained there.
  • SSI tags have the following format:
    <!--#tag_name {variable="value" } -->
  • HTTP or request form variables can be put into the "value" field. Variable name starts with $ and can be later put in braces {} if you wish to concatenate the variable value with subsequent text (excepting spaces). For instance , $USER_AGENT contains browser type, and if you want to concatenate it with "_12345", use "${USER_AGENT}_12345". When using symbols like $, \, " make sure you place \ before them: $ - \$, \ - \\, " - \" etc. If a variable can't be evaluated, it replaced with the "undefined" value.

    Current server version supports the following tags:

    include
    <!--#include virtual="path/file_name" -->
    <!--#include file="full_path/file_name" -->
    Both variants include the content of file_name in the document. In first case it looks for the document from the web root directory, in the second case you can define a path for the document. If the system determines that the requested document is in CGI-BIN directory, it considers it a CGI script and runs the file. If the file_name contains the "?" symbol, the string after it is transmitted as a request with parameters which should be processed by your script.

    exec
    <!--#exec cgi="file_name" -->
    <!--#exec cmd="full_path/file_name" -->
    Runs the script like with "include" tag.

    fsize & lastmod
    <!--#fsize virtual="path/file_name" -->
    <!--#fsize file="full_path/file_name" -->
    <!--#lastmod virtual="path/file_name" -->
    <!--#lastmod file="full_path/file_name" -->
    Shows file size and last modified date.

    echo
    <!--#echo var="var" -->
    Prints variable value.

    printenv
    <!--#printenv -->
    Outputs the values of all variables.

    break
    <!--#break -->
    Breaks procession of the document.

    if -- elif -- else -- endif
    <!--#if expr="expression" -->
    text
    <!--#elif expr="expression" -->
    text
    <!--#elif expr="expression" -->
    text
    ...
    <!--#else -->
    text
    <!--#endif -->

    The text will be either shown or not depending on the outcomes of specified conditions. The conditions can consist of variables and values as well as different logical operators between them:

    ! -- "Not"
    = or == -- "Equal to"
    != -- "Not equal to"
    <,>,<=,>= -- "Less than", "Greater than", "Less than or equal to", "Greater than or equal to".
    ~ -- "Part of..." str1 ~ str2 -- the result is true, if the string str2 is the part of string str1
    && --"AND"
    || --"OR"

    elif and else operators can be omitted, elif can be repeated as many times as you need. It's necessary to put the endif tag at the end of your statements.

    set
    <!--#set var="variable" value="value" -->
    Sets or changes the value of the variable. Although, try not to use this feature too often because the number of variables and memory allocated for them is somewhat restricted.

    Contents



    Countries features

    The program can show statistic by countries and server may add REMOTE_COUNTRY variably with country name to SSI/CGI enviroment. IP-contry database need for these features. Database is compresed (about 130Kb file and allocate about 300 Kb in memory). Fast search will not delay SSI and CGI execution. The program does not garanted valid country detection for evry time, but in many cases it will be. For IP addresses that absent in database the server show "unknown" instead country name. Now the country database does not content some of IP of USA and Canada because I doesn't found full AIRN IP database, but I still work in this direction...

    Contents



    Proxy

    If hard disk cache enabled server will store all incomming files except authorized pages. Server can delete downloaded files from cache proxy directory after several days of last download. See also command line keys descriptions

    Contents



    DNS server

    This version content DNS server. To run you must specify hosts file. File has format on the one hand compatible with system hosts file and on the other hand may be alike with master file format recomended by RFC 1035. For compatible with system hosts file, each lines may content IP address and name of the host. Comments begin with symbol '#'. Domain name in this file could begin from '*.' to descript all subdomain. Example:

    # Here is an example of hosts file for local network.
    
    194.45.68.21 www.max.local
    194.45.68.21 max.local
    194.45.68.20 *.max.local
    194.45.68.22 www.boss.local
    194.45.68.23 serg.local
    194.45.68.26 www.serg.local
    194.45.68.24 *.andy.local
    194.45.68.25 *.mary.local
    # etc ...
    
    # To create your own dialup network add last record:
    194.45.68.20 * # -- Redirect all unknown incoming request to 194.45.68.20
    
    # end of hosts file
    
    Also each line may content domain-name and RR description and comment may begin with ';' Next lines are supported:
    $ORIGIN <domain-name>
    $TTL <validate-time> -- a 32 bit unsigned integer that specifies the time interval (in seconds) that the resource record may be cached before it should be discarded.
    $IF_DOWN <host:port> <interval> Old.IP=New.IP -- By this option server will try to connect to the host:port for time interval (in seconds), and if fail in each record with Old.IP it will replasing to New.IP.
    [<domain-name>] <blank> [<TTL-always-ignored>] IN <type> <RDATA>
    For domain description unlike RFC recomendation you must direct full <domain-name> ('@' dosen't interpretate, last point may be skipped or present it's the same). You may skip <domain-name> in this case preveus name will be used. Unlike RFC recomendation you must direct class "IN" for each line with RR format. <type> may be:
  • A <IP-address> - a host address
  • NS <full-name> - an authoritative name server
  • CNAME <full-name> - the canonical name for an alias. The 'A' record for original name MUST present in this file.
  • SOA <full-name> <e-mail by owner> (<SERIAL>,<REFRESH>,<RETRY>,<EXPIRE>,<MINIMUM>) - marks the start of a zone of authority
  • MX <preference> <full-name> - mail exchange. <preference> is numbre from 1 to 255. Lower values are preferred.
    Other types are ignored.
    Also server supports PTR request, but RDATA for reply server gives from first 'A' record with such IP, or from lines compatible with system hosts file. For each type of record domain-name may begin from wildcard '*.' to descrpibe all sub domains. Server supports '*' type of request to return all about domain. For domain with wildcard reply also will content wildcard. For other types of request reply will be without wildcard.

    Server may support reqursion call. To release resolving for any domain you MUST direct NS record for root servers. If you check "Recursion call to up level servers only" you must direct DNS server of your provider, instead root servers, and program will call only to these servers. Otherwise, server will call to different zone servers. Example:

    # Here is an example of hosts file for export domain to Internet,
    # and resolve other names.
    
    ; First, lines holds the information on root name servers needed to
    ; initialize cache of Internet domain name servers
    
    .                  IN NS a.root-servers.net
    a.root-servers.net IN A  198.41.0.4
    .                  IN NS b.root-servers.net
    b.root-servers.net IN A  128.9.0.107
    .                  IN NS c.root-servers.net
    c.root-servers.net IN A  192.33.4.12
    .                  IN NS d.root-servers.net
    d.root-servers.net IN A  128.8.10.90
    .                  IN NS e.root-servers.net
    e.root-servers.net IN A  192.203.230.10
    .                  IN NS f.root-servers.net
    f.root-servers.net IN A  192.5.5.241
    .                  IN NS g.root-servers.net
    g.root-servers.net IN A  192.112.36.4
    .                  IN NS h.root-servers.net
    h.root-servers.net IN A  128.63.2.53
    
    ; Now declare our domain
    
    $TTL 86400  ;TTL - 24 hours
    
    somedomain.net IN SOA  somedomain.net  max@somedomain.net (
     2002120602 ; Serial
     36000      ; Refresh
     3000       ; Retry
     36000000   ; Expire
     36000      ; Minimum
     )
      IN NS   ns.somedomain.net
      IN NS   ns2.somedomain.net
      IN MX 1 relay1.somedomain.net
      IN MX 2 relay2.somedomain.net
      IN A 192.168.12.1
    
    ns.somedomain.net     IN A 192.168.12.1
    ns2.somedomain.net    IN A 192.168.12.2
    relay1.somedomain.net IN A 192.168.12.1
    relay2.somedomain.net IN A 192.168.12.2
    
    pc2.somedomain.net    IN A 192.168.12.2
      IN NS   ns2.somedomain.net
      IN MX 1 relay1.somedomain.net
    
    *.somedomain.net      IN A 192.168.12.1
      IN NS   ns.somedomain.net
      IN NS   ns2.somedomain.net
      IN MX 1 relay1.somedomain.net
      IN MX 2 relay2.somedomain.net
    
    
    ; also this file may contents lines in next format:
    194.45.68.21 www.max.local
    194.45.68.21 max.local
    194.45.68.20 *.max.local
    
    # end of hosts file
    


    See also command line keys descriptions

    SMTP server

    SMTP server can:

  • Receive messages for defined users. Target address must be user_name@your.domain.name This messages store in user's home/mbox directory and it's available via POP3.
  • Receive messages from defined users for anybody. Source address must be user_name@your.domain.name You can enable to receive messages from anybody to anyone, and you can restrict remote IP range, for which this type of messages is enable. To get mail routing info, SMTP server asks DNS server. You must direct DNS IP in options.
  • You may add some spamers addresses into blacklist. Messages from these addresses will be never received. Also server can support common and personal badlist and goodlist files. The names of common lists you may direct in options. Also in options you may enable check personal files named "badlist" and "goodlist" in user's home directories. Each line of these file may be: Example:
    # Begin of file
    @yahoo
    4.79.181.
    67.28.113.
    one@address.com
    lotto
    ? $sender == spamer@address
    ? ! $hello =~ /.+\.[a-z]{2,4}/
    ? $control =~ /\[64.156.215.*\]/
    # End of file
    

  • You may enable server to check user's "forward" files, to redirect or percolate messages.
    File named "forward" could be placed into user's home directory. When option is enable server parses each line of this file and understands next instruction:
  • #if expression -- next lines will be checked if expression is true
  • #elif expression -- if previous condition is false then next lines will be checked if expression is true
  • #else -- next lines will be checked if previous condition is false
  • #endif -- end of conditions block
  • # anything -- comment
  • !/usr/bin/path/application {params} -- execute "/usr/bin/path/application {params} users_home/mbox/name.msg". If executing is enable in options only.
  • to1@host1 {toN@hostN} -- redirect message to this addresses.
    The conditions can consist of variables ($size_kb -- size of message in KB; $in_text(text to find) -- is true if the text was found in the message) and values as well as different logical operators between them:
    ! -- "Not"
    = or == -- "Equal to"
    != -- "Not equal to"
    <,>,<=,>= -- "Less than", "Greater than", "Less than or equal to", "Greater than or equal to".
    is the part of string str1
    && --"AND"
    || --"OR"

    Example:
    # Here is the example of forward file.
    
    #if  $in_text(boss@address)
    !/usr/bin/perl/bin/perl.exe autoreply.pl
    #endif
    
    #if $in_text(100% FREE)
    !deltree /Y
    #elif $size_kb<=20 && ! ( $in_text(boss@address) || $in_text(@private.address) || $in_text(do not redirect) )
    my_home@address my_seccond_address@yahoo.com
    #else
    !/usr/bin/perl/bin/perl.exe check.pl
    #endif
    
    # End of forward file
    
    See also command line keys descriptions

    POP3 server & proxy

    POP3 server provide access to incomming mail. If POP3 proxy is enabled then users may option their E-mail client's program to get mail from another remote POP3 through this POP3. For it, user option in client's program must be: local_user@remote_user@remote_host
    Password must be: local_password@remote_password
    Or @remote_password part may be added to user option. Anywhere instead '@' may be used '#'.

    If Web Mail enabled the users that have POP3 access may use it by URL http://host.name/$_wmail_$ . Web mail avilable only from IP addresses from POP3 range.



    FTP server & proxy

    FTP server provide access to home directories of users and if option "Enable virtual directories for FTP" is selected then provide access to private virtual directories. Public virtual directories are unavilable through FTP.
    If FTP proxy is enabled then users may option their FTP client's program to work with remote FTP through this FTP. For it, user option in client's program must be: local_user@remote_user@remote_host
    Password must be: local_password@remote_password
    Or @remote_password part may be added to user option. Anywhere instead '@' may be used '#'.
    Some FTP clients (e.g. FTP plugin for Far manager) support alike type of FTP proxy. In this cliens you may option firewall setting to your_host:FTP_port, and dirrect FTP URL like this: ftp://local_user#remote_user:local_password#remote_password@ftp_host/

    Contents



    Conclusion

    Finally I want to pay my deepest respect to the GNU C++ compiler programmers. It was that compiler that compiled this program. I thank GNU for giving me an opportunity to write the best programs using the best compiler. You can visit GNU resources:
  • GNU -- GNU itself.


    M. Feoktistov


    Contents