2013-12-18 104 views
8

這是跟我的問題here。我建立了一個家庭服務器(只是我的其他筆記本電腦運行Ubuntu和Nginx),我想服務clojure文件。我可以在Nginx中使用Clojure嗎?

我在尋求幫助,瞭解這個過程如何工作。我很抱歉,在這一點上我很困惑,我想我需要重新開始。我正在問一個新問題,因爲我想使用nginx而不是lein ring server,正如該問題的答案中所建議的那樣。

首先我開始一個項目guestbook與leiningen和我跑lein ring server,我看到「Hello World」在localhost:3000。據我瞭解,這與nginx無關!

nginx如何進入這個過程?起初,我試圖用nginx創建一個代理服務器,這也起到了作用,但我不知道如何使用該設置來提供clojure文件。

這是我在改編自this answer nginx.conf文件:

upstream ring { 
    server 127.0.0.1:3000 fail_timeout=0; 
} 

server { 
    root /home/a/guestbook/resources/public; 

    # make site accessible from http://localhost 
    server_name localhost; 

    location/{ 
     # first attempt to serve request as file 
     try_files $uri $uri/ @ring; 
    } 

    location @ring { 
     proxy_redirect off; 
     proxy_buffering off; 
     proxy_set_header Host $http_host; 
     proxy_pass http://ring; 
    } 

    location ~ ^(assets|images|javascript|stylesheets|system)/ { 
     expires max; 
     add_header Cache-Control public; 
    } 
} 

所以我想用我的域名example.com(不是localhost);我該如何去做這件事?


編輯

@noisesmith's comment我會選擇去與雷音uberjar選項。作爲解釋here,它似乎很容易地創建一個:

$ lein uberjar 
Unpacking clojure-1.1.0-alpha-20091113.120145-2.jar 
Unpacking clojure-contrib-1.0-20091114.050149-13.jar 
Compiling helloworld 
     [jar] Building jar: helloworld.jar 
$ java -jar helloworld.jar 
Hello world! 

你能直也我我如何可以使用此uberjar nginx的正確文檔?

回答

7

對於初學者,請勿使用lein來運行生產中的東西。您可以使用lein uberjar創建一個jar文件,並準備運行所有代理,然後使用java -jar從生成的jar中運行該應用。還可以運行lein ring uberwar來創建一個在tomcat中運行的war文件,該文件提供了一些其他的便利(如在大多數Linux系統上將日誌旋轉和與/etc/init.d作爲服務集成等)。

nginx位於您的應用程序前端口80上。它將通過代理您的應用程序來提供內容。這很有用,因爲nginx具有許多功能(especially regarding security),您不需要在自己的應用中實現這些功能,包括與https和selinux集成的可選集成。在應用程序前端使用nginx還可以防止需要以root用戶身份運行java(通常只有root用戶才能使用端口80)。此外,你可以讓nginx直接提供靜態資源,而不必從你的應用程序提供它們。

+0

好的,謝謝。這給了我一個更好的理解。但是,我怎麼把這些實踐?例如,我發現這個文檔https://github.com/ddellacosta/Clojure-under-Jetty-and-Apache#rationale-and-other-approaches其中作者列出了許多不同的方法來部署clojure應用程序,包括他自己的解決方案(對於Apache)。我認爲會有一種標準的部署方式。我也在考慮切換到Python。作爲一名初學者,你認爲我會更容易部署Python嗎?謝謝。 – Zeynel

+1

最簡單的選擇是使用'lein ring uberwar'並將結果上傳到aws beanstalk。其次最簡單的方法是使用'lein uberjar'並將結果上傳到Linux服務器並通過'java -jar'運行。在生產環境中使用lein並不能簡化事情,因爲它需要在生產環境中使用單獨的開發工具鏈,並且可能導致不可預測性,因爲依賴關係解析和打包不會在您的開發機器上發生。 – noisesmith

+1

關於pyton,我不會相信python直接與web交談,我不會相信clojure會直接與web交談,並且最好的做法是在這種情況下也使用nginx或其前面的等價物。製作uberjar會生成一個運行應用程序的文件,除了jvm之外,不需要其他配置或安裝。 Python沒有提供任何簡單的東西。 – noisesmith

11

請嘗試Nginx-Clojure module。你可以在沒有任何Java Web服務器的情況下使用Nginx運行clojure Ring處理程序,例如。碼頭。

相關問題