Install nginx on centos using cyberciti’s tutorial
update default iptables to allow http traffic: [sourcecode lang=“shell”] # 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 [/sourcecode]
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: [sourcecode lang=“shell”] -A RH-Firewall-1-INPUT -m tcp -p tcp –dport 8000 -j ACCEPT # allow access to mochiweb [/sourcecode]
Test that mochiweb is available to localhost by running the following from the command line on the server:
[sourcecode lang=“shell”] curl http://127.0.0.1:8000 [/sourcecode]
You should get something back like:
Configure nginx to proxy api calls to mochiweb. Put this in /etc/nginx/nginx.conf: [sourcecode lang=“shell”] 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; } } } [/sourcecode]
As per BeeBole’s tutorial, edit the mochiweb request handler to handle requests for ‘api’:
[sourcecode lang=“erlang”] %% @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”, [],["Congratulation"]}); % <– 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)}. [/sourcecode]
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
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.