Apache에서 Clojure 웹 응용 프로그램을 통합하는 방법
노트
이 OP가 약 2 년 전에 작성 되었기 때문에 같은 질문을 다시하기보다는 단계별 지침이 있는지 궁금합니다. 그래서 Jetty, Tomcat이든 Noir 또는 다른 Clojure 웹 애플리케이션을 Apache에 통합 할 수 있습니다. , 또는 다른 것. Django에 대한 유사한 지침이 있으며 Python이 Django의 경우 링 프레임 워크가 아닌 엔진으로 실행되고 있다는 것을 이해하므로 Clojure 웹 응용 프로그램에서 상황이 더 복잡해집니다.
끝 참고
저는 Clojure를 매우 좋아하고 Compojure는 깔끔한 웹 프레임 워크처럼 보입니다.
그러나 Tomcat과 같은 일반 응용 프로그램 서버에 내 응용 프로그램을 WAR로 배포하려고 할 때 모든 것이 무너졌습니다. 실제로 스톡 핸들러가 작동하지 않았기 때문에 로컬 Jetty와 Tomcat 모두에서 작동하는 정적 파일 및 리소스에 대한 사용자 정의 링 핸들러를 작성해야했고 모든 곳에 컨텍스트 루트를 수동으로 추가해야했습니다.
Jetty와 Tomcat 모두에서 실행될 수있는 가장 간단한 웹 애플리케이션을 만들기 위해이 모든 코드를 작성해야했다는 사실에 부정적으로 놀랐습니다. 이에 대한 가능한 설명은 세 가지뿐입니다.
- 누구도 Jetty를 사용한 로컬 개발, 즉 생산에 Clojure / Compojure를 사용하지 않습니다.
- 누구나 컨텍스트 루트없이 전용 Jetty에 Clojure / Compojure 앱을 배포합니다 (사람들이 Node.js 앱을 사용하는 것처럼).
- 내가 알지 못했던 문제를 피할 수있는 정말 간단한 방법이 있습니다.
다음 중 귀하의 의견에 해당하는 것은 무엇입니까? 아니면 다른 건가요?
편집하다:
전쟁 파일을 만드는 것은 Maven / Leiningen에있어 당연한 일이며 제가 의미하는 바가 아닙니다. Compojure가 Tomcat과 함께 작동하도록 만들기 위해 너무 많은 코드를 작성해야하는지 궁금합니다. 정적 파일 서비스 및 컨텍스트 루트 인식과 같은 기본 요소는 즉시 작동 해야 합니다.
사람들은 Compojure 앱을 비 Jetty 서블릿 컨테이너에 배포하고 있습니다.
확인 :
또한 lein-war을 확인하십시오
나는 이것을 상당히 고통스럽게 만들기 위해 다음의 조합을 사용합니다.
Cake (배포 명령 포함)
Lau Jensen이 개발 한 웹 프로젝트를위한 Cake 템플릿.
Vagrant (Chef 또는 Puppet에 의존하는 Ruby VM (Virtualbox) 관리 도구)
VPS (Slicehost에서)
핵심 부분은 Lau가 만든 webdev 템플릿입니다. webdev 폴더는 ~/.cake/templates
. 이를 기반으로 새 프로젝트를 만들려면 다음을 사용하십시오.
cake new webdev *projectname*
템플릿에는 필요하지 않은 경우 제외 할 수 있거나 제외해야하는 log4j 및 Java 메일이 포함되어 있습니다. 또한 Enlive와 Mustache를 사용하고 있다고 가정하지만 그것이 독약이라면 Compojure / Hiccup으로 변경하는 것은 사소한 일입니다.
템플릿은 개발중인 부두에서 앱을 제공하고 (단지 server.clj 평가) Tomcat에서 실행할 때 전쟁으로 작동합니다. Tomcat에서 ROOT.war로 서버에 배포 된 경우 경로는 동일하게 유지됩니다. 모든 정적 파일은 리소스 디렉토리에 있어야합니다. Jetty는 거기에서 제공 할 것입니다 (Ring 파일 미들웨어 덕분에). 프로덕션에서 이들은 webapp의 루트로 이동하여 Tomcat이 제공합니다 (web.xml이 처리합니다).
devbox 폴더에는 Tomcat이 설치된 Virtualbox VM을 만드는 데 필요한 Vagrantfile 및 쿡북이 포함되어 있습니다. 저는 cake를 사용하여 .war 파일을 /home/vagrant
dir 에 배포합니다 (이것은 project.clj의 dev 컨텍스트 정의에서 제어 됨). .war 파일은 ROOT.war로 Tomcat의 webapps dir ( /var/lib/tomcat6/webapps
)에 심볼릭 링크됩니다. Vagrant 사용 방법에 대한 자세한 내용은 Vagrant 사이트 를 참조하십시오 .
이 요지 는 cake deploy 명령을 사용하도록 project.clj를 조정하는 방법의 예를 보여줍니다. 이 예에서는 다음을 사용하여 배포 할 수있는 두 개의 컨텍스트 @dev 및 @prod를 만듭니다.
cake deploy @dev / cake delpoy @prod
나는이 zip에 Cake webdev 템플릿과 Vagrant 파일을 수집했습니다 .
나는 leiningen-war 를 사용하여 일반적인 war 파일을 생성하는 데 성공했습니다 (물론 leiningen을 사용하고 있다고 가정). 정적 html의 위치, web.xml의 위치 및 project.clj 파일의 기타 리소스를 지정할 수 있습니다.
JBoss (서블릿 컨테이너로 Tomcat 실행)에 배포 할 수있는 일반적인 war 파일을 생성하는 것은 그리 어렵지 않았지만 web.xml 형식에 대해 잘 알고 있어야한다고 생각합니다. 나는 내 자신의 web.xml을 작성하는 것이 더 편해서이 접근 방식을 더 좋아하는 것을 설명 할 수 있습니다.
지금 라이닝 겐 전쟁 배후자가 라인 링을 추천하고있는 것 같습니다 . 나는 그것을 살펴보기 시작했지만 지금까지 일반적인 전쟁 파일을 쉽게 얻을 수 없었습니다.
프로덕션 배포를 설명하는 것이 여기서 약점이라는 데 동의합니다.
저는 Ring과 Compojure 위에 구축 된 웹 프레임 워크 인 Noir를 사용 하고 있습니다.
을 사용하여 프로젝트를 만들었습니다 lein noir new my-proj
. 그런 다음 my-proj/web
디렉토리를 만들고 다음 줄을 추가했습니다.
project.clj:
:compile-path "web/WEB-INF/classes"
:library-path "web/WEB-INF/lib"
:ring {:handler project.server/handler}
my-proj/web
Tomcat 개발 중에 디렉토리를 컨텍스트 루트로 설정했습니다 .
정적 파일 제공을 위해 my-proj/resources/public
디렉토리 아래에 물건을 넣습니다 . 코드를 통한 파일 접근 (읽기 / 쓰기)의 경우 :servlet-context
링 요청 헤더에서 사용할 수 있습니다. 위의 설정에서 컨텍스트 경로는 다음과 같습니다 (.getRealPath (ring-request-header :servlet-context) "/WEB-INF/classes/myfile.txt")
. Myfile.txt는 my-proj/resources
.
Google App Engine에 배포하는 경우 훌륭한 블로그 http://compojureongae.posterous.com/이 있습니다.
GAE에 배포하지 않더라도 몇 가지 유용한 팁을 얻을 수 있습니다.
I have released in production (for over 6 months now) a Compojure+Vaadin application. Packaging has been done using the lein-war plugin and I did not encounter any major problems.
The application is named halo, contained in a halo.war file, the context is /halo and the tomcat server is also running Hudson, and another custom made application. Vaadin is resolving all my static files properly, CSS, images... I mainly used that blog post to write the little glue needed for it.
On another note, I am also running Noir on Heroku and haven't had any problems regarding packaging and deployment, and this is in production too.
This is not directly related to your Compojure question, but Clojure in production in web applications, yes, definitely.
If you are using a ring-based server (compojure, noir/lib-noir, luminus, etc.), and want to deploy as an uberjar, to avoid
"Failed to load Main-Class manifest attribute from your-uberjar.jar"
simply create the uberjar with lein ring uberjar
. Note the 'ring' addition to lein uberjar. This is assuming you're using the lein-ring plugin.
ReferenceURL : https://stackoverflow.com/questions/5510851/how-to-integrate-clojure-web-applications-in-apache
'developer tip' 카테고리의 다른 글
변경 가능한 객체에 대해 GetHashCode를 재정의 하시겠습니까? (0) | 2020.12.26 |
---|---|
실제 색상을 혼합하는 것과 같은 색상 혼합 알고리즘이 있습니까? (0) | 2020.12.26 |
UIGesture를 뒤에있는 뷰로 전달 (0) | 2020.12.26 |
null을 확장하는 클래스를 작성하는 방법과 이유는 무엇입니까? (0) | 2020.12.26 |
성능을 향상 시키려면 어떤 PHP opcode cacher를 사용해야합니까? (0) | 2020.12.26 |