aws ๋ฐฐํฌ๋ฅผ ํ•˜๊ฒŒ๋๋‹ค ์ด์ „๊นŒ์ง€๋Š” ํ”„๋ก ํŠธ๋งŒ ๋ฐฐํฌํ•˜๋Š”๊ฑธ ํ•ด๋ดค์—ˆ๋Š”๋ฐ, ํ”„๋ก ํŠธ์™€ ์„œ๋ฒ„๋ฅผ ํ•ฉ์นœ ํ’€์Šคํƒ์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐฐํฌํ•ด๋ณด๋Š” ์ข‹์€ ๊ฒฝํ—˜์„ ์–ป๊ฒŒ ๋˜์—ˆ๋‹ค. ์„œ๋ฒ„๋Š” express, db๋Š” mysql, ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ Œ๋”๋ง + ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง์œผ๋กœ ๋œ ํ”„๋กœ์ ํŠธ๋กœ, ๋‚ด๊ฐ€ ์‹ค์งˆ์ ์œผ๋กœ ์„œ๋ฒ„๋ฅผ ๊ฐ€๋™์‹œ์ผœ์•ผ ํ•˜๋Š” ๊ฒƒ์€ mysql๊ณผ express๊ฐ€ ์žˆ์—ˆ๋‹ค. mysql๊ฐ™์€ ๊ฒฝ์šฐ๋Š” mysql-server๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ db๋ฅผ ๊ณ„์† ๋Œ๋ฆด ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ express์˜ ๊ฒฝ์šฐ ํ•œ๋ฒˆ๋„ ์•ˆํ•ด๋ดค๋‹ค๋Š”๊ฒŒ ๋ฌธ์ œ,,,๋ผ์„œ ๋‚˜์ค‘์—๋ผ๋„ ๊นŒ๋จน์„๊นŒ๋ด ๋ฐฐํฌํ•œ ๊ณผ์ •์„ ์ ์–ด๋†“์œผ๋ ค ํ•œ๋‹ค. ๊ฑฐ๋‘์ ˆ๋ฏธํ•˜๊ณ  ์Šคํƒ€ํŠธ

์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๊ณผ์ •์—์„œ

์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๊ณผ์ •์—์„œ๋Š” ์ƒ์„ฑ ํ›„์— ๋ฏธ๋ฆฌ ํƒ„๋ ฅ์  ip(elastic ip)๋ฅผ ๋งŒ๋“ค์–ด ํ• ๋‹นํ•ด๋†“์ž. ๋‚˜์ค‘์— ๋งŒ๋“ค์ง€ ์•Š์œผ๋ฉด ๋‹ค์‹œ๊ธˆ ์ ‘์†ํ•˜๋Š” ๊ณผ์ •์ด ๊ท€์ฐฎ๋‹ค.

ec2 ์ฝ˜์†”์˜ ๋ฉ”๋‰ด์—์„œ Elastic IP addressses -> Allocate Elastic IP address ๋ฅผ ํ†ตํ•ด ๊ณ ์ •์ ์œผ๋กœ IP๋ฅผ ํ• ๋‹นํ•ด์ค€๋‹ค. ์„ค์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์ธ์Šคํ„ด์Šค ์žฌ์‹คํ–‰๋งˆ๋‹ค ip๊ฐ€ ๋ฐ”๋€” ์ˆ˜ ์žˆ๊ธฐ๋•Œ๋ฌธ์— ๊ณ ์ •์ ์ธ ip๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋‚ซ๋‹ค

ํƒ„๋ ฅ์  IP๊ฐ€ ๋งŒ๋“ค์–ด์กŒ์œผ๋ฉด Actions -> Associate Elastic IP Address ๋ฅผ ํ†ตํ•ด ์ธ์Šคํ„ด์Šค์— ํ• ๋‹นํ•ด์ค€๋‹ค.

ssh ์—ฐ๊ฒฐํ•˜๊ธฐ

ssh ์—ฐ๊ฒฐ์€ ec2 ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๊ผญ ํ•„์š”ํ•˜๋‹ค ๋งค๋ฒˆ aws ๋“ค์–ด๊ฐ€์„œ ํ•  ๊ฒƒ๋„ ์•„๋‹ˆ๊ณ  ์• ์ดˆ์— ์„ค์ • ์ž์ฒด๊ฐ€ ์–ด๋ ต์ง€ ์•Š๋‹ค ec2 ์ƒ์„ฑํ•  ๋•Œ ๋งŒ๋“  ํ‚คํŽ˜์–ด๋ฅผ ๊ฐ€์ง€๊ณ 

ssh -i ํ‚คํŽ˜์–ด.pem Username@PublicIP

๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐํ•ด์ค€๋‹ค. ๊ทธ๋Ÿผ ์ด๋Ÿฐ ์‹์œผ๋กœ ์—ฐ๊ฒฐ์ด ๋œ๋‹ค

์ฒซ ์—ฐ๊ฒฐ ์‹œ locale ์„ค์ •

์˜ ๊ฒฝ์šฐ ์ด ๋งํฌ๋ฅผ ์ฐธ๊ณ 

Mysql-server

๋„ ์ด ๋งํฌ๋ฅผ ์ฐธ๊ณ 

์›๊ฒฉ ์ €์žฅ์†Œ์—์„œ clone

git clone ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์ฃผ์†Œ

๋‚˜๋Š” private repository๋กœ๋„ ํ•œ๋ฒˆ ๋งŒ๋“ค์–ด ๋ดค๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ cloneํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ณ„์ • ์ •๋ณด ์ธ์ฆ์ด ํ•„์š”ํ•˜๋‹ค.

๋‚˜๋Š” access token์„ ๋ถ€์—ฌํ•ด์„œ ํ•ด๋‹น ํ† ํฐ์„ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ํƒํ–ˆ๋‹ค.

settings -> Developer settings -> Personal access tokens -> Fine-grain tokens์— ๋“ค์–ด๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•ด์ฃผ๊ณ , ์ ๋‹นํ•œ ๊ถŒํ•œ์„ ์„ค์ •ํ•ด์ค€ ๋’ค์— git cloneํ•  ๋•Œ ์œ ์ €๋„ค์ž„์„ ์ž…๋ ฅ ํ›„ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ๋ž€์— ๋ฐœ๊ธ‰๋œ ํ† ํฐ์„ ์ž…๋ ฅํ•ด์ฃผ๋ฉด cloneํ•  ์ˆ˜ ์žˆ๋‹ค.

mvm, nodejs ์„ค์น˜

mvm(node.js ๋ฒ„์ „ ๋งค๋‹ˆ์ €)๋ฅผ ์ด์šฉํ•ด์„œ node์™€ ๋”ธ๋ ค์˜ค๋Š” npm์„ ๋‹ค์šด๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

# installs nvm (Node Version Manager)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash
 
# download and install Node.js (you may need to restart the terminal)
nvm install 20
 
# verifies the right Node.js version is in the environment
node -v # should print `v20.17.0`
 
# verifies the right npm version is in the environment
npm -v # should print `10.8.2`

NGINX ์„ค์น˜ ๋ฐ ์‹คํ–‰

$ sudo apt-get update
$ sudo apt-get install nginx
์•„๋ž˜๋Š” ์ž˜ ์„ค์น˜๋˜์—ˆ๋‚˜ ๋ฒ„์ ผ ํ™•์ธํ•˜๋Š”๊ฒƒ
$ sudo nginx -v
๊ณต์‹ NGINX ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ๋ฏธ๋ฆฌ ๋นŒ๋“œ๋œ ์šฐ๋ถ„ํˆฌ ํŒจํ‚ค์ง€ ์„ค์น˜
$ sudo wget https://nginx.org/keys/nginx_signing.key
  • nginx stop: ๋น ๋ฅธ ์ข…๋ฃŒ
  • nginx quit: ์ •์ƒ์ข…๋ฃŒ
  • nginx reload: ๊ตฌ์„ฑํŒŒ์ผ ๋‹ค์‹œ ๋กœ๋“œ
  • nginx reopen: ๋กœ๊ทธํŒŒ์ผ ๋‹ค์‹œ์—ด๊ธฐ
  • nginx restart: ์žฌ์‹œ์ž‘

nginx๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์ œ๋Œ€๋กœ ์ž‘๋™์„ ์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š” nginx์˜ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

sudo vi /etc/nginx/sites-available/default

nginx.conf๋ฅผ ํ†ตํ•ด Include๋œ ์„œ๋ฒ„ ์„ค์ • ๊ด€ํŽธ ํŒŒ์ผ์„ vi ์—๋””ํ„ฐ๋ฅผ ํ†ตํ•ด ์ˆ˜์ •ํ•ด์ค€๋‹ค.

server {
	listen 80 default_server;
	listen [::]:80 default_server;
	...
	server_name ์„œ๋ฒ„์ด๋ฆ„
 
	location / { 
		# First attempt to serve request as file, then
		# as directory, then fall back to displaying a 404.
		proxy_pass http://127.0.0.1:3000;
		proxy_http_version 1.1;
	}
...
}
  • server_name ์„œ๋ฒ„์ด๋ฆ„;
    • ์ด ์„œ๋ฒ„ ๋„๋ฉ”์ธ์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
    • ํ•ด๋‹น ๋„๋ฉ”์ธ์œผ๋กœ ์ ‘๊ทผํ•  ๋•Œ Nginx๊ฐ€ ์ด ์„ค์ •์„ ์‚ฌ์šฉํ•œ๋‹ค
  • location / { ... }
    • location /์€ ๋ชจ๋“  ๋ฃจํŠธ ๊ฒฝ๋กœ (/)๋กœ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌ
  • proxy_pass http://127.0.0.1:3000;
    • ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ 127.0.0.1:3000์œผ๋กœ ํ”„๋ก์‹œ(์ „๋‹ฌ)ํ•œ๋‹ค
    • ๋‚˜๋Š” ์„œ๋ฒ„๋ฅผ ๋Œ๋ฆด ๋•Œ 3000 ํฌํŠธ๋กœ ๋Œ๋ ธ๊ธฐ ๋•Œ๋ฌธ์— 3000ํฌํŠธ๋กœ ํ”„๋ก์‹œ๋ฅผ ์ „๋‹ฌํ•˜๋„๋ก ํ–ˆ๋‹ค
  • proxy_http_version 1.1;
    • Nginx๊ฐ€ ํ”„๋ก์‹œ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ HTTP 1.1 ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์ • ๋ณ€๋™ ์‚ฌํ•ญ์„ ์ ์šฉ์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์žฌ์‹œ์ž‘ ํ•ด์ค€๋‹ค.
sudo systemctl restart nginx

pm2 ์„ค์น˜

pm2๋Š” ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ์ž๋กœ Node.js๋กœ ๋งŒ๋“ค์–ด์ง„ ํ”„๋กœ๊ทธ๋žจ์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋ฉฐ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

  • ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ์‹œ ์ž๋™ ์žฌ์‹œ์ž‘
  • ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‹œ ํ”„๋กœ์„ธ์Šค ์žฌ์‹œ์ž‘
  • ๋กœ๊ทธ ํ™”๋ฉด ์ง€์› ๋จผ์ € ์ „์—ญ์ ์œผ๋กœ Pm2 ์‚ฌ์šฉ์„ ์œ„ํ•ด ์„ค์น˜ํ•ด์ค€๋‹ค.
$ npm install pm2 -g

์Šฌ๋งŒํ•œ ๋ช…๋ น์–ด๋Š” ์ด์ •๋„๊ฐ€ ์žˆ๋‹ค

  • pm2 start [name] : ์‹œ์ž‘
  • pm2 list : ๋ชฉ๋ก
  • pm2 stop id|name|namespace|all|json|stdin : ์ข…๋ฃŒ
  • pm2 delete id|name|namespace|all|json|stdin : ์ œ๊ฑฐ
  • pm2 start [name] --watch : ์ฝ”๋“œ ๋ณ€๊ฒฝ์‹œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์žฌ์‹œ์ž‘
  • pm2 log : ๋กœ๊ทธ ํ™•์ธ