웹사이트 검색

Debian 9에서 Clojure 웹 애플리케이션을 배포하는 방법


이 페이지에서

  1. 시작하기\n
  2. Nginx 및 감독자 설치
  3. Clojure 앱 다운로드
  4. Clojure 웹 앱 환경 설정\n
  5. Nginx 및 감독자 구성
  6. Clojure 웹 앱 액세스
  7. 결론

Clojure는 운영 체제에서 발견되는 동시 프로그래밍에 중점을 둔 JVM용 최신 범용 프로그래밍 언어입니다. Clojure를 사용하면 도구, 라이브러리 및 애플리케이션 서버를 포함한 기존 JVM 인프라를 사용할 수 있습니다.

이 가이드는 수퍼바이저와 Nginx를 사용하여 Clojure에서 간단한 웹 애플리케이션을 배포하는 과정을 안내합니다.

요구 사항

  • Ubuntu 16.04를 실행하는 서버.\n
  • 서버의 루트 비밀번호 설정.\n

시작하기

시작하기 전에 다음 명령을 사용하여 패키지를 최신 버전으로 업데이트하는 것이 좋습니다.

apt-get update -y
apt-get upgrade -y

모든 패키지가 업데이트되면 서버를 다시 시작하여 이러한 모든 변경 사항을 적용하십시오.

reboot

다음으로 다음 명령을 사용하여 git, curl, Java와 같은 일부 필수 패키지를 서버에 설치합니다.

apt-get install git curl openjdk-8-jre-headless -y

필요한 모든 패키지가 설치되면 다음 명령을 사용하여 JAVA 버전을 확인할 수 있습니다.

java -version

다음 출력에 JAVA 버전이 표시되어야 합니다.

openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-8u131-b11-2-b11)
OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)

완료되면 Nginx 및 Supervisor 설치를 진행할 수 있습니다.

Nginx 및 감독자 설치

기본적으로 Nginx 및 Supervisor는 Ubuntu 16.04 리포지토리에서 사용할 수 있습니다. 다음 명령을 실행하여 설치할 수 있습니다.

apt-get install nginx supervisor -y

설치가 완료되면 Nginx 및 Supervisor 서비스를 시작하고 다음 명령을 사용하여 부팅 시 시작되도록 활성화합니다.

systemctl start nginx
systemctl start supervisor
systemctl enable nginx
systemctl enable supervisor

완료되면 다음 단계로 진행할 수 있습니다.

클로저 앱 다운로드

먼저 git 저장소에서 샘플 Clojure 프로젝트를 다운로드해야 합니다. 아래와 같이 git clone 명령줄 유틸리티를 사용하여 쉽게 다운로드할 수 있습니다.

git clone https://github.com/do-community/do-clojure-web.git

다음 단계는 Leiningen을 사용하여 이 Clojure 프로젝트를 컴파일하고 실행하는 것입니다. Leiningen은 Clojure 앱을 컴파일하는 데 사용할 수 있는 종속성 관리 및 빌드 자동화 도구입니다. 아래 그림과 같이 curl 명령으로 다운로드할 수 있습니다.

curl https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein -o /usr/bin/lein

그런 다음 다음 명령을 사용하여 다운로드한 도구에 적절한 권한을 부여합니다.

chmod 755 /usr/bin/lein

이제 다음 명령을 실행하여 Closure 프로젝트를 컴파일합니다.

cd do-clojure-web
lein uberjar

다음 출력이 표시되어야 합니다.

WARNING: You're currently running as root; probably by accident.
Press control-C to abort or Enter to continue as root.
Set LEIN_ROOT to disable this warning.

Downloading Leiningen to /root/.lein/self-installs/leiningen-2.7.1-standalone.jar now...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   618    0   618    0     0    309      0 --:--:--  0:00:02 --:--:--   207
100 14.6M  100 14.6M    0     0   326k      0  0:00:46  0:00:46 --:--:--  279k
Retrieving lein-ring/lein-ring/0.8.13/lein-ring-0.8.13.pom from clojars
Retrieving org/clojure/clojure/1.2.1/clojure-1.2.1.pom from central
Retrieving org/clojure/data.xml/0.0.6/data.xml-0.0.6.pom from central
Retrieving org/clojure/pom.contrib/0.0.25/pom.contrib-0.0.25.pom from central
Retrieving org/sonatype/oss/oss-parent/5/oss-parent-5.pom from central
Retrieving org/clojure/clojure/1.3.0/clojure-1.3.0.pom from central
Retrieving leinjacker/leinjacker/0.4.1/leinjacker-0.4.1.pom from clojars
Retrieving org/clojure/core.contracts/0.0.1/core.contracts-0.0.1.pom from central
Retrieving org/clojure/pom.contrib/0.0.26/pom.contrib-0.0.26.pom from central
Retrieving org/clojure/core.unify/0.5.3/core.unify-0.5.3.pom from central
Retrieving org/clojure/clojure/1.4.0/clojure-1.4.0.pom from central
Retrieving org/clojure/clojure/1.2.1/clojure-1.2.1.jar from central
Retrieving org/clojure/core.contracts/0.0.1/core.contracts-0.0.1.jar from central
Retrieving org/clojure/data.xml/0.0.6/data.xml-0.0.6.jar from central
Retrieving org/clojure/core.unify/0.5.3/core.unify-0.5.3.jar from central
Retrieving org/clojure/clojure/1.2.1/clojure-1.2.1.jar from clojars

Clojure 프로젝트가 컴파일되면 다음 단계로 진행할 수 있습니다.

Clojure 웹 앱 환경 설정

다음으로 Clojure 웹 애플리케이션의 디렉토리 구조를 생성해야 합니다. 다음 명령으로 이 작업을 수행할 수 있습니다.

mkdir -p /var/www/html/do-clojure-web/app/db

다음으로 Clojure 애플리케이션 파일을 위 디렉토리에 복사합니다.

cp /root/do-clojure-web/target/do-clojure-web-0.1.0-standalone.jar /var/www/html/do-clojure-web/app/

그런 다음 다음 명령을 사용하여 Clojure 앱 디렉터리에 적절한 권한을 부여합니다.

chown -R www-data:www-data /var/www/html/do-clojure-web/

다음으로 다음 명령을 사용하여 clojure 웹 응용 프로그램의 symbolink를 만듭니다.

cd /var/www/html/do-clojure-web/app/
ln -s do-clojure-web-0.1.0-standalone.jar do-clojure-web.jar

이제 Clojure 웹 앱을 사용할 준비가 되었습니다. 다음 명령으로 실행 여부를 확인할 수 있습니다.

java -jar do-clojure-web.jar

모든 것이 정상이면 다음 출력이 표시됩니다.

2017-10-01 10:30:48.349:INFO:oejs.Server:jetty-7.x.y-SNAPSHOT
2017-10-01 10:30:48.590:INFO:oejs.AbstractConnector:Started :5000

Nginx 및 감독자 구성

다음으로, Clojure 애플리케이션을 서비스로 관리하도록 Supervisor를 구성해야 합니다. 아래와 같이 Supervisor config 디렉토리 아래에 do-clojure-web.conf 파일을 생성하면 됩니다.

nano /etc/supervisor/conf.d/do-clojure-web.conf

다음 줄을 추가합니다.

[program:do-clojure-web]
command=/usr/bin/java -jar do-clojure-web.jar
directory=/var/www/html/do-clojure-web/app
user=www-data
autostart=true
autorestart=true
startretries=3
redirect_stderr=true
stdout_logfile=/var/log/log/do-clojure-web.app.log

완료되면 파일을 저장하고 닫습니다.

다음으로 리버스 프록시로 사용하도록 Nginx를 구성해야 합니다. Clojure 웹 애플리케이션은 localhost의 연결만 허용하기 때문입니다. Nginx를 사용하여 원격 위치에서 액세스할 수 있습니다. 이렇게 하려면 Nginx 기본 구성 파일을 구성해야 합니다.

nano /etc/nginx/sites-available/default

아래와 같이 파일을 변경합니다.

upstream http_backend {
    server 127.0.0.1:5000;
    keepalive 32;
}
server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;

        index index.html index.htm index.nginx-debian.html;

        server_name _;

    location / {
        proxy_pass http://http_backend;

        proxy_http_version 1.1;
        proxy_set_header Connection "";

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;

        access_log /var/log/do-clojure-web.access.log;
        error_log /var/log/do-clojure-web.error.log;
    }
}

완료되면 파일을 저장하고 닫은 다음 Nginx 및 감독자 서비스를 다시 시작하여 모든 변경 사항을 적용합니다.

systemctl restart nginx
systemctl restart supervisor

다음 명령을 사용하여 Nginx와 Supervisor의 상태를 모두 확인할 수 있습니다.

systemctl status supervisor

모든 것이 정상이면 다음 출력이 표시됩니다.

? supervisor.service - Supervisor process control system for UNIX
   Loaded: loaded (/lib/systemd/system/supervisor.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2017-10-02 10:19:32 EDT; 22min ago
     Docs: http://supervisord.org
 Main PID: 397 (supervisord)
    Tasks: 19 (limit: 4915)
   CGroup: /system.slice/supervisor.service
           ??397 /usr/bin/python /usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf
           ??446 /usr/bin/java -jar do-clojure-web.jar

Oct 02 10:19:32 debian systemd[1]: Started Supervisor process control system for UNIX.
Oct 02 10:19:39 debian supervisord[397]: 2017-10-02 10:19:39,656 CRIT Supervisor running as root (no user in config file)
Oct 02 10:19:39 debian supervisord[397]: 2017-10-02 10:19:39,665 INFO Included extra file "/etc/supervisor/conf.d/do-clojure-web.conf" during p
Oct 02 10:19:39 debian supervisord[397]: 2017-10-02 10:19:39,821 INFO RPC interface 'supervisor' initialized
Oct 02 10:19:39 debian supervisord[397]: 2017-10-02 10:19:39,823 CRIT Server 'unix_http_server' running without any HTTP authentication checkin
Oct 02 10:19:39 debian supervisord[397]: 2017-10-02 10:19:39,825 INFO supervisord started with pid 397
Oct 02 10:19:40 debian supervisord[397]: 2017-10-02 10:19:40,890 INFO spawned: 'do-clojure-web' with pid 446
Oct 02 10:19:41 debian supervisord[397]: 2017-10-02 10:19:41,893 INFO success: do-clojure-web entered RUNNING state, process has stayed up for 
systemctl status nginx

산출:

? nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2017-10-02 10:19:35 EDT; 26min ago
     Docs: man:nginx(8)
  Process: 425 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
  Process: 401 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
 Main PID: 427 (nginx)
    Tasks: 2 (limit: 4915)
   CGroup: /system.slice/nginx.service
           ??427 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
           ??429 nginx: worker process

Oct 02 10:19:32 debian systemd[1]: Starting A high performance web server and a reverse proxy server...
Oct 02 10:19:35 debian systemd[1]: nginx.service: Failed to read PID from file /run/nginx.pid: Invalid argument
Oct 02 10:19:35 debian systemd[1]: Started A high performance web server and a reverse proxy server.

Clojure 웹 앱에 액세스

모든 것이 제대로 구성되면 웹 브라우저를 통해 Clojure 웹 애플리케이션에 액세스할 시간입니다.

웹 브라우저를 열고 URL http://your-ip-address를 입력하면 아래와 같이 Clojure 웹 앱 홈 페이지로 리디렉션됩니다.

이제 위치 추가 버튼을 클릭하면 다음 이미지가 표시됩니다.

여기에서 x 값과 y 값 필드에 값을 제공한 다음 위치 제출 버튼을 클릭합니다. 이제 모든 위치 보기 버튼을 클릭하여 제출한 위치를 볼 수 있습니다. 다음 이미지가 표시되어야 합니다.

결론

위 글에서는 Supervisor와 Lein을 이용하여 Clojure 웹 애플리케이션을 배포하는 방법에 대해 알아보았습니다. 또한 Nginx를 리버스 프록시 서버로 설정하여 원격 위치에서 Clojure 웹 애플리케이션에 액세스하는 방법도 배웠습니다. 이제 Clojure, Supervisor 및 lein을 사용하여 사용자 지정 애플리케이션을 쉽게 배포할 수 있기를 바랍니다. 궁금한 점이 있으면 무엇이든 물어보세요.