Ravindra BagaleCourses & study guides English

Node.js Express App AWS EC2 वर Host करा: PM2 आणि Nginx

Node.js server वर JavaScript चालवतो, आणि बहुतेक Node.js APIs Express नावाच्या छोट्या framework ने बनवलेले असतात. तुम्ही Python app host केला असेल, तर रस्ता जवळपास तोच आहे; फक्त tools ची नावं बदलतात. या chapter मध्ये तुम्ही दोन्ही बाजूबाजूला compare करता, Amazon Linux 2023 EC2 instance वर Node.js आणि npm install करता, package.json आणि JSON route असलेली Express index.js लिहिता, libraries node_modules मध्ये install करता, app port 3000 वर test करता, PM2 ने तो चालू ठेवता (reboot नंतरसुद्धा), आणि visitors नी साधा port 80 वापरावा म्हणून समोर nginx ठेवता.

या class मध्ये काय शिकणार

  • Python app vs Node.js app host करणं, step by step बाजूबाजूला
  • Amazon Linux 2023 आणि Ubuntu वर Node.js आणि npm install करणं
  • package.json: name, version, dependencies आणि devDependencies
  • / route आणि /getusers JSON route असलेली Express index.js
  • npm install, node_modules folder आणि package-lock.json
  • node index.js आणि तात्पुरत्या port 3000 rule ने testing
  • PM2: start, list, logs, restart, stop, आणि reboot साठी pm2 startup आणि pm2 save
  • Port 3000 ला nginx proxy_pass, sudo nginx -t, आणि port 3000 बंद करणं
  • नेहमीचे errors सोडवणं: Cannot find module, EADDRINUSE, 502 Bad Gateway

1. Python app vs Node.js app, बाजूबाजूला

का: Dynamic app, PHP, Python किंवा Node.js, एकाच पद्धतीने host होतो: language install करा, app च्या libraries install करा, app internal port वर चालवा, तो background मध्ये चालू ठेवा, आणि समोर port 80 वर nginx ठेवा. Steps बाजूबाजूला पाहिल्या की नवीन language म्हणजे फक्त commands ची नवीन नावं.

Python app vs Node.js app host करणं Install Python sudo yum install python3-pip -y Node.js sudo yum install nodejs24 -y App folder Python mkdir pythonapp Node.js mkdir nodeapp Library list Python requirements.txt Node.js package.json Framework Python Flask / Django Node.js Express Code Python app.py Node.js index.js Libraries install Python pip install -r requirements.txt Node.js npm install Test run Python python3 app.py :5000 Node.js node index.js :3000 Background Python gunicorn Node.js pm2 start index.js समोर Python nginx proxy_pass :5000 Node.js nginx proxy_pass :3000 Python libraries virtual environment मध्ये python3 -m venvmyenv Node.js venv नाही: libraries app च्या स्वतःच्याnode_modules/

Figure 1. Python app आणि Node.js app साठी त्याच नऊ steps: install, folder, library list, framework, code, libraries install, test run, background run आणि समोर nginx. मोठा फरक: Python ला virtual environment लागतं, Node.js प्रत्येक app च्या libraries त्याच्या स्वतःच्या node_modules folder मध्ये ठेवतो.

Classroom line

Python needs a virtual environment; Node.js doesn't.

Python ची बाजू step by step Host a Python Flask app on EC2 with gunicorn and nginx मध्ये समजावली आहे.

2. Node.js आणि npm install करा

का: Node.js शिवाय server JavaScript चालवूच शकत नाही, आणि Express आणायला npm लागतो. Current version निवडला की security fixes मिळत राहतात.

काय: Node.js browser च्या बाहेर JavaScript चालवतो. npm (Node Package Manager) Express सारख्या libraries download करतो; तो Node.js सोबत येतो.

कसं, Amazon Linux 2023 वर:

  1. SSH (22) My IP वरून आणि HTTP (80) कुठूनही allow करणाऱ्या security group सह Amazon Linux 2023 instance (t2.micro किंवा t3.micro) launch करा, आणि ssh -i mykey.pem ec2-user@PUBLIC_IP ने connect करा.
  2. Node.js install करा आणि versions check करा:

    sudo yum install nodejs24 -y
    node -v
    npm -v
    
  3. node -v v24.x दाखवतो आणि npm -v npm चं version. nodejs24 package सोबत npm पण install होतो.

  4. Amazon Linux 2023 मध्ये प्रत्येक Node.js version चं वेगळं package आहे: nodejs22 आणि nodejs24 current आहेत. साधं nodejs package म्हणजे Node.js 18, ज्याला आता security fixes मिळत नाहीत, म्हणून नवीन app साठी ते वापरू नका.

कसं, Ubuntu वर: package चं नाव इथेही nodejs आहे, आणि npm वेगळं package आहे:

sudo apt update
sudo apt install nodejs npm -y
node -v

3. Project आणि package.json बनवा

का: package.json मुळे कोणताही server एका npm install ने app परत उभं करू शकतो. ते नसेल तर प्रत्येक library हाताने लक्षात ठेवावी लागेल.

काय: package.json app चं वर्णन करतो: त्याचं नाव, version, आणि त्याला लागणाऱ्या libraries. हे requirements.txt चं काम करतं, फक्त JSON मध्ये लिहिलेलं: { } च्या आत "key": "value" pairs, commas ने वेगळे.

कसं:

  1. Folder बनवा आणि file उघडा:

    mkdir nodeapp
    cd nodeapp
    nano package.json
    
  2. लिहा:

    {
      "name": "node-app",
      "description": "sample Express API",
      "version": "0.0.1",
      "private": true,
      "dependencies": {
        "express": "^5.3.0"
      },
      "devDependencies": {
        "mocha": "^12.0.3",
        "supertest": "^7.3.1"
      }
    }
    
  3. Ctrl+O, Enter ने save करा, आणि Ctrl+X ने बाहेर पडा.

प्रत्येक भागाचा अर्थ:

  1. name आणि version app ओळखतात. "private": true मुळे app चुकून npm registry वर publish होत नाही.
  2. dependencies म्हणजे app चालायला लागणाऱ्या libraries: इथे फक्त Express.
  3. devDependencies फक्त code लिहिताना आणि test करताना लागतात: mocha tests चालवतो आणि supertest app ला test requests पाठवतो. Live app त्या कधीच वापरत नाही.
  4. ^5.3.0 म्हणजे "version 5.3.0 किंवा कुठलंही नवीन 5.x". npm स्वतःहून 6.0 वर उडी मारत नाही, कारण नवीन major version code बिघडवू शकतं.

Classroom line

Libraries needed only for coding and testing are called development dependencies.

package.json: libraries चे दोन प्रकार{ "name": "node-app", "version": "0.0.1", "dependencies": { "express": "^5.3.0" }, "devDependencies": { "mocha": "^12.0.3", "supertest": "^7.3.1" }}dependenciesapp चालवायला लागतात, प्रत्येक server वरexpress: web frameworknpm install --omit=dev -> installeddevDependenciesफक्त code लिहायला आणि test करायलाmocha tests चालवतो, supertest test requests पाठवतोnpm install --omit=dev -> skipped

Figure 2. package.json मध्ये दोन प्रकारच्या libraries असतात. express सारख्या dependencies server वर app चालवायला लागतात. mocha आणि supertest सारख्या devDependencies फक्त code लिहिताना आणि test करताना लागतात; npm install --omit=dev त्या सोडून देतो.

तयार sample app GitHub repository ravibagale/nodeapp मध्ये आहे; git clone https://github.com/ravibagale/nodeapp.git तो download करतो.

4. Express app लिहा: index.js

का: ही छोटी file म्हणजेच पूर्ण app. प्रत्येक ओळ काय करते हे कळलं की routes जोडणं आणि errors सोडवणं स्वतः जमतं.

कसं: nano index.js, आणि लिहा:

var express = require('express');
var app = express();

app.get('/', function (req, res) {
  res.send('Hello from Node.js on EC2');
});

app.get('/getusers', function (req, res) {
  res.json({ username: 'ravi' });
});

app.listen(process.env.PORT || 3000);
module.exports = app;

प्रत्येक ओळ काय करते:

  1. require('express') node_modules मधून Express load करतो; express() app object बनवतो, नाव app.
  2. app.get('/', ...) / साठीच्या GET request ला उत्तर देतो. हे Flask च्या @app.route('/') चं Express version आहे.
  3. Function ला request req आणि response res मिळतात. res.send() text किंवा HTML पाठवतो.
  4. /getusers हा API route आहे: res.json() object JSON म्हणून पाठवतो, {"username":"ravi"}, content type application/json सह.
  5. app.listen(process.env.PORT || 3000) PORT environment variable मधल्या port वर ऐकतो, तो set नसेल तर 3000 वर.
  6. module.exports = app मुळे test files, जसं supertest test, app load करू शकतात.

Classroom line

Python had app.route; here it's app.get.

5. npm install आणि node_modules folder

का: Library node_modules मध्ये येईपर्यंत require('express') fail होतो. npm install ती तिथे आणतो, package.json ने मागितलेल्या versions मध्ये.

कसं: ~/nodeapp मध्ये:

npm install
ls

काय होतं:

  1. npm package.json वाचतो, Express आणि Express ला स्वतःला लागणारी प्रत्येक library download करतो, आणि त्या सगळ्या project मध्ये नवीन folder node_modules मध्ये ठेवतो.
  2. तो package-lock.json पण लिहितो, install केलेल्या प्रत्येक package च्या नेमक्या version सह, म्हणजे पुढच्या npm install ला, कुठल्याही server वर, त्याच versions मिळतात.
  3. node_modules फक्त या app चा आहे. म्हणूनच Node.js ला virtual environment लागत नाही: दोन folders मधल्या दोन apps चे स्वतःचे वेगळे node_modules असतात.
  4. Live server वर npm install --omit=dev ने test libraries वगळू शकता.
  5. node_modules कधीच GitHub वर किंवा servers मध्ये copy करू नका. node_modules .gitignore मध्ये टाका, package.json आणि package-lock.json ठेवा, आणि प्रत्येक server वर npm install चालवा.
  6. npm install vulnerabilities दाखवत असेल, तर npm audit कुठलं package ते सांगतो; package.json मध्ये त्या package चं version update केलं की सहसा प्रश्न सुटतो.

Classroom line

When npm install runs, it creates a folder named node_modules.

npm install project चा स्वतःचा node_modules भरतो ~/nodeapp/ package.json index.js $ npm install node_modules/ express/ body-parser/ router/ ... dozens more Express ला स्वतःला लागणारे helpers package-lock.json नेमकी versions, पुढच्या install साठी ~/otherapp/ package.json node_modules/ स्वतःच्या libraries आणि versions: clash नाही, venv ची गरज नाही node_modules git च्या बाहेर ठेवा; प्रत्येक server वर npm install चालवा.

Figure 3. npm install package.json वाचतो, express आणि तो ज्या packages वर अवलंबून आहे ते सगळे project च्या स्वतःच्या node_modules folder मध्ये download करतो, आणि नेमकी versions package-lock.json मध्ये नोंदवतो. दुसऱ्या folder मधल्या दुसऱ्या app ला स्वतःचा node_modules मिळतो.

6. node index.js ने app test करा

का: आधी server वरच curl ने test केलं की nginx किंवा security group आड येण्याआधीच app चालतं हे सिद्ध होतं.

कसं:

  1. App foreground मध्ये start करा:

    node index.js
    
  2. Prompt परत येत नाही: app या terminal मध्ये चालतोय. दुसऱ्या SSH window मध्ये, server वरच test करा:

    curl http://127.0.0.1:3000/
    curl http://127.0.0.1:3000/getusers
    
  3. तुमच्या browser मधून test करायला security group मध्ये तात्पुरता inbound rule टाका: Custom TCP, port 3000, source My IP. http://PUBLIC_IP:3000/ आणि http://PUBLIC_IP:3000/getusers उघडा.

  4. Ctrl+C दाबा: app थांबतो. SSH window बंद केली तरी तो थांबतो. Test साठी हे ठीक आहे, live app साठी नाही.

7. PM2 ने app चालू ठेवा

का: node ने सुरू केलेलं app SSH window बंद होताच मरतं. Live API चालू राहायला हवं आणि crash नंतर परत यायला हवं, हे PM2 चं काम.

काय: PM2 हा Node.js साठी process manager आहे. तो app background मध्ये चालवतो, crash झाला तर restart करतो, त्याचे logs ठेवतो, आणि reboot नंतर परत start करू शकतो. Python साठी gunicorn आणि systemd जे काम करतात, ते Node.js साठी PM2 करतो.

कसं:

  1. एकदाच, globally (-g) install करा, म्हणजे pm2 command प्रत्येक folder मध्ये चालते:

    sudo npm install -g pm2
    
  2. ~/nodeapp मधून app start करा:

    pm2 start index.js
    
  3. PM2 एक table दाखवतो: id 0, name index (.js शिवाय file चं नाव), mode fork, status online. Prompt परत येतो, आणि logout नंतरही app चालू राहतो.

  4. रोजच्या commands:

    pm2 list
    pm2 logs index
    pm2 restart index
    pm2 stop index
    pm2 delete index
    
  5. pm2 list table परत दाखवतो; ↺ column restarts मोजतो. pm2 logs index app चा output आणि errors live दाखवतो (Ctrl+C ने log view मधून बाहेर; app चालूच राहतो). stop app थांबवतो पण list मध्ये ठेवतो; delete तो PM2 मधून काढतो.

  6. App ला जास्त स्पष्ट नाव द्यायचं असेल, तर pm2 start index.js --name nodeapp ने start करा आणि बाकीच्या commands मध्ये nodeapp वापरा.

Classroom line

To run it in the background, you need PM2.

काळा terminal: [PM2] Spawning PM2 daemon with pm2_home=/home/ec2-user/.pm2, PM2 Successfully daemonized, Starting /home/ec2-user/nodeapp/index.js in fork_mode (1 instance), Done. खाली id, name, namespace, version, mode, pid, uptime, restarts, status, cpu, mem, user, watching columns असलेलं table आणि एक row: 0, index, default, 0.0.1, fork, online, 0%, 33.9mb, ec2-user, disabled.

Whiteboard: pm2 start index.js: PM2 त्याचा daemon start करतो, index.js fork mode मध्ये start करतो आणि app online असलेलं process table दाखवतो.

8. Reboot नंतर app परत start करा: pm2 startup आणि pm2 save

का: PM2 स्वतः एक साधा program आहे. Reboot नंतर, किंवा instance stop आणि start केल्यावर, त्याला कोणी start करत नाही, म्हणून तुम्ही login करेपर्यंत app बंद राहतो.

कसं:

  1. PM2 ला startup service बनवायला सांगा:

    pm2 startup
    
  2. तो sudo env PATH=$PATH:/usr/bin ... pm2 startup systemd -u ec2-user --hp /home/ec2-user ने सुरू होणारी एक command दाखवतो. ती नेमकी ओळ copy करून चालवा. ती pm2-ec2-user नावाची systemd service बनवते, जी boot ला PM2 start करते.

  3. चालू apps ची list save करा:

    pm2 save
    
  4. pm2 save सध्याची list ~/.pm2/dump.pm2 मध्ये लिहितो. Boot ला PM2 त्या list मधला प्रत्येक app start करतो.

  5. Test करा: sudo reboot, एका मिनिटाने परत connect करा, आणि pm2 list चालवा: तुम्ही start न करता index online आहे.
  6. App add किंवा delete केला की प्रत्येक वेळी परत pm2 save चालवा.
Node.js app चालू ठेवा EC2 instance 1. node index.js: app तुमच्या SSH session मध्ये जगतो $ node index.js ^C (or SSH closed) index.js: थांबला SSH बंद केला किंवा Ctrl+C: app थांबतो. 2. pm2 start index.js: app background मध्ये चालतो PM2 (process manager, background मध्ये) → index.js:3000 online Logout करा: app online राहतो. 3. App crash होतो: PM2 तो परत start करतो index.js crash झाला → restart: ↺ 1, परत online pm2 list मधला ↺ column restarts मोजतो; pm2 logs कारण दाखवतो. 4. Reboot: pm2 startup + pm2 save तो परत आणतात systemd: pm2-ec2-user (boot ला PM2 start करतो) systemd boot ला PM2 start करतो; PM2 ~/.pm2/dump.pm2 मध्ये saveकेलेले apps start करतो.

Figure 4. Animation: foreground मधला node index.js SSH बंद झाल्यावर थांबतो; pm2 start logout नंतरही app online ठेवतो; app crash झाला तर PM2 तो restart करतो; reboot नंतर pm2 startup आणि pm2 save तो परत online आणतात.

9. समोर nginx ठेवा: port 3000 ला proxy_pass

का: Visitors नी port 3000 नाही, तर साधा http://ADDRESS port 80 वर (आणि HTTPS साठी 443) वापरायला हवा. nginx प्रत्येक request घेतो आणि ती app कडे पाठवतो. हे Python app सारखंच चालतं; reverse proxy चं पूर्ण explanation Put nginx in front as the reverse proxy मध्ये आहे.

कसं:

  1. nginx install करा आणि start करा:

    sudo yum install nginx -y
    sudo service nginx start
    
  2. sudo nano /etc/nginx/nginx.conf ने config उघडा. आधीपासून असलेल्या server { ... } block च्या आत, root ओळीनंतर, हे टाका:

    location / {
        proxy_pass http://127.0.0.1:3000;
    }
    
  3. File check करा, मग reload करा:

    sudo nginx -t
    sudo service nginx reload
    
  4. nginx -t ने syntax is ok आणि test is successful म्हणायलाच हवं. नाहीतर तो सांगतो ती ओळ दुरुस्त करा आणि परत test करा; तोपर्यंत चालू nginx जुनं config वापरत राहतो.

  5. Port शिवाय http://PUBLIC_IP/ आणि http://PUBLIC_IP/getusers उघडा: Express app nginx मधून उत्तर देतो.

Classroom line

Now install nginx and start it.

Classroom line

Every service command needs sudo.

Port 3000 बंद करा: आता बाहेरच्या कोणालाही त्याची गरज नाही.

  1. Security group मधून port 3000 चा rule delete करा. 22 My IP वरून, 80, आणि HTTPS टाकलं तर 443 ठेवा.
  2. जास्त safety साठी, app ला फक्त server वरच ऐकू द्या. index.js ची शेवटून दुसरी ओळ app.listen(process.env.PORT || 3000, '127.0.0.1'); करा आणि pm2 restart index चालवा.
  3. http://PUBLIC_IP/ चालतो; http://PUBLIC_IP:3000/ आता उत्तर देत नाही.
Node.js app च्या समोर nginxBrowserhttp://PUBLIC_IP/Security group22 My IP80 Anywhere3000 deletedफक्त test साठीEC2 instancenginx :80location / { proxy_pass 127.0.0.1:3000;}Express appindex.js127.0.0.1:3000PM2 चालू ठेवतोsudo nginx -t, मग sudo service nginx reload. एका server block मध्येएकच location /. App बंद असेल तर 502 Bad Gateway.

Figure 5. Browser port 80 वर nginx पर्यंत पोहोचतो; location / block request PM2 ने चालू ठेवलेल्या 127.0.0.1:3000 वरच्या Express app कडे पाठवतो. Security group 22 आणि 80 allow करतो; तात्पुरता port 3000 rule delete केला आहे.

10. Code बदला: pm2 restart

का: PM2 जुना code memory मध्ये ठेवतो. Restart करेपर्यंत तुमचा बदल काहीच करत नाही, आणि bug नसताना bug वाटतो.

काय: App start झाला तेव्हा PM2 ने index.js load केली. File मधला बदल app restart होईपर्यंत काहीच करत नाही.

Worked example: दुसरा API route टाका.

  1. index.js मध्ये app.listen ओळीच्या वर route टाका:

    app.get('/health', function (req, res) {
      res.json({ status: 'ok' });
    });
    
  2. http://PUBLIC_IP/health उघडा: तो Cannot GET /health म्हणतो, Express कडून 404. चालू app कडे अजून जुना code आहे.

  3. तो restart करा, आणि errors साठी log बघा:

    pm2 restart index
    pm2 logs index --lines 20
    
  4. /health परत उघडा: तो {"status":"ok"} देतो.

  5. package.json बदलला असेल, तर आधी npm install, मग pm2 restart index चालवा. pm2 restart all प्रत्येक app restart करतो.

Classroom line

Suppose you changed the code...

11. काही बिघडलं तर

का: प्रत्येक लक्षण एक layer दाखवतं: app, PM2, nginx किंवा security group. क्रमाने तपासलं की प्रॉब्लेम लवकर सापडतो.

  1. node: command not found: Node.js install नाही. sudo yum install nodejs24 -y चालवा.
  2. Error: Cannot find module 'express': npm install चालवलं नाही, किंवा दुसऱ्या folder मध्ये चालवलं. cd ~/nodeapp करून npm install चालवा.
  3. npm install code EJSONPARSE देऊन fail होतो: package.json valid JSON नाही. सुटलेला comma, सुटलेला " किंवा शेवटच्या item नंतरचा comma शोधा.
  4. Error: listen EADDRINUSE: address already in use :::3000: app ची दुसरी copy आधीच port 3000 वापरतेय, बहुतेक PM2 ने start केलेली. pm2 list ती दाखवतो; सोबत node index.js चालवू नका.
  5. Testing करताना http://PUBLIC_IP:3000 उघडत नाही: app चालू नाही, किंवा security group मध्ये port 3000 rule नाही.
  6. pm2: command not found: sudo npm install -g pm2 ने install करा.
  7. Reboot नंतर app गायब: pm2 startup चालवा, तो दाखवतो ती ओळ चालवा, मग pm2 save.
  8. 502 Bad Gateway: nginx चालतोय पण app उत्तर देत नाही. pm2 list आणि pm2 logs index कारण दाखवतात; proxy_pass मधला port check करा.
  9. तुमच्या app ऐवजी nginx welcome page: location / block नाही किंवा server block च्या बाहेर आहे, किंवा nginx reload केला नाही.
  10. nginx -t duplicate location "/" म्हणतो: एका server block मध्ये एकच location / असू शकतो. जास्तीचा block delete करा.
  11. नवीन route Cannot GET देतो: pm2 restart index चालवा.

Classroom line

Only one works, not both.

Ravindra Bagale's Tip

तीन commands ची एक सवय लावा: प्रत्येक code बदलानंतर pm2 restart आणि pm2 logs वर एक नजर; प्रत्येक nginx बदलानंतर reload आधी sudo nginx -t; आणि प्रत्येक नवीन किंवा delete केलेल्या app नंतर pm2 save. आणि nginx चालायला लागला की port 3000 rule delete करा. App फक्त nginx मधूनच पोहोचता यायला हवा.

Practice झाली की EC2 instance stop करा. तुम्ही install केलेलं सगळं instance च्या EBS root volume वर असतं; पुढचा chapter data साठी दुसरा EBS volume जोडतो.

12. पूर्ण class एका page वर

  1. Python आणि Node.js apps एकाच पद्धतीने host होतात: language, libraries, internal port वर app, process manager, समोर nginx.
  2. Amazon Linux 2023: sudo yum install nodejs24 -y (npm सोबत येतो); Ubuntu: sudo apt install nodejs npm -y. node -v आणि npm -v ने check करा.
  3. package.json app चं वर्णन करतो; dependencies चालवायला लागतात, devDependencies फक्त लिहायला आणि test करायला.
  4. Express: app.get('/path', function (req, res) { ... }); text साठी res.send(), JSON साठी res.json(); app.listen(process.env.PORT || 3000).
  5. npm install project चा स्वतःचा node_modules भरतो आणि package-lock.json लिहितो; venv लागत नाही. node_modules git बाहेर ठेवा.
  6. node index.js foreground मध्ये चालतो: तात्पुरत्या port 3000 rule सह test साठी चांगला.
  7. sudo npm install -g pm2, pm2 start index.js; मग pm2 list, logs, restart, stop, delete.
  8. pm2 startup (दाखवलेली ओळ चालवा) आणि pm2 save reboot नंतर app परत आणतात.
  9. nginx: server block मध्ये location / { proxy_pass http://127.0.0.1:3000; }, एकच location /; sudo nginx -t, मग sudo service nginx reload.
  10. nginx मागे असताना port 3000 rule delete करा; नवीन code ला pm2 restart index लागतो.

13. Hands-on lab: nginx मागे Express API, PM2 ने चालू ठेवलेला

हा lab का. हा lab नवीन Amazon Linux 2023 server पासून port 80 वर उत्तर देणाऱ्या, logout आणि reboot नंतरही टिकणाऱ्या Node.js API पर्यंत नेतो, वाटेत प्रत्येक layer तपासत.

  1. Node.js install करा
    • Command: sudo yum install nodejs24 -y
    • काय दिसेल: Complete!
    • Check करा: node -v v24.x दाखवतो; npm -v version दाखवतो.
    • का: nodejs24 हा security fixes मिळणारा current version, आणि तो npm सोबत आणतो. साधा nodejs package Node.js 18 आहे, त्याला आता fixes मिळत नाहीत.
  2. Project folder बनवा
    • Command: mkdir ~/nodeapp && cd ~/nodeapp
    • काय दिसेल: काहीच नाही.
    • Check करा: pwd → /home/ec2-user/nodeapp
    • का: प्रत्येक app ला स्वतःचा folder, म्हणजे त्याचे node_modules दुसऱ्या app मध्ये मिसळत नाहीत.
  3. package.json लिहा
    • करा: nano package.json आणि section 3 मधली file लिहा, dependencies खाली "express" सह.
    • Check करा: cat package.json मध्ये braces आणि commas section 3 सारखेच दिसतात.
    • का: एक comma किंवा quote राहिला तर npm JSON parse error देऊन थांबतो.
  4. index.js लिहा
    • करा: nano index.js आणि section 4 मधला code लिहा.
    • Check करा: cat index.js चा शेवट app.listen(process.env.PORT || 3000); ने होतो.
    • का: Port 3000 हा app चा स्वतःचा port; नंतर nginx त्याकडे forward करेल.
  5. Libraries install करा
    • Command: npm install
    • काय दिसेल: added ... packages आणि नवीन node_modules folder.
    • Check करा: ls node_modules/express मध्ये Express च्या files दिसतात.
    • का: हे नसेल तर node index.js Cannot find module 'express' ने fail होतो.
  6. PM2 ने सुरू करा
    • Command: sudo npm install -g pm2 && pm2 start index.js
    • काय दिसेल: index आणि status online असलेला table.
    • Check करा: curl http://127.0.0.1:3000/getusers → {"username":"ravi"}
    • का: -g मुळे pm2 प्रत्येक folder मध्ये चालतो. Logout नंतरही PM2 app चालू ठेवतो.
  7. Reboot नंतरही टिका
    • Command: pm2 startup
    • काय दिसेल: sudo env PATH=$PATH:/usr/bin ने सुरू होणारी एक ओळ. ती copy करून चालवा, मग pm2 save.
    • Check करा: sudo reboot, परत connect, pm2 list: index online आहे.
    • का: startup boot ला PM2 सुरू करतो; save कोणती apps सुरू करायची ते सांगतो. दोन्ही लागतात.
  8. nginx पुढे ठेवा
    • Command: sudo yum install nginx -y && sudo service nginx start
    • काय दिसेल: Complete!
    • Check करा: section 9 मधला location / { proxy_pass http://127.0.0.1:3000; } block जोडा, मग sudo nginx -t → syntax is ok आणि test is successful.
    • का: Visitors port 80 वापरतात; nginx प्रत्येक request app कडे पाठवतो. nginx -t typos चालू server बिघडवण्याआधीच पकडतो.
  9. Reload करून browser मधून test करा
    • Command: sudo service nginx reload
    • काय दिसेल: काहीच नाही.
    • Check करा: address मध्ये port नसताना http://PUBLIC_IP/getusers {"username":"ravi"} दाखवतो.
    • का: Fail झालं तर security group port 80 allow करतो का ते तपासा. Port 3000 internet ला कधीच उघडा लागत नाही.
  10. Code बदला आणि restart करा
    • करा: section 10 मधला /health route जोडा, मग pm2 restart index चालवा.
    • Check करा: http://PUBLIC_IP/health → {"status":"ok"}
    • का: Restart आधी तोच address Cannot GET /health दाखवतो, कारण PM2 अजून जुना code चालवतो.

14. Try at home

Try at home

Task 1: app

  1. Amazon Linux 2023 instance launch करा, nodejs24 install करा, आणि node -v व npm -v check करा.
  2. package.json आणि index.js सह ~/nodeapp बनवा. npm install आधी node index.js चालवा आणि error वाचा. मग npm install चालवा आणि node_modules मध्ये डोकावून बघा.
  3. My IP साठी port 3000 उघडा आणि browser मध्ये / आणि /getusers test करा.

Task 2: PM2

  1. PM2 ने app start करा, SSH बंद करा, आणि app अजून उत्तर देतो का ते check करा.
  2. pm2 startup आणि pm2 save चालवा, instance reboot करा, आणि pm2 list check करा.
  3. /health route टाका, Cannot GET बघा, मग pm2 restart index आणि JSON बघा.

Task 3: nginx

  1. nginx install करा, location / block टाका, sudo nginx -t चालवा, reload करा, आणि app port 80 वर उघडा.
  2. दुसरा location / block टाका, sudo nginx -t चालवा, आणि message वाचा. तो परत delete करा.
  3. pm2 stop index ने app थांबवा, 502 Bad Gateway बघा, आणि परत start करा. Port 3000 rule delete करा.

Recap

थोडक्यात

  1. Node.js app Python app सारखाच host होतो; requirements.txt, pip, python3 app.py आणि gunicorn ऐवजी package.json, npm install, node index.js आणि PM2.
  2. dependencies app चालवतात; devDependencies फक्त लिहायला आणि test करायला मदत करतात.
  3. प्रत्येक project चा स्वतःचा node_modules असतो, म्हणून Node.js ला virtual environment लागत नाही.
  4. PM2 app background मध्ये चालू ठेवतो; pm2 startup आणि pm2 save reboot नंतर तो परत आणतात.
  5. Port 80 वरचा nginx requests 127.0.0.1:3000 ला पाठवतो; sudo nginx -t ने test करा, मग port 3000 बंद करा.
  6. नवीन code ला pm2 restart लागतो.

सराव Tasks

या scenario बद्दल

Dubai Gold Souk हा दुबई मधला दागिने व्यवसाय आहे. Fatima Al Mansoori त्यांचं IT व cloud काम पाहतात. त्यांचे पैसे AED मध्ये मोजले जातात आणि AWS resources me-central-1 Region मध्ये चालतात. खालच्या tasks मध्ये तुम्ही या lesson मध्ये शिकलेलं वापरून त्यांची खरी कामं करता. सगळी नावं, account IDs, IP addresses व numbers सरावासाठी काल्पनिक आहेत.

0 / 12

सोपं बदलानंतर service restart करा

का: Config बदल service restart/reload नंतरच लागू होतात.

काय करायचं: nginx service restart करा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

सोपं Service चालू आहे का ते पाहा

का: Site बंद असेल तर आधी web server चालू आहे का ते पाहा.

काय करायचं: httpd service चं status दाखवा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

सोपं Ubuntu वर package install करा

का: Ubuntu apt वापरतं. Package नावं वेगळी: Ubuntu वर Apache म्हणजे apache2.

काय करायचं: Ubuntu वर apache2 package confirm न विचारता install करा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

सोपं Amazon Linux वर package install करा

का: Amazon Linux 2023 वर dnf हा package manager. -y आपोआप yes देतो.

काय करायचं: Amazon Linux 2023 वर httpd package confirm न विचारता install करा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

सोपं Server वरून website test करा

का: DNS तयार होण्याआधीही web server उत्तर देतो का ते curl दाखवतो.

काय करायचं: http://localhost ला request पाठवा व फक्त response headers दाखवा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

सोपं GitHub वरून code घ्या

का: git clone पूर्ण repository server वर copy करतो.

काय करायचं: https://github.com/dubaigold/website.git सध्याच्या folder मध्ये clone करा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

मध्यम nginx config test करा

का: Restart मुळे site बंद पडण्याआधी test चुका पकडतो.

काय करायचं: nginx configuration files मधल्या चुका तपासा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

मध्यम Service आत्ता व boot ला सुरू करा

का: enable reboot नंतर सुरू करतो; --now आत्ताच सुरू करतो.

काय करायचं: nginx service enable करा व लगेच सुरू करा, एका command ने.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

मध्यम Port 80 सगळ्यांसाठी उघडा

का: Security group HTTP allow करत असेल तरच visitors website पाहू शकतात.

काय करायचं: Security group sg-012bb45cc4124c3b2 वर 0.0.0.0/0 कडून inbound TCP port 80 allow करा.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

मध्यम CloudFormation: web SG

का: फक्त 443 उघडल्याने server सुरक्षित.

काय करायचं: 0.0.0.0/0 कडून TCP 443 allow करणारा AWS::EC2::SecurityGroup. GroupDescription द्या.

कसं करायचं:
  1. Task मधल्या top-level keys पासून सुरू करा.
  2. Child keys 2 spaces ने indent करा (tabs नकोत).
  3. प्रत्येक property मध्ये task मधली value भरा.
  4. Check answer दाबा. Keys चा क्रम महत्त्वाचा नाही.

मध्यम Security group बनवा

का: Security group म्हणजे instance भोवतीचा firewall.

काय करायचं: vpc-0ff45ee412deadbee मध्ये dubaigold-web-sg नावाचा security group "Web servers" description सह बनवा.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

अवघड Ubuntu वर nginx site enable करा

का: Ubuntu वर sites-available पासून sites-enabled ला symbolic link ने site enable होते.

काय करायचं: /etc/nginx/sites-enabled/ मध्ये /etc/nginx/sites-available/dubaigold ची symbolic link बनवा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

झटपट उजळणी cards

हा lesson दोन मिनिटांत revise करा. Cards phone वर save करा किंवा PNG download करा. प्रत्येक card वरचा QR त्याचा lesson उघडतो.

तुलना card: Python Flask app vs Node.js Express app. Python Flask app: Python मध्ये लिहिलेलं web app. Node.js Express app: JavaScript मध्ये लिहिलेलं web app.
तुलना: Python Flask app vs Node.js Express app · PNG download करा
उजळणी card: package.json म्हणजे काय?. Node app ला अनेक libraries लागतात. कोणत्या install करायच्या हे server ला कळायला हवं. package.json मध्ये app चं नाव, version आणि dependencies. npm install ते वाचतो. App folder मध्ये npm install चालवा. node_modules आणि package-lock.json बनतात. Dependency line:
उजळणी card: package.json म्हणजे काय? · PNG download करा
उजळणी card: छोटं Express app. URLs ना सहज उत्तर द्यायला Node ला web framework लागतो. Express तो framework. प्रत्येक route एका URL ला function शी जोडतो. index.js लिहा, मग port 3000 वर node index.js ने test. JSON route:
उजळणी card: छोटं Express app · PNG download करा
उजळणी card: PM2 ने Node चालू ठेवा. SSH बंद केला किंवा server reboot झाला की node index.js थांबतो. PM2 हा process manager. App background मध्ये चालवतो आणि crash झाल्यास restart करतो. App start करा, मग pm2 startup आणि pm2 save म्हणजे reboot नंतर परत येतं. Start:
उजळणी card: PM2 ने Node चालू ठेवा · PNG download करा
उजळणी card: Port 3000 वरच्या Node समोर Nginx. Users ना port 80 अपेक्षित, आणि 3000 internet ला उघडणं unsafe. Nginx 80 वर ऐकतो आणि 127.0.0.1:3000 वरच्या Node ला proxy_pass करतो. location add करा, nginx -t, reload, मग port 3000 चा SG rule काढा. Location:
उजळणी card: Port 3000 वरच्या Node समोर Nginx · PNG download करा
तुलना: node index.js vs pm2 start index.js. node index.js: App तुमच्या terminal मध्ये चालवतो. pm2 start index.js: App managed background process म्हणून चालवतो.
तुलना: node index.js vs pm2 start index.js · PNG download करा
मुलाखत card: Production मध्ये node index.js ऐवजी PM2 का?. PM2 app background मध्ये चालू ठेवतो, crash आणि reboot नंतर restart करतो. SSH बंद झाला की node index.js मरतो. Commands:
मुलाखत card: Production मध्ये node index.js ऐवजी PM2 का? · PNG download करा
मुलाखत card: Node app साठी Nginx 502 Bad Gateway दाखवतो. काय तपासता?. Node app चालू आहे का आणि proxy_pass मधल्या port वर ऐकतो का. 502 म्हणजे Nginx ला backend कडून उत्तर मिळालं नाही. Check:
मुलाखत card: Node app साठी Nginx 502 Bad Gateway दाखवतो. काय तपासता? · PNG download करा
मुलाखत card: Node start करताना EADDRINUSE म्हणजे काय?. Port आधीच दुसऱ्या process ने वापरलेला, बहुतेक app ची जुनी copy. दोन programs एकाच port वर ऐकू शकत नाहीत. शोधा आणि थांबवा:
मुलाखत card: Node start करताना EADDRINUSE म्हणजे काय? · PNG download करा
मुलाखत card: package-lock.json commit करायचं पण node_modules नाही, का?. Lock file exact versions fix करते; node_modules npm install ने परत बनतो. node_modules खूप मोठा आणि OS-specific. .gitignore line:
मुलाखत card: package-lock.json commit करायचं पण node_modules नाही, का? · PNG download करा

अजून cards: Ravi Sir's Cards.