Seize the day

POST : Backend study

Google GCP 우분투에 Nginx/Mongodb/Deno 설치하기

시작 부터 에러가

kimdaejeong@base-backend-1:~$ sudo apt-get install nginx
E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?

 

구글링해서

E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?

 

위 에러를 아래와 같이 해결했습니다.

우선 터미널 여시고 모든 프로세스를 죽여줍니다~!
1) sudo killall apt apt-get

만일 진행중인 프로세스가 없다라고 뜨면, 아래와 같이 하나하나씩 디렉토리를 삭제해주세요.

- sudo rm /var/lib/apt/lists/lock
- sudo rm /var/cache/apt/archives/lock
- sudo rm /var/lib/dpkg/lock*

sudo dpkg --configure -a  를 하시고 sudo apt update

 

sudo dpkg --configure -a    에서 다시 에러

kimdaejeong@base-backend-1:~$ sudo dpkg --configure -a 
dpkg: error: dpkg status database is locked by another process
kimdaejeong@base-backend-1:~$ sudo rm /var/lib/dpkg/lock
kimdaejeong@base-backend-1:~$ sudo dpkg --configure -a 
dpkg: error: dpkg status database is locked by another process

 

lsof /var/lib/dpkg/lock 으로 해결된 듯.. 왜 때문에?
dpkg: error: dpkg status database is locked by another process - Ask Ubuntu

 

설치 성공

kimdaejeong@base-backend-1:~$ nginx -V
nginx version: nginx/1.10.3 (Ubuntu)
built with OpenSSL 1.0.2g  1 Mar 2016
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_v2_module --with-http_sub_module --with-http_xslt_module --with-stream --with-stream_ssl_module --with-mail --with-mail_ssl_module --with-threads

 

80 포트로 변경하고 서버 시작 

$ vi  /etc/nginx/sites-enabled/default
$ sudo service nginx start

 

Certbot을 이용하여 Ngix에 SSL 인증서 적용하기

인증서 만들기
Certbot으로 무료 인증서 발급 받기 | MHLab Blog (elfinlas.github.io)
Ubuntu Nginx 환경에서 CertBot을 사용하여 https 사용하기 (velog.io)
[Nginx] Nginx HTTPS 및 Let's Encryt SSL 인증서 적용⋆ JackerLab
여기를 참고..

kimdaejeong@base-backend-1:/var/www/html/.well-known/acme-challenge$ sudo certbot certonly --webroot -w /var/www/html -d app.mdiwebma.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for app.mdiwebma.com
Using the webroot path /var/www/html for all unmatched domains.
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/app.mdiwebma.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/app.mdiwebma.com/privkey.pem
   Your cert will expire on 2021-11-01. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:

설치 과정중에 http 서버가 실행중이어야한다.
/var/www/html 이 현재  http를 서비스하고 있는 nginx의 root 디렉토리이다.

인증서는 /etc/letsencrypt에 있다.

kimdaejeong@base-backend-1:/etc/letsencrypt$ sudo ls -al /etc/letsencrypt/live/app.mdiwebma.com
total 12
drwxr-xr-x 2 root root 4096 Aug  3 11:34 .
drwx------ 3 root root 4096 Aug  3 11:34 ..
lrwxrwxrwx 1 root root   40 Aug  3 11:34 cert.pem -> ../../archive/app.mdiwebma.com/cert1.pem
lrwxrwxrwx 1 root root   41 Aug  3 11:34 chain.pem -> ../../archive/app.mdiwebma.com/chain1.pem
lrwxrwxrwx 1 root root   45 Aug  3 11:34 fullchain.pem -> ../../archive/app.mdiwebma.com/fullchain1.pem
lrwxrwxrwx 1 root root   43 Aug  3 11:34 privkey.pem -> ../../archive/app.mdiwebma.com/privkey1.pem
-rw-r--r-- 1 root root  692 Aug  3 11:34 README

 

nginx 설정파일 변경

server {
        # listen 80 default_server;
        # listen [::]:80 default_server;

        # SSL configuration
        #
        listen 443 ssl default_server;
        listen [::]:443 ssl default_server;

        ssl_certificate /etc/letsencrypt/live/app.mdiwebma.com/fullchain.pem;
        ssl_certificate_key     /etc/letsencrypt/live/app.mdiwebma.com/privkey.pem;

nginx restart로 동작확인

sudo service nginx restart

 

자동 갱신 
/etc/cron.d/certbot 이 추가되었음 확인가능 


인증서 갱신: 

# 인증성 갱신없이 갱신이 가능한지 체크만 한다.
sudo certbot renew --dry-run

# 실제 인증서를 갱신한다.  80포트가 살아있어야 한다. 
sudo certbot renew

# nginx 재시작해야 적용이 되더라.
sudo service nginx restart

 

자동 갱신하기
HotHandCoding :: certbot를 활용한 https 인증서 발급 및 cron 설정 (tistory.com) 여기를 참고

# 이미 등록되어 있는지 확인
crontab -l

# 없으면 추가
crontab -e

# 2월 28일 마다 (https://crontab.guru/ 참고)
0 0 28 1 * certbot renew --renew-hook "sudo service nginx restart"

 

GCP 우분투에 Mongodb 설치하기

Install MongoDB Community Edition on Ubuntu — MongoDB Manual
여기를 거의 참고했고,  지시에 따라서 하면 거의 되는데 뭔가 잘 안된 부분만 수정한다. 

5.0 버전은 설치가 안 된다.  설치는 -y mongodb-org 로 문서에 되어 있는데 실제로는 에러를 내고 -org 를 지우고 하니 제대로 설치가 되었다. 

sudo apt-get install -y mongodb

서버 실행도  mongod로 실행하니 에러를 내고, mongodb로 하니 제대로 실행되고 mongo를 실행해서 접속도 되었다.

sudo service mongodb start

이 방법은 너무 낮은 버전의 mongodb(2.x)를 설치한다.  삭제하고 다시 시도. (삭제는 메뉴얼대로 하니 문제없이 됨)

 

5.0은 아무리해도 설치가 안 되서, 4.4 버전의 Mongodb를 설치를 다시 시도하기 (메뉴얼에서 해당 OS에 맞는 명령줄을 복사해서 5.0을 4.4로 변경)

echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list

OS 확인

kimdaejeong@base-backend-1:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.7 LTS
Release:        16.04
Codename:       xenial

64bit인지 확인

kimdaejeong@base-backend-1:~$ uname -m
x86_64

init system 확이

kimdaejeong@base-backend-1:~$ ps --no-headers -o comm 1
systemd


4.4버전의 Mongodb는 설치 성공했음.. 서버 실행
$ sudo systemctl start mongod

Mongo db 5.x의 설치는 상위 버전의 우분투 이미지를 이용해서 설치 시도하여 성공했음 :  https://dajkim76.tistory.com/535

 

GCP에 deno 설치 

Deno - A secure runtime for JavaScript and TypeScript 

curl -fsSL https://deno.land/x/install/install.sh | sh

kimdaejeong@base-backend-1:/etc/cron.d$ curl -fsSL https://deno.land/x/install/install.sh | sh
######################################################################## 100.0%
Archive:  /home/kimdaejeong/.deno/bin/deno.zip
  inflating: /home/kimdaejeong/.deno/bin/deno  
Deno was installed successfully to /home/kimdaejeong/.deno/bin/deno
Manually add the directory to your $HOME/.bash_profile (or similar)
  export DENO_INSTALL="/home/kimdaejeong/.deno"
  export PATH="$DENO_INSTALL/bin:$PATH"
Run '/home/kimdaejeong/.deno/bin/deno --help' to get started

 

위에 표시된 환경변수 두 줄을 .bashrc 맨 아래를 추가해 둔다. 

kimdaejeong@base-backend-1:~$ vi .bashrc
kimdaejeong@base-backend-1:~$ . .bashrc
kimdaejeong@base-backend-1:~$ deno 
Deno 1.12.2
exit using ctrl+d or close()

 

설치단계에서 unzip 에러가 나면 : GitHub - denoland/deno_install: Deno Binary Installer

sudo apt-get install unzip -y

 

Deno Server test

server.ts

import { Application, Router, Context } from "https://deno.land/x/oak/mod.ts"
import { Bson, MongoClient } from "https://deno.land/x/mongo/mod.ts";

// Init mongo db
const client = new MongoClient();

//Connecting to a Local Database
await client.connect("mongodb://localhost:27017");

// Define collection
interface TSList {
    _id: { $oid: string };
    moneyBookId: Bson.ObjectId
    collectionName: string;
    ts: number
  }


const db = client.database("testdb");
const tslist = db.collection<TSList>("TSList");


// Http Handler
const getTSList = async ({ response }: { response: any }) => {
    
    const result = await tslist.find().toArray()
    response.body = {
        code: 0,
        result: result
    }
}

const errorHandler = async (ctx: Context, next: any) => {
    try {
      await next();
    } catch (err) {
      ctx.response.status = 500;
      ctx.response.body = { code: 500, message: err.message }
    }
  }

  const _404 = async (ctx: Context) => {
    ctx.response.status = 404;
    ctx.response.body = { code: 404, message: "404 Not Found!" }
  }

 // Init router
const router = new Router()
router.get("/lt/v1/tslist", getTSList)

// Init server
const app = new Application()
const port = 8000
app.use(errorHandler);
app.use(router.routes())
app.use(router.allowedMethods())
app.use(_404)

console.log("start server port=" + port);
await app.listen({ port: port });

 

서버 실행까지는 성공함
$ deno run --inspect  --allow-net --unstable server.ts
Debugger listening on ws://127.0.0.1:9229/ws/e35c1134-9494-4ee6-b0e5-f2623cbb3e83
start server port=8000

Nginx에 프락시 설정하기
sudo vi /etc/nginx/sites-enabled/default

location /lt {
                proxy_pass http://localhost:8000;
        }

연결 확인 https://app.mdiwebma.com/lt/v1/tslist

GCP에 ssh로 접속하기

메타데이터에서 SSH 키 관리  |  Compute Engine 문서  |  Google Cloud  참고.. 

Mac에 키 생성

ssh-keygen -t rsa -f ~/.ssh/gcp.key -C kimdaejeong

 

GCP 메타 데이타에 public 키 등록 

  $ cat gcp.key.pub

https://console.cloud.google.com/compute/metadata/sshKeys 에 키 등록 

Mac 에서 접속

$ ssh -i ~/.ssh/gcp.key kimdaejeong@<GCP IP>
Enter passphrase for key '/Users/user/.ssh/gcp.key':

OS를 여러개 사용되었을때,  이전 OS에 사용된 IP가 새로 실행한 VM에 다시 할당된 경우는 
~/.ssh/known_hosts  에서 해당 IP를 지우고 다시 시도한다.  

top

posted at

2021. 8. 3. 19:09


CONTENTS

Seize the day
BLOG main image
김대정의 앱 개발 노트와 사는 이야기
RSS 2.0Tattertools
공지
아카이브
최근 글 최근 댓글
카테고리 태그 구름사이트 링크