2013-12-18 16 views
8

Questo è un seguito alla mia domanda here. Ho creato un server domestico (solo il mio altro portatile con Ubuntu e Nginx) e voglio servire i file dei clandestini.Posso usare Clojure con nginx?

Sto chiedendo aiuto per capire come funziona questo processo. Mi dispiace a questo punto sono confuso e penso di dover ricominciare da capo. Sto facendo una nuova domanda perché voglio usare nginx non lein ring server, come suggerito nella risposta per quella domanda.

Prima ho avviato un progetto guestbook con leiningen e ho eseguito lein ring server e vedo "Hello World" a localhost:3000. Per quanto ho capito, questo non ha nulla a che fare con nginx!

Come nginx entra in questo processo? All'inizio cercavo di creare un server proxy con nginx e anche quello funzionava, ma non sapevo come servire i file clojure con quella configurazione.

Questo è quello che ho nel mio file nginx.conf adattato da this answer:

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; 
    } 
} 

quindi voglio utilizzare il mio dominio example.com (non localhost); Come procedo a fare questo?


EDIT

Come da @noisesmith's comment farò scegliere di andare opzione uberjar Lein con. Come spiegato here, sembra molto facile creare uno:

$ 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! 

Mi può dirigere anche la documentazione giusta su come posso usare questo uberjar con nginx?

risposta

7

Per i principianti, non utilizzare lein per eseguire le operazioni di produzione. È possibile utilizzare lein uberjar per creare un file jar con tutti i file pronti per l'esecuzione e java -jar per eseguire l'app dal jar risultante. C'è anche la possibilità di eseguire lein ring uberwar per creare un archivio di guerra da eseguire all'interno di tomcat, che fornisce alcuni altri vantaggi (come la rotazione dei log e l'integrazione con /etc/init.d come servizio ecc. Sulla maggior parte dei sistemi Linux).

nginx si trova di fronte all'app, sulla porta 80. Servirà il contenuto tramite il proxy dell'app. Ciò è utile perché nginx ha molte funzionalità (especially regarding security) che non è necessario implementare nella propria app, inclusa l'integrazione opzionale con l'integrazione con https e selinux. L'utilizzo di nginx di fronte all'app impedisce inoltre di eseguire java come root (in genere solo l'utente root può utilizzare la porta 80). Inoltre, puoi consentire a nginx di servire direttamente le risorse statiche, piuttosto che doverle servire dalla tua app.

+0

Ok, grazie. Questo mi dà una migliore comprensione. Ma come li metto in pratica? Ad esempio, ho trovato questo documento https://github.com/ddellacosta/Clojure-under-Jetty-and-Apache#rationale-and-other-approaches in cui l'autore elenca molti approcci diversi per la distribuzione delle applicazioni di clojure inclusa la sua soluzione (per Apache). Pensavo che ci sarebbe stato un modo standard per dispiegare. Sto anche considerando di passare a Python. Come principiante pensi che avrei un tempo più semplice per implementare Python? Grazie. – Zeynel

+1

L'opzione più semplice è usare 'lein ring uberwar' e caricare il risultato su un beanstalk aws. Il secondo modo più semplice è usare 'lein uberjar' e caricare il risultato su un server Linux ed eseguirlo tramite' java -jar'. L'utilizzo di lein in produzione non semplifica le cose, perché richiede una toolchain di sviluppo separato sulla produzione e può portare a imprevedibilità perché la risoluzione delle dipendenze e il packaging non si verificano sulla macchina di sviluppo. – noisesmith

+1

Per quanto riguarda Pyton, non mi fiderei di Python direttamente parlando al web più di quanto mi fiderei di clojure parlando direttamente al web, e la migliore pratica sarebbe quella di usare nginx o un equivalente di fronte ad esso anche in quel caso. La creazione di un uberjar risulta in un singolo file che esegue la tua app, senza bisogno di altre configurazioni o installazioni oltre alla jvm. Python non offre nulla di più semplice. – noisesmith

11

Si prega di provare Nginx-Clojure module. È possibile eseguire i gestori di anello clojure con Nginx senza alcun server Web Java, ad es. Molo.