웹사이트 검색

Ubuntu 20.04에서 Nginx로 Clojure 웹 애플리케이션을 배포하는 방법


이 페이지에서

  1. 전제 조건
  2. 시작하기\n
  3. Nginx 및 감독자 설치
  4. Clojure 앱 다운로드
  5. Clojure 애플리케이션용 디렉토리 구조 생성\n
  6. Clojure 응용 프로그램에 대한 감독자 구성\n
  7. Clojure 애플리케이션용 Nginx 구성\n
  8. Clojure 애플리케이션 액세스\n
  9. 결론

Clojure는 Java 플랫폼의 현대적이고 역동적이며 강력한 프로그래밍 언어입니다. LISP 프로그래밍 언어를 기반으로 하며 Java 및 .Net 런타임 환경 모두에서 실행할 수 있는 컴파일러가 있습니다. Clojure를 사용하면 Java 코드를 직접 건드리지 않고도 처음부터 시스템을 구축할 수 있습니다. 현재 Walmart 및 Puppet Lab을 비롯한 많은 대기업에서 사용하고 있습니다.

이 튜토리얼에서는 Ubuntu 20.04에서 Clojure 웹 애플리케이션을 배포하는 방법을 설명합니다.

전제 조건

  • Ubuntu 20.04를 실행하는 서버.\n
  • 서버 IP를 가리키는 유효한 도메인 이름입니다.\n
  • 루트 암호는 서버에 구성됩니다.\n

시작하기

시작하기 전에 시스템 패키지를 최신 버전으로 업데이트하는 것이 좋습니다. 다음 명령으로 업데이트할 수 있습니다.

apt-get update -y

모든 패키지가 업데이트되면 다음 명령을 실행하여 Java 및 기타 필수 패키지를 설치합니다.

apt-get install git curl default-jdk -y

모든 패키지가 설치되면 다음 명령을 사용하여 설치된 Java 버전을 확인합니다.

java -version

다음과 같은 결과가 표시되어야 합니다.

openjdk version "11.0.9.1" 2020-11-04
OpenJDK Runtime Environment (build 11.0.9.1+1-Ubuntu-0ubuntu1.20.04)
OpenJDK 64-Bit Server VM (build 11.0.9.1+1-Ubuntu-0ubuntu1.20.04, mixed mode, sharing)

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

Nginx 및 감독자 설치

다음으로 Nginx 웹 서버와 Supervisor를 시스템에 설치해야 합니다. Nginx는 인터넷에서 애플리케이션을 호스팅하는 데 사용되는 웹 서버입니다. Supervisor는 사용자가 Linux 기반 운영 체제에서 여러 프로세스를 모니터링하고 제어할 수 있도록 하는 클라이언트/서버 시스템입니다.

다음 명령을 사용하여 두 패키지를 모두 설치할 수 있습니다.

apt-get install nginx supervisor -y

두 패키지가 모두 설치되면 다음 단계로 진행할 수 있습니다.

클로저 앱 다운로드

먼저 Git 저장소에서 Clojure 앱을 다운로드해야 합니다. 다음 명령을 실행하여 다운로드할 수 있습니다.

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

다운로드가 완료되면 다음 출력이 표시됩니다.

Cloning into 'do-clojure-web'...
remote: Enumerating objects: 37, done.
remote: Total 37 (delta 0), reused 0 (delta 0), pack-reused 37
Unpacking objects: 100% (37/37), 6.25 KiB | 399.00 KiB/s, done.

다음으로 시스템에 Leiningen을 설치해야 합니다. Leiningen은 Clojure 프로그래밍 언어로 작성된 프로젝트를 만드는 데 사용되는 빌드 자동화 및 종속성 관리 도구입니다. 다음 명령을 사용하여 Leiningen 바이너리 패키지를 다운로드할 수 있습니다.

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

다운로드가 완료되면 다음 명령으로 실행 권한을 설정합니다.

chmod 755 /usr/bin/lein

다음으로 디렉터리를 Clojure로 변경하고 다음 명령을 사용하여 프로젝트를 컴파일합니다.

cd do-clojure-web
lein uberjar

프로젝트가 컴파일되면 다음과 같은 결과가 표시됩니다.

Retrieving commons-codec/commons-codec/1.6/commons-codec-1.6.jar from central
Retrieving javax/servlet/servlet-api/2.5/servlet-api-2.5.jar from central
Retrieving org/clojure/java.jdbc/0.2.3/java.jdbc-0.2.3.jar from central
Retrieving com/h2database/h2/1.3.170/h2-1.3.170.jar from central
Retrieving org/eclipse/jetty/jetty-server/7.6.13.v20130916/jetty-server-7.6.13.v20130916.jar from central
Retrieving org/eclipse/jetty/orbit/javax.servlet/2.5.0.v201103041518/javax.servlet-2.5.0.v201103041518.jar from central
Retrieving org/eclipse/jetty/jetty-continuation/7.6.13.v20130916/jetty-continuation-7.6.13.v20130916.jar from central
Retrieving org/eclipse/jetty/jetty-http/7.6.13.v20130916/jetty-http-7.6.13.v20130916.jar from central
Retrieving org/eclipse/jetty/jetty-io/7.6.13.v20130916/jetty-io-7.6.13.v20130916.jar from central
Retrieving org/eclipse/jetty/jetty-util/7.6.13.v20130916/jetty-util-7.6.13.v20130916.jar from central
Retrieving medley/medley/0.5.3/medley-0.5.3.jar from clojars
Retrieving clout/clout/2.1.0/clout-2.1.0.jar from clojars
Retrieving compojure/compojure/1.3.1/compojure-1.3.1.jar from clojars
Retrieving ring/ring-core/1.3.2/ring-core-1.3.2.jar from clojars
Retrieving instaparse/instaparse/1.3.4/instaparse-1.3.4.jar from clojars
Retrieving crypto-random/crypto-random/1.2.0/crypto-random-1.2.0.jar from clojars
Retrieving crypto-equality/crypto-equality/1.0.0/crypto-equality-1.0.0.jar from clojars
Retrieving clj-time/clj-time/0.6.0/clj-time-0.6.0.jar from clojars
Retrieving ring/ring-codec/1.0.0/ring-codec-1.0.0.jar from clojars
Retrieving ring/ring-defaults/0.1.2/ring-defaults-0.1.2.jar from clojars
Retrieving ring/ring-ssl/0.2.1/ring-ssl-0.2.1.jar from clojars
Retrieving ring/ring-headers/0.1.1/ring-headers-0.1.1.jar from clojars
Retrieving ring/ring-anti-forgery/1.0.0/ring-anti-forgery-1.0.0.jar from clojars
Retrieving hiccup/hiccup/1.0.2/hiccup-1.0.2.jar from clojars
Retrieving ring/ring-jetty-adapter/1.3.2/ring-jetty-adapter-1.3.2.jar from clojars
Retrieving ring/ring-servlet/1.3.2/ring-servlet-1.3.2.jar from clojars
Compiling do-clojure-web.handler
Created /root/do-clojure-web/target/do-clojure-web-0.1.0.jar
Created /root/do-clojure-web/target/do-clojure-web-0.1.0-standalone.jar

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

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/
cp /root/do-clojure-web/db/do-clojure-web.h2.db /var/www/html/do-clojure-web/app/db/

그런 다음 다음 명령을 사용하여 적절한 권한과 소유권을 설정합니다.

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

다음으로 디렉터리를 Clojure 앱으로 변경하고 clojure 애플리케이션의 심볼릭 링크를 만듭니다.

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

다음으로 다음 명령을 실행하여 애플리케이션이 작동하는지 확인합니다.

java -jar do-clojure-web.jar

모든 것이 정상이면 다음과 같은 결과가 표시됩니다.

2020-11-25 10:19:51.456:INFO:oejs.Server:jetty-7.x.y-SNAPSHOT
2020-11-25 10:19:51.497:INFO:oejs.AbstractConnector:Started :5000

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

Clojure 애플리케이션에 대한 감독자 구성

Clojure 애플리케이션을 서비스로 관리하는 방법에는 여러 가지가 있습니다. 이 튜토리얼에서는 Supervisor를 사용하여 Clojure 앱을 관리합니다. Supervisor 구성 디렉터리 내에 파일을 생성하여 구성할 수 있습니다.

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/do-clojure-web.app.log

파일을 저장하고 닫은 다음 감독자 서비스를 다시 시작하여 변경 사항을 적용합니다.

systemctl restart supervisor

그런 다음 시스템 재부팅 시 Supervisor 서비스가 시작되도록 활성화합니다.

systemctl enable 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 Wed 2020-11-25 10:22:31 UTC; 1min 12s ago
       Docs: http://supervisord.org
   Main PID: 40927 (supervisord)
      Tasks: 28 (limit: 2353)
     Memory: 104.6M
     CGroup: /system.slice/supervisor.service
             ??40927 /usr/bin/python3 /usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf
             ??40946 /usr/bin/java -jar do-clojure-web.jar

Nov 25 10:22:31 ubunt4 systemd[1]: Started Supervisor process control system for UNIX.
Nov 25 10:22:31 ubunt4 supervisord[40927]: 2020-11-25 10:22:31,603 CRIT Supervisor is running as root.  Privileges were not dropped becaus>
Nov 25 10:22:31 ubunt4 supervisord[40927]: 2020-11-25 10:22:31,603 INFO Included extra file "/etc/supervisor/conf.d/do-clojure-web.conf" d>
Nov 25 10:22:31 ubunt4 supervisord[40927]: 2020-11-25 10:22:31,608 INFO RPC interface 'supervisor' initialized
Nov 25 10:22:31 ubunt4 supervisord[40927]: 2020-11-25 10:22:31,608 CRIT Server 'unix_http_server' running without any HTTP authentication >
Nov 25 10:22:31 ubunt4 supervisord[40927]: 2020-11-25 10:22:31,609 INFO supervisord started with pid 40927
Nov 25 10:22:32 ubunt4 supervisord[40927]: 2020-11-25 10:22:32,612 INFO spawned: 'do-clojure-web' with pid 40946
Nov 25 10:22:33 ubunt4 supervisord[40927]: 2020-11-25 10:22:33,615 INFO success: do-clojure-web entered RUNNING state, process has stayed >

이 시점에서 Supervisor 서비스가 시작되고 애플리케이션이 포트 5000에서 수신 대기합니다. 다음 명령으로 확인할 수 있습니다.

ss -antpl | grep 5000

다음과 같은 결과가 표시되어야 합니다.

LISTEN   0        50          [::ffff:127.0.0.1]:5000                  *:*       users:(("java",pid=40946,fd=7)) 

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

Clojure 애플리케이션용 Nginx 구성

다음으로 Nginx를 역방향 프록시로 구성하여 Clojure 앱을 제공해야 합니다. 먼저 다음 명령을 사용하여 Nginx 가상 호스트 구성 파일을 만듭니다.

nano /etc/nginx/sites-available/clojure.conf

다음 줄을 추가합니다.

upstream http_backend {
    server 127.0.0.1:5000;
    keepalive 32;
}
server {
        listen 80;
        root /var/www/html;
        index index.html index.htm index.nginx-debian.html;

        server_name clojure.example.com;

    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 가상 호스트를 활성화합니다.

ln -s /etc/nginx/sites-available/clojure.conf /etc/nginx/sites-enabled/

다음으로 다음 명령을 사용하여 구문 오류가 있는지 Nginx를 확인합니다.

nginx -t

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

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

마지막으로 Nginx 서비스를 다시 시작하여 변경 사항을 적용합니다.

systemctl restart nginx

완료되면 Clojure 앱에 액세스할 수 있습니다.

Clojure 애플리케이션에 액세스

이제 웹 브라우저를 열고 URL http://clojure.example.com을 사용하여 Clojure 애플리케이션에 액세스합니다. 다음 화면에 Clojure 애플리케이션 대시보드가 표시되어야 합니다.

위치 추가 버튼을 클릭합니다. 다음 화면이 표시됩니다.

원하는 값을 제공하고 위치 제출 버튼을 클릭합니다. 다음 화면이 표시됩니다.

이제 모든 위치 보기 버튼을 클릭합니다. 다음 화면에 추가된 위치가 표시되어야 합니다.

결론

축하합니다! Ubuntu 20.04 서버에서 Nginx를 역방향 프록시로 사용하여 Clojure 앱을 성공적으로 배포했습니다. 이제 Clojure로 사용자 지정 애플리케이션을 배포할 수 있습니다.