Erik's blog

Code, notes, recipes, general musings

Posts Tagged ‘mochiweb

Building and running the Mochiweb dev server

leave a comment »

motivation

environment

  • Mac OS X 10.5

steps

  1. follow Bob Ippolito’s tutorial from his blog
  2. if your server returns
           exception exit: {noproc,{gen_server,call,  
              [httpc_manager,  
              ...  
    

    when you try to run http:request("http://127.0.0.1:8000/")., start inets with inets:start(). and then run the http request call, as described on Pragmatic Dave’s blog.

Advertisements

Written by Erik

January 27, 2010 at 10:23 pm

Posted in tutorial

Tagged with ,

setting up nginx and mochiweb on centos 5

with one comment

  1. Install nginx on centos using cyberciti’s tutorial
  2. update default iptables to allow http traffic:
    # ref: http://www.cyberciti.biz/faq/redhat-fedora-ip6tables-firewall-configuration/
    # ref: http://wiki.zimbra.com/index.php?title=Firewall_Configuration
    # Firewall configuration written by system-config-securitylevel
    # Manual customization of this file is not recommended.
    *filter
    :INPUT ACCEPT [0:0]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    :RH-Firewall-1-INPUT - [0:0]
    -A INPUT -j RH-Firewall-1-INPUT
    -A FORWARD -j RH-Firewall-1-INPUT
    -A RH-Firewall-1-INPUT -i lo -j ACCEPT
    -A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
    -A RH-Firewall-1-INPUT -p 50 -j ACCEPT
    -A RH-Firewall-1-INPUT -p 51 -j ACCEPT
    -A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
    -A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
    -A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
    -A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT
    -A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
    -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
    COMMIT
    
  3. install mochiweb using BeeBole’s tutorial.  For ease of use while testing, launch dev server using separate screen, as the mochiweb shell will own the terminal used to launched it by default, and add the following line to iptables so we can hit the server directly:
    -A RH-Firewall-1-INPUT -m tcp -p tcp --dport 8000 -j ACCEPT # allow access to mochiweb
    

    Test that mochiweb is available to localhost by running the following from the command line on the server:

    curl http://127.0.0.1:8000
    

    You should get something back like:

    <html>
    <head>
    <title>It Worked</title>
    </head>
    <body>
    MochiWeb running.
    </body>
    </html>

  4. Configure nginx to proxy api calls to mochiweb.  Put this in /etc/nginx/nginx.conf:
    user              nginx;
    worker_processes  1;
    error_log         /var/log/nginx/error.log;
    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;
        include /etc/nginx/conf.d/*.conf;
        server {
            listen       80;
            server_name  localhost;
            location ~ api { # <-- pass requests for 'api...' to mochiweb
                    proxy_pass      http://127.0.0.1:8000;
            }
            location / {
                root   /usr/share/nginx/html;
                index  index.html index.htm;
            }
            error_page  404              /404.html;
            location = /404.html {
                root   /usr/share/nginx/html;
            }
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   /usr/share/nginx/html;
            }
        }
    }
    

    As per BeeBole’s tutorial, edit the mochiweb request handler to handle requests for ‘api’:

    %% @author author <author@example.com>
    %% @copyright YYYY author.
    
    %% @doc Web server for myapp.
    
    -module(myapp_web).
    -author('author <author@example.com>').
    
    -export([start/1, stop/0, loop/2]).
    
    %% External API
    
    start(Options) ->
        {DocRoot, Options1} = get_option(docroot, Options),
        Loop = fun (Req) ->
                       ?MODULE:loop(Req, DocRoot)
               end,
        mochiweb_http:start([{name, ?MODULE}, {loop, Loop} | Options1]).
    
    stop() ->
        mochiweb_http:stop(?MODULE).
    
    loop(Req, DocRoot) ->
        "/" ++ Path = Req:get(path),
        case Req:get(method) of
            Method when Method =:= 'GET'; Method =:= 'HEAD' ->
                case Path of
                    "api" -> Req:ok({"text/html", [],["<h1>Congratulation</h1>"]}); % <-- the 'api' request handler
                    _ -> Req:serve_file(Path, DocRoot)
                end;
            'POST' ->
                case Path of
                    _ ->
                        Req:not_found()
                end;
            _ ->
                Req:respond({501, [], []})
        end.
    
    %% Internal API
    
    get_option(Option, Options) ->
        {proplists:get_value(Option, Options), proplists:delete(Option, Options)}.
    

    As per James Gardner’s post Streaming File Upload with Erlang and Mochiweb Multipart Post, rebuild the request handler by running make in the myapp directory. The mochiweb server will automatically restart

  5. confirm the proxy is working by hitting http://domain/ and http://domain/api.  The former should return the nginx install confirmation page, and the latter should return the simple “Congratulation” page.

Written by Erik

December 26, 2009 at 9:51 pm

Posted in tutorial

Tagged with , ,