[Meta notes: the following question is not answered, but the problem that the question is involved in is considered solved. Thanks to @georgek]
I am experimenting Noir web framework on a home machine running Ubuntu linux. I followed the "Getting started" part from the Noir site and got the demo server up and running. But that example was running at the testing port 8080. I wanted it to run at the default http port (port 80), so I edited the "8080" part of the clojure file my-website/src/my_website/server.clj:
(ns my-website.server
(:require [noir.server :as server]))
(server/load-views "src/my_website/views/")
(defn -main [& m]
(let [mode (keyword (or (first m) :dev))
port (Integer. (get (System/getenv) "PORT" "80"))] ; <- I changed "8080" to "80"
(server/start port {:mode mode
:ns 'my-website})))
And tried to run the demo again, but I got the following:
$ lein run
Starting server...
2011-11-27 13:26:27.183:INFO::Logging to STDERR via org.mortbay.log.StdErrLog
2011-11-27 13:26:27.189:INFO::jetty-6.1.25
2011-11-27 13:26:27.242:WARN::failed SocketConnector@0.0.0.0:80: java.net.BindException: Permission denied
2011-11-27 13:26:27.242:WARN::failed Server@111ded2: java.net.BindException: Permission denied
Exception in thread "main" java.lang.RuntimeException: java.net.BindException: Permission denied
at clojure.lang.Util.runtimeException(Util.java:165)
at clojure.lang.Compiler.eval(Compiler.java:6476)
at clojure.lang.Compiler.eval(Compiler.java:6455)
at clojure.lang.Compiler.eval(Compiler.java:6431)
at clojure.core$eval.invoke(core.clj:2795)
at clojure.main$eval_opt.invoke(main.clj:296)
...
...
I have root access to the machine, I just don’t know where to start to solve this problem. Could anybody help?
What I have tried:
I tried to run lein run as su, but it didn’t work either.
I stopped the Apache2 server for releasing port 80 (Is this the right way to do it?):
$ sudo /etc/init.d/apache2 stop
Still doesn’t work.
I did it all over again on a macbook, it worked for port 80 (“sudo” is needed). Don’t know why it doesn’t work for Ubuntu.
The solution that I took
A practical solution to the problem (not an answer to the question):
I followed this web page, and used 8080 port as a service, and then configured the “httpd.conf” file of the Apache2 server to let port 8080 listen all the requests to port 80. This solution is provided by @georgek .
[I am sorry if this post is not valuable to some people, I’m new in this field. Thank you again everyone!]
An alternative solution
@ivant provides an alternative solution which also works!
I would recommend running Noir as a non-root user on 8080 and using a rule to forward that domain and port to your Apache running on 80. Is there another reason you don’t want to do that?