Ravindra BagaleCourses & study guides English

EC2 वर website host करणं: web servers, Apache httpd, /var/www/html, port 80 आणि curl

चला, सुरू करूया. आत्तापर्यंत आपण Linux शिकलो: folders, files, users आणि permissions. आज हे सगळं वापरून cloud engineer चं खरं काम करायचं: server वर website live करायची. आधी बघू की कोणी website उघडतो तेव्हा नक्की काय होतं, web server म्हणजे काय, आणि website hosting आणि API hosting मध्ये फरक काय. मग आपल्या EC2 server वर Apache install करायचा, start करायचा, /var/www/html मध्ये आपलं स्वतःचं page ठेवायचं, port 80 उघडायचा आणि site कुठल्याही browser मधून, अगदी तुमच्या phone वरून सुद्धा, उघडायची. Server चालू ठेवा आणि प्रत्येक command माझ्यासोबत type करा.

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

  • Hosting कुठे येतं: development, test आणि production
  • कोणी website उघडतो तेव्हा काय होतं
  • Web server म्हणजे काय: Apache, Nginx आणि बाकीचे
  • Website hosting vs API hosting
  • Static vs dynamic websites
  • sudo yum install httpd ने Apache install करणं
  • httpd -v ने install check करणं
  • Software vs service: start, status आणि enable
  • Apache start होत नसेल तर काय करायचं
  • /var/www/html मध्ये तुमचं पहिलं page
  • Security Group मध्ये port 80 उघडणं
  • Site उघडणं, आणि curl ने debug करणं
  • आणखी pages add करणं

1. Hosting का: laptop पासून live website पर्यंत

का. Developers website त्यांच्या laptops वर लिहितात. तिथे ती जगात कोणालाच उघडता येत नाही. कोणीतरी ती अशा server वर ठेवायला पाहिजे जो दिवस-रात्र चालू असतो आणि internet वरून कोणीही गाठू शकतो. ते काम cloud engineer करतो, आणि त्याला hosting म्हणतात.

काय. Software साधारणपणे तीन ठिकाणांमधून जातं:

  1. Development: developers स्वतःच्या laptops वर code लिहितात.
  2. Test: testers ते test server वर check करतात.
  3. Production: खरे users जो उघडतात तो live server.

Cloud engineers website लिहीत नाहीत. ती ज्या servers वर राहते ते servers ते बनवतात आणि चालवतात. Hosting चे दोन प्रकार:

  1. Website hosting: server तयार web pages पाठवतो (HTML, CSS, JavaScript, images).
  2. API (backend) hosting: server backend code चालवतो आणि data पाठवतो, बहुतेक JSON मध्ये.
Developer च्या laptop पासून live website पर्यंत Development Developers code लिहितात स्वतःच्या laptops वर. Test Testers ते check करतात test server वर. Production Live server जो खरे users उघडतात. Cloud engineer चं काम: code servers वर host करणं 1. Website hosting: server तयार web pages पाठवतो (HTML, CSS, JavaScript, images). 2. API (backend) hosting: server backend code चालवतो आणि data पाठवतो, बहुतेक JSON. हा chapter: EC2 server वर Apache ने website hosting.

Figure 1. Code developers च्या laptops वरून test server वर आणि मग production वर जातो. Cloud engineer तो host करतो: website hosting pages पाठवतं, API hosting data पाठवतं.

या chapter मध्ये एका EC2 server वर website hosting सुरुवातीपासून शेवटपर्यंत करायचं.

2. कोणी website उघडतो तेव्हा काय होतं

का. Request कुठल्या रस्त्याने जाते हे माहीत असेल, तर site उघडत नसताना कुठे बघायचं ते कळतं.

काय. समजा तुमची site www.mysite.com आहे आणि कोणी http://www.mysite.com/about.html उघडतो:

  1. Browser DNS ला www.mysite.com चा IP address विचारतो. DNS server चा public IP सांगतो.
  2. Browser request त्या IP ला पाठवतो. http आहे आणि port number दिलेला नाही, म्हणून port 80, HTTP चा default. https साठी default 443.
  3. Server वर एक program port 80 वर 24 तास ऐकत बसलेला असतो. तो program म्हणजे web server.
  4. Web server request वाचतो ("मला about.html दे") आणि ती file त्याच्या web folder मध्ये शोधतो. Amazon Linux वर Apache असेल तर तो folder /var/www/html.
  5. File असेल तर ती browser कडे परत जाते, आणि browser ती दाखवतो. नसेल तर उत्तर 404 Not Found.
  6. URL मध्ये file चं नावच नसेल, जसं http://www.mysite.com/, तर web server folder चं home page, index.html, पाठवतो.
कोणी तुमची website उघडतो तेव्हा काय होतं Browser http://www.mysite.com /about.html समजा ही तुमची site आहे DNS: नावावरून IP www.mysite.com → PUBLIC_IP PUBLIC_IP:80 ला request response: ती file EC2 server (Amazon Linux) port 80 Apache (httpd) port 80 वर 24/7 ऐकत असतो /var/www/html/ index.html about.html contact.html? इथे नाही → 404 1. तुम्ही http://www.mysite.com/about.html type करता. http आणि port number नाही म्हणजे port 80. 2. DNS नावाचा server च्या public IP address मध्ये बदल करतो. 3. Request त्या IP वर port 80 ला पोचते, जिथे Apache ऐकत असतो. 4. Apache त्याच्या folder मध्ये, /var/www/html मध्ये, about.html शोधतो. 5. सापडली: file browser कडे परत जाते. नाही सापडली: 404 Not Found.

Figure 2. Animation: DNS नावाचा public IP करतो, request port 80 ला पोचते, Apache /var/www/html मध्ये बघतो आणि file परत पाठवतो, file नसेल तर 404 Not Found.

Ports 80 आणि 443 तुम्ही Public आणि private IP, ports आणि IP classes मध्ये शिकलात. Domain names आणि DNS चा वेगळा chapter पुढे येईल; आज आपण server चा public IP सरळ वापरतोय.

Example 1: एकाच server वर तीन URLs.

  1. http://PUBLIC_IP/ ने /var/www/html/index.html मिळतं.
  2. http://PUBLIC_IP/about.html ने /var/www/html/about.html मिळतं.
  3. http://PUBLIC_IP/contact.html, अशी file नसेल तर, 404 Not Found देतं.

Classroom line

Whatever pages are in the html folder are what go back as the response.

Correction

Web files /var/www/html मध्येच ठेवायच्या असा Linux चा कुठलाही नियम नाही. तो Amazon Linux वरचा Apache चा default web folder आहे, जो /etc/httpd/conf/httpd.conf मधल्या DocumentRoot "/var/www/html" या line ने ठरतो. Admin तो दुसरीकडे बदलू शकतो. /bin किंवा /etc सारखे folders operating system साठी आहेत, web files साठी कधीच नाहीत.

3. Web server म्हणजे काय

का. Server machine वर बरेच programs चालतात. Browser ला उत्तर फक्त एकाच प्रकारचा program देऊ शकतो: जो port 80 (किंवा 443) वर ऐकतो, HTTP request समजतो आणि response परत पाठवतो. तो program म्हणजे web server.

काय. नेहमीचे web servers:

  1. Apache HTTP Server: open source आणि free. Amazon Linux वर package आणि program दोघांचं नाव httpd.
  2. Nginx: हा पण open source आणि free. त्याच्यामागची company paid support आणि जास्तीचे features विकते.
  3. IIS: Windows वरचा Microsoft चा web server, .NET sites साठी खूप वापरला जातो.
  4. Lighttpd: छोटा, हलका web server.

अजून दोन नावं ऐकायला मिळतील:

  1. Gunicorn आणि Uvicorn हे app servers आहेत. ते Python backend code चालवतात, बहुतेक Nginx किंवा Apache च्या मागे.
  2. XAMPP आणि WAMP हे laptop वर practice साठीचे bundles आहेत. एका installer मधून Apache, MySQL किंवा MariaDB, आणि PHP मिळतात.
Web requests ना उत्तर देणारे programs Web servers Apache HTTP Server open source, free. Package चं नाव: httpd Nginx open source, free. वेगळा लिहिलेला, Apache च्या code पासून नाही IIS Windows वरचा Microsoft चा web server Lighttpd छोटा, हलका web server App servers backend code चालवतात Gunicorn Uvicorn Python apps चालवतात, बहुतेक Nginx च्या मागे किंवा Apache च्या Bundles laptop वर practice साठी XAMPP WAMP एका installer मध्ये Apache + MySQL/MariaDB + PHP. स्वतःचा वेगळा web server नाही. या chapter मध्ये: Amazon Linux वर Apache. Nginx पुढच्या chapter मध्ये.

Figure 3. Web servers (Apache, Nginx, IIS, Lighttpd), Python code चालवणारे app servers (Gunicorn, Uvicorn), आणि laptop वर practice साठी bundles (XAMPP, WAMP).

या chapter मध्ये आपण Apache वापरतोय. Nginx पुढे येईल; concept तोच आहे.

Correction

Class board वरचे तीन मुद्दे, दुरुस्त करून:

  1. Nginx Apache च्या code पासून बनवलेला नाही. Igor Sysoev ने तो वेगळा लिहिला, एकाच वेळी खूप सारे connections handle करण्यासाठी.
  2. XAMPP आणि WAMP हे स्वतःचे web servers नाहीत. ते bundles आहेत, ज्यांच्या आत Apache असतो.
  3. Board वर Apache आणि Nginx चे speed चे आकडे (requests per second) होते. ते आपण काढून टाकलेत: खरा speed server, site आणि settings वर अवलंबून असतो, आणि कुठलाही एक आकडा खरा नसतो.

4. Website hosting vs API hosting

का. "Hosting" म्हणजे दोन वेगवेगळी कामं, आणि दोघांना server वर वेगवेगळ्या गोष्टी install कराव्या लागतात.

काय. समजा आपण Instagram आहोत. लोक ते वेगवेगळ्या size च्या phones, tablets, laptops, अगदी car screens वर उघडतात. Server ने ठरलेल्या layout चं एकच तयार HTML page पाठवलं, तर ते बऱ्याच screens वर बिघडलेलं दिसेल.

Classroom line

The layout will break.

म्हणून अशी apps काम वाटून घेतात:

  1. तुमच्या phone वरचं app server कडे फक्त data मागतं, उदाहरणार्थ user number 1001 चं profile.
  2. Server वर backend code (Python, Node.js, Java, .NET) तो data database मधून (MySQL, MongoDB) वाचतो.
  3. Server data JSON मध्ये परत पाठवतो, जो एक सोपा key-value format आहे.
  4. App ला स्वतःच्या screen ची size माहीत असते, आणि ते screen स्वतः काढतं.

Example 2: JSON उत्तर.

{"username": "ravi", "followers": 500}

Text values double quotes मध्ये असतात; numbers नाहीत.

Website hosting vs API hosting Website hosting Browser page दाखवतो Server /var/www/html Server पूर्ण HTML page पाठवतो: layout आणि content, दाखवायला तयार. <h1>Hello from my EC2 server</h1> एकच ठरलेला layout. खूप वेगळ्या screens वर तो नीट बसेलच असं नाही. API (backend) hosting Phone Tablet Laptop Backend code Python, Node.js, Java, .NET Database MySQL, MongoDB {"username": "ravi", "followers": 500} Server फक्त data (JSON) पाठवतो. प्रत्येक app स्वतःच्या screen प्रमाणे स्वतःचा UI काढतं.

Figure 4. Website hosting /var/www/html मधून पूर्ण HTML page पाठवतं. API hosting backend code आणि database मधून फक्त data (JSON) पाठवतं, आणि प्रत्येक app स्वतःची screen काढतं.

म्हणजे:

  1. Website hosting: server पूर्ण pages पाठवतो. Web server आणि files लागतात.
  2. API (backend) hosting: server data पाठवतो. Language (Python, Node.js, Java किंवा .NET), app server, बऱ्याचदा database, आणि समोर web server लागतो. तो code developers लिहितात; server तयार करून deploy करणं हे cloud engineer चं काम.

Correction

Board वर https://instagram.com/getprofile.py?id=1001 सारखा address दाखवला होता. तो फक्त "server कडे data मागणं" ही कल्पना दाखवण्यासाठी होता. खऱ्या apps त्यांच्या URLs मध्ये .py files दाखवत नाहीत. App server (Python साठी Gunicorn किंवा Uvicorn) साध्या, स्वच्छ addresses मागे code चालवतो.

5. Static vs dynamic websites

का. Site host करण्याआधी ती कुठल्या प्रकारची आहे ते माहीत पाहिजे, कारण dynamic site ला server वर खूप जास्त गोष्टी लागतात.

काय. Static website फक्त अशा files ची बनलेली असते ज्या browser ला समजतात:

  1. HTML: page ची रचना आणि content.
  2. CSS: ते कसं दिसतं (colours, fonts, layout).
  3. JavaScript: code जो browser मध्ये चालतो, server वर नाही.
  4. Images आणि videos.

प्रत्येक visitor ला त्याच files मिळतात. Server फक्त file शोधतो आणि पाठवतो.

Classroom line

(Static is the site) whose content doesn't change.

Dynamic website ला यांच्याशिवाय हे पण लागतं:

  1. Server-side language, जसं Python, PHP, Node.js किंवा Java.
  2. Database.

Server प्रत्येक visitor साठी त्याच्या data वरून page बनवतो. समजा reels app: प्रत्येक user ला वेगळे reels दिसतात, त्याने आधी काय बघितलं त्यावरून निवडलेले, आणि ते database मध्ये ठेवलेलं असतं.

Classroom line

Everyone sees different reels. Not everyone sees the same reels.

Static vs dynamic websites Static website HTML: page ची रचना CSS: ते कसं दिसतं JavaScript: browser मध्ये चालते Images आणि videos प्रत्येक visitor ला तीच file. Server फक्त file शोधतो आणि पाठवतो. उदाहरण: college event चं page Dynamic website Server-side language Python, PHP, Node.js, Java ... Database MySQL, MongoDB ... Server प्रत्येक visitor साठी, त्याच्या data वरून page बनवतो. समजा reels feed: प्रत्येक user ला वेगळा आज आपण static site host करतोय. Dynamic sites ला language आणि database पण install करावे लागतात.

Figure 5. Static site म्हणजे HTML, CSS, JavaScript आणि media, सगळ्यांसाठी सारखी. Dynamic site मध्ये server-side language आणि database येतात आणि प्रत्येक visitor साठी page बनतं.

Example 3: HTML हिशोब करत नाही. हे HTML file मध्ये लिहा आणि उघडा:

a=2
b=3
c=a+b

Browser अगदी तेच text दाखवतो. तो 5 दाखवत नाही. HTML फक्त page वर काय आहे ते सांगतं; हिशोब करायला browser मध्ये JavaScript, किंवा server वर language लागते.

Correction

HTML ही markup language आहे: ती text ला headings, paragraphs, links वगैरे म्हणून mark करते. ती programming language नाही, आणि "view engine" पण नाही. आणि PHP server वर चालते, म्हणून PHP site dynamic असते, static नाही.

आज आपण static site host करतोय. Dynamic sites पुढच्या chapters मध्ये येतील.

6. Step 1: Amazon Linux server launch करा आणि connect करा

काय. हे तुम्ही Root user, IAM users, MFA आणि पहिला EC2 server आणि EC2 च्या आत मध्ये केलंय:

  1. EC2 console मध्ये Amazon Linux 2023 AMI ने instance launch करा.
  2. तुमचा key pair आणि SSH (port 22) allow करणारा Security Group वापरा.
  3. ec2-user म्हणून SSH ने connect करा.

"Live" म्हणजे site अशा server वर आहे जो internet वरून कोणीही गाठू शकतो. Public IP असलेला तुमचा EC2 server अगदी तसाच आहे. Ubuntu servers थोडे वेगळे चालतात (दुसरा package manager, आणि package चं नाव apache2); हा chapter Amazon Linux साठी आहे.

7. Step 2: yum ने Apache install करा

का. नवीन server वर web server नसतो. आधी check करा:

[ec2-user@ip-172-31-xx-xx ~]$ httpd -v
-bash: httpd: command not found

command not found म्हणजे Linux ज्या folders मध्ये commands शोधतो, तिथे httpd नावाचा program नाही. सोप्या भाषेत: install नाही.

काय. एका command ने install होतो:

sudo yum install httpd

याचे चार भाग वाचा:

  1. sudo: root म्हणून चालवा. पूर्ण system साठी software install करणं हे admin चं काम.
  2. yum: package manager, software install, update आणि remove करणारं tool.
  3. install: काय करायचं. remove ने uninstall होईल.
  4. httpd: Apache चं package नाव.

Classroom line

Why sudo? Only root may install software, so we used sudo.

Install command वाचूया sudo yum install httpd -y sudo root म्हणून चालवा, install साठी लागतं yum package manager (AL2023 वर yum = dnf) install काय करायचं (remove ने uninstall) httpd package: Apache web server -y याला y उत्तर: Is this ok [y/N]

Figure 6. sudo yum install httpd -y चे भाग: sudo, package manager yum, action install, package httpd, आणि प्रश्नाला आपोआप उत्तर देणारा -y.

Handwritten board: sudo, yum in a box with an arrow to package manager, install with an arrow to action, and httpd with an arrow to software, package.

Class board वरून: sudo yum install httpd चे भाग: yum म्हणजे package manager, install म्हणजे action, httpd म्हणजे software package.

Package manager तुमच्यासाठी काय करतो.

  1. कुठून download करायचं ते त्याला माहीत असतं. Download चे addresses (repositories) /etc/yum.repos.d/ मधल्या .repo files मध्ये ठरवलेले असतात.
  2. httpd ला आणखी काय लागतं (त्याच्या dependencies) ते त्याला माहीत असतं, आणि तो ते आधी, बरोबर क्रमाने install करतो.
  3. तो packages (compressed RPM files) download करतो आणि install करतो.
  4. तो कुठल्याही folder मधून चालतो; आधी कुठे cd करायची गरज नाही.

कसं दिसतं. Amazon Linux 2023 वरच्या खऱ्या output ची सुरुवात (लांब lines ... ने छोट्या केल्या आहेत):

[ec2-user@ip-172-31-xx-xx ~]$ sudo yum install httpd
...
Dependencies resolved.
...
Installing:
 httpd                 x86_64    2.4.68-1.amzn2023.0.1    amazonlinux    ...
Installing dependencies:
 apr                   x86_64    ...
 apr-util              x86_64    ...
 httpd-core            x86_64    ...
 httpd-filesystem      noarch    ...
 httpd-tools           x86_64    ...
 ...
Installing weak dependencies:
 mod_http2             x86_64    ...
 mod_lua               x86_64    ...
 ...
Transaction Summary
...
Install  14 Packages

Total download size: ...
Installed size: ...
Is this ok [y/N]:
  1. Installing: तुम्ही मागितलेला package.
  2. Installing dependencies: ज्यांच्याशिवाय httpd चालूच शकत नाही ते packages.
  3. Installing weak dependencies: default ने सोबत येणाऱ्या उपयोगी extra गोष्टी.
  4. Total download size हा Installed size पेक्षा कमी असतो, कारण packages compressed download होतात आणि server वर उघडले जातात.
  5. Is this ok [y/N]: तुम्हाला confirm करायला सांगतो. Capital N हा default आहे: नुसता Enter दाबला तर नाही.

तुमच्या server वर version आणि packages ची संख्या वेगळी असू शकते; Amazon Linux चे updates येतात तसे ते बदलतात.

Classroom line

Whatever file is downloaded is compressed, so its size is smaller.

Example 4: आधी N, मग -y ने install. N type केलं तर काहीच install होत नाही:

Is this ok [y/N]: N
Operation aborted.

-y लावलं की आधीच yes उत्तर दिलं जातं. आपण हीच command वापरतो:

sudo yum install httpd -y

ते download करतं, install करतं आणि शेवटी हे दाखवतं:

Complete!

Correction

Class मध्ये सांगितलं की dnf हा yum पेक्षा नवीन आणि fast आहे. Amazon Linux 2023 वर ते एकच program आहेत: /usr/bin/yum आणि /usr/bin/dnf दोघं dnf-3 कडे point करतात. म्हणून speed मध्ये काहीच फरक नाही, आणि या course मधली प्रत्येक yum command dnf ने तशीच चालते. (जुन्या Amazon Linux 2 मध्ये खरा जुना yum होता.)

8. Step 3: install check करा

का. पुढे जाण्याआधी Apache खरंच आहे ना ते confirm करा.

कसं. त्याचं version विचारा:

[ec2-user@ip-172-31-xx-xx ~]$ httpd -v
Server version: Apache/2.4.68 (Amazon Linux)
Server built:   ...

Version आलं म्हणजे install आहे. command not found म्हणजे नाही.

Version चे flags प्रत्येक program चे वेगळे असतात.

  1. बरेच programs --version घेतात.
  2. Apache चा httpd version साठी -v वापरतो.
  3. httpd -V (capital V) version सोबत तो कसा build झाला तेही दाखवतो.

9. Step 4: software vs service, start आणि status

का. Install करणं पुरेसं नाही. Web server दिवस-रात्र चालू राहायला हवा आणि port 80 वर ऐकत राहायला हवा.

काय. काही software आपण उघडतो, वापरतो आणि बंद करतो, जसं editor. काही software background मध्ये सतत चालू राहतं आणि कामाची वाट बघतं. त्याला service म्हणतात. Apache, Nginx आणि MySQL या services आहेत.

Classroom line

Software that keeps running 24/7 in the background is what we call a service.

कसं. Start करा, मग check करा:

[ec2-user@ip-172-31-xx-xx ~]$ sudo service httpd start
Redirecting to /bin/systemctl start httpd.service

पहिली line error नाही. Amazon Linux 2023 वर service हा एक छोटा helper आहे, जो काम systemctl कडे देतो (services सांभाळणारं tool), आणि तसं तुम्हाला सांगतो. sudo service httpd start आणि sudo systemctl start httpd एकच काम करतात.

आता status:

[ec2-user@ip-172-31-xx-xx ~]$ sudo service httpd status
Redirecting to /bin/systemctl status httpd.service
● httpd.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; ...)
     Active: active (running) since ...
...
... systemd[1]: Started httpd.service - The Apache HTTP Server.
... httpd[...]: Server configured, listening on: port 80

तीन गोष्टी वाचा:

  1. Loaded: loaded: service install आहे आणि system ला माहीत आहे.
  2. Active: active (running) (तुमच्या screen वर हिरवं): ती आत्ता चालू आहे.
  3. listening on: port 80: ती browsers ची वाट बघतेय.
Handwritten board: sudo yum install httpd -y; httpd with -v, -V and --version; sudo service httpd start; sudo service httpd status.

Class board वरून: आजच्या चार commands: -y ने install, httpd -v, -V किंवा --version ने version check, मग service start करून तिचा status check.

Example 5: status कडून मिळणारी तीन उत्तरं. httpd install च नसेल तेव्हा:

Redirecting to /bin/systemctl status httpd.service
Unit httpd.service could not be found.

बाकीची दोन:

  1. Install आहे पण start नाही: Active: inactive (dead). उपाय: sudo service httpd start.
  2. चालू: Active: active (running).

प्रत्येक boot ला start. start ने Apache आत्ता चालू होतो, पण reboot नंतर (किंवा instance stop करून start केल्यावर) तो बंदच राहतो. नवीन install केलेला httpd boot ला start व्हायला set नसतो; Loaded: line मधलं disabled तेच सांगतं. ते एकदा चालू करा:

[ec2-user@ip-172-31-xx-xx ~]$ sudo systemctl enable httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
तुमच्या web server च्या चार अवस्था 1. Install नाही $ httpd -v command not found 2. Install, पण बंद Active: inactive (dead) 3. चालू Active: active (running) 4. Port 80 उघडा SG inbound: HTTP 80 0.0.0.0/0 httpd -v म्हणतो command not found, आणि status म्हणतो Unit httpd.service could not be found. उपाय: sudo yum install httpd -y Install आहे पण start नाही: sudo service httpd status मध्ये Active: inactive (dead). उपाय: sudo service httpd start (आणि प्रत्येक boot साठी sudo systemctl enable httpd) चालू: Active: active (running). Server वर curl http://localhost चालतं. तरी browser fail होऊ शकतो: Security Group default ने port 80 बंद ठेवतो. Security Group मध्ये HTTP 80, 0.0.0.0/0 हा inbound rule add केला. आता http://PUBLIC_IP/ कुठूनही तुमचं page उघडतं.

Figure 7. Animation: web server च्या चार अवस्था. Install नाही, install पण बंद, चालू, आणि Security Group मध्ये port 80 उघडा, तेव्हा शेवटी browser मध्ये page दिसतं.

Correction

Board वर states "loaded, inactive" आणि "unloaded, inactive" अशा लिहिल्या होत्या. खरे शब्द वेगळे आहेत. Install आहे पण बंद असेल तर Active: inactive (dead) दिसतं. Install नसेल तर Unit httpd.service could not be found.

10. Apache start होत नसेल तर

का. start fail झालं तर status त्याचं कारण सांगतो. परत install करत बसण्याऐवजी तो वाचायला शिका.

काय. तीन नेहमीची कारणं:

  1. Install नाही. Status म्हणतो Unit httpd.service could not be found. आधी install करा.
  2. Port 80 आधीच कोणीतरी घेतलाय. एका port वर एकच program ऐकू शकतो. दुसरा web server, समजा Nginx, आधीच port 80 वापरत असेल, तर Apache ला तो मिळत नाही.
  3. Config file मध्ये चूक. नवीन install वर शक्यता कमी, पण edits केल्यावर होतं.

Example 6: port 80 आधीच वापरात. Start fail होतं, sudo service httpd status मध्ये failed दिसतं, आणि त्याच्या शेवटच्या lines मध्ये (किंवा sudo journalctl -u httpd मध्ये) हे असतं:

(98)Address already in use: AH00072: make_sock: could not bind to address [::]:80
(98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down

उपाय: दुसरा program बंद करा (Nginx असेल तर sudo service nginx stop), मग परत sudo service httpd start.

Ravindra Bagale's Tip

Apache च्या log मध्ये तुम्हाला AH00558: httpd: Could not reliably determine the server's fully qualified domain name ... Set the 'ServerName' directive globally to suppress this message पण दिसू शकतं. घाबरू नका, ती फक्त warning आहे: Apache तरीही start होतो आणि तुमची site दाखवतो. ServerName set केलं की ती जाते, आणि ते तुम्ही site ला domain मिळाल्यावर कराल.

11. Step 5: /var/www/html मध्ये तुमचं पहिलं page

का. Developer चा खरा code server वर ठेवण्याआधी, एका छोट्या page ने setup test करा. ते page उघडलं, तर web server, folder, home page आणि port सगळं चालतंय. मग पुढे कुठलाही problem आला तर तो code मध्ये असेल, server मध्ये नाही.

काय.

  1. /var/www/html हा Apache चा web folder (त्याचा DocumentRoot). httpd package install होतानाच तो बनतो, आणि रिकामा असतो.
  2. Home page चं नाव अगदी index.html च पाहिजे. Apache ची DirectoryIndex index.html ही setting file नाव नसलेल्या URL साठी तेच page देते.
  3. तुम्ही index.html ठेवेपर्यंत Apache त्याचं स्वतःचं test page दाखवतो, ज्याचं title "It works! Apache httpd" असतं.

Example 7: folder मध्ये जा. cd /var/ type करा आणि प्रत्येक भाग पूर्ण करायला Tab दाबा:

[ec2-user@ip-172-31-xx-xx ~]$ cd /var/www/html
[ec2-user@ip-172-31-xx-xx html]$ pwd
/var/www/html
[ec2-user@ip-172-31-xx-xx html]$ ls
[ec2-user@ip-172-31-xx-xx html]$

रिकामा.

Example 8: sudo शिवाय save होत नाही. Folder root चा आहे:

[ec2-user@ip-172-31-xx-xx html]$ ls -ld /var/www/html
drwxr-xr-x. 2 root root 6 Jan  5 10:15 /var/www/html

rwxr-xr-x: फक्त owner, म्हणजे root, लिहू शकतो. हे तुम्ही chmod सविस्तर मध्ये शिकलात. म्हणून ec2-user म्हणून nano index.html केलं तर editor उघडतो, पण save करताना screen च्या खाली error येतो:

[ Error writing index.html: Permission denied ]

touch index.html पण तसंच fail होतं:

touch: cannot touch 'index.html': Permission denied

Classroom line

Will nano index.html open (and save) or not?

Example 9: sudo ने बनवा. Save न करता nano मधून बाहेर या (Ctrl+X, मग N), आणि मग:

sudo nano index.html

एक line type करा:

<h1>Hello from my EC2 server</h1>

Save करून बाहेर: Ctrl+X, मग Y, मग Enter. Check करा:

[ec2-user@ip-172-31-xx-xx html]$ ls -l
total 4
-rw-r--r--. 1 root root 34 Jan  5 10:15 index.html

File root ची आहे, आणि सगळे ती वाचू शकतात (others साठी r--). Apache ला एवढंच लागतं.

Correction

Class मधले दोन छोटे मुद्दे. httpd install होताच /var/www/html तयार असतो; service start केल्यावर तो बनत नाही. आणि ec2-user तिथे लिहू शकत नाही याचं कारण "/var मध्ये permission नाही" असं सगळीकडचं नाही: /var/www/html हाच folder root चा आहे, mode 755.

12. Step 6: Security Group मध्ये port 80 उघडा

का. Apache चालू आहे आणि page पण आहे, पण आत्ता http://PUBLIC_IP/ उघडलं, तर browser नुसता थांबून राहतो आणि मग हार मानतो. Server च्या समोरची एक गोष्ट request अडवते: Security Group.

काय. Security Group हा तुमच्या instance चा firewall आहे. त्यात rules च्या दोन lists असतात:

  1. Inbound rules: तुमच्या server कडे येणारं traffic. Launch ला बहुतेक एकच rule असतो: port 22 वर SSH. ज्याला rule नाही ते सगळं blocked.
  2. Outbound rules: तुमचा server internet कडे स्वतः सुरू करतो ते traffic, उदाहरणार्थ yum packages download करतो ते. Default ने सगळं outbound traffic allowed असतं.

आत allow झालेल्या request चं उत्तर आपोआप बाहेर जातं. तुमच्या website च्या उत्तरांसाठी outbound rule लागत नाही.

Handwritten board: Security group (Firewall) at the top, with arrows to Inbound Rule on the left, where a request comes into a box, and Outbound rule on the right, where a request leaves a box.

Class board वरून: Security Group हा firewall आहे, ज्यात दोन प्रकारचे rules: server कडे येणाऱ्या requests साठी inbound rules, आणि server बाहेर पाठवतो त्या requests साठी outbound rules.

Security Group हा तुमच्या server समोरचा firewall आहे तुमचा laptop ssh -i key.pem कोणीही, कुठलाही browser http://PUBLIC_IP/ बाकी काहीही दुसरा port Security Group: inbound rules SSH 22 launch ला add झाला: हात लावू नका HTTP 80 0.0.0.0/0 website साठी हा add करा Rule नाही = blocked. Outbound: default ने सगळं traffic allowed (उदाहरणार्थ yum downloads). ✕ EC2 server port 80: Apache port 22: SSH Allowed requests ची उत्तरं आपोआप परत जातात. Apache एकदम नीट चालू असला तरी, इथे HTTP 80 allow करेपर्यंत page उघडत नाही.

Figure 8. Server समोरचा Security Group. Inbound SSH 22 (launch पासूनचा) आणि 0.0.0.0/0 कडून HTTP 80 आत येतात, बाकी सगळं blocked; outbound default ने उघडं.

कसं. EC2 console मध्ये:

  1. Instances उघडा आणि तुमचा instance select करा.
  2. Security tab उघडा.
  3. Security group च्या link वर click करा (त्याचा ID sg- ने सुरू होतो).
  4. Edit inbound rules वर click करा.
  5. Add rule वर click करा.
  6. Type: HTTP निवडा. Port 80 आपोआप भरतो.
  7. Source: Anywhere-IPv4 निवडा, म्हणजे 0.0.0.0/0, "कुठल्याही IP कडून".
  8. Save rules वर click करा.
Handwritten board: Edit inbound Rule at the top; Add Rule, Type http, Port 80 in a box, and Source 0.0.0.0/0, with a curve joining port and source.

Class board वरून: Edit inbound rules: Add rule, type HTTP, port 80, source 0.0.0.0/0.

Classroom line

Don't touch the rule that's already there.

Ravindra Bagale's Tip

खूप students HTTP add करताना आधीचा SSH rule edit किंवा delete करतात. मग त्यांचं स्वतःचं SSH connect होत नाही. नवीन rule add करा; port 22 चा rule आहे तसाच ठेवा. पुढे HTTPS साठी अजून एक rule add कराल: type HTTPS, port 443.

13. Step 7: तुमची website उघडा

कसं.

  1. EC2 console मधून तुमच्या instance चा Public IPv4 address copy करा.
  2. Browser मध्ये http:// आणि मग IP type करा: http://PUBLIC_IP/.
  3. तुम्हाला Hello from my EC2 server दिसेल.

Classroom line

Now our website is live for the whole world.

Example 10: site खरंच live आहे याचे पुरावे.

  1. तोच address तुमच्या phone वर, mobile data वर उघडा. तिथेही चालतो.
  2. Browser मध्ये page वर right-click करून View Page Source निवडा. तुम्ही nano मध्ये type केलेली line अगदी तशीच दिसते.
  3. Server वर परत येऊन history चालवा, आज वापरलेल्या सगळ्या commands दिसतात. त्या notes म्हणून ठेवा.

Correction

http:// स्वतः लिहा. नुसता IP type केला तर काही browsers आधी https:// try करतात. आपल्या server वर अजून HTTPS (port 443) नाही, म्हणून तो प्रयत्न fail होतो आणि site बंद आहे असं वाटतं. पुढे http:// लिहिलं की browser port 80 वापरतो.

14. curl ने debugging

का. Browser मध्ये काहीच दिसत नसेल, तर कळायला पाहिजे: problem server च्या आत आहे की बाहेर? curl एका command मध्ये हे सांगतो.

काय. curl हा command-line program आहे जो web server कडे page मागतो, browser पाठवतो तशीच request, पण page काढण्याऐवजी raw HTML print करतो. localhost म्हणजे "हीच machine", म्हणून request Security Group मधून जातच नाही.

Example 11: server वर.

[ec2-user@ip-172-31-xx-xx ~]$ curl http://localhost
<h1>Hello from my EC2 server</h1>
  1. तुमचं HTML दिसलं: Apache आणि file बरोबर आहेत. Problem बाहेर आहे: Security Group चा HTTP 80 rule, http:// ऐवजी https://, किंवा चुकीचा public IP (stop आणि start नंतर तो बदलतो).
  2. Apache चं test page किंवा error दिसलं: problem आत आहे. Service चा status, folder आणि file चं नाव check करा.

Example 12: test page म्हणजे "अजून index.html नाही".

[ec2-user@ip-172-31-xx-xx ~]$ curl -s http://localhost | grep title
<title>It works! Apache httpd</title>

Example 13: नसलेलं page.

[ec2-user@ip-172-31-xx-xx ~]$ curl http://localhost/about.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL was not found on this server.</p>
</body></html>

Example 14: फक्त headers. -I page शिवाय status line आणि headers दाखवतो:

[ec2-user@ip-172-31-xx-xx ~]$ curl -I http://localhost
HTTP/1.1 200 OK
Date: ...
Server: Apache/2.4.68 (Amazon Linux)
...
Content-Type: text/html; charset=UTF-8

200 OK म्हणजे page सापडलं आणि पाठवलं.

Example 15: नेहमीची typo. curl दोनदा type केलं, तर curl दुसऱ्या curl ला website चं नाव समजतो:

[ec2-user@ip-172-31-xx-xx ~]$ curl curl http://localhost
curl: (6) Could not resolve host: curl
<h1>Hello from my EC2 server</h1>

पहिली line curl नावाच्या "site" चं fail होणं आहे; दुसरी तुमचं खरं page.

Page उघडत नाही? आधी server लाच विचारा $ curl http://localhost तुमचं स्वतःचं HTML दिसतं Apache आणि file बरोबर आहेत. Problem server च्या बाहेर आहे: 1. Security Group: HTTP 80 inbound? 2. http:// type केलं, https:// नाही? 3. बरोबर public IP? (stop/start नंतर public IP बदलतो) Error, किंवा "It works!" test page Problem server च्या आत आहे: 1. sudo service httpd status: active (running)? 2. File /var/www/html मध्ये, ~ मध्ये नाही? 3. नाव बरोबर index.html?

Figure 9. Server वर curl http://localhost चालवा. तुमचं HTML दिसलं तर problem बाहेर आहे (Security Group, http vs https, public IP); error किंवा test page दिसलं तर आत आहे (service, folder, file चं नाव).

Classroom line

I'll go through the errors you got; mostly everyone has the same one.

नेहमीच्या चुका, जास्त वेळा होणाऱ्या आधी:

  1. Security Group मध्ये port 80 add केला नाही.
  2. http:// ऐवजी https:// type केलं.
  3. File /var/www/html ऐवजी home folder (~) मध्ये बनवली.
  4. File चं नाव चुकलं, जसं Index.html किंवा index.htm. ते अगदी index.html च पाहिजे.
  5. Apache start केला नाही, किंवा reboot नंतर परत start झाला नाही (sudo systemctl enable httpd वापरा).

Correction

Class मध्ये सांगितलं की browser "curl command वापरतो". तसं नाही. Browser आणि curl हे दोन वेगळे programs आहेत, जे दोघं एकाच प्रकारची HTTP request पाठवतात. Browser page काढून दाखवतो; curl HTML print करतो.

15. आणखी pages, आणि एक खरं page

का. Site मध्ये एकापेक्षा जास्त pages असतात, आणि developers तुम्हाला एका line पेक्षा खूप जास्त देतात.

Example 16: दुसरं page.

sudo nano about.html

Type करा, मग Ctrl+X, Y, Enter ने save करा:

<h1>About this site</h1>

IP नंतर file चं नाव लिहून उघडा:

  1. http://PUBLIC_IP/ अजूनही index.html च दाखवतो.
  2. http://PUBLIC_IP/about.html नवीन page दाखवतो.
  3. Folder मध्ये नसलेलं कुठलंही नाव 404 Not Found देतं.

Example 17: home page च्या जागी पूर्ण page. sudo nano index.html ने index.html परत उघडा, जुनी line delete करा आणि पूर्ण page paste करा, उदाहरणार्थ:

<!DOCTYPE html>
<html>
<head>
  <title>My first website</title>
  <style>
    body { font-family: sans-serif; text-align: center; }
    h1 { color: #0b62a4; }
  </style>
</head>
<body>
  <h1>My first website</h1>
  <p>Hosted on Amazon EC2 with Apache.</p>
  <p>This page is served by Apache from /var/www/html.</p>
</body>
</html>

Save करा आणि browser refresh करा. Restart ची गरज नाही: प्रत्येक request ला Apache file परत वाचतो.

Ravindra Bagale's Tip

Practice साठी तुम्ही AI chat tool कडून एकाच file मधलं HTML page (HTML, CSS आणि JavaScript एकत्र) लिहून घेऊ शकता. Public server वर paste करण्याआधी ते वाचा: publish तुम्ही करताय. Company मध्ये page नेहमी developers कडून येतं, बहुतेक zip file म्हणून, जी तुम्ही server वर copy करून /var/www/html मध्ये unzip करता.

16. पूर्ण setup एका page वर

काय. या chapter मधली प्रत्येक command, क्रमाने:

Step Command किंवा action काय करतं
Check httpd -v command not found = अजून install नाही
Install sudo yum install httpd -y Apache आणि त्याच्या dependencies
Verify httpd -v Apache/2.4.x (Amazon Linux) दाखवतं
Start sudo service httpd start Apache आत्ता चालू (systemctl कडे दिलं जातं)
Status sudo service httpd status active (running), port 80 वर ऐकतोय
Boot sudo systemctl enable httpd प्रत्येक boot ला Apache start
Page cd /var/www/html, sudo nano index.html तुमचं home page
Firewall Security Group: HTTP, 80, 0.0.0.0/0 add करा browsers ना आत येऊ देतं
Open http://PUBLIC_IP/ site, कुठूनही
Debug curl http://localhost problem आत की बाहेर?

17. घरी करून बघा

Try at home

Task 1: install करा आणि चालवा

  1. नवीन Amazon Linux 2023 instance वर httpd -v चालवा. Message लिहून ठेवा.
  2. sudo yum install httpd चालवा आणि Is this ok [y/N]: ला N उत्तर द्या. मग -y ने install करा.
  3. sudo service httpd start च्या आधी आणि नंतर sudo service httpd status चालवा. दोन्ही वेळेची Active: line लिहा.
  4. sudo systemctl enable httpd चालवा.

Task 2: तुमचं page

  1. ec2-user म्हणून touch /var/www/html/test.html करून बघा. Error वाचा.
  2. sudo nano ने index.html बनवा आणि curl http://localhost ने check करा.

Task 3: जगासाठी उघडा

  1. HTTP rule add करण्याआधी http://PUBLIC_IP/ उघडा. काय होतं?
  2. HTTP 80 rule add करा आणि परत try करा, phone वरून पण.
  3. about.html add करून उघडा. मग नसलेलं page उघडून 404 वाचा.

Task 4: debug

  1. sudo service httpd stop ने Apache बंद करा. आता browser आणि curl http://localhost काय दाखवतात?
  2. परत start करा.

झालं की instance stop करा. लक्षात ठेवा, परत start केल्यावर public IP बदलतो.

Recap

थोडक्यात सांगायचं तर

  1. Code development, test आणि मग production मध्ये जातो; cloud engineer तो host करतो.
  2. Request: नाव → IP (DNS) → port 80 → web server → /var/www/html मधली file → परत browser कडे, नाहीतर 404.
  3. Web server म्हणजे port 80/443 वर ऐकणारा program: Apache (httpd), Nginx, IIS, Lighttpd. XAMPP आणि WAMP bundles आहेत, web servers नाहीत.
  4. Website hosting pages पाठवतं; API hosting backend code आणि database मधून data (JSON) पाठवतं.
  5. Static = HTML, CSS, JavaScript, media, सगळ्यांसाठी सारखं. Dynamic = server-side language + database.
  6. sudo yum install httpd -y Apache install करतो. Amazon Linux 2023 वर yum आणि dnf एकच program.
  7. Is this ok [y/N]:: नुसता Enter म्हणजे नाही; -y yes उत्तर देतो.
  8. httpd -v version दाखवतो; command not found म्हणजे install नाही.
  9. sudo service httpd start ने start (तो systemctl कडे redirect करतो), status ने check, आणि प्रत्येक boot साठी sudo systemctl enable httpd.
  10. /var/www/html root चा folder आहे: pages sudo nano ने बनवा. Home page index.html.
  11. Inbound rule HTTP 80, 0.0.0.0/0 कडून add करा; SSH rule ला हात लावू नका.
  12. http://PUBLIC_IP/ उघडा, http:// सकट. Fail झालं तर server वर curl http://localhost सांगतो की problem आत आहे की बाहेर.

Classroom line

With just that, we can host websites.


Ravindra Bagale, trainer: linkedin.com/in/ravindra-bagale. Site चं नाव www.mysite.com, pages आणि user चं नाव ravi शिकण्यासाठीची उदाहरणं आहेत; PUBLIC_IP म्हणजे तुमच्या instance चा public IPv4 address. Commands आणि messages Amazon Linux 2023 च्या test copy वर (Apache httpd 2.4.68, nano 8.3) तपासले. Prompt मधलं hostname, dates आणि version numbers उदाहरणादाखल आहेत आणि updates सोबत बदलतात.