<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Yashvi Kothari</title>
    <description>The latest articles on DEV Community by Yashvi Kothari (@yashvikothari).</description>
    <link>https://dev.to/yashvikothari</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F545159%2F6e7005fb-7ff7-4bfb-a57e-2101c9269c00.jpeg</url>
      <title>DEV Community: Yashvi Kothari</title>
      <link>https://dev.to/yashvikothari</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yashvikothari"/>
    <language>en</language>
    <item>
      <title>Lovable Data Leak 2026: 24,664 AI Apps Exposed 80,000+ User Records via Supabase</title>
      <dc:creator>Yashvi Kothari</dc:creator>
      <pubDate>Tue, 03 Nov 2026 21:46:58 +0000</pubDate>
      <link>https://dev.to/yashvikothari/lovable-data-leak-2026-24664-ai-apps-exposed-80000-user-records-via-supabase-2l7a</link>
      <guid>https://dev.to/yashvikothari/lovable-data-leak-2026-24664-ai-apps-exposed-80000-user-records-via-supabase-2l7a</guid>
      <description>&lt;p&gt;The $0 Security Breach: How 24,664 AI-Built Apps Leaked Your Passport Number&lt;/p&gt;

&lt;p&gt;A Cloud Security Analysis of the Lovable/Supabase Data Exposure&lt;/p&gt;




&lt;p&gt;The Hook&lt;/p&gt;

&lt;p&gt;In November 2026, security researchers scanned 159,041 AI-generated web applications.&lt;/p&gt;

&lt;p&gt;They didn't hack anything.&lt;/p&gt;

&lt;p&gt;They didn't use zero-days.&lt;/p&gt;

&lt;p&gt;They simply knocked on doors that were left wide open—and found 80,000+ user profiles, unencrypted passport numbers, payment details, and 200,000 private chat messages sitting in plain sight.&lt;/p&gt;

&lt;p&gt;The culprit? A "no-code" promise that made building easy and securing optional.&lt;/p&gt;

&lt;p&gt;This is the story of how AI democratized software creation—and accidentally democratized data breaches.&lt;/p&gt;




&lt;p&gt;The Setup: When "Easy" Becomes "Exposed"&lt;/p&gt;

&lt;p&gt;Lovable is a Swedish AI startup that turns plain English into working web applications. Type "build me a customer portal," and it appears. No code. No technical knowledge required.&lt;/p&gt;

&lt;p&gt;The marketing is seductive. The terms and conditions? Less so—they quietly place all security responsibility on the user.&lt;/p&gt;

&lt;p&gt;Here's the gap: Non-technical founders built production apps with sensitive data. They didn't know they needed to secure the backend. And nobody forced them to learn.&lt;/p&gt;

&lt;p&gt;The result was predictable.&lt;/p&gt;




&lt;p&gt;The Technical Autopsy: What Actually Happened&lt;/p&gt;

&lt;p&gt;Researchers focused on Supabase—the open-source Firebase alternative that Lovable integrates for database functionality. Of the 159,041 projects analyzed:&lt;/p&gt;

&lt;p&gt;· 34,545 used Supabase&lt;br&gt;
· 24,664 leaked database records immediately upon page load&lt;br&gt;
· 7,403 exposed email addresses across 10,560 tables&lt;/p&gt;

&lt;p&gt;The Root Cause: Row Level Security (RLS) Turned Off&lt;/p&gt;

&lt;p&gt;Supabase uses a client-side JavaScript library. Your frontend holds a public anon key—by design. That key is meant to be public.&lt;/p&gt;

&lt;p&gt;But here's the catch: That public key can only access what your database policies allow.&lt;/p&gt;

&lt;p&gt;When RLS is disabled or misconfigured:&lt;/p&gt;

&lt;p&gt;· Anyone with browser DevTools can see your anon key&lt;br&gt;
· Anyone with that key can query your database&lt;br&gt;
· Anyone can read every row in every table&lt;/p&gt;

&lt;p&gt;The researchers didn't brute-force passwords. They opened Chrome, inspected network traffic, grabbed the key, and queried tables like profiles, messages, and payments.&lt;/p&gt;

&lt;p&gt;One request. Full access.&lt;/p&gt;



&lt;p&gt;The DevSecOps Nightmare: AI Code Uniformity&lt;/p&gt;

&lt;p&gt;Here's where it gets worse.&lt;/p&gt;

&lt;p&gt;AI generates code using recurring architectural patterns. Lovable apps follow predictable structures:&lt;/p&gt;

&lt;p&gt;· Same Supabase initialization&lt;br&gt;
· Same client-side key exposure&lt;br&gt;
· Same missing RLS configurations&lt;/p&gt;

&lt;p&gt;This uniformity is a gift to attackers.&lt;/p&gt;

&lt;p&gt;A single automated script that detects "Supabase + Lovable" can scan thousands of applications simultaneously. What worked against one app works against all of them.&lt;/p&gt;

&lt;p&gt;The scale of exploitation is now a function of AI's consistency, not attacker sophistication.&lt;/p&gt;



&lt;p&gt;The Damage Report&lt;/p&gt;

&lt;p&gt;The exposed data wasn't abstract. It included:&lt;/p&gt;

&lt;p&gt;Data Type Example&lt;br&gt;
Identity Documents 1,000+ records with passport numbers, expiration dates, nationalities&lt;br&gt;
User Profiles 80,000+ full names, emails, birthdates, gender&lt;br&gt;
Private Communications 200,000+ chat messages, internal WhatsApp threads&lt;br&gt;
Financial Records Invoices, payment details, ticket codes&lt;br&gt;
Business Intelligence AI-generated email summaries about tenants, owners, partners&lt;/p&gt;

&lt;p&gt;One provider leaked 280,000 customer emails.&lt;/p&gt;

&lt;p&gt;This is phishing fuel. Identity theft raw material. Fraud starter kit.&lt;/p&gt;



&lt;p&gt;The Fix: Row Level Security in Supabase&lt;/p&gt;

&lt;p&gt;If you're building on Supabase—with or without AI—here's the non-negotiable first step:&lt;/p&gt;

&lt;p&gt;Step 1: Enable RLS on Every Table&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;profiles&lt;/span&gt; &lt;span class="n"&gt;ENABLE&lt;/span&gt; &lt;span class="k"&gt;ROW&lt;/span&gt; &lt;span class="k"&gt;LEVEL&lt;/span&gt; &lt;span class="k"&gt;SECURITY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="n"&gt;ENABLE&lt;/span&gt; &lt;span class="k"&gt;ROW&lt;/span&gt; &lt;span class="k"&gt;LEVEL&lt;/span&gt; &lt;span class="k"&gt;SECURITY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;payments&lt;/span&gt; &lt;span class="n"&gt;ENABLE&lt;/span&gt; &lt;span class="k"&gt;ROW&lt;/span&gt; &lt;span class="k"&gt;LEVEL&lt;/span&gt; &lt;span class="k"&gt;SECURITY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do this before you add data. Not after.&lt;/p&gt;

&lt;p&gt;Step 2: Write Explicit Access Policies&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Users can only read their own profile&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;POLICY&lt;/span&gt; &lt;span class="nv"&gt;"Users read own profile"&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;profiles&lt;/span&gt;
&lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="k"&gt;SELECT&lt;/span&gt;
&lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uid&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Users can only read their own messages&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;POLICY&lt;/span&gt; &lt;span class="nv"&gt;"Users read own messages"&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt;
&lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="k"&gt;SELECT&lt;/span&gt;
&lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uid&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sender_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 3: Test Like an Attacker&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open your app in an incognito window&lt;/li&gt;
&lt;li&gt;Open DevTools → Network tab&lt;/li&gt;
&lt;li&gt;Find your Supabase API calls&lt;/li&gt;
&lt;li&gt;Copy the anon key&lt;/li&gt;
&lt;li&gt;Use curl to query a table you shouldn't access
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s1"&gt;'https://your-project.supabase.co/rest/v1/profiles?select=*'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"apikey: YOUR_ANON_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer YOUR_ANON_KEY"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you see data you shouldn't, you're exposed.&lt;/p&gt;




&lt;p&gt;The DevSecOps Checklist for AI-Built Apps&lt;/p&gt;

&lt;p&gt;Before any AI-generated app touches real data:&lt;/p&gt;

&lt;p&gt;Check Why It Matters&lt;br&gt;
✅ RLS enabled on all tables Blocks unauthorized row access&lt;br&gt;
✅ Explicit SELECT, INSERT, UPDATE, DELETE policies RLS alone isn't enough&lt;br&gt;
✅ anon key limited to intended public data Never allow it to bypass RLS&lt;br&gt;
✅ API response payloads inspected See what the frontend actually receives&lt;br&gt;
✅ Automated fuzzing of database endpoints Catch what manual review misses&lt;br&gt;
✅ IAM/RBAC validated before production Defense in depth&lt;/p&gt;




&lt;p&gt;The Lesson: AI Doesn't Remove Responsibility. It Redistributes It.&lt;/p&gt;

&lt;p&gt;Lovable's marketing promises ease. Its terms require expertise.&lt;/p&gt;

&lt;p&gt;Between those two lies a chasm—and 7,403 applications fell into it.&lt;/p&gt;

&lt;p&gt;The uncomfortable truth: AI can write your backend, but it can't own your security posture. That responsibility remains human. It requires understanding access control, database policies, and the difference between "it works" and "it's safe."&lt;/p&gt;

&lt;p&gt;Cloud security isn't a feature you bolt on later. It's a decision you make before the first user signs up.&lt;/p&gt;




&lt;p&gt;The Closing Thought&lt;/p&gt;

&lt;p&gt;The researchers didn't exploit a vulnerability.&lt;/p&gt;

&lt;p&gt;They exploited a pattern—a predictable, repeatable, AI-generated pattern that said: "We didn't know we needed to lock this door."&lt;/p&gt;

&lt;p&gt;The fix is simple. The lesson is expensive.&lt;/p&gt;

&lt;p&gt;Enable RLS. Write policies. Test like an attacker.&lt;/p&gt;

&lt;p&gt;And the next time an AI offers to build your app in four minutes, ask it one question:&lt;/p&gt;

&lt;p&gt;"Did you enable Row Level Security?"&lt;/p&gt;

&lt;p&gt;If it doesn't know the answer, neither do you.&lt;/p&gt;







&lt;p&gt;Did this help you understand the Lovable/Supabase exposure? Share it with someone building their first AI-generated app. The knowledge gap is the vulnerability.&lt;/p&gt;

&lt;p&gt;Reference Research Report:&lt;br&gt;
&lt;a href="https://www.crissyfield.de/research/lovable-en/" rel="noopener noreferrer"&gt;https://www.crissyfield.de/research/lovable-en/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>lowcode</category>
      <category>security</category>
      <category>supabase</category>
      <category>cloud</category>
    </item>
    <item>
      <title>How a Marketing Manager Deployed a Production Data Leak in 4 Minutes (And Why Your Scanner Missed It)</title>
      <dc:creator>Yashvi Kothari</dc:creator>
      <pubDate>Tue, 03 Nov 2026 20:54:34 +0000</pubDate>
      <link>https://dev.to/yashvikothari/how-a-marketing-manager-deployed-a-production-data-leak-in-4-minutes-and-why-your-scanner-missed-4nph</link>
      <guid>https://dev.to/yashvikothari/how-a-marketing-manager-deployed-a-production-data-leak-in-4-minutes-and-why-your-scanner-missed-4nph</guid>
      <description>&lt;p&gt;Code is Now Free. Security Architecture is Still Expensive.&lt;/p&gt;

&lt;p&gt;AI lets anyone ship to production on Vercel in minutes. Learn why passing a build scan isn't enough and how CNAPP and CSPM stop shadow deployment leaks.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How do you secure multi-team deployments on platforms like Vercel at scale?&lt;/p&gt;
&lt;h2&gt;
  
  
  Securing rapid PaaS deployments requires moving beyond single-team application scans to centralized Cloud Native Application Protection Platforms (CNAPP) and SaaS Security Posture Management (SSPM). Key controls include enforcing authentication on production URLs, storing API keys as write-only secrets rather than readable config variables, strictly enforcing SAML SSO across all sub-teams, and rotating access tokens older than 90 days.
&lt;/h2&gt;
&lt;/blockquote&gt;

&lt;p&gt;In 2016, deploying an application to production required a Linux sysadmin, a Terraform state file, an IAM role review, and a three-day change-management ticket.&lt;/p&gt;

&lt;p&gt;Today, it requires a prompt and a credit card.&lt;/p&gt;

&lt;p&gt;AI coding assistants and frictionless deployment platforms like Vercel have collapsed the distance between an idea and a live production URL. A marketing manager can prompt an internal customer portal into existence at 9:00 AM and deploy it to the global edge by 9:15 AM.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Creation has been democratized. Security has not.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When deployment friction drops to zero, shadow IT mutates into &lt;strong&gt;Shadow Production&lt;/strong&gt;. And it introduces a terrifying blind spot for Cloud Operations and Security engineers: &lt;strong&gt;Your application passed its built-in security scan. Everything is green. Yet your customer database is wide open.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let’s break down why a successful deployment is not a secure deployment—and how we architect visibility when every department becomes a software team.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Anatomy of a 15-Minute Breach
&lt;/h3&gt;

&lt;p&gt;Imagine this scenario—inspired by real-world enterprise findings recently highlighted by Orca Security.&lt;/p&gt;

&lt;p&gt;A growth manager needs a quick portal to analyze customer support conversations. Waiting on the core engineering sprint takes three weeks. So they open an AI code generator, connect a frontend template to a production database containing customer names and support transcripts, and push it to Vercel.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;The build succeeds.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The automated dependency scanner passes.&lt;/strong&gt; (Zero critical CVEs in &lt;code&gt;package.json&lt;/code&gt;!)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The URL goes live.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To the creator, the job is done. To a Cloud Security engineer, four silent alarms just went off—except no one can hear them because the deployment happened in an isolated team workspace outside the central AWS or GCP security perimeter.&lt;/p&gt;




&lt;h3&gt;
  
  
  The 4 Silent Misconfigurations of Rapid PaaS Deployments
&lt;/h3&gt;

&lt;p&gt;When non-security practitioners—or fast-moving product teams—spin up isolated deployment environments, four architectural failures show up almost immediately.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[AI Prompt / Code] 
       │
       ▼
[Vercel / PaaS Deployment] ──► Passed Dependency Scan (Green Checkmark!)
       │
       ├── ❌ 1. Public Prod URL (No Auth Layer)
       ├── ❌ 2. API Keys in Plaintext Config (Not Write-Only Secrets)
       ├── ❌ 3. SAML Connected, Never Enforced (Bypassed IdP)
       └── ❌ 4. Zombie Tokens (&amp;gt;90 Days Unused, No Expiry)
       │
       ▼
[Production Database / AWS Backend] ──► SILENT DATA EXPOSURE

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo6fv7jw3mvnfw4wb60o7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo6fv7jw3mvnfw4wb60o7.jpg" alt=" " width="799" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Public Production URLs Without Authentication
&lt;/h4&gt;

&lt;p&gt;AI tools optimize for &lt;em&gt;working&lt;/em&gt; code, not &lt;em&gt;defensive&lt;/em&gt; code. When you deploy a preview or production branch on modern PaaS platforms, it generates a live, publicly routable URL immediately. Unless authentication middleware or deployment protection is explicitly wired in, anyone who guesses, scrapes, or discovers that URL via certificate transparency logs has direct access to the portal.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Secrets Stored as Readable &lt;code&gt;Config&lt;/code&gt; Instead of &lt;code&gt;Secret&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;There is a massive architectural difference between a &lt;strong&gt;Configuration Variable&lt;/strong&gt; and a &lt;strong&gt;Secret&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Config variables&lt;/strong&gt; are readable in plaintext by anyone with project dashboard access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secrets&lt;/strong&gt; are write-only—injected at runtime and hidden from the UI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When someone pastes a database connection string or an AWS IAM access key into a standard readable config field, every contractor, intern, or compromised developer account in that workspace can copy-paste your production credentials in two clicks.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. The SAML Illusion (Connected vs. Enforced)
&lt;/h4&gt;

&lt;p&gt;Security teams love checking the "SSO Integrated" box. An organization connects Okta or Entra ID via SAML to their deployment platform and moves on. &lt;strong&gt;Here is the trap:&lt;/strong&gt; connecting an Identity Provider (IdP) is not the same as &lt;em&gt;enforcing&lt;/em&gt; it. If SAML enforcement isn't toggled on, users can bypass your corporate IdP entirely and log in via standard email/password or unmonitored social logins—circumventing your MFA and conditional access policies.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Zombie Access Tokens
&lt;/h4&gt;

&lt;p&gt;To hook up CI/CD pipelines or third-party integrations, teams generate personal or team access tokens. Often, these tokens are created with "No Expiration" and forgotten. Six months later, the project is abandoned, the token sits unused for over 90 days, and it remains a live, unmonitored backdoor into your deployment infrastructure.&lt;/p&gt;




&lt;h3&gt;
  
  
  The CloudOps Blind Spot: Why Single-Team Dashboards Fail
&lt;/h3&gt;

&lt;p&gt;If you have one Vercel team, you can audit these four settings before your morning coffee cools.&lt;/p&gt;

&lt;p&gt;What happens when your enterprise has &lt;strong&gt;40 teams&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;A platform’s native dashboard shows you the posture of &lt;em&gt;one&lt;/em&gt; workspace at a time. It does not correlate how a readable API key in a rogue Vercel project connects to an over-permissive IAM role in your core &lt;strong&gt;AWS&lt;/strong&gt; environment, or a storage bucket in &lt;strong&gt;GCP&lt;/strong&gt; or &lt;strong&gt;Azure&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;To solve this, you have to stop treating deployment platforms like isolated developer toys and start treating them as extensions of your cloud control plane. Here is how modern security domains map to this problem:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Security Domain&lt;/th&gt;
&lt;th&gt;Core Function&lt;/th&gt;
&lt;th&gt;What It Solves in Shadow Deployments&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;CSPM&lt;/strong&gt; &lt;em&gt;(Cloud Security Posture Management)&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;Misconfiguration detection&lt;/td&gt;
&lt;td&gt;Flags public production URLs and disabled firewall rules automatically.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;CIEM&lt;/strong&gt; &lt;em&gt;(Cloud Infrastructure Entitlement Management)&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;Identity &amp;amp; permission visibility&lt;/td&gt;
&lt;td&gt;Identifies who has admin access across 50 fragmented team workspaces and enforces SAML.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Secrets Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Credential exposure prevention&lt;/td&gt;
&lt;td&gt;Detects sensitive keys stored in readable config metadata without exposing the secret value itself.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;SSPM&lt;/strong&gt; &lt;em&gt;(SaaS Security Posture Management)&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;SaaS configuration hygiene&lt;/td&gt;
&lt;td&gt;Audits zombie access tokens (&amp;gt;90 days dormant) and unmonitored team creations.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;AppSec&lt;/strong&gt; &lt;em&gt;(Application Security)&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;Code &amp;amp; dependency scanning&lt;/td&gt;
&lt;td&gt;Catches vulnerabilities inside the code (necessary, but blind to infrastructure exposure).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;CNAPP&lt;/strong&gt; &lt;em&gt;(Cloud Native Application Protection Platform)&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;Cross-environment risk correlation&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;The Endgame:&lt;/strong&gt; Connects the exposed Vercel config variable to the exact AWS/GCP database it unlocks.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdogpcjzbmo8ptcp3wyyx.jpg" alt=" " width="800" height="484"&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Engineering Takeaway: Audit Metadata, Not Just Code
&lt;/h3&gt;

&lt;p&gt;The most elegant takeaway from how platforms like Orca Security approach this problem is &lt;strong&gt;agentless, read-only metadata auditing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You don't need to install heavy agents on serverless edge functions, and your security tool shouldn't actually read the plaintext values of your secrets. By querying the platform's API in read-only mode, a strong CloudOps architecture continuously inventories:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Every newly spun-up team&lt;/strong&gt; (eliminating manual registration).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment variable metadata&lt;/strong&gt; (verifying &lt;em&gt;how&lt;/em&gt; a variable is stored—Config vs. Secret—without reading &lt;em&gt;what&lt;/em&gt; it is).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-cloud blast radius&lt;/strong&gt; (viewing PaaS deployment risks right next to your AWS CloudTrail and IAM findings).&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Your Monday Morning CloudOps Checklist:
&lt;/h4&gt;

&lt;p&gt;If your organization uses rapid deployment platforms alongside AWS, Azure, or GCP, run this mental audit today:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Inventory the sprawl:&lt;/strong&gt; How many independent team workspaces exist across your organization right now?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check SAML state:&lt;/strong&gt; Is SSO merely &lt;em&gt;connected&lt;/em&gt;, or is it strictly &lt;em&gt;enforced&lt;/em&gt;?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit variable types:&lt;/strong&gt; Are database URLs and API keys stored as readable environment configs?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kill dormant tokens:&lt;/strong&gt; Revoke any CLI or API token that hasn't seen traffic in 90 days.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI made building software effortless. That means our job in Cloud Operations is no longer gatekeeping the build—it is securing the blast radius.&lt;/p&gt;




</description>
      <category>cspm</category>
      <category>cnapp</category>
      <category>vercel</category>
      <category>misconfigurations</category>
    </item>
    <item>
      <title>What Is the Storm-3168 Azure Service Principal Attack and How Do You Detect It?</title>
      <dc:creator>Yashvi Kothari</dc:creator>
      <pubDate>Tue, 03 Nov 2026 20:01:31 +0000</pubDate>
      <link>https://dev.to/yashvikothari/what-is-the-storm-3168-azure-service-principal-attack-and-how-do-you-detect-it-8jk</link>
      <guid>https://dev.to/yashvikothari/what-is-the-storm-3168-azure-service-principal-attack-and-how-do-you-detect-it-8jk</guid>
      <description>&lt;p&gt;Storm-3168: How One Compromised Service Principal Can Put an Entire Cloud Environment at Risk&lt;/p&gt;

&lt;p&gt;Storm-3168 used one leaked service principal secret to destroy Azure workloads in 7 minutes. Here's how to detect it and reduce your blast radius.&lt;/p&gt;

&lt;p&gt;If one of my workload identities was compromised right now, what would I check first?&lt;/p&gt;

&lt;p&gt;That question is the entire article. Not the threat actor. Not the timeline. Not the press release.&lt;/p&gt;

&lt;p&gt;Storm-3168 is a reminder that the most dangerous identity in your cloud isn't a human with a password. It's a service principal nobody watches, holding permissions nobody reviewed, using a secret somebody pasted into GitHub.&lt;/p&gt;

&lt;p&gt;Here's what happened, and here's what I'd do about it.&lt;/p&gt;




&lt;p&gt;What Happened in Storm-3168&lt;/p&gt;

&lt;p&gt;In June 2026, Microsoft tracked a campaign it calls Storm-3168 (linked to JADEPUFFER). Two compromised Azure service principals from the same tenant executed a devastating sequence: 15.5 hours of quiet reconnaissance, a 7-minute destruction window, and a credential-harvesting phase that followed .&lt;/p&gt;

&lt;p&gt;The numbers matter because they show intent and automation:&lt;/p&gt;

&lt;p&gt;· 300+ successful read operations during reconnaissance&lt;br&gt;
· 100+ storage account deletion attempts&lt;br&gt;
· 30+ successful ListKeys requests after the destruction &lt;/p&gt;

&lt;p&gt;The first service principal spent over fifteen hours mapping subscriptions, VMs, and resource groups. The second enumerated two subscriptions in five seconds, then began deleting storage accounts, Key Vaults, Function Apps, and App Service plans. It also tried to remove Azure Site Recovery and Backup protection locks—not random vandalism, but a deliberate attempt to disable recovery .&lt;/p&gt;

&lt;p&gt;The initial access vector? A client ID, client secret, and tenant ID posted in plaintext in a public GitHub issue. The issue was later edited to remove the secret, but the edit history preserved it .&lt;/p&gt;

&lt;p&gt;That's it. That's the whole entry point.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzghtfsnnf0vnph187an0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzghtfsnnf0vnph187an0.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;How Service Principal Credentials Get Compromised&lt;/p&gt;

&lt;p&gt;Service principals are the workhorses of cloud automation. They don't have MFA. They don't have a device posture. They often don't have a human owner who notices when something's wrong .&lt;/p&gt;

&lt;p&gt;The compromise paths are boringly predictable:&lt;/p&gt;

&lt;p&gt;Public code exposure. The Storm-3168 vector. A secret pasted into an issue, a commit, a gist. The edit history is forever.&lt;/p&gt;

&lt;p&gt;Over-permissioned app owners. Anyone who can add a credential to an application can authenticate as that application. If the app holds Directory.ReadWrite.All, the attacker just became a directory admin without touching a password .&lt;/p&gt;

&lt;p&gt;Standing privilege with no expiry. A service principal created for a migration project in 2024 still holds Owner on the subscription in 2026. The attacker's window equals the credential's lifetime .&lt;/p&gt;

&lt;p&gt;Unmonitored sign-in logs. Service principal sign-ins often bypass the alerting that human sign-ins receive. An attacker with a valid secret looks exactly like your CI/CD pipeline—until they don't.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbzgtzdlgymr81stoexqp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbzgtzdlgymr81stoexqp.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;How Excessive Azure RBAC Permissions Increase the Blast Radius&lt;/p&gt;

&lt;p&gt;Here's the uncomfortable truth: Storm-3168 didn't exploit a vulnerability. It used the permissions the service principals already had .&lt;/p&gt;

&lt;p&gt;The reconnaissance identity could enumerate the entire tenant. The destructive identity could delete storage accounts, Key Vaults, and Function Apps. That's not a misconfiguration in the traditional sense. That's the default outcome of granting broad roles because "it's just an automation account" .&lt;/p&gt;

&lt;p&gt;Blast radius isn't abstract. It's the answer to: If this identity's secret leaked right now, what's the worst an attacker could do before anyone notices?&lt;/p&gt;

&lt;p&gt;For a service principal with Owner at subscription scope, the answer is: everything in that subscription. For a principal with Contributor plus ListKeys permissions on storage, the answer is: delete the data, then harvest the keys to whatever survives .&lt;/p&gt;

&lt;p&gt;The Storm-3168 attackers specifically targeted backup and Site Recovery controls. They understood that destroying production is loud, but destroying recovery options is what makes the damage permanent .&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw7v9a8x291zjweg5647r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw7v9a8x291zjweg5647r.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;How Attackers Misuse Legitimate Cloud APIs&lt;/p&gt;

&lt;p&gt;There's no malware in Storm-3168. No endpoint compromise. No lateral movement through VMs.&lt;/p&gt;

&lt;p&gt;Just python-requests/2.34.2 calling Azure Resource Manager APIs .&lt;/p&gt;

&lt;p&gt;The API calls themselves are documented, supported, and expected:&lt;/p&gt;

&lt;p&gt;· ListKeys on storage accounts is how applications retrieve access keys. The attackers used it 30+ times to harvest credentials after destruction .&lt;br&gt;
· Resource deletion APIs are how Terraform cleans up. The attackers used them 100+ times in seven minutes .&lt;br&gt;
· Enumeration APIs are how inventory tools work. The attackers used them for 15 hours before anyone noticed .&lt;/p&gt;

&lt;p&gt;This is the core lesson of cloud-native attacks: the API doesn't know your intent. It only knows your token. If the token is valid and the permission is present, the action succeeds.&lt;/p&gt;

&lt;p&gt;The one thing that broke the attack wasn't a security control. It was a version mismatch—the attackers used an unsupported API version for SQL deletion, and those attempts failed . Don't count on that.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4gx10kwrkdloxmf3dlcu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4gx10kwrkdloxmf3dlcu.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;How to Detect Suspicious Activity Using Entra ID and Azure Activity Logs&lt;/p&gt;

&lt;p&gt;If I suspect a workload identity is compromised, I'm not opening a dashboard. I'm running queries.&lt;/p&gt;

&lt;p&gt;Entra ID sign-in logs:&lt;br&gt;
Look for service principal sign-ins from IPs not seen in the last 30 days. The Elastic detection rule for rare service principal activity from multiple IPs is a good starting point: it surfaces principals performing low-frequency actions from multiple source IPs, which often indicates stolen credentials or token replay .&lt;/p&gt;

&lt;p&gt;Azure Activity Logs:&lt;br&gt;
Filter for Delete operations initiated by service principals. Then look for ListKeys calls in the same time window. The Storm-3168 pattern—destruction followed by key harvesting—is detectable if you correlate the two.&lt;/p&gt;

&lt;p&gt;A practical KQL approach for Activity Logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AzureActivity
| where OperationNameValue has_any ("DELETE", "LISTKEYS")
| where Caller contains "service principal name or object ID"
| project TimeGenerated, OperationNameValue, ResourceGroup, Caller, CallerIpAddress
| sort by TimeGenerated desc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The one detection that would have caught Storm-3168 early: A service principal performing ListKeys on a storage account it has never touched before, from an IP that isn't your build agent's egress range. That's not automation. That's reconnaissance or harvesting .&lt;/p&gt;

&lt;p&gt;For credential additions specifically, alert on Update application – Certificates and secrets management outside your secrets rotation pipeline. If a human added a secret to a high-privilege app at 3 AM, that's worth a page .&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6er0xqaggb9xj0y5i2ho.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6er0xqaggb9xj0y5i2ho.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;AWS IAM Roles, Least Privilege, and CloudTrail: A Useful Mirror&lt;/p&gt;

&lt;p&gt;I don't write about AWS to pad word count. I write about it because AWS's model exposes what Azure teams often miss.&lt;/p&gt;

&lt;p&gt;In AWS, long-term access keys are the exception, not the default. IAM roles with temporary credentials via STS are the norm. A compromised role session expires. A leaked Azure service principal secret—unless you built rotation—doesn't .&lt;/p&gt;

&lt;p&gt;CloudTrail's strength isn't that it's magic. It's that the events are structured around who assumed what role, from where, and what did they do with it. AssumeRole chains create an audit trail that links a session back to its origin. Azure's equivalent—service principal sign-ins correlated with Activity Log operations—is possible, but fewer teams build the correlation .&lt;/p&gt;

&lt;p&gt;The least-privilege comparison is equally sharp. AWS permission boundaries and IAM Access Analyzer can surface escalation paths before an attacker finds them. In Azure, the equivalent discipline is scoped RBAC assignments plus Privileged Identity Management for anything that doesn't need to be always-on .&lt;/p&gt;

&lt;p&gt;The gap isn't technical. It's cultural. AWS teams grew up with temporary credentials. Many Azure teams grew up with a secret in a config file.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1vy4hkl23vrnt4bv27y9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1vy4hkl23vrnt4bv27y9.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Five Practical Lessons for Cloud Security and DevOps Engineers&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Audit every service principal secret. Right now.&lt;br&gt;
Search your GitHub organization's issue and commit history for client_secret, AZURE_CLIENT_SECRET, and tenant IDs. Rotate anything you find. The Storm-3168 entry vector was an edited issue—the secret remained in the edit history .&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Treat ListKeys as a sensitive operation.&lt;br&gt;
Storage account key retrieval is credential access. Alert when a service principal that normally runs Get or List operations suddenly calls ListKeys, especially after a burst of deletions .&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scope RBAC to the resource, not the subscription.&lt;br&gt;
If a service principal only needs to manage one storage account, give it Storage Account Contributor on that account. Not Contributor on the resource group. Not Owner on the subscription. The blast radius shrinks with every scope reduction .&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use PIM for workload identities that don't need standing access.&lt;br&gt;
Most automation needs persistent permissions. Some doesn't. For the service principals that only run during deployments, use just-in-time activation. The secret, if leaked, is useless outside the activation window .&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Correlate identity logs with resource logs.&lt;br&gt;
The Storm-3168 detection window exists because two log sources tell one story. Entra ID tells you who authenticated. Azure Activity Logs tell you what they did. If you're only watching one, you're watching half the attack .&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;The ghost of Storm-3168 isn't a sophisticated adversary. It's a forgotten secret in a public edit history and a service principal with permissions nobody questioned.&lt;/p&gt;

&lt;p&gt;What would I check first?&lt;/p&gt;

&lt;p&gt;The service principal secrets my team hasn't rotated. The RBAC assignments nobody can justify. The ListKeys calls in the Activity Log from an IP we don't recognize.&lt;/p&gt;

&lt;p&gt;Start there. Then fix what you find.&lt;/p&gt;

</description>
      <category>security</category>
      <category>azure</category>
      <category>devops</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Binance Hack: DevSecOps Lessons from the $6.34B Breach</title>
      <dc:creator>Yashvi Kothari</dc:creator>
      <pubDate>Tue, 03 Nov 2026 18:15:18 +0000</pubDate>
      <link>https://dev.to/yashvikothari/binance-hack-devsecops-lessons-from-the-634b-breach-24kb</link>
      <guid>https://dev.to/yashvikothari/binance-hack-devsecops-lessons-from-the-634b-breach-24kb</guid>
      <description>&lt;p&gt;&lt;strong&gt;A Poisoned Homebrew Install, a Fake Job Interview, and a $6.34 Billion Lesson in Cloud Operations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk5vd8ajib0epruno2qme.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk5vd8ajib0epruno2qme.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On Thursday, October 29, 2026, attackers moved roughly $6.34 billion in digital assets out of Binance’s hot wallets. As of Binance’s November 3 report, about $2.85 billion had been frozen or intercepted (subject to reconciliation and market price volatility), and by October 31, Binance had replenished 98% of the affected token assets from its own reserves.&lt;/p&gt;

&lt;p&gt;Still, moving $6.34 billion out the door didn't happen because someone cracked a 256-bit cryptographic key. It didn't happen because a zero-day exploit melted a hardware firewall.&lt;/p&gt;

&lt;p&gt;According to &lt;a href="https://x.com/binance/status/2117626126214504729" rel="noopener noreferrer"&gt;Binance’s initial incident report&lt;/a&gt; published November 3, it started months earlier with a poisoned package install, escalated through a fake job interview on a work laptop, and pivoted through an internal AI tool.&lt;/p&gt;

&lt;p&gt;When you manage cloud infrastructure or DevSecOps, it is easy to obsess over the perimeter. We spend millions on Web Application Firewalls, Multi-Party Computation (MPC), and automated threat detection. Yet this incident reminds us of a brutal, timeless truth:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your security architecture is never defined by whether a human makes a mistake. It is defined by the blast radius of their local environment when they do.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let’s dissect how a months-long social engineering campaign bypassed multi-billion-dollar defenses, why an internal AI tool became a critical pivot point, and what every Cloud Operations engineer needs to fix in their stack today.&lt;/p&gt;




&lt;h3&gt;
  
  
  Act I: The Anatomy of a $6.34 Billion Breach
&lt;/h3&gt;

&lt;p&gt;Great heists don’t happen in five minutes. They happen slowly, then all at once.&lt;/p&gt;

&lt;p&gt;According to a &lt;a href="https://www.fbi.gov/investigate/cyber/alerts/2026/north-korea-responsible-for-6-billion-binance-attack" rel="noopener noreferrer"&gt;Saturday alert from the FBI&lt;/a&gt;, state-sponsored attackers linked to North Korea (DPRK) were behind the campaign. As detailed in Binance’s initial report, the attackers didn't brute-force the front door. They spent five months mapping the humans inside the building.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The Reconnaissance (June 2026)&lt;/strong&gt;&lt;br&gt;
An engineer on the Wallet DevOps team ("Engineer A") wanted to install a popular AI coding tool. They searched for it on a search engine and downloaded a tampered Homebrew installation.&lt;/p&gt;

&lt;p&gt;Binance’s security team caught the anomaly, replaced the device, and rotated related credentials. Case closed? Not quite. Before the device was replaced, the attackers got the one thing you cannot rotate: &lt;strong&gt;the org chart.&lt;/strong&gt; Engineer A’s role and their colleagues on the wallet infrastructure team were now exposed to the attackers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The Hook (September 2026)&lt;/strong&gt;&lt;br&gt;
Enter "Engineer B." According to Binance's report, an individual posing as a Project Director contacted Engineer B on a job-hunting platform where their profile referenced their Binance experience, setting up a two-round interview process. The first round was a live video interview with a fake "HR representative" who shared a personal social media account to build trust. Then came a second-round interview on a social chat app with an individual claiming to be the CEO of a fictitious company.&lt;/p&gt;

&lt;p&gt;Near the end of the chat, Engineer B was instructed to download an interview "assignment" containing a code repository onto their &lt;strong&gt;work computer&lt;/strong&gt;. During the setup process, malicious code inside the repo quietly executed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The Sleight of Hand&lt;/strong&gt;&lt;br&gt;
That setup script didn't just build an app. It quietly hijacked the local Python version manager (&lt;code&gt;pyenv&lt;/code&gt;) inside &lt;code&gt;/opt/homebrew/&lt;/code&gt;, swapping the legitimate 3,344-byte &lt;code&gt;pyenv&lt;/code&gt; wrapper script with a 3,414-byte malicious version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE  /opt/homebrew/Cellar/pyenv/2.8.0/libexec/pyenv_
MODIFY  pyenv_ -&amp;gt; 3,414 B
DELETE  .../libexec/pyenv (3,344 B)      (remove the valid pyenv)
RENAME  pyenv_ -&amp;gt; pyenv (3,414 B)        (replace with malicious version)
DELETE  /opt/homebrew/bin/pyenv
ln (create a new symlink) + spawn zsh

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No endpoint detection alerts fired. The attacker was inside and communicating with an external server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. The AI Springboard (October 20, 2026)&lt;/strong&gt;&lt;br&gt;
How do you jump from a general software engineer’s laptop to the fortified Wallet DevOps team? Binance says the attackers used an &lt;strong&gt;internal AI tool&lt;/strong&gt; from Engineer B’s compromised machine as a springboard to gain control over Wallet DevOps Engineer A and another Wallet Software Engineer ("Engineer C"). Sitting on Engineer A’s computer was the golden ticket: &lt;strong&gt;a container deployment permission token.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. The Execution (October 29, 2026)&lt;/strong&gt;&lt;br&gt;
Between 17:15 and 19:56 UTC, the attackers logged onto Engineer C’s computer, used the credentials stolen from Engineer A, deployed a container, and triggered a malicious script targeting the internal wallet signing service.&lt;/p&gt;

&lt;p&gt;At 20:05 UTC, the drain began. Across multiple networks, hot wallets started pouring out assets. On-chain trackers estimate roughly $3.8 billion was drained on Ethereum alone, alongside 18,270 BTC, 233.46 million XRP, 970,500 SOL, and 44.2 million OP reported by Binance.&lt;/p&gt;




&lt;h3&gt;
  
  
  Act II: When the Kill Switch Fails
&lt;/h3&gt;

&lt;p&gt;Here is the part that should keep every Cloud Architect and SecOps engineer awake at night.&lt;/p&gt;

&lt;p&gt;When Binance’s internal alerts triggered, the team hit the emergency brakes. They suspended withdrawals, shut down hot wallet services, and coordinated with industry partners to freeze assets (for example, Circle froze impacted USDC around 21:04 UTC, nearly an hour after the initial transfers began, contributing to the $2.85 billion frozen or intercepted as of the November 3 report).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Yet unauthorized transfers kept happening on Ethereum anyway.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To understand why, you have to separate the root compromise from the persistence mechanism. As blockchain intelligence firm TRM Labs points out, the other nine chains were drained using ordinary signed transfers, meaning the compromised internal signing service itself was signing transactions for the attacker.&lt;/p&gt;

&lt;p&gt;On Ethereum, however, the attackers went a step further and used that signing access to build a persistence layer that outlived the server shutdown: &lt;strong&gt;Ethereum’s EIP-7702 authorization mechanism&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;EIP-7702 allows an account to delegate certain execution rights to a smart contract without exposing the private key. On-chain analysts found a batch of about 50 authorizations tied to different nonce values, a tactic Odaily calls "nonce spraying" where only one authorization needed to land. That delegation gave an attacker-controlled smart contract partial execution rights over a Binance hot wallet.&lt;/p&gt;

&lt;p&gt;Once those authorizations existed on-chain, they operated independently of Binance’s normal withdrawal infrastructure. Shutting down internal signing servers stopped the bleeding on other chains, but it couldn't invalidate a delegation already written into the Ethereum blockchain state.&lt;/p&gt;

&lt;p&gt;Worse, because the hot wallet relied on &lt;strong&gt;Multi-Party Computation (MPC)&lt;/strong&gt;, there was no single private key an engineer could grab to immediately revoke the malicious EIP-7702 authorizations. The team had to build and execute a specialized procedure to revoke them while assets remained at risk. The final unauthorized transfer of 2,961.9 ETH finalized at 23:56 UTC, and Binance finally cleared the delegation code by authorizing to the zero address at 00:10 UTC on October 30, four hours after the drain started.&lt;/p&gt;




&lt;h3&gt;
  
  
  Act III: The CloudOps &amp;amp; DevSecOps Playbook
&lt;/h3&gt;

&lt;p&gt;It is easy to point fingers at an engineer taking a side-hustle interview on a work MacBook. Anyone who has worked in operations knows that &lt;strong&gt;blaming the human is a lazy post-mortem.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Humans will always click links. Humans will always want a higher-paying job. Humans will always take shortcuts to install a shiny new AI tool.&lt;/p&gt;

&lt;p&gt;If a single cloned Git repository on a developer's laptop can cascade into a rogue container deploying to a production signing environment, the failure isn't human. &lt;strong&gt;The failure is architectural.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here are the five operational laws this incident proves we cannot ignore:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Contain the Blast Radius of Internal AI Tools
&lt;/h4&gt;

&lt;p&gt;Binance hasn't disclosed the exact technical mechanism that allowed an internal AI tool to become a springboard between Engineer B, Engineer A, and Engineer C. Whatever the specific mechanism was, the architectural lesson is clear: internal AI tools, agentic workflows, and shared developer assistants sit at a privileged intersection of your engineering org.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Fix:&lt;/strong&gt; Treat internal AI infrastructure as Tier-0 assets. Isolate their execution environments, enforce strict least-privilege RBAC on what an AI service can query or execute, and ensure an internal AI tool can never execute commands or pass state across separate developer workstations.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. Long-Lived Tokens on Laptops Are Ticking Time Bombs
&lt;/h4&gt;

&lt;p&gt;Engineer A had a container deployment permission token sitting on their computer. In modern cloud operations, static or long-lived deployment tokens on local disks shouldn't exist.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Fix:&lt;/strong&gt; Enforce Zero Trust and Just-In-Time (JIT) access. Container deployments into sensitive environments should only happen via immutable CI/CD pipelines triggered by hardware-backed, short-lived OIDC sessions, never from a persistent token stored on a developer endpoint.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  3. Move Local Dev Environments out of User-Owned Host Paths
&lt;/h4&gt;

&lt;p&gt;Look closely at why replacing &lt;code&gt;/opt/homebrew/bin/pyenv&lt;/code&gt; was so effortless. On Apple Silicon Macs, &lt;code&gt;/opt/homebrew&lt;/code&gt; is owned by the local user account by default. That means any user-level malware triggered by a &lt;code&gt;setup.py&lt;/code&gt; or &lt;code&gt;npm install&lt;/code&gt; can silently overwrite developer binaries and scripts without ever triggering a &lt;code&gt;sudo&lt;/code&gt; password prompt.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Fix:&lt;/strong&gt; Stop doing raw development on the host OS of corporate machines. Move coding workflows to ephemeral Cloud Development Environments (CDEs) or isolated DevContainers. If a developer runs an untrusted repo inside a sandboxed environment with no access to host paths or corporate tokens, the blast radius shrinks sharply.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  4. Package Managers Need an Allowlist, Not Search Engines
&lt;/h4&gt;

&lt;p&gt;Engineer A got compromised in June by searching for an AI tool online and running a poisoned Homebrew installation. Engineer B got compromised in September via a malicious repo modifying &lt;code&gt;pyenv&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Fix:&lt;/strong&gt; Lock down endpoint package management. Engineers with access to production systems shouldn't pull arbitrary packages from the open internet or unverified taps. Route package installations through an internal, verified artifact registry with strict binary and script attestation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  5. Game-Day Your "Un-Revocable" Architecture
&lt;/h4&gt;

&lt;p&gt;Binance used MPC to eliminate single points of failure. Irony struck when that exact complexity slowed them down from rapidly revoking malicious on-chain EIP-7702 delegations. Security controls designed to slow down an attacker can also slow down the defender during an active incident.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Fix:&lt;/strong&gt; Don't just run chaos engineering on server uptime; run chaos engineering on &lt;strong&gt;credential and state revocation&lt;/strong&gt;. Ask your team today: &lt;em&gt;"If an attacker modifies an IAM trust policy, registers a rogue OIDC provider, creates a persistent access key, or delegates smart contract execution rights right now, how many minutes does it take us to revoke it, and is that playbook pre-scripted?"&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  The Takeaway
&lt;/h3&gt;

&lt;p&gt;Security isn't a product you buy. It is a series of friction points you design so that when someone makes a human mistake at 4:00 PM on a Thursday, the system absorbs the shock without collapsing.&lt;/p&gt;

&lt;p&gt;Attackers aren't breaking encryption anymore. They are hacking trust, hijacking developer workflows, and turning our own automation against us.&lt;/p&gt;

&lt;p&gt;Audit your endpoints. Lock down your AI tooling. Delete your local tokens.&lt;/p&gt;

&lt;p&gt;Because in cloud operations, &lt;strong&gt;clarity in your architecture is the only thing standing between a routine Thursday and a $6.34 billion headline.&lt;/strong&gt;&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Let’s connect and talk Cloud, DevSecOps, and Infrastructure on LinkedIn: &lt;strong&gt;&lt;a href="https://www.linkedin.com/in/yashvikothari" rel="noopener noreferrer"&gt;@yashvikothari&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devsecops</category>
      <category>cloudcomputing</category>
      <category>cybersecurity</category>
      <category>devops</category>
    </item>
    <item>
      <title>29 Notable Cloud &amp; DevOps Professionals from India to Follow in 2026</title>
      <dc:creator>Yashvi Kothari</dc:creator>
      <pubDate>Tue, 29 Sep 2026 20:36:01 +0000</pubDate>
      <link>https://dev.to/aws-builders/29-notable-cloud-devops-professionals-from-india-to-follow-in-2026-njn</link>
      <guid>https://dev.to/aws-builders/29-notable-cloud-devops-professionals-from-india-to-follow-in-2026-njn</guid>
      <description>&lt;p&gt;India has one of the world's largest and fastest-growing cloud, DevOps, Kubernetes, and cloud-native communities.&lt;/p&gt;

&lt;p&gt;There is no single official organization that maintains a definitive ranking of India's "Top 50 Cloud Engineers." Therefore, this list is not intended as a ranking or a claim that one professional is better than another.&lt;/p&gt;

&lt;p&gt;Instead, it highlights 29 notable professionals based on publicly documented community leadership, open-source contributions, cloud certifications, ambassador/hero programs, technical education, and contributions to the cloud-native ecosystem.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Yash Pimple&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;CNCF Ambassador based in Mumbai, India. His CNCF profile highlights his work with Kubernetes, Kyverno, K8sGPT and Keptn, as well as his involvement in the Cloud-native Thane community.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Vyom Yadav&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;CNCF Ambassador from Chandigarh, with contributions involving Kubernetes, Kyverno, KubeArmor and other cloud-native projects.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Swastik Gour&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;CNCF Ambassador from Alwar, India, with project experience across Kubernetes, Helm, Cilium, Argo, KubeVela and K8sGPT.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sreejith Anujan&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;CNCF Ambassador and Red Hat professional from Kerala, with extensive experience across Kubernetes, OpenShift, Helm, Kubeflow, OPA and other cloud-native technologies.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Kunal Kushwaha&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cloud-native educator, community builder and CNCF Ambassador known for his work in developer education and the WeMakeDevs community.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Saiyam Pathak&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;CNCF Ambassador and cloud-native community leader known for Kubernetes education, advocacy and technical evangelism.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sangam Biradar&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cloud-native community contributor associated with Docker and CNCF communities.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Arun Gupta&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A long-time open-source and cloud technology leader with experience across enterprise technology and developer communities.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ayyanar Jeyakrishnan&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;AWS Machine Learning Hero based in Bengaluru, recognized by AWS for community contribution and expertise around machine learning and AWS technologies.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Gaurav Chhabra&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cloud and enterprise technology professional with a focus on cloud architecture and community contribution.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Yashvi Kothari&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;AWS Community Builder with a focus on Cloud Operations, Cloud Security and DevSecOps. Her public profiles document experience and learning across AWS, Azure, Digital Ocean and Oracle Cloud Infrastructure, along with cloud-security technologies and technical writing.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Piyush Sachdeva&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cloud engineering and community professional associated with cloud infrastructure and operations.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Gaurav Sen&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Systems and cloud architecture educator and founder of InterviewReady, known for technical content around system design and distributed systems.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sandeep Dinesh&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cloud and developer technology professional with experience in cloud architecture and developer advocacy.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sathish VJ&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Multi-cloud architecture professional and technology community contributor.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Rohan Shetty&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cloud-native and Kubernetes infrastructure professional.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Rupesh Sharma&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cloud and solutions architecture professional.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Prateek Jain&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cloud security and DevSecOps professional with a focus on security architecture and cloud infrastructure.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Venkatesh Iyer&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Enterprise cloud solutions professional working around cloud architecture and enterprise technology.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ankit Jain&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cloud infrastructure and SRE professional.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Bhavani Ravi&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Software and cloud architecture professional.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Shubham Londhe&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cloud and DevOps educator and community mentor associated with TrainWithShubham.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Praveen Singampalli&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;DevOps and SRE educator associated with HeyDevOps and cloud/DevOps career education.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Abhishek Veeramalla&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cloud and DevOps engineer and technical educator known for practical DevOps and cloud learning content.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Aman Sharma&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cloud and systems engineering professional.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sagar Utekar&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cloud operations and automation professional.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sahil B.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Independent DevOps practitioner and technical community contributor.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Abhishek Singh N.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Independent DevOps practitioner.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Karthikeyan V.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Independent cloud and DevOps practitioner.&lt;/p&gt;

&lt;p&gt;Methodology&lt;/p&gt;

&lt;p&gt;This is a curated list, not an official ranking.&lt;/p&gt;

&lt;p&gt;Inclusion can be based on publicly verifiable factors such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Official AWS Hero or Community Builder recognition&lt;/li&gt;
&lt;li&gt;CNCF Ambassador status&lt;/li&gt;
&lt;li&gt;Open-source contributions&lt;/li&gt;
&lt;li&gt;Cloud-native community leadership&lt;/li&gt;
&lt;li&gt;Technical education and mentorship&lt;/li&gt;
&lt;li&gt;Public technical writing&lt;/li&gt;
&lt;li&gt;Cloud architecture and infrastructure work&lt;/li&gt;
&lt;li&gt;Contributions to developer communities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because the Indian cloud ecosystem includes a very large number of skilled professionals, this list should not be interpreted as an exhaustive list of India's best cloud engineers.&lt;/p&gt;

&lt;p&gt;The purpose is simply to provide readers with a starting point for discovering professionals, educators and community contributors working across India's cloud and DevOps ecosystem.&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>devops</category>
      <category>linux</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Phase 1 HTML</title>
      <dc:creator>Yashvi Kothari</dc:creator>
      <pubDate>Tue, 22 Sep 2026 10:37:56 +0000</pubDate>
      <link>https://dev.to/yashvikothari/phase-1-html-4j0o</link>
      <guid>https://dev.to/yashvikothari/phase-1-html-4j0o</guid>
      <description>&lt;p&gt;Phase 1 HTML&lt;br&gt;
Don't spend months here.&lt;br&gt;
Learn enough to create a webpage without copying a template.&lt;br&gt;
Learn:&lt;br&gt;
html&lt;br&gt;
head&lt;br&gt;
body&lt;br&gt;
h1-h6&lt;br&gt;
p&lt;br&gt;
div&lt;br&gt;
span&lt;br&gt;
a&lt;br&gt;
img&lt;br&gt;
ul / ol / li&lt;br&gt;
table&lt;br&gt;
form&lt;br&gt;
input&lt;br&gt;
textarea&lt;br&gt;
select&lt;br&gt;
button&lt;br&gt;
label&lt;br&gt;
Also understand:&lt;br&gt;
attributes&lt;br&gt;
id&lt;br&gt;
class&lt;br&gt;
forms&lt;br&gt;
links&lt;br&gt;
images&lt;br&gt;
semantic HTML&lt;br&gt;
Practice project #1&lt;br&gt;
Build:&lt;br&gt;
Simple Airbnb Listing Page&lt;/p&gt;
&lt;h2&gt;
  
  
  Example:
&lt;/h2&gt;
&lt;h2&gt;
  
  
  Beautiful Apartment
&lt;/h2&gt;

&lt;p&gt;[        IMAGE        ]&lt;/p&gt;

&lt;p&gt;Ahmedabad, Gujarat&lt;/p&gt;

&lt;p&gt;₹3,000 / night&lt;/p&gt;

&lt;p&gt;2 bedrooms&lt;br&gt;
1 bathroom&lt;br&gt;
WiFi&lt;br&gt;
Kitchen&lt;/p&gt;
&lt;h2&gt;
  
  
  [ Reserve ]
&lt;/h2&gt;

&lt;p&gt;No JavaScript.&lt;br&gt;
No database.&lt;br&gt;
No backend.&lt;/p&gt;
&lt;h2&gt;
  
  
  Just HTML.
&lt;/h2&gt;

&lt;p&gt;Setup VSCode on your system.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw7flek9ugou7nqkrnoeu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw7flek9ugou7nqkrnoeu.png" alt=" " width="799" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Install both live server&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxu17trzg4aeqeuzy3ndd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxu17trzg4aeqeuzy3ndd.png" alt=" " width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3z3oowbscbtyx1thhb2j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3z3oowbscbtyx1thhb2j.png" alt=" " width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1dnv1wvp5c2ous6z8255.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1dnv1wvp5c2ous6z8255.png" alt=" " width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First HTML Page&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx77d6vysl7tgx10wwsxb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx77d6vysl7tgx10wwsxb.png" alt=" " width="799" height="230"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  HTML Comments
&lt;/h1&gt;

&lt;p&gt;When writing HTML, you may want to leave notes for yourself or other developers.&lt;/p&gt;

&lt;p&gt;These notes are called &lt;strong&gt;comments&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Comments are useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Explaining what a section of code does&lt;/li&gt;
&lt;li&gt;Providing context for other developers&lt;/li&gt;
&lt;li&gt;Leaving reminders&lt;/li&gt;
&lt;li&gt;Making code easier to understand and maintain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important part is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comments are not displayed on the webpage.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The browser reads them but ignores them when rendering the page.&lt;/p&gt;


&lt;h2&gt;
  
  
  HTML Comment Syntax
&lt;/h2&gt;

&lt;p&gt;An HTML comment starts with &lt;code&gt;&amp;lt;!--&lt;/code&gt; and ends with &lt;code&gt;--&amp;gt;&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- This is a simple comment --&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Anything written between these two markers is treated as a comment.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Welcome to my website!&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- This paragraph displays a welcome message --&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The webpage will only display:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Welcome to my website!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The comment will not appear on the rendered page.&lt;/p&gt;




&lt;h2&gt;
  
  
  Multiline Comments
&lt;/h2&gt;

&lt;p&gt;HTML comments can also span multiple lines.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!--
This is a multiline comment.
The browser will ignore everything
written inside these comment markers.
--&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This can be useful when you want to explain a larger section of HTML.&lt;/p&gt;




&lt;h2&gt;
  
  
  Are HTML Comments Completely Hidden?
&lt;/h2&gt;

&lt;p&gt;Not exactly.&lt;/p&gt;

&lt;p&gt;Although comments &lt;strong&gt;don't appear on the rendered webpage&lt;/strong&gt;, they are still present in the HTML source sent to the browser.&lt;/p&gt;

&lt;p&gt;Anyone can inspect them.&lt;/p&gt;

&lt;p&gt;To view the source of a webpage:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the webpage in your browser.&lt;/li&gt;
&lt;li&gt;Right-click anywhere on the page.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;View Page Source&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Or use the keyboard shortcut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ctrl + U
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On macOS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cmd + U
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can then search the source code and find the comments.&lt;/p&gt;

&lt;h3&gt;
  
  
  Important
&lt;/h3&gt;

&lt;p&gt;Don't put passwords, API keys, private information, or secrets inside HTML comments.&lt;/p&gt;

&lt;p&gt;For example, &lt;strong&gt;never&lt;/strong&gt; do this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!--
Database password: MySecretPassword123
--&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The comment isn't visible on the webpage, but it can still be seen in the page source.&lt;/p&gt;




&lt;h1&gt;
  
  
  Practice Exercise
&lt;/h1&gt;

&lt;p&gt;Now let's see HTML comments in action.&lt;/p&gt;

&lt;h3&gt;
  
  
  Task
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open the provided HTML page.&lt;/li&gt;
&lt;li&gt;Find the paragraph &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; tag.&lt;/li&gt;
&lt;li&gt;Add an HTML comment &lt;strong&gt;below the paragraph tag&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;This is my paragraph.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- This is my first HTML comment --&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Save the HTML file.&lt;/li&gt;
&lt;li&gt;Open the rendered webpage in your browser.&lt;/li&gt;
&lt;li&gt;Right-click the page and select &lt;strong&gt;View Page Source&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Find the comment you added.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Notice the difference:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rendered webpage:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;This is my paragraph.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Page source:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;This is my paragraph.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- This is my first HTML comment --&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The browser doesn't display the comment, but the comment is still present in the source.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv29iknoit7391hkkqw1z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv29iknoit7391hkkqw1z.png" alt=" " width="799" height="222"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6s6ap063zici961pozo2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6s6ap063zici961pozo2.png" alt=" " width="799" height="344"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Lab Note
&lt;/h2&gt;

&lt;p&gt;The goal isn't just to know the syntax.&lt;/p&gt;

&lt;p&gt;The goal is to understand what the browser does with HTML comments.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tags in HTML
&lt;/h2&gt;

&lt;p&gt;Tags are fundamental building block of HTML file which tell browser how webpage should appear and behave.&lt;/p&gt;

&lt;p&gt;Let's go to example.com website and view page source.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F784c6mzjymj5yd9p56p4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F784c6mzjymj5yd9p56p4.png" alt=" " width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxvsuqkc721kiq1uwq1cz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxvsuqkc721kiq1uwq1cz.png" alt=" " width="799" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Blue one's are HTML Tags.&lt;/p&gt;

&lt;p&gt;Only Information browser is getting from remote computer is a text document but it has to construct UI which might have favicon,title,animations,layout,colors etc.&lt;/p&gt;

&lt;p&gt;So we need to deliver a lot of information like what is animation/colors/content/font-size,font-family,font-type/link &amp;amp; where link is pointing to ?&lt;/p&gt;

&lt;p&gt;Thus we use HTML.&lt;/p&gt;

&lt;p&gt;Eg: &lt;br&gt;
title tag is responsible for:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn1l7ad5udfuw18y4j0k1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn1l7ad5udfuw18y4j0k1.png" alt=" " width="547" height="121"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqqptsppw5t2tytucd8ka.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqqptsppw5t2tytucd8ka.png" alt=" " width="798" height="153"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmxa6jmekmrrw0e1yz65e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmxa6jmekmrrw0e1yz65e.png" alt=" " width="800" height="199"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhlnpduueph3i2zkzb2et.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhlnpduueph3i2zkzb2et.png" alt=" " width="800" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;we have lot of tags. p tag for pargraph. div tag for division,etc.&lt;/p&gt;


&lt;h1&gt;
  
  
  Say Hello to HTML Elements
&lt;/h1&gt;
&lt;h2&gt;
  
  
  Your First HTML Element
&lt;/h2&gt;

&lt;p&gt;You’ll begin by creating a simple web page using HTML. You can write and edit your code directly in the code editor provided on this page.&lt;/p&gt;

&lt;p&gt;Look at the code in your editor:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4i8d1g8201u7pft9gvwl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4i8d1g8201u7pft9gvwl.png" alt=" " width="800" height="281"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Hello&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is an &lt;strong&gt;HTML element&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Most HTML elements have two parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An &lt;strong&gt;opening tag&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;closing tag&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Opening Tag
&lt;/h3&gt;

&lt;p&gt;An opening tag looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Closing Tag
&lt;/h3&gt;

&lt;p&gt;A closing tag looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The main difference is the &lt;strong&gt;forward slash &lt;code&gt;/&lt;/code&gt;&lt;/strong&gt; in the closing tag.&lt;/p&gt;

&lt;p&gt;So:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Hello&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; → opening tag&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Hello&lt;/code&gt; → element content&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;/h1&amp;gt;&lt;/code&gt; → closing tag&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Complete the Challenge
&lt;/h2&gt;

&lt;p&gt;For this challenge, modify the existing &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; element so that its text says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hello World
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your final code should be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Hello World&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it. You’ve just created your first HTML element with the correct content.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgjii1y6s1a2r21p425m4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgjii1y6s1a2r21p425m4.png" alt=" " width="800" height="94"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Create a Headline with the &lt;code&gt;h2&lt;/code&gt; Element
&lt;/h1&gt;

&lt;p&gt;In the next few tasks, we’ll build an &lt;strong&gt;HTML5 CatPhotoApp&lt;/strong&gt; step-by-step, adding new elements and features as we go.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding the &lt;code&gt;h2&lt;/code&gt; Element
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;&lt;code&gt;h2&lt;/code&gt;&lt;/strong&gt; element is used to create a &lt;strong&gt;level-two heading&lt;/strong&gt; on a web page.&lt;/p&gt;

&lt;p&gt;HTML headings help organize the structure of your webpage.&lt;/p&gt;

&lt;p&gt;A common heading structure looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Main Heading&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Subheading&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;Another Subheading&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;strong&gt;&lt;code&gt;h1&lt;/code&gt;&lt;/strong&gt; element is generally used for the main heading, while &lt;strong&gt;&lt;code&gt;h2&lt;/code&gt;&lt;/strong&gt; is commonly used for subheadings.&lt;/p&gt;

&lt;p&gt;HTML also provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;h3&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;h4&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;h5&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;h6&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These elements represent different levels of headings and subheadings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Complete the Challenge
&lt;/h2&gt;

&lt;p&gt;You already have an &lt;code&gt;h1&lt;/code&gt; element containing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Hello World&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, add an &lt;strong&gt;&lt;code&gt;h2&lt;/code&gt;&lt;/strong&gt; element directly below it.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;h2&lt;/code&gt; should contain the text:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CatPhotoApp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your final code should look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Hello World&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;CatPhotoApp&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates your second HTML element and adds a level-two heading to the page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbuj5vkowv71kghuk2qd1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbuj5vkowv71kghuk2qd1.png" alt=" " width="800" height="164"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fun0wvzdvgtmsu2ybrt02.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fun0wvzdvgtmsu2ybrt02.png" alt=" " width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Anchor Tag
&lt;/h1&gt;

&lt;p&gt;The &lt;strong&gt;&lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;&lt;/strong&gt; element, also called the &lt;strong&gt;anchor element&lt;/strong&gt;, is used to create hyperlinks in HTML.&lt;/p&gt;

&lt;p&gt;It can link to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Web pages&lt;/li&gt;
&lt;li&gt;Files&lt;/li&gt;
&lt;li&gt;Email addresses&lt;/li&gt;
&lt;li&gt;A specific location on the same page&lt;/li&gt;
&lt;li&gt;Other destinations that can be accessed through a URL&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The &lt;code&gt;href&lt;/code&gt; Attribute
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;&lt;code&gt;href&lt;/code&gt;&lt;/strong&gt; attribute specifies where the link should take the user.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Visit Example&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; → opening anchor tag&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;href="https://example.com"&lt;/code&gt; → destination of the link&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Visit Example&lt;/code&gt; → clickable text&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;/a&amp;gt;&lt;/code&gt; → closing anchor tag&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The content inside the &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; element should clearly describe where the link will take the user.&lt;/p&gt;

&lt;p&gt;If an &lt;code&gt;href&lt;/code&gt; attribute is present, the link can also be activated using the &lt;strong&gt;Enter&lt;/strong&gt; key when the anchor element has keyboard focus.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fauzz7ikeefv7rps7slqo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fauzz7ikeefv7rps7slqo.png" alt=" " width="800" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Write an anchor tag below linking to &lt;a href="https://google.com" rel="noopener noreferrer"&gt;https://google.com&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://google.com"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Google&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fblqj7wmc4xdwyfu6hhyy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fblqj7wmc4xdwyfu6hhyy.png" alt=" " width="799" height="223"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fonhhw30q9urxigvesb0e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fonhhw30q9urxigvesb0e.png" alt=" " width="620" height="826"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Block-Level and Inline Tags in HTML
&lt;/h1&gt;

&lt;p&gt;The &lt;strong&gt;&lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;&lt;/strong&gt; element is commonly used to display paragraph text on a webpage.&lt;/p&gt;

&lt;p&gt;The letter &lt;strong&gt;&lt;code&gt;p&lt;/code&gt;&lt;/strong&gt; stands for &lt;strong&gt;"paragraph."&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a Paragraph
&lt;/h2&gt;

&lt;p&gt;You can create a paragraph element like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;I'm a p tag!&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A paragraph element has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; → opening tag&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;I'm a p tag!&lt;/code&gt; → paragraph content&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;/p&amp;gt;&lt;/code&gt; → closing tag&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Complete the Challenge
&lt;/h2&gt;

&lt;p&gt;You already have an &lt;strong&gt;&lt;code&gt;h2&lt;/code&gt;&lt;/strong&gt; element on your webpage.&lt;/p&gt;

&lt;p&gt;Now, create a &lt;strong&gt;&lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;&lt;/strong&gt; element directly below the &lt;code&gt;h2&lt;/code&gt; element.&lt;/p&gt;

&lt;p&gt;The paragraph should contain the text:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hello Paragraph
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your code should look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;CatPhotoApp&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Hello Paragraph&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  HTML Naming Convention
&lt;/h2&gt;

&lt;p&gt;As a standard convention, HTML tags are written in &lt;strong&gt;lowercase&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;P&amp;gt;&amp;lt;/P&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Following lowercase conventions makes your HTML code consistent and easier to read.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F90yoedlqhen6gha4sb3t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F90yoedlqhen6gha4sb3t.png" alt=" " width="798" height="158"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F56wx6gd5t65gi3d7g545.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F56wx6gd5t65gi3d7g545.png" alt=" " width="799" height="165"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why HTML tags exist?
&lt;/h2&gt;

&lt;p&gt;Button Tag. You can go ahead and click on screen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgftswwv669gp4u1oija7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgftswwv669gp4u1oija7.png" alt=" " width="798" height="157"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can pretty much customize almost every single aspect of HTML tags through CSS.When we use CSS we can make h6 tag as big as h1 &amp;amp; h1 tag as small as h6.We can reverse behaviour right away with CSS.&lt;br&gt;
We can create div as button and button as div. Button is also inline element because text continues.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwp3yf366p6ehlny2dsok.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwp3yf366p6ehlny2dsok.png" alt=" " width="800" height="133"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;why don't we have all tag as div only ? because HTML was built to have semantics. Visually it can be identified which is largest heading, which is smallest heading ? but code should also be able to tell that without actually being parsed into webpage.Why so? because of accessibility reasons.&lt;/p&gt;

&lt;p&gt;when you have h1 on page that means that is important heading.Your browser knows that accessibility readers or people who are disable&lt;br&gt;
know that it is important heading.&lt;/p&gt;

&lt;p&gt;similarly for button your accessibility reader know that it can be clicked.your browser won't be able to tell that to reader.&lt;/p&gt;

&lt;p&gt;Lot of interactivity can be added with button with javascript.&lt;/p&gt;
&lt;h2&gt;
  
  
  we can attach event handlers. when we click on button turn h1 tag to red or h2 tag should disappear or h3 tag should change to bigger font size.
&lt;/h2&gt;
&lt;h2&gt;
  
  
  Image Tag
&lt;/h2&gt;

&lt;p&gt;Images are integral part of communication and how we perceive the world.&lt;br&gt;
So HTML allows to embed image directly with ease of single HTML tag.&lt;/p&gt;

&lt;p&gt;img tag is inline and self-closing tag.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foryn2npb7dtq57aw7fjj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foryn2npb7dtq57aw7fjj.png" alt=" " width="800" height="223"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;width and height attribute in html image tag works for legacy reasons but it's good if it's done with CSS.&lt;/p&gt;

&lt;p&gt;With HTML few tags are deprecated. eg: center tag highlighting has stopped working.Browsers till support it so text got in center.Instead of using this HTML tag, CSS should be used.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0xc4sln8umxiguyk7ja1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0xc4sln8umxiguyk7ja1.png" alt=" " width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Video (video) tag
&lt;/h2&gt;

&lt;p&gt;Support of videos were very bad in terms of how browser could play them.Images and text were fine.You had to install/download adobe flash player/codex around 2005-2006.&lt;/p&gt;

&lt;p&gt;since then there are new standards of video that allows us to transfer video more effeciently.&lt;/p&gt;

&lt;p&gt;But support of video in browsers have majorly improved.&lt;br&gt;
Browsers now allow you to embed video natively.&lt;/p&gt;

&lt;p&gt;Unlike image tag, video tag are not self closing.&lt;/p&gt;

&lt;p&gt;Embed this video&lt;br&gt;
&lt;a href="https://www.w3schools.com/html/mov_bbb.mp4" rel="noopener noreferrer"&gt;https://www.w3schools.com/html/mov_bbb.mp4&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbpearvs0n72pz5p13np6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbpearvs0n72pz5p13np6.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F636p7mt8iaxelmekwtq5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F636p7mt8iaxelmekwtq5.png" alt=" " width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;it almost look like image and we can't do anything no play pause button.&lt;br&gt;
write attribute controls and not necessary to give it value.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0x1kpevsdgmc7vnumes0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0x1kpevsdgmc7vnumes0.png" alt=" " width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now video plays.&lt;/p&gt;

&lt;p&gt;raw mp4 video link was embedded this is not case with youtube link. Youtube link is link of webpage it cannot play it.&lt;/p&gt;
&lt;h2&gt;
  
  
  for youtube link copy embedded snippet whole iframe thing.
&lt;/h2&gt;
&lt;h2&gt;
  
  
  Table (table) tag
&lt;/h2&gt;

&lt;p&gt;organization of data in proper way&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4xuzhsgzdbbzvprcvh9g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4xuzhsgzdbbzvprcvh9g.png" alt=" " width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffv1zph76jxaycgmcypit.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffv1zph76jxaycgmcypit.png" alt=" " width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvgupzqyc7i9lesvrwuj0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvgupzqyc7i9lesvrwuj0.png" alt=" " width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;now for understanding purpose using css for border&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fypba769fmohjjyqw1yle.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fypba769fmohjjyqw1yle.png" alt=" " width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff4ndg01i712uqj15qsbb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff4ndg01i712uqj15qsbb.png" alt=" " width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fun part of table is you can spawn certain cells to have multiple rows or coloumn&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr92p4if3bi30ilw5gfwy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr92p4if3bi30ilw5gfwy.png" alt=" " width="800" height="431"&gt;&lt;/a&gt;&lt;br&gt;
so remove 1 td in this tr.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frvazkxp1rcl1lcb0cqyj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frvazkxp1rcl1lcb0cqyj.png" alt=" " width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feglxvb19bsqyd7gpuk98.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feglxvb19bsqyd7gpuk98.png" alt=" " width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;now remove third value td of next row tr&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fybuz59lmj21kd4s4nfbs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fybuz59lmj21kd4s4nfbs.png" alt=" " width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can scale upto page size,pretty awsome layouts can be created with sidebar,content area and header.Problem with it is it is very much hard to make it responsive.&lt;br&gt;
Responsive webpage is adjusting its layout automatically with screen size.it works properly on desktops,mobile phones and tablets.&lt;/p&gt;

&lt;p&gt;Thus table tag should not use for creating layouts but ony when tabular representation is needed.&lt;/p&gt;


&lt;h1&gt;
  
  
  Create a Text Field
&lt;/h1&gt;

&lt;p&gt;Now let’s start creating a &lt;strong&gt;web form&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;&lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt;&lt;/strong&gt; element is used to collect information from users.&lt;/p&gt;
&lt;h2&gt;
  
  
  Creating a Text Input
&lt;/h2&gt;

&lt;p&gt;To create a text field, use the &lt;code&gt;input&lt;/code&gt; element with the &lt;code&gt;type&lt;/code&gt; attribute set to &lt;code&gt;text&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;type="text"&lt;/code&gt; attribute tells the browser that you want a field where the user can enter text.&lt;/p&gt;

&lt;p&gt;Unlike many HTML elements, the &lt;strong&gt;&lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt;&lt;/strong&gt; element does not need a separate closing tag. It is a self-closing element.&lt;/p&gt;

&lt;h2&gt;
  
  
  Complete the Challenge
&lt;/h2&gt;

&lt;p&gt;Create an &lt;strong&gt;&lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt;&lt;/strong&gt; element with the type set to &lt;strong&gt;&lt;code&gt;text&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Place it &lt;strong&gt;below your lists&lt;/strong&gt; in the HTML code.&lt;/p&gt;

&lt;p&gt;Your code should include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will add a text field where users can enter information.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8vmo7itgn7f6fmym32qr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8vmo7itgn7f6fmym32qr.png" alt=" " width="800" height="524"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Add Placeholder Text to a Text Field
&lt;/h1&gt;

&lt;p&gt;Placeholder text is the text displayed inside an &lt;strong&gt;&lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt;&lt;/strong&gt; field before the user enters any information.&lt;/p&gt;

&lt;p&gt;You can add placeholder text using the &lt;strong&gt;&lt;code&gt;placeholder&lt;/code&gt;&lt;/strong&gt; attribute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"this is placeholder text"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;type="text"&lt;/code&gt; creates a text input field.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;placeholder&lt;/code&gt; specifies the text shown before the user types anything.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The &lt;strong&gt;&lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt;&lt;/strong&gt; element does not require a closing tag.&lt;/p&gt;

&lt;h2&gt;
  
  
  Complete the Challenge
&lt;/h2&gt;

&lt;p&gt;Set the &lt;strong&gt;&lt;code&gt;placeholder&lt;/code&gt;&lt;/strong&gt; value of your text input to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat photo URL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your final code should look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"cat photo URL"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will display &lt;strong&gt;"cat photo URL"&lt;/strong&gt; inside the text field until the user enters their own text.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs9ldlyod01uiwnmk45t3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs9ldlyod01uiwnmk45t3.png" alt=" " width="800" height="505"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Declare the Doctype of an HTML Document
&lt;/h1&gt;

&lt;p&gt;So far, we’ve focused on individual HTML elements and what they do. Now, let’s look at a few elements that provide the &lt;strong&gt;overall structure&lt;/strong&gt; of an HTML document.&lt;/p&gt;

&lt;p&gt;These elements are commonly included in every HTML page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Declare the HTML Version
&lt;/h2&gt;

&lt;p&gt;At the beginning of an HTML document, you need to tell the browser which version of HTML the page uses.&lt;/p&gt;

&lt;p&gt;HTML has evolved over time, and different versions have been released. Most modern browsers support the latest standard, &lt;strong&gt;HTML5&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For HTML5, declare the document type using:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```html id="y3t9u1"&lt;br&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


This should always be placed on the **first line** of the HTML document.

The `!` and uppercase `DOCTYPE` are important, particularly for compatibility with older browsers. The `html` part is not case-sensitive.

## The `&amp;lt;html&amp;gt;` Element

After the `&amp;lt;!DOCTYPE html&amp;gt;` declaration, the rest of your HTML code should be placed inside the **`&amp;lt;html&amp;gt;`** element.

The opening tag:



```html id="z4o6q7"
&amp;lt;html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;goes directly below the doctype declaration.&lt;/p&gt;

&lt;p&gt;The closing tag:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```html id="2n7k8p"&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


goes at the end of the document.

A basic HTML structure looks like this:



```html id="c7x2mp"
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;!-- Your HTML code goes here --&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Complete the Challenge
&lt;/h2&gt;

&lt;p&gt;In the blank HTML document, complete the following steps:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkyihwdf6bsmg9suc0xj9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkyihwdf6bsmg9suc0xj9.png" alt=" " width="800" height="275"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add the &lt;strong&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/code&gt;&lt;/strong&gt; declaration at the top.&lt;/li&gt;
&lt;li&gt;Add an opening &lt;strong&gt;&lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;&lt;/strong&gt; tag below it.&lt;/li&gt;
&lt;li&gt;Add a closing &lt;strong&gt;&lt;code&gt;&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/strong&gt; tag at the end.&lt;/li&gt;
&lt;li&gt;Place an &lt;strong&gt;&lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;&lt;/strong&gt; element inside the &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; element.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; should be the &lt;strong&gt;only child element&lt;/strong&gt; inside &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; can contain any text.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your structure should look like this:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```html id="8b4q1s"&lt;br&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br&gt;
&lt;br&gt;
  &lt;/p&gt;
&lt;h1&gt;Hello World&lt;/h1&gt;
&lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


This gives your HTML document its basic structure and declares that it uses HTML5.

![ ](https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/7e8ejcp7iaetluk0walp.png)
---
# Define the Head and Body of an HTML Document

Now that you know how to structure an HTML document with the `&amp;lt;html&amp;gt;` element, you can organize it further using the **`&amp;lt;head&amp;gt;`** and **`&amp;lt;body&amp;gt;`** elements.

## The `&amp;lt;head&amp;gt;` Element

The **`&amp;lt;head&amp;gt;`** element contains information about the webpage that is not displayed as the main page content.

Metadata elements such as:

* `&amp;lt;link&amp;gt;`
* `&amp;lt;meta&amp;gt;`
* `&amp;lt;title&amp;gt;`
* `&amp;lt;style&amp;gt;`

are typically placed inside the `&amp;lt;head&amp;gt;` element.

## The `&amp;lt;body&amp;gt;` Element

The **`&amp;lt;body&amp;gt;`** element contains the actual content of the webpage that users see in their browser.

For example, headings, paragraphs, images, and other visible page content belong inside the `&amp;lt;body&amp;gt;`.

A basic HTML document structure looks like this:



```html id="8k2mqp"
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;!-- metadata elements --&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;!-- page contents --&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Complete the Challenge
&lt;/h2&gt;

&lt;p&gt;Edit the existing HTML markup so that it includes both a &lt;strong&gt;&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;&lt;/strong&gt; and a &lt;strong&gt;&lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Follow these requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; should contain &lt;strong&gt;only the &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;&lt;/strong&gt; element.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; should contain &lt;strong&gt;only the &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;&lt;/strong&gt; elements.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The structure should look like this:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```html id="q7v4nz"&lt;br&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br&gt;
&lt;br&gt;
  &lt;br&gt;
    &lt;/p&gt;
Page Title
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
    &lt;h1&gt;Hello World&lt;/h1&gt;
&lt;br&gt;
    &lt;p&gt;Hello Paragraph&lt;/p&gt;
&lt;br&gt;
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


This separates the page's **metadata** from its **visible content** and gives your HTML document a clear structure.

![ ](https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/uobeu7yz7tbosm3rfb2l.png)


![ ](https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/sahgfwo818kdlyz36gxy.png)

---

# HTML (The Skeleton of Every Webpage)

&amp;gt; [!NOTE]
&amp;gt; HTML is NOT a programming language. It's a **markup language** — it tells the browser *what* things are (heading, paragraph, image, link), not *how* they behave. Think of it as **labeling** content.

---

## What is HTML?

**HTML** = **H**yper **T**ext **M**arkup **L**anguage

It's the **skeleton** of every webpage. Without HTML, there is no webpage.

| Analogy | Role |
|---|---|
| HTML | The **skeleton** and **organs** — structure |
| CSS | The **skin, hair, clothes** — appearance |
| JavaScript | The **muscles and brain** — behavior |

Right now, we're ONLY building the skeleton. It will look ugly. **That's fine.**

---

## How HTML Works

HTML uses **tags** to wrap content and tell the browser what each piece is.



```html
&amp;lt;tagname&amp;gt;Content goes here&amp;lt;/tagname&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;tagname&amp;gt;&lt;/code&gt; = &lt;strong&gt;opening tag&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;/tagname&amp;gt;&lt;/code&gt; = &lt;strong&gt;closing tag&lt;/strong&gt; (has a &lt;code&gt;/&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Everything between = the &lt;strong&gt;content&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some tags are &lt;strong&gt;self-closing&lt;/strong&gt; (no content inside):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"photo.jpg"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;hr&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  1. The Basic Structure — &lt;code&gt;html&lt;/code&gt;, &lt;code&gt;head&lt;/code&gt;, &lt;code&gt;body&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Every HTML file has this skeleton:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;My First Page&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- Everything visible goes here --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tag&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tells the browser "this is HTML5" (always include it)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The root — everything lives inside this&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Invisible&lt;/strong&gt; info — title, metadata, links to CSS files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The text shown on the browser tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Visible&lt;/strong&gt; content — everything the user sees&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Analogy:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; = The &lt;strong&gt;label on a shipping box&lt;/strong&gt; — info about the content, but not the content itself&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; = The &lt;strong&gt;stuff inside the box&lt;/strong&gt; — what you actually see&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Headings — &lt;code&gt;h1&lt;/code&gt; through &lt;code&gt;h6&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Headings define titles and hierarchy. &lt;code&gt;h1&lt;/code&gt; is the biggest, &lt;code&gt;h6&lt;/code&gt; is the smallest.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Main Title (use only ONE per page)&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Section Title&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;Sub-section Title&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;h4&amp;gt;&lt;/span&gt;Sub-sub-section&lt;span class="nt"&gt;&amp;lt;/h4&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;h5&amp;gt;&lt;/span&gt;Rarely used&lt;span class="nt"&gt;&amp;lt;/h5&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;h6&amp;gt;&lt;/span&gt;Almost never used&lt;span class="nt"&gt;&amp;lt;/h6&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd9i2yw5x5iajhxj1wxe9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd9i2yw5x5iajhxj1wxe9.png" alt=" " width="800" height="241"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rules:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every page should have exactly &lt;strong&gt;one &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Don't skip levels (don't jump from &lt;code&gt;h1&lt;/code&gt; to &lt;code&gt;h4&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Headings are for &lt;strong&gt;hierarchy&lt;/strong&gt;, not for making text big (that's CSS's job)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Analogy:&lt;/strong&gt; Think of a book:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;h1&lt;/code&gt; = Book title&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;h2&lt;/code&gt; = Chapter titles&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;h3&lt;/code&gt; = Section within a chapter&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Paragraph — &lt;code&gt;p&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;For blocks of text.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;This is a paragraph. It automatically adds space above and below.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;This is another paragraph. Each one starts on a new line.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fegcmcwb9wn3mh8z3tc3c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fegcmcwb9wn3mh8z3tc3c.png" alt=" " width="799" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;[!TIP]&lt;br&gt;
Extra spaces and line breaks in your code are &lt;strong&gt;ignored&lt;/strong&gt; by the browser. To force a line break, use &lt;code&gt;&amp;lt;br /&amp;gt;&lt;/code&gt;. But most of the time, just use separate &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; tags.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  4. Division &amp;amp; Span — &lt;code&gt;div&lt;/code&gt; and &lt;code&gt;span&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;These are &lt;strong&gt;generic containers&lt;/strong&gt; — they don't mean anything on their own. They're used to &lt;strong&gt;group&lt;/strong&gt; things together.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; — Block-level container
&lt;/h3&gt;

&lt;p&gt;Takes up the &lt;strong&gt;full width&lt;/strong&gt;. Starts on a new line.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Property Details&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;2 bedrooms, 1 bathroom&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt; — Inline container
&lt;/h3&gt;

&lt;p&gt;Stays &lt;strong&gt;in the same line&lt;/strong&gt; as surrounding text.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;The price is &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt;₹3,000&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt; per night.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Analogy:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; = A &lt;strong&gt;cardboard box&lt;/strong&gt; — groups things together, takes up a row&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt; = A &lt;strong&gt;highlighter&lt;/strong&gt; — marks a piece of text within a line&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2sdkx4l9ckch1nfry6q9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2sdkx4l9ckch1nfry6q9.png" alt=" " width="799" height="389"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Links — &lt;code&gt;a&lt;/code&gt; (Anchor)
&lt;/h2&gt;

&lt;p&gt;Links take you to another page (or another part of the same page).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Link to another website --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://www.google.com"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Go to Google&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Link opens in a new tab --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://www.google.com"&lt;/span&gt; &lt;span class="na"&gt;target=&lt;/span&gt;&lt;span class="s"&gt;"_blank"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Go to Google (new tab)&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Link to another page on your site --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"about.html"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;About Us&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Link to a section on the same page --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#contact"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Jump to Contact&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fre5ltaqgjg63jexa2dwo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fre5ltaqgjg63jexa2dwo.png" alt=" " width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;href&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The URL to go to (&lt;strong&gt;required&lt;/strong&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;target="_blank"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Open in a new tab&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  6. Images — &lt;code&gt;img&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Displays an image. Self-closing tag (no &lt;code&gt;&amp;lt;/img&amp;gt;&lt;/code&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"apartment.jpg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Beautiful apartment in Ahmedabad"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"600"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7wqjviq3vcjeqzdaimr1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7wqjviq3vcjeqzdaimr1.png" alt=" " width="799" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;src&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Path to the image file or URL (&lt;strong&gt;required&lt;/strong&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;alt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Description of the image (for accessibility &amp;amp; if image fails to load) (&lt;strong&gt;required&lt;/strong&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;width&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Width in pixels (optional)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;height&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Height in pixels (optional)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Where can &lt;code&gt;src&lt;/code&gt; point to?&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Local file (same folder) --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"photo.jpg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"..."&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Local file (in a subfolder) --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"images/photo.jpg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"..."&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Image from the internet --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/photo.jpg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"..."&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe0atpqr2eg7yk5espptj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe0atpqr2eg7yk5espptj.png" alt=" " width="799" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]&lt;br&gt;
Always include the &lt;code&gt;alt&lt;/code&gt; attribute. It helps blind users (screen readers read it aloud) and helps SEO. Never leave it empty for meaningful images.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  7. Lists — &lt;code&gt;ul&lt;/code&gt;, &lt;code&gt;ol&lt;/code&gt;, &lt;code&gt;li&lt;/code&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Unordered List (bullet points)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;WiFi&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Kitchen&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Air conditioning&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7g365mvp4yhfxc7qli2n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7g365mvp4yhfxc7qli2n.png" alt=" " width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WiFi&lt;/li&gt;
&lt;li&gt;Kitchen&lt;/li&gt;
&lt;li&gt;Air conditioning&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ordered List (numbered)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;ol&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Search for a property&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Check availability&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Book and pay&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ol&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh0n54tos8kbrl62fnqfo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh0n54tos8kbrl62fnqfo.png" alt=" " width="799" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Search for a property&lt;/li&gt;
&lt;li&gt;Check availability&lt;/li&gt;
&lt;li&gt;Book and pay&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tag&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;U&lt;/strong&gt;nordered &lt;strong&gt;L&lt;/strong&gt;ist (bullets)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;ol&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;O&lt;/strong&gt;rdered &lt;strong&gt;L&lt;/strong&gt;ist (numbers)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;L&lt;/strong&gt;ist &lt;strong&gt;I&lt;/strong&gt;tem (goes inside &lt;code&gt;ul&lt;/code&gt; or &lt;code&gt;ol&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  8. Tables — &lt;code&gt;table&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;For displaying &lt;strong&gt;tabular data&lt;/strong&gt; (rows and columns).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;table&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;thead&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;th&amp;gt;&lt;/span&gt;Feature&lt;span class="nt"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;th&amp;gt;&lt;/span&gt;Details&lt;span class="nt"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/thead&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;tbody&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;td&amp;gt;&lt;/span&gt;Bedrooms&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;td&amp;gt;&lt;/span&gt;2&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;td&amp;gt;&lt;/span&gt;Bathrooms&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;td&amp;gt;&lt;/span&gt;1&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/tbody&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/table&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpaa7iik4tmkavcvzn3wb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpaa7iik4tmkavcvzn3wb.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tag&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The table container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;thead&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Table header group&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;tbody&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Table body group&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;tr&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;T&lt;/strong&gt;able &lt;strong&gt;R&lt;/strong&gt;ow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;th&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;T&lt;/strong&gt;able &lt;strong&gt;H&lt;/strong&gt;eader cell (bold, centered by default)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;td&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;T&lt;/strong&gt;able &lt;strong&gt;D&lt;/strong&gt;ata cell&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;[!WARNING]&lt;br&gt;
Never use tables for page layout! Tables are ONLY for tabular data. Use CSS for layout (you'll learn this in Phase 2).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  9. Forms — &lt;code&gt;form&lt;/code&gt;, &lt;code&gt;input&lt;/code&gt;, &lt;code&gt;textarea&lt;/code&gt;, &lt;code&gt;select&lt;/code&gt;, &lt;code&gt;button&lt;/code&gt;, &lt;code&gt;label&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Forms collect user input. This is how login pages, search bars, and contact forms work.&lt;/p&gt;

&lt;h3&gt;
  
  
  The &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; container
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"/submit"&lt;/span&gt; &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"POST"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- form fields go here --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;action&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Where to send the data (URL)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;method&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;How to send it (&lt;code&gt;GET&lt;/code&gt; or &lt;code&gt;POST&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;&amp;lt;label&amp;gt;&lt;/code&gt; — Describes a form field
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"username"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Username:&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"username"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"username"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;for&lt;/code&gt; attribute connects the label to the input's &lt;code&gt;id&lt;/code&gt;. Clicking the label focuses the input.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fujbdf5sdn8c22wvacc2r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fujbdf5sdn8c22wvacc2r.png" alt=" " width="800" height="155"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt; — The Swiss Army Knife
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Text input --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"username"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Enter your name"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Password (hidden characters) --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"password"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"password"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Enter password"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Email (validates email format) --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"you@example.com"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Number --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"number"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"guests"&lt;/span&gt; &lt;span class="na"&gt;min=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;max=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Date --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"date"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"checkin"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Checkbox --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"checkbox"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"wifi"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"wifi"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"wifi"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;WiFi&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Radio buttons (pick one) --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"radio"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"type"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"entire"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"entire"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"entire"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Entire place&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"radio"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"type"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"room"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"room"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"room"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Private room&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Submit button --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"Reserve"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw84yzvjtd74p2natgf9x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw84yzvjtd74p2natgf9x.png" alt=" " width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;&amp;lt;textarea&amp;gt;&lt;/code&gt; — Multi-line text
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Message:&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;textarea&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt; &lt;span class="na"&gt;rows=&lt;/span&gt;&lt;span class="s"&gt;"5"&lt;/span&gt; &lt;span class="na"&gt;cols=&lt;/span&gt;&lt;span class="s"&gt;"40"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Write your message..."&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhlt55f3l5jlfejjy9a7m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhlt55f3l5jlfejjy9a7m.png" alt=" " width="800" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt; — Dropdown
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"guests"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Number of guests:&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;select&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"guests"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"guests"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;-- Select --&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;1 Guest&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;2 Guests&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;3 Guests&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"4"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;4+ Guests&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/select&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkfmzbq2gus10hkhvd14p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkfmzbq2gus10hkhvd14p.png" alt=" " width="800" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; — A clickable button
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Reserve Now&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Save to Wishlist&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"reset"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Clear Form&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2uiypxl3xpzp429iaown.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2uiypxl3xpzp429iaown.png" alt=" " width="799" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Behavior&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;submit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sends the form data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;button&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Does nothing by default (needs JS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;reset&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Clears all form fields&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  10. Attributes — The Extra Info on Tags
&lt;/h2&gt;

&lt;p&gt;Attributes provide &lt;strong&gt;extra information&lt;/strong&gt; about an element. They go inside the opening tag.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;tag&lt;/span&gt; &lt;span class="na"&gt;attribute=&lt;/span&gt;&lt;span class="s"&gt;"value"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Content&lt;span class="nt"&gt;&amp;lt;/tag&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Common Attributes (work on ALL elements)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Unique&lt;/strong&gt; identifier (only ONE element can have a specific id)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;div id="header"&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;class&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Group&lt;/strong&gt; identifier (many elements can share a class)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;p class="highlight"&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;style&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Inline CSS (avoid using this; use CSS files)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;p style="color: red;"&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tooltip text on hover&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;p title="Extra info"&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;id&lt;/code&gt; vs &lt;code&gt;class&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- ID: unique, like your Aadhaar number — only ONE element --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"main-header"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Welcome&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Class: shared, like a school house name — MANY elements --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"amenity"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;WiFi&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"amenity"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Kitchen&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"amenity"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Pool&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjet4lpsn9zcau6vh2pzo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjet4lpsn9zcau6vh2pzo.png" alt=" " width="799" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;id&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;class&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Uniqueness&lt;/td&gt;
&lt;td&gt;Must be unique on the page&lt;/td&gt;
&lt;td&gt;Can be reused on many elements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Usage&lt;/td&gt;
&lt;td&gt;One specific element&lt;/td&gt;
&lt;td&gt;Group of similar elements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CSS selector&lt;/td&gt;
&lt;td&gt;&lt;code&gt;#main-header&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.amenity&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  11. Semantic HTML
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Semantic&lt;/strong&gt; = "meaning." Semantic HTML uses tags that &lt;strong&gt;describe what the content IS&lt;/strong&gt;, not just how it looks.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Non-Semantic (tells you nothing)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"header"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"nav"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"main"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"footer"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ Semantic (tells you everything)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;header&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;nav&amp;gt;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;lt;/nav&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;main&amp;gt;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;footer&amp;gt;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;lt;/footer&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Semantic Tags You Should Know
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tag&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Use for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Top section&lt;/td&gt;
&lt;td&gt;Logo, navigation, title&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Navigation&lt;/td&gt;
&lt;td&gt;Menu links&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Main content&lt;/td&gt;
&lt;td&gt;The primary content of the page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Thematic group&lt;/td&gt;
&lt;td&gt;A section of related content&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Self-contained content&lt;/td&gt;
&lt;td&gt;Blog post, news article, listing card&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;aside&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Side content&lt;/td&gt;
&lt;td&gt;Sidebar, related info&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;footer&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bottom section&lt;/td&gt;
&lt;td&gt;Copyright, contact info, links&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;figure&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Media with caption&lt;/td&gt;
&lt;td&gt;Image + caption&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;figcaption&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Caption for &lt;code&gt;&amp;lt;figure&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Description of the image&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Why bother?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Screen readers&lt;/strong&gt; use these to help blind users navigate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search engines&lt;/strong&gt; (Google) understand your page better → better SEO&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Other developers&lt;/strong&gt; can read your code faster&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You&lt;/strong&gt; can read your own code 6 months later&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;[!TIP]&lt;br&gt;
Rule of thumb: If there's a semantic tag that fits, use it instead of &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;. Ask yourself: "Is this a navigation? Use &lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt;. Is this a footer? Use &lt;code&gt;&amp;lt;footer&amp;gt;&lt;/code&gt;."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Quick Reference — All Tags You Learned
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tag&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Self-closing?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Root of the document&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Metadata container&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Visible content&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;–&lt;code&gt;&amp;lt;h6&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Headings&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Paragraph&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Block container&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Inline container&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Link&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Image&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Unordered list&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;ol&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ordered list&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List item&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Table&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;tr&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Table row&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;th&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Table header cell&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;td&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Table data cell&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Form container&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Input field&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;textarea&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Multi-line text input&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Dropdown&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;option&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Dropdown option&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Button&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;label&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Label for form field&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;br&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Line break&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;hr&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Horizontal rule (line)&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Page/section header&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Navigation&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Main content&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Content section&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Self-contained content&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;footer&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Page/section footer&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;figure&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Media container&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;figcaption&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Caption for figure&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;&lt;em&gt;Now let's build the Airbnb listing page! →&lt;/em&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Phase 1 Airbnb Listing Project in HTML Walkthrough
&lt;/h1&gt;

&lt;h2&gt;
  
  
  What was built
&lt;/h2&gt;

&lt;p&gt;A complete &lt;strong&gt;Airbnb-style property listing page&lt;/strong&gt; using &lt;strong&gt;only HTML&lt;/strong&gt; — no CSS, no JavaScript, no backend. The page is intentionally "ugly" because styling is Phase 2's job.&lt;/p&gt;

&lt;h3&gt;
  
  
  Project location
&lt;/h3&gt;

&lt;p&gt;[index.html]&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsibyzp8rkrfub60dcdg2.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsibyzp8rkrfub60dcdg2.gif" alt=" " width="720" height="327"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc1vn0g6nflb0mvhm639f.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc1vn0g6nflb0mvhm639f.gif" alt=" " width="720" height="327"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!--
    DOCTYPE tells the browser: "This is an HTML5 document."
    Always put this on the very first line.
--&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!--
    &amp;lt;html&amp;gt; is the ROOT element — everything lives inside it.
    lang="en" tells browsers and screen readers the language is English.
--&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!--
        &amp;lt;head&amp;gt; contains INVISIBLE information about the page.
        Nothing here shows up on the screen.
    --&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!--
        charset="UTF-8" allows the page to display characters from
        any language, including ₹ (rupee symbol), é, ñ, 中文, etc.
        Without this, special characters might show as garbage: â‚¹
    --&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!--
        This makes the page look good on mobile phones.
        Without it, the page would appear tiny on a phone screen.
    --&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Beautiful Apartment in Ahmedabad — Airbnb&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!--
        &amp;lt;title&amp;gt; sets the text on the browser tab.
        Also what Google shows as the page title in search results.
    --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;


&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!--
        &amp;lt;body&amp;gt; contains EVERYTHING the user sees on the page.
        This is where all our content goes.
    --&amp;gt;&lt;/span&gt;


    &lt;span class="c"&gt;&amp;lt;!-- ============================================ --&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!--                  HEADER                       --&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- ============================================ --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;header&amp;gt;&lt;/span&gt;
        &lt;span class="c"&gt;&amp;lt;!--
            &amp;lt;header&amp;gt; is a SEMANTIC tag — it tells the browser
            "this is the top section of the page" (logo, nav, etc.)
            We could use &amp;lt;div&amp;gt; instead, but &amp;lt;header&amp;gt; is more meaningful.
        --&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Airbnb&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
        &lt;span class="c"&gt;&amp;lt;!--
            &amp;lt;h1&amp;gt; = the MOST IMPORTANT heading on the page.
            Rule: Only ONE &amp;lt;h1&amp;gt; per page.
            Here it's the brand name / logo text.
        --&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;nav&amp;gt;&lt;/span&gt;
            &lt;span class="c"&gt;&amp;lt;!--
                &amp;lt;nav&amp;gt; = SEMANTIC tag for navigation links.
                Tells screen readers "these are navigation links."
            --&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#listing"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Listing&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
            &lt;span class="c"&gt;&amp;lt;!--
                &amp;lt;a&amp;gt; = Anchor tag = a LINK.
                href="#listing" means "scroll to the element with id='listing' on this page."
                The # means "look on THIS page" (not another website).
            --&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt; | &lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
            &lt;span class="c"&gt;&amp;lt;!--
                &amp;lt;span&amp;gt; is an INLINE container. We're using it here just
                to add a separator "|" between the nav links.
                It doesn't start a new line (unlike &amp;lt;div&amp;gt;).
            --&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#amenities"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Amenities&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt; | &lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#reviews"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Reviews&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt; | &lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#reserve"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Reserve&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/nav&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;


    &lt;span class="nt"&gt;&amp;lt;hr&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!--
        &amp;lt;hr&amp;gt; = Horizontal Rule = a dividing line.
        It's self-closing (no &amp;lt;/hr&amp;gt; needed).
        Visually separates sections of content.
    --&amp;gt;&lt;/span&gt;


    &lt;span class="c"&gt;&amp;lt;!-- ============================================ --&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!--                MAIN CONTENT                   --&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- ============================================ --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;main&amp;gt;&lt;/span&gt;
        &lt;span class="c"&gt;&amp;lt;!--
            &amp;lt;main&amp;gt; = SEMANTIC tag for the primary content of the page.
            There should be only ONE &amp;lt;main&amp;gt; per page.
        --&amp;gt;&lt;/span&gt;


        &lt;span class="c"&gt;&amp;lt;!-- ====== LISTING SECTION ====== --&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"listing"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="c"&gt;&amp;lt;!--
                &amp;lt;section&amp;gt; = SEMANTIC tag for a thematic group of content.
                id="listing" gives this section a UNIQUE identifier.
                The nav link href="#listing" scrolls to THIS section.

                Remember: 'id' must be UNIQUE on the entire page.
            --&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Beautiful Apartment in Ahmedabad&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
            &lt;span class="c"&gt;&amp;lt;!--
                &amp;lt;h2&amp;gt; = Second-level heading.
                This is the property title. Under the page's &amp;lt;h1&amp;gt;, so h2 is correct.
            --&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
                &lt;span class="c"&gt;&amp;lt;!--
                    &amp;lt;p&amp;gt; = Paragraph.
                    Contains a brief location/host description.
                --&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt;⭐ 4.9&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
                &lt;span class="c"&gt;&amp;lt;!--
                    &amp;lt;span&amp;gt; wraps the rating inline (doesn't break to a new line).
                    Later with CSS, we could style this differently.
                --&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt; · &lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#reviews"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;128 reviews&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt; · &lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt;Ahmedabad, Gujarat, India&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;


        &lt;span class="nt"&gt;&amp;lt;hr&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;


        &lt;span class="c"&gt;&amp;lt;!-- ====== PROPERTY IMAGE ====== --&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"photos"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Photos&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;figure&amp;gt;&lt;/span&gt;
                &lt;span class="c"&gt;&amp;lt;!--
                    &amp;lt;figure&amp;gt; = SEMANTIC tag for media content (image, diagram, etc.)
                    with an optional caption. Better than a plain &amp;lt;div&amp;gt;.
                --&amp;gt;&lt;/span&gt;

                &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt;
                    &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://images.unsplash.com/photo-1522708323590-d24dbb6b0267?w=800"&lt;/span&gt;
                    &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Spacious living room with modern furniture, large windows letting in natural light, and a comfortable sofa"&lt;/span&gt;
                    &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"700"&lt;/span&gt;
                &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="c"&gt;&amp;lt;!--
                    &amp;lt;img&amp;gt; = Image tag. Self-closing.

                    src = Source of the image. Can be:
                        - A local file:  src="images/photo.jpg"
                        - A URL:         src="https://example.com/photo.jpg"

                    alt = Alternative text. VERY IMPORTANT:
                        - Displayed if the image fails to load
                        - Read aloud by screen readers for blind users
                        - Helps Google understand your images (SEO)
                        - Should DESCRIBE the image, not just say "photo"

                    width = Width in pixels. We set 700 to keep it reasonable.
                --&amp;gt;&lt;/span&gt;

                &lt;span class="nt"&gt;&amp;lt;figcaption&amp;gt;&lt;/span&gt;
                    Living room — bright and spacious with modern decor
                &lt;span class="nt"&gt;&amp;lt;/figcaption&amp;gt;&lt;/span&gt;
                &lt;span class="c"&gt;&amp;lt;!--
                    &amp;lt;figcaption&amp;gt; = Caption for the &amp;lt;figure&amp;gt;.
                    Displayed below the image as descriptive text.
                --&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/figure&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;figure&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt;
                    &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://images.unsplash.com/photo-1540518614846-7eded433c457?w=800"&lt;/span&gt;
                    &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Cozy bedroom with a king-size bed, white linens, and warm lighting"&lt;/span&gt;
                    &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"700"&lt;/span&gt;
                &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;figcaption&amp;gt;&lt;/span&gt;
                    Master bedroom — king-size bed with premium linens
                &lt;span class="nt"&gt;&amp;lt;/figcaption&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/figure&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;


        &lt;span class="nt"&gt;&amp;lt;hr&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;


        &lt;span class="c"&gt;&amp;lt;!-- ====== PROPERTY DETAILS ====== --&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"details"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Property Details&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
                Entire apartment hosted by &lt;span class="nt"&gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Yash&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt;
                &lt;span class="c"&gt;&amp;lt;!--
                    &amp;lt;strong&amp;gt; = SEMANTIC tag meaning "strong importance."
                    Browsers display it as bold.
                    Don't use &amp;lt;b&amp;gt; — &amp;lt;strong&amp;gt; carries meaning, &amp;lt;b&amp;gt; is just visual.
                --&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
                2 bedrooms · 1 bathroom · 4 guests · 1 bed
            &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;em&amp;gt;&lt;/span&gt;Self check-in with lockbox&lt;span class="nt"&gt;&amp;lt;/em&amp;gt;&lt;/span&gt;
                &lt;span class="c"&gt;&amp;lt;!--
                    &amp;lt;em&amp;gt; = SEMANTIC tag meaning "emphasis."
                    Browsers display it as italic.
                    Don't use &amp;lt;i&amp;gt; — &amp;lt;em&amp;gt; carries meaning, &amp;lt;i&amp;gt; is just visual.
                --&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;


        &lt;span class="nt"&gt;&amp;lt;hr&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;


        &lt;span class="c"&gt;&amp;lt;!-- ====== DESCRIPTION ====== --&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"description"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;About This Place&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
                Welcome to our beautiful apartment in the heart of Ahmedabad!
                This spacious 2-bedroom apartment is perfect for families,
                couples, or business travelers looking for a comfortable stay.
            &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
                Located just 10 minutes from Sabarmati Ashram and walking
                distance to the famous Law Garden night market, you'll have
                the best of Ahmedabad at your doorstep.
            &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
                The apartment features modern amenities, a fully equipped
                kitchen, high-speed WiFi, and a stunning city view from
                the balcony.
            &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;


        &lt;span class="nt"&gt;&amp;lt;hr&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;


        &lt;span class="c"&gt;&amp;lt;!-- ====== PRICE ====== --&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"pricing"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Pricing&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;table&amp;gt;&lt;/span&gt;
                &lt;span class="c"&gt;&amp;lt;!--
                    &amp;lt;table&amp;gt; = Creates a table with rows and columns.
                    Use tables ONLY for tabular data, never for page layout.
                --&amp;gt;&lt;/span&gt;

                &lt;span class="nt"&gt;&amp;lt;thead&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!--
                        &amp;lt;thead&amp;gt; = Table Header group.
                        Contains the column headings.
                    --&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;
                        &lt;span class="c"&gt;&amp;lt;!--
                            &amp;lt;tr&amp;gt; = Table Row.
                            Each &amp;lt;tr&amp;gt; is one horizontal row.
                        --&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;th&amp;gt;&lt;/span&gt;Item&lt;span class="nt"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
                        &lt;span class="c"&gt;&amp;lt;!--
                            &amp;lt;th&amp;gt; = Table Header cell.
                            Displayed bold and centered by default.
                        --&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;th&amp;gt;&lt;/span&gt;Price&lt;span class="nt"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/thead&amp;gt;&lt;/span&gt;

                &lt;span class="nt"&gt;&amp;lt;tbody&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!--
                        &amp;lt;tbody&amp;gt; = Table Body group.
                        Contains the data rows.
                    --&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;td&amp;gt;&lt;/span&gt;Per night&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
                        &lt;span class="c"&gt;&amp;lt;!--
                            &amp;lt;td&amp;gt; = Table Data cell.
                            A regular cell containing data.
                        --&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;td&amp;gt;&lt;/span&gt;₹3,000&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;td&amp;gt;&lt;/span&gt;Cleaning fee&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;td&amp;gt;&lt;/span&gt;₹500&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;td&amp;gt;&lt;/span&gt;Service fee&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;td&amp;gt;&lt;/span&gt;₹400&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;th&amp;gt;&lt;/span&gt;Total (1 night)&lt;span class="nt"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
                        &lt;span class="c"&gt;&amp;lt;!--
                            Using &amp;lt;th&amp;gt; here to make the total row bold,
                            since it's a summary/header-like cell.
                        --&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;th&amp;gt;&lt;/span&gt;₹3,900&lt;span class="nt"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/tbody&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/table&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;


        &lt;span class="nt"&gt;&amp;lt;hr&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;


        &lt;span class="c"&gt;&amp;lt;!-- ====== AMENITIES ====== --&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"amenities"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Amenities&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;Essentials&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
                &lt;span class="c"&gt;&amp;lt;!--
                    &amp;lt;ul&amp;gt; = Unordered List (bullet points).
                    Each item inside is an &amp;lt;li&amp;gt; (List Item).
                --&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;WiFi&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Air conditioning&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Heating&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Iron&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Hair dryer&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;Kitchen &lt;span class="ni"&gt;&amp;amp;amp;&lt;/span&gt; Dining&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
            &lt;span class="c"&gt;&amp;lt;!--
                &amp;amp;amp; is an HTML ENTITY for the &amp;amp; symbol.
                Some characters have special meaning in HTML, so we use entities:
                    &amp;amp;amp;   = &amp;amp;
                    &amp;amp;lt;    = &amp;lt;
                    &amp;amp;gt;    = &amp;gt;
                    &amp;amp;quot;  = "
                    &amp;amp;copy;  = ©
            --&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Full kitchen&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Refrigerator&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Microwave&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Coffee maker&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Dishes and silverware&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;Safety&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Smoke detector&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Fire extinguisher&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;First aid kit&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;Not Available&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&amp;lt;s&amp;gt;&lt;/span&gt;Swimming pool&lt;span class="nt"&gt;&amp;lt;/s&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&amp;lt;s&amp;gt;&lt;/span&gt;Gym&lt;span class="nt"&gt;&amp;lt;/s&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
                &lt;span class="c"&gt;&amp;lt;!--
                    &amp;lt;s&amp;gt; = Strikethrough text.
                    Shows that these amenities are NOT available.
                --&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;


        &lt;span class="nt"&gt;&amp;lt;hr&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;


        &lt;span class="c"&gt;&amp;lt;!-- ====== HOUSE RULES ====== --&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"rules"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;House Rules&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;ol&amp;gt;&lt;/span&gt;
                &lt;span class="c"&gt;&amp;lt;!--
                    &amp;lt;ol&amp;gt; = Ordered List (numbered).
                    The browser automatically numbers each &amp;lt;li&amp;gt;.
                --&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Check-in: After 2:00 PM&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Checkout: Before 11:00 AM&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;No smoking inside the apartment&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;No parties or loud music after 10:00 PM&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Maximum 4 guests allowed&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Pets are &lt;span class="nt"&gt;&amp;lt;strong&amp;gt;&lt;/span&gt;not&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt; allowed&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/ol&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;


        &lt;span class="nt"&gt;&amp;lt;hr&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;


        &lt;span class="c"&gt;&amp;lt;!-- ====== REVIEWS ====== --&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"reviews"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Reviews&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;⭐ 4.9 average · 128 reviews&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;article&amp;gt;&lt;/span&gt;
                &lt;span class="c"&gt;&amp;lt;!--
                    &amp;lt;article&amp;gt; = SEMANTIC tag for self-contained content.
                    Each review is an independent piece of content — perfect for &amp;lt;article&amp;gt;.
                --&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;Priya&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&amp;lt;em&amp;gt;&lt;/span&gt;September 2026&lt;span class="nt"&gt;&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
                    Amazing apartment! Super clean, great location, and Yash was
                    a wonderful host. The kitchen was fully equipped — we cooked
                    every day. Highly recommend!
                &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;article&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;Rahul&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&amp;lt;em&amp;gt;&lt;/span&gt;August 2026&lt;span class="nt"&gt;&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
                    Perfect for our family trip to Ahmedabad. The kids loved the
                    spacious living room. WiFi was fast and reliable. Only
                    suggestion: a few more pillows would be nice.
                &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;article&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;Ananya&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&amp;lt;em&amp;gt;&lt;/span&gt;July 2026&lt;span class="nt"&gt;&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
                    Stayed here for a week for work. The location is unbeatable —
                    close to restaurants and transport. The apartment felt like
                    home. Will definitely book again!
                &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;


        &lt;span class="nt"&gt;&amp;lt;hr&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;


        &lt;span class="c"&gt;&amp;lt;!-- ====== LOCATION ====== --&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"location"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Location&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Ahmedabad, Gujarat, India&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
                Navrangpura area — one of the most vibrant neighborhoods
                in Ahmedabad. Walking distance to:
            &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Law Garden Night Market — 5 min walk&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Sabarmati Ashram — 10 min drive&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Sardar Vallabhbhai Patel International Airport — 25 min drive&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Ahmedabad Railway Station — 15 min drive&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;


        &lt;span class="nt"&gt;&amp;lt;hr&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;


        &lt;span class="c"&gt;&amp;lt;!-- ============================================ --&amp;gt;&lt;/span&gt;
        &lt;span class="c"&gt;&amp;lt;!--            RESERVATION FORM                   --&amp;gt;&lt;/span&gt;
        &lt;span class="c"&gt;&amp;lt;!-- ============================================ --&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"reserve"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Reserve This Property&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;&lt;/span&gt;₹3,000&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt; / night&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"/submit-reservation"&lt;/span&gt; &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"POST"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="c"&gt;&amp;lt;!--
                    &amp;lt;form&amp;gt; = Container for all form fields.

                    action="/submit-reservation"
                        Where to send the data when submitted.
                        Since we have no backend, this will just reload the page.

                    method="POST"
                        HOW to send the data:
                        - GET  = data goes in the URL (visible)
                        - POST = data goes in the request body (hidden)
                        For forms that send sensitive data, always use POST.
                --&amp;gt;&lt;/span&gt;


                &lt;span class="c"&gt;&amp;lt;!-- NAME FIELD --&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!--
                        Wrapping each label+input pair in a &amp;lt;div&amp;gt; puts each
                        field on its own line (since &amp;lt;div&amp;gt; is a block element).
                    --&amp;gt;&lt;/span&gt;

                    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"fullname"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Full Name:&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!--
                        &amp;lt;label&amp;gt; tells the user what to type.
                        for="fullname" LINKS this label to the input with id="fullname".
                        Benefit: clicking the label focuses the input field.
                    --&amp;gt;&lt;/span&gt;

                    &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

                    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt;
                        &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt;
                        &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"fullname"&lt;/span&gt;
                        &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"fullname"&lt;/span&gt;
                        &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Enter your full name"&lt;/span&gt;
                        &lt;span class="na"&gt;required&lt;/span&gt;
                    &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!--
                        &amp;lt;input&amp;gt; = Self-closing. No &amp;lt;/input&amp;gt; needed.

                        type="text"     → A single-line text box
                        id="fullname"   → UNIQUE identifier (connects to the label's 'for')
                        name="fullname" → The KEY when data is sent to server
                                          Server receives: fullname=Yash+Verma
                        placeholder     → Gray hint text shown when field is empty
                        required        → Form won't submit if this is empty
                                          (this is an attribute with NO value — just its presence matters)
                    --&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

                &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;


                &lt;span class="c"&gt;&amp;lt;!-- EMAIL FIELD --&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Email Address:&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt;
                        &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;
                        &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;
                        &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;
                        &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"you@example.com"&lt;/span&gt;
                        &lt;span class="na"&gt;required&lt;/span&gt;
                    &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!--
                        type="email" → Browser validates that it looks like an email.
                        If you type "abc" and hit submit, it'll say "enter a valid email."
                    --&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

                &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;


                &lt;span class="c"&gt;&amp;lt;!-- PHONE FIELD --&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"phone"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Phone Number:&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt;
                        &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"tel"&lt;/span&gt;
                        &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"phone"&lt;/span&gt;
                        &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"phone"&lt;/span&gt;
                        &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"+91 98765 43210"&lt;/span&gt;
                    &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!--
                        type="tel" → On mobile phones, this opens the NUMBER keyboard
                        instead of the full keyboard. Nice UX touch!
                        Not marked 'required' — it's optional.
                    --&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

                &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;


                &lt;span class="c"&gt;&amp;lt;!-- CHECK-IN DATE --&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"checkin"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Check-in Date:&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt;
                        &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"date"&lt;/span&gt;
                        &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"checkin"&lt;/span&gt;
                        &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"checkin"&lt;/span&gt;
                        &lt;span class="na"&gt;required&lt;/span&gt;
                    &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!--
                        type="date" → Shows a date picker calendar!
                        No JavaScript needed — the browser provides it.
                    --&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

                &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;


                &lt;span class="c"&gt;&amp;lt;!-- CHECK-OUT DATE --&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"checkout"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Check-out Date:&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt;
                        &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"date"&lt;/span&gt;
                        &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"checkout"&lt;/span&gt;
                        &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"checkout"&lt;/span&gt;
                        &lt;span class="na"&gt;required&lt;/span&gt;
                    &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

                &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;


                &lt;span class="c"&gt;&amp;lt;!-- NUMBER OF GUESTS --&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"guests"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Number of Guests:&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;select&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"guests"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"guests"&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="c"&gt;&amp;lt;!--
                            &amp;lt;select&amp;gt; = Dropdown menu.
                            Each &amp;lt;option&amp;gt; is one choice in the dropdown.
                        --&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;-- Select --&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
                        &lt;span class="c"&gt;&amp;lt;!--
                            value="" with required means this "placeholder" option
                            won't be accepted — the user must pick a real option.
                        --&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;1 Guest&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;2 Guests&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;3 Guests&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"4"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;4 Guests&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/select&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

                &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;


                &lt;span class="c"&gt;&amp;lt;!-- PROPERTY TYPE — RADIO BUTTONS --&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Booking Type:&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

                    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"radio"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"entire"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"booking_type"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"entire"&lt;/span&gt; &lt;span class="na"&gt;checked&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"entire"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Entire place&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!--
                        type="radio" → Round buttons where you can pick ONLY ONE.
                        All radio buttons with the SAME 'name' form a group.
                        Here all 3 have name="booking_type", so only one can be selected.

                        checked → This option is selected by default.

                        id="entire" connects to the &amp;lt;label for="entire"&amp;gt;,
                        so clicking "Entire place" text also selects the radio button.
                    --&amp;gt;&lt;/span&gt;

                    &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

                    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"radio"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"private"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"booking_type"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"private"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"private"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Private room&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;

                    &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

                    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"radio"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"shared"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"booking_type"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"shared"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"shared"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Shared room&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

                &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;


                &lt;span class="c"&gt;&amp;lt;!-- ADD-ONS — CHECKBOXES --&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Add-ons:&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

                    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"checkbox"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"airport"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"addons"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"airport_pickup"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"airport"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Airport pickup (₹800)&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!--
                        type="checkbox" → Square boxes. Can select MULTIPLE.
                        Unlike radio buttons, checkboxes are independent.
                    --&amp;gt;&lt;/span&gt;

                    &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

                    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"checkbox"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"breakfast"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"addons"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"breakfast"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"breakfast"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Daily breakfast (₹300/day)&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;

                    &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

                    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"checkbox"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"tour"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"addons"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"city_tour"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"tour"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Guided city tour (₹1,500)&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

                &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;


                &lt;span class="c"&gt;&amp;lt;!-- SPECIAL REQUESTS — TEXTAREA --&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"requests"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Special Requests:&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;textarea&lt;/span&gt;
                        &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"requests"&lt;/span&gt;
                        &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"requests"&lt;/span&gt;
                        &lt;span class="na"&gt;rows=&lt;/span&gt;&lt;span class="s"&gt;"4"&lt;/span&gt;
                        &lt;span class="na"&gt;cols=&lt;/span&gt;&lt;span class="s"&gt;"50"&lt;/span&gt;
                        &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Any special requirements? (e.g., early check-in, extra pillows, dietary needs)"&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!--
                        &amp;lt;textarea&amp;gt; = Multi-line text input.
                        Unlike &amp;lt;input&amp;gt;, this is NOT self-closing — it needs &amp;lt;/textarea&amp;gt;.

                        rows="4"  → Height (4 lines tall)
                        cols="50" → Width (50 characters wide)

                        NOTE: The closing tag must come RIGHT AFTER the opening tag
                        (no space/newline) if you don't want default text inside.
                    --&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

                &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;


                &lt;span class="c"&gt;&amp;lt;!-- TERMS CHECKBOX --&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"checkbox"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"terms"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"terms"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"agreed"&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"terms"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                        I agree to the
                        &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://www.airbnb.com/terms"&lt;/span&gt; &lt;span class="na"&gt;target=&lt;/span&gt;&lt;span class="s"&gt;"_blank"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Terms of Service&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!--
                        required on a checkbox = user MUST check this box to submit.
                        Perfect for "agree to terms" checkboxes.

                        target="_blank" on the link = opens in a new tab,
                        so the user doesn't lose their form progress.
                    --&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

                &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;


                &lt;span class="c"&gt;&amp;lt;!-- SUBMIT &amp;amp; RESET BUTTONS --&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Reserve Now&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!--
                        type="submit" → Clicking this sends the form data.
                        The browser validates all 'required' fields first.
                    --&amp;gt;&lt;/span&gt;

                    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"reset"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Clear Form&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!--
                        type="reset" → Clicking this clears all form fields
                        back to their default values.
                    --&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;


        &lt;span class="nt"&gt;&amp;lt;hr&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;


        &lt;span class="c"&gt;&amp;lt;!-- ====== HOST INFO ====== --&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"host"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Meet Your Host&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Hosted by Yash&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Joined in January 2024&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;⭐ 128 Reviews&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;🏅 Superhost&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;✅ Identity verified&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
                Hi! I'm Yash, a software developer based in Ahmedabad.
                I love hosting guests and sharing the beauty of Gujarat.
                I'm available 24/7 for any questions during your stay!
            &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Response rate:&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt; 100%
                &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Response time:&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt; within an hour
            &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"mailto:yash@example.com"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Contact Host&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
                &lt;span class="c"&gt;&amp;lt;!--
                    mailto: is a special URL scheme.
                    Clicking this opens the user's email app with
                    yash@example.com pre-filled in the "To" field.
                --&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;


    &lt;span class="nt"&gt;&amp;lt;hr&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;


    &lt;span class="c"&gt;&amp;lt;!-- ============================================ --&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!--                  FOOTER                       --&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- ============================================ --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;footer&amp;gt;&lt;/span&gt;
        &lt;span class="c"&gt;&amp;lt;!--
            &amp;lt;footer&amp;gt; = SEMANTIC tag for the bottom section of the page.
            Usually contains copyright, links, and legal info.
        --&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
            &lt;span class="ni"&gt;&amp;amp;copy;&lt;/span&gt; 2026 Airbnb Clone — Practice Project
            &lt;span class="c"&gt;&amp;lt;!--
                &amp;amp;copy; = © (copyright symbol). It's an HTML entity.
            --&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;nav&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#listing"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Back to Top&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt; | &lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://www.airbnb.com"&lt;/span&gt; &lt;span class="na"&gt;target=&lt;/span&gt;&lt;span class="s"&gt;"_blank"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Real Airbnb&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt; | &lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"mailto:yash@example.com"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Contact&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/nav&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;small&amp;gt;&lt;/span&gt;
                This is a practice project for learning HTML.
                Not affiliated with Airbnb, Inc.
            &lt;span class="nt"&gt;&amp;lt;/small&amp;gt;&lt;/span&gt;
            &lt;span class="c"&gt;&amp;lt;!--
                &amp;lt;small&amp;gt; = Text in a smaller font size.
                Often used for disclaimers, fine print, copyright.
            --&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/footer&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Page Structure — Section by Section
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────────────────────┐
│  HEADER                              │  &amp;lt;header&amp;gt;, &amp;lt;h1&amp;gt;, &amp;lt;nav&amp;gt;, &amp;lt;a&amp;gt;
│  Airbnb logo + navigation links      │
├──────────────────────────────────────┤
│  LISTING                             │  &amp;lt;section&amp;gt;, &amp;lt;h2&amp;gt;, &amp;lt;p&amp;gt;, &amp;lt;span&amp;gt;, &amp;lt;a&amp;gt;
│  Title + rating + location            │
├──────────────────────────────────────┤
│  PHOTOS                              │  &amp;lt;section&amp;gt;, &amp;lt;figure&amp;gt;, &amp;lt;img&amp;gt;, &amp;lt;figcaption&amp;gt;
│  Property images with captions        │
├──────────────────────────────────────┤
│  DETAILS                             │  &amp;lt;section&amp;gt;, &amp;lt;h2&amp;gt;, &amp;lt;p&amp;gt;, &amp;lt;strong&amp;gt;, &amp;lt;em&amp;gt;
│  Bedrooms, bathrooms, guests          │
├──────────────────────────────────────┤
│  DESCRIPTION                         │  &amp;lt;section&amp;gt;, &amp;lt;h2&amp;gt;, &amp;lt;p&amp;gt;
│  About the property                   │
├──────────────────────────────────────┤
│  PRICING                             │  &amp;lt;table&amp;gt;, &amp;lt;thead&amp;gt;, &amp;lt;tbody&amp;gt;, &amp;lt;tr&amp;gt;, &amp;lt;th&amp;gt;, &amp;lt;td&amp;gt;
│  Price breakdown table                │
├──────────────────────────────────────┤
│  AMENITIES                           │  &amp;lt;h3&amp;gt;, &amp;lt;ul&amp;gt;, &amp;lt;li&amp;gt;, &amp;lt;s&amp;gt;
│  Feature lists (essentials, kitchen)  │
├──────────────────────────────────────┤
│  HOUSE RULES                         │  &amp;lt;ol&amp;gt;, &amp;lt;li&amp;gt;, &amp;lt;strong&amp;gt;
│  Numbered rules list                  │
├──────────────────────────────────────┤
│  REVIEWS                             │  &amp;lt;article&amp;gt;, &amp;lt;h3&amp;gt;, &amp;lt;p&amp;gt;, &amp;lt;em&amp;gt;
│  Guest reviews                        │
├──────────────────────────────────────┤
│  LOCATION                            │  &amp;lt;section&amp;gt;, &amp;lt;ul&amp;gt;, &amp;lt;li&amp;gt;
│  Nearby landmarks                     │
├──────────────────────────────────────┤
│  RESERVATION FORM                    │  &amp;lt;form&amp;gt;, &amp;lt;label&amp;gt;, &amp;lt;input&amp;gt;, &amp;lt;select&amp;gt;,
│  Full booking form                    │  &amp;lt;option&amp;gt;, &amp;lt;textarea&amp;gt;, &amp;lt;button&amp;gt;,
│                                       │  radio, checkbox, date picker
├──────────────────────────────────────┤
│  HOST INFO                           │  &amp;lt;section&amp;gt;, &amp;lt;ul&amp;gt;, &amp;lt;li&amp;gt;, &amp;lt;a href="mailto:"&amp;gt;
│  Host profile                         │
├──────────────────────────────────────┤
│  FOOTER                              │  &amp;lt;footer&amp;gt;, &amp;lt;nav&amp;gt;, &amp;lt;small&amp;gt;, &amp;amp;copy;
│  Copyright + links                    │
└──────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Every Concept → Where It's Used
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;Tags Used&lt;/th&gt;
&lt;th&gt;Where in the Page&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Page structure&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;html&lt;/code&gt;, &lt;code&gt;head&lt;/code&gt;, &lt;code&gt;body&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;The skeleton wrapping everything&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Headings&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;h1&lt;/code&gt;, &lt;code&gt;h2&lt;/code&gt;, &lt;code&gt;h3&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Airbnb title (h1), section titles (h2), amenity groups (h3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Paragraphs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;p&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Descriptions, details, host info&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Div&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;div&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Wrapping each form field pair&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Span&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;span&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Rating star, separator dots, inline pieces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;a&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nav links, review link, mailto link, terms link&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Images&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;img&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Two property photos (from Unsplash)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Unordered list&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ul&lt;/code&gt;, &lt;code&gt;li&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Amenities, host badges, nearby locations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ordered list&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ol&lt;/code&gt;, &lt;code&gt;li&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;House rules (numbered)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Table&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;table&lt;/code&gt;, &lt;code&gt;thead&lt;/code&gt;, &lt;code&gt;tbody&lt;/code&gt;, &lt;code&gt;tr&lt;/code&gt;, &lt;code&gt;th&lt;/code&gt;, &lt;code&gt;td&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Pricing breakdown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Form&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;form&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reservation form&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Input types&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;text&lt;/code&gt;, &lt;code&gt;email&lt;/code&gt;, &lt;code&gt;tel&lt;/code&gt;, &lt;code&gt;date&lt;/code&gt;, &lt;code&gt;radio&lt;/code&gt;, &lt;code&gt;checkbox&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Name, email, phone, dates, booking type, add-ons&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Textarea&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;textarea&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Special requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Select/dropdown&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;select&lt;/code&gt;, &lt;code&gt;option&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Number of guests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Button&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;button&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reserve Now, Clear Form&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Label&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;label&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Every form field has a connected label&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Attributes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;id&lt;/code&gt;, &lt;code&gt;class&lt;/code&gt;, &lt;code&gt;href&lt;/code&gt;, &lt;code&gt;src&lt;/code&gt;, &lt;code&gt;alt&lt;/code&gt;, &lt;code&gt;required&lt;/code&gt;, &lt;code&gt;placeholder&lt;/code&gt;, &lt;code&gt;for&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;value&lt;/code&gt;, &lt;code&gt;type&lt;/code&gt;, &lt;code&gt;target&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Used throughout&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Semantic HTML&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;header&lt;/code&gt;, &lt;code&gt;nav&lt;/code&gt;, &lt;code&gt;main&lt;/code&gt;, &lt;code&gt;section&lt;/code&gt;, &lt;code&gt;article&lt;/code&gt;, &lt;code&gt;footer&lt;/code&gt;, &lt;code&gt;figure&lt;/code&gt;, &lt;code&gt;figcaption&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Page structure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HTML entities&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;&amp;amp;copy;&lt;/code&gt;, &lt;code&gt;&amp;amp;amp;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Copyright symbol, ampersand&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Special links&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;href="#id"&lt;/code&gt;, &lt;code&gt;href="mailto:"&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;In-page scrolling, email link&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧪 Practice Challenges — Try These Yourself
&lt;/h2&gt;

&lt;p&gt;Now that you've seen the full page, &lt;strong&gt;modify it&lt;/strong&gt; to practice. Open the file in a text editor and try these(Will try to Ans in comment or edit this blog later):&lt;/p&gt;

&lt;h3&gt;
  
  
  Easy
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Change the property title to your own&lt;/li&gt;
&lt;li&gt;[ ] Change the price from ₹3,000 to ₹5,000&lt;/li&gt;
&lt;li&gt;[ ] Add a 3rd photo using any image URL from &lt;a href="https://unsplash.com" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Add 2 more amenities to the list&lt;/li&gt;
&lt;li&gt;[ ] Change the host name to yours&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Medium
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Add a new review (copy the &lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt; pattern)&lt;/li&gt;
&lt;li&gt;[ ] Add a new house rule to the ordered list&lt;/li&gt;
&lt;li&gt;[ ] Add a new column to the pricing table ("Per Week" pricing)&lt;/li&gt;
&lt;li&gt;[ ] Add a &lt;code&gt;type="number"&lt;/code&gt; input for "Number of Nights" in the form&lt;/li&gt;
&lt;li&gt;[ ] Create a new section: &lt;strong&gt;"What guests are saying"&lt;/strong&gt; with a quote&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Challenge
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Create a &lt;strong&gt;second HTML page&lt;/strong&gt; called &lt;code&gt;about.html&lt;/code&gt; with info about the host&lt;/li&gt;
&lt;li&gt;[ ] Add a link in &lt;code&gt;index.html&lt;/code&gt; to navigate to &lt;code&gt;about.html&lt;/code&gt; and vice versa&lt;/li&gt;
&lt;li&gt;[ ] Add a &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt; comparing this apartment with a competing listing&lt;/li&gt;
&lt;li&gt;[ ] Create a &lt;strong&gt;contact form&lt;/strong&gt; page (&lt;code&gt;contact.html&lt;/code&gt;) with name, email, subject, and message fields&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;[!TIP]&lt;br&gt;
&lt;strong&gt;How to edit:&lt;/strong&gt; Open &lt;code&gt;index.html&lt;/code&gt; in any text editor (Notepad, VS Code, etc.), make changes, save the file, and refresh the browser. That's the full workflow!&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What This Page is Missing (On Purpose)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Missing&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;th&gt;When you'll learn it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No styling (looks ugly)&lt;/td&gt;
&lt;td&gt;CSS hasn't been learned yet&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Phase 2 — CSS&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No interactivity&lt;/td&gt;
&lt;td&gt;JavaScript hasn't been learned yet&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Phase 3 — JavaScript&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Form doesn't actually submit&lt;/td&gt;
&lt;td&gt;No backend server&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Phase 4+ — Backend&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No real data&lt;/td&gt;
&lt;td&gt;No database&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Phase 5+ — Database&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Images from internet&lt;/td&gt;
&lt;td&gt;No image hosting set up&lt;/td&gt;
&lt;td&gt;Later&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]&lt;br&gt;
&lt;strong&gt;The page looks plain and ugly. That's a SUCCESS.&lt;/strong&gt; You built a complete, well-structured HTML document with correct semantic tags. The visual design comes in Phase 2 (CSS). Never use HTML to try to make things look pretty — that's CSS's job.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ✅ Phase 1 Checklist — Can You...
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Create an HTML file from scratch with the correct structure?&lt;/li&gt;
&lt;li&gt;[ ] Use headings (&lt;code&gt;h1&lt;/code&gt;–&lt;code&gt;h6&lt;/code&gt;) with proper hierarchy?&lt;/li&gt;
&lt;li&gt;[ ] Add paragraphs, links, and images?&lt;/li&gt;
&lt;li&gt;[ ] Build ordered and unordered lists?&lt;/li&gt;
&lt;li&gt;[ ] Create a table with headers and data?&lt;/li&gt;
&lt;li&gt;[ ] Build a form with text inputs, dropdowns, radio buttons, checkboxes, and a submit button?&lt;/li&gt;
&lt;li&gt;[ ] Connect &lt;code&gt;&amp;lt;label&amp;gt;&lt;/code&gt; to &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt; using &lt;code&gt;for&lt;/code&gt; and &lt;code&gt;id&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;[ ] Explain the difference between &lt;code&gt;id&lt;/code&gt; and &lt;code&gt;class&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;[ ] Use semantic tags (&lt;code&gt;header&lt;/code&gt;, &lt;code&gt;main&lt;/code&gt;, &lt;code&gt;section&lt;/code&gt;, &lt;code&gt;article&lt;/code&gt;, &lt;code&gt;footer&lt;/code&gt;) instead of &lt;code&gt;div&lt;/code&gt; everywhere?&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>beginners</category>
      <category>frontend</category>
      <category>html</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Phase 0 Understanding how websites work</title>
      <dc:creator>Yashvi Kothari</dc:creator>
      <pubDate>Thu, 17 Sep 2026 08:42:41 +0000</pubDate>
      <link>https://dev.to/yashvikothari/phase-0-understanding-how-websites-work-38od</link>
      <guid>https://dev.to/yashvikothari/phase-0-understanding-how-websites-work-38od</guid>
      <description>&lt;p&gt;Phase 0 Understand how websites work&lt;br&gt;
Before writing code, understand these concepts.&lt;br&gt;
Learn:&lt;br&gt;
What is a website?&lt;br&gt;
Browser vs server&lt;br&gt;
Frontend vs backend&lt;br&gt;
Database&lt;br&gt;
HTTP&lt;br&gt;
Request&lt;br&gt;
Response&lt;br&gt;
URL&lt;br&gt;
Domain&lt;br&gt;
IP address&lt;br&gt;
HTTP vs HTTPS&lt;br&gt;
GET vs POST&lt;br&gt;
Client-server architecture&lt;br&gt;
You should be able to understand:&lt;br&gt;
You&lt;br&gt;
 ↓&lt;br&gt;
Chrome&lt;br&gt;
 ↓&lt;br&gt;
Internet&lt;br&gt;
 ↓&lt;br&gt;
Server&lt;br&gt;
 ↓&lt;br&gt;
Application&lt;br&gt;
 ↓&lt;br&gt;
Database&lt;br&gt;
 ↓&lt;br&gt;
Server&lt;br&gt;
 ↓&lt;br&gt;
Chrome&lt;br&gt;
 ↓&lt;br&gt;
You&lt;/p&gt;

&lt;p&gt;Practice&lt;br&gt;
Open browser DevTools → Network tab.&lt;br&gt;
Visit a website and observe:&lt;br&gt;
Request&lt;br&gt;
Response&lt;br&gt;
Status Code&lt;br&gt;
Method&lt;br&gt;
URL&lt;br&gt;
Headers&lt;br&gt;
Response&lt;br&gt;
Don't worry about understanding everything yet.&lt;/p&gt;
&lt;h1&gt;
  
  
  Phase 0 — How Websites Work
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;[!NOTE]&lt;br&gt;
You don't need to memorize any of this. Read it, understand the &lt;em&gt;big picture&lt;/em&gt;, and come back as a reference. Everything will become clearer once you start writing code.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  1. What is a Website?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;website&lt;/strong&gt; is a collection of files (text, images, code) stored on a computer somewhere in the world. When you "visit" a website, your browser downloads those files and displays them on your screen.&lt;/p&gt;

&lt;p&gt;Think of it like a &lt;strong&gt;restaurant&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Restaurant&lt;/th&gt;
&lt;th&gt;Website&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;You (the customer)&lt;/td&gt;
&lt;td&gt;You (the user)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The menu you see&lt;/td&gt;
&lt;td&gt;The webpage you see (HTML, CSS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The kitchen&lt;/td&gt;
&lt;td&gt;The server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The recipe book&lt;/td&gt;
&lt;td&gt;The application code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The pantry/fridge&lt;/td&gt;
&lt;td&gt;The database&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The waiter&lt;/td&gt;
&lt;td&gt;HTTP (the protocol carrying requests &amp;amp; responses)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Key takeaway:&lt;/strong&gt; A website isn't a single magical thing — it's files on someone else's computer, delivered to your computer over the internet.&lt;/p&gt;


&lt;h2&gt;
  
  
  2. Browser vs Server
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Browser (Client)
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;browser&lt;/strong&gt; is the app on &lt;em&gt;your&lt;/em&gt; device — Chrome, Firefox, Edge, Safari. Its job is to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Send requests&lt;/strong&gt; — "Hey, give me google.com"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Receive files&lt;/strong&gt; — HTML, CSS, JavaScript, images&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Render (display)&lt;/strong&gt; those files as a visual webpage&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The browser is also called the &lt;strong&gt;client&lt;/strong&gt; — the one &lt;em&gt;asking&lt;/em&gt; for something.&lt;/p&gt;
&lt;h3&gt;
  
  
  Server
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;server&lt;/strong&gt; is a computer (usually in a data center) that is &lt;em&gt;always on&lt;/em&gt; and &lt;em&gt;always connected to the internet&lt;/em&gt;, waiting to respond to requests.&lt;/p&gt;

&lt;p&gt;Its job is to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Listen&lt;/strong&gt; for incoming requests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Process&lt;/strong&gt; the request (look up data, run logic)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Send back&lt;/strong&gt; a response (usually an HTML page, JSON data, or files)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Real-world analogy:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Browser&lt;/strong&gt; = You calling a pizza shop on the phone&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server&lt;/strong&gt; = The pizza shop answering the phone, making your pizza, and delivering it&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;[!TIP]&lt;br&gt;
Your own laptop can act as a server! When you learn backend development, you'll run a "local server" on your machine. It's just a program that listens and responds.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  3. Frontend vs Backend
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Frontend (Client-Side)
&lt;/h3&gt;

&lt;p&gt;Everything the &lt;strong&gt;user sees and interacts with&lt;/strong&gt; in the browser:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The layout of the page (HTML)&lt;/li&gt;
&lt;li&gt;The colors, fonts, spacing (CSS)&lt;/li&gt;
&lt;li&gt;Buttons that do things, animations, pop-ups (JavaScript)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Technologies:&lt;/strong&gt; HTML, CSS, JavaScript, React, Angular, Vue&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Analogy:&lt;/strong&gt; The &lt;strong&gt;dining area&lt;/strong&gt; of a restaurant — what customers see.&lt;/p&gt;
&lt;h3&gt;
  
  
  Backend (Server-Side)
&lt;/h3&gt;

&lt;p&gt;Everything that happens &lt;strong&gt;behind the scenes&lt;/strong&gt; on the server:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Processing login credentials&lt;/li&gt;
&lt;li&gt;Fetching your order history from a database&lt;/li&gt;
&lt;li&gt;Sending emails&lt;/li&gt;
&lt;li&gt;Payment processing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Technologies:&lt;/strong&gt; Node.js, Python (Django/Flask), Java, Go, PHP, Ruby&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Analogy:&lt;/strong&gt; The &lt;strong&gt;kitchen&lt;/strong&gt; of a restaurant — customers can't see it, but that's where the real work happens.&lt;/p&gt;
&lt;h3&gt;
  
  
  How They Connect
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────┐         ┌──────────────┐         ┌──────────────┐
│   FRONTEND   │  ────►  │   BACKEND    │  ────►  │   DATABASE   │
│  (Browser)   │  ◄────  │   (Server)   │  ◄────  │  (Storage)   │
│              │         │              │         │              │
│ HTML/CSS/JS  │         │ Node/Python  │         │ MySQL/Mongo  │
│ What you SEE │         │ Logic/Rules  │         │ Where data   │
│              │         │              │         │ LIVES        │
└──────────────┘         └──────────────┘         └──────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Database
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;database&lt;/strong&gt; is organized storage for data. Think of it as a super-powered Excel spreadsheet.&lt;/p&gt;

&lt;p&gt;When you sign up on Instagram:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your username, email, password → &lt;strong&gt;stored in a database&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Your posts, likes, followers → &lt;strong&gt;stored in a database&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;When you log in → the server &lt;strong&gt;reads from the database&lt;/strong&gt; to check your password&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Types of Databases
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Examples&lt;/th&gt;
&lt;th&gt;Data looks like...&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Relational (SQL)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MySQL, PostgreSQL&lt;/td&gt;
&lt;td&gt;Tables with rows &amp;amp; columns (like Excel)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Non-Relational (NoSQL)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MongoDB, Firebase&lt;/td&gt;
&lt;td&gt;Flexible documents (like JSON files)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Example — A "users" table in SQL:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;username&lt;/th&gt;
&lt;th&gt;email&lt;/th&gt;
&lt;th&gt;password_hash&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;yash123&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:yash@email.com"&gt;yash@email.com&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;a1b2c3...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;priya456&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:priya@email.com"&gt;priya@email.com&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;d4e5f6...&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;[!NOTE]&lt;br&gt;
You don't need to learn databases right now. Just understand: &lt;strong&gt;data has to live somewhere&lt;/strong&gt;, and that somewhere is the database.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  5. HTTP — The Language of the Web
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;HTTP&lt;/strong&gt; = &lt;strong&gt;H&lt;/strong&gt;yper &lt;strong&gt;T&lt;/strong&gt;ext &lt;strong&gt;T&lt;/strong&gt;ransfer &lt;strong&gt;P&lt;/strong&gt;rotocol&lt;/p&gt;

&lt;p&gt;It's the &lt;strong&gt;set of rules&lt;/strong&gt; that browsers and servers use to talk to each other. Think of it as the &lt;strong&gt;language&lt;/strong&gt; the waiter speaks.&lt;/p&gt;

&lt;p&gt;Every time you visit a website, your browser speaks HTTP to the server.&lt;/p&gt;


&lt;h2&gt;
  
  
  6. Request
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;request&lt;/strong&gt; is what your browser &lt;strong&gt;sends to the server&lt;/strong&gt; when you want something.&lt;/p&gt;

&lt;p&gt;When you type &lt;code&gt;https://www.google.com&lt;/code&gt; and hit Enter, your browser sends an HTTP request that looks roughly like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET / HTTP/1.1
Host: www.google.com
User-Agent: Chrome/120
Accept: text/html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Breaking it down:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The method — "I want to GET (read) something"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The path — "Give me the homepage"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;HTTP/1.1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The version of HTTP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Host: www.google.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Which server to talk to&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;User-Agent: Chrome/120&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;"I'm using Chrome"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Accept: text/html&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;"I want HTML back"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  7. Response
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;response&lt;/strong&gt; is what the server &lt;strong&gt;sends back&lt;/strong&gt; to your browser.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 14523

&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Google&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;... the Google homepage ...&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Breaking it down:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;200 OK&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Status code — "Everything went well, here's your page"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Content-Type: text/html&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;"I'm sending you an HTML file"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;html&amp;gt;...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The actual content (the webpage)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Common Status Codes
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;When you see it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;200&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ OK&lt;/td&gt;
&lt;td&gt;Page loaded successfully&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;301&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;↪️ Moved Permanently&lt;/td&gt;
&lt;td&gt;Website redirected you&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;404&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Not Found&lt;/td&gt;
&lt;td&gt;Page doesn't exist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;500&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;💥 Internal Server Error&lt;/td&gt;
&lt;td&gt;Server crashed or has a bug&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;403&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🚫 Forbidden&lt;/td&gt;
&lt;td&gt;You don't have permission&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  8. URL — The Address of a Webpage
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;URL&lt;/strong&gt; = &lt;strong&gt;U&lt;/strong&gt;niform &lt;strong&gt;R&lt;/strong&gt;esource &lt;strong&gt;L&lt;/strong&gt;ocator — it's the &lt;strong&gt;address&lt;/strong&gt; that tells the browser exactly where to go.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://www.example.com:443/products/shoes?color=red&amp;amp;size=10#reviews
  │        │              │       │              │              │
  │        │              │       │              │              └─ Fragment (scroll to this section)
  │        │              │       │              └─ Query params (filters/search)
  │        │              │       └─ Path (which page)
  │        │              └─ Port (which door on the server)
  │        └─ Domain (which server)
  └─ Protocol (how to communicate)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Protocol&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;How to talk (securely)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Domain&lt;/td&gt;
&lt;td&gt;&lt;code&gt;www.example.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Which server to contact&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Port&lt;/td&gt;
&lt;td&gt;&lt;code&gt;:443&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Which "door" (usually hidden)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Path&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/products/shoes&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Which specific page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Query&lt;/td&gt;
&lt;td&gt;&lt;code&gt;?color=red&amp;amp;size=10&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Extra info / filters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fragment&lt;/td&gt;
&lt;td&gt;&lt;code&gt;#reviews&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Scroll to a section on the page&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  9. Domain &amp;amp; IP Address
&lt;/h2&gt;

&lt;h3&gt;
  
  
  IP Address
&lt;/h3&gt;

&lt;p&gt;Every computer on the internet has a unique &lt;strong&gt;IP address&lt;/strong&gt; — a number like &lt;code&gt;142.250.190.46&lt;/code&gt;. This is the &lt;strong&gt;real&lt;/strong&gt; address of a server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Domain Name
&lt;/h3&gt;

&lt;p&gt;Since nobody wants to remember &lt;code&gt;142.250.190.46&lt;/code&gt;, we use &lt;strong&gt;domain names&lt;/strong&gt; like &lt;code&gt;google.com&lt;/code&gt; as human-friendly aliases.&lt;/p&gt;

&lt;h3&gt;
  
  
  DNS — The Phonebook of the Internet
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;DNS&lt;/strong&gt; (Domain Name System) translates domain names to IP addresses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You type: google.com
     ↓
DNS lookup: "google.com → 142.250.190.46"
     ↓
Browser connects to: 142.250.190.46
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Analogy:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IP address&lt;/strong&gt; = A house's GPS coordinates (27.1751, 78.0421)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain name&lt;/strong&gt; = The house's street address ("Taj Mahal, Agra")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DNS&lt;/strong&gt; = Google Maps converting the address to coordinates&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  10. HTTP vs HTTPS
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;HTTP&lt;/th&gt;
&lt;th&gt;HTTPS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Full form&lt;/td&gt;
&lt;td&gt;HyperText Transfer Protocol&lt;/td&gt;
&lt;td&gt;HyperText Transfer Protocol &lt;strong&gt;Secure&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Encryption&lt;/td&gt;
&lt;td&gt;❌ None — data sent as plain text&lt;/td&gt;
&lt;td&gt;✅ Encrypted with SSL/TLS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Anyone on the network can read your data&lt;/td&gt;
&lt;td&gt;Data is scrambled, unreadable to snoopers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Port&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;443&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;URL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http://...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://...&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use today&lt;/td&gt;
&lt;td&gt;Almost never (browsers warn you)&lt;/td&gt;
&lt;td&gt;Everywhere — the standard&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;br&gt;
If you log into a website over &lt;strong&gt;HTTP&lt;/strong&gt;, someone on the same Wi-Fi can literally read your password. With &lt;strong&gt;HTTPS&lt;/strong&gt;, everything is encrypted.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]&lt;br&gt;
Never enter passwords or credit cards on a site that shows &lt;code&gt;http://&lt;/code&gt; (no 's'). Modern browsers show a "Not Secure" warning for these sites.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  11. GET vs POST
&lt;/h2&gt;

&lt;p&gt;These are the two most common &lt;strong&gt;HTTP methods&lt;/strong&gt; — they tell the server &lt;em&gt;what kind of action&lt;/em&gt; you want.&lt;/p&gt;
&lt;h3&gt;
  
  
  GET — "Give me something"
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Purpose:&lt;/strong&gt; Read / retrieve data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When it happens:&lt;/strong&gt; Loading a page, searching, clicking a link&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data location:&lt;/strong&gt; In the URL (visible) → &lt;code&gt;?q=cats&amp;amp;page=2&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safe to repeat?&lt;/strong&gt; Yes — nothing changes on the server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visiting &lt;code&gt;google.com&lt;/code&gt; → GET&lt;/li&gt;
&lt;li&gt;Searching &lt;code&gt;google.com/search?q=cats&lt;/code&gt; → GET&lt;/li&gt;
&lt;li&gt;Loading your Twitter feed → GET&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  POST — "Here, take this data"
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Purpose:&lt;/strong&gt; Send / submit data to the server&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When it happens:&lt;/strong&gt; Submitting a form, logging in, uploading a file&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data location:&lt;/strong&gt; In the request body (hidden from URL)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safe to repeat?&lt;/strong&gt; No — might create duplicates (e.g., double purchase)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Submitting a signup form → POST&lt;/li&gt;
&lt;li&gt;Posting a tweet → POST&lt;/li&gt;
&lt;li&gt;Uploading a photo → POST&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Comparison Table
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;GET&lt;/th&gt;
&lt;th&gt;POST&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Purpose&lt;/td&gt;
&lt;td&gt;Read data&lt;/td&gt;
&lt;td&gt;Send/create data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data in URL?&lt;/td&gt;
&lt;td&gt;✅ Yes (visible)&lt;/td&gt;
&lt;td&gt;❌ No (in body)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cacheable?&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bookmarkable?&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can be repeated safely?&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Example&lt;/td&gt;
&lt;td&gt;Loading a page&lt;/td&gt;
&lt;td&gt;Submitting a form&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;[!TIP]&lt;br&gt;
There are other methods too — &lt;strong&gt;PUT&lt;/strong&gt; (update), &lt;strong&gt;DELETE&lt;/strong&gt; (remove), &lt;strong&gt;PATCH&lt;/strong&gt; (partial update). You'll learn these when building APIs. For now, just know GET and POST.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  12. Client-Server Architecture
&lt;/h2&gt;

&lt;p&gt;This is the &lt;strong&gt;fundamental pattern&lt;/strong&gt; of how the web works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  ┌─────────┐                              ┌─────────┐
  │ CLIENT  │  ──── Request ──────────►    │ SERVER  │
  │(Browser)│  ◄─── Response ────────────  │         │
  └─────────┘                              └─────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;The &lt;strong&gt;client&lt;/strong&gt; (your browser) initiates communication by sending a &lt;strong&gt;request&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;server&lt;/strong&gt; processes the request and sends back a &lt;strong&gt;response&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The server &lt;strong&gt;never&lt;/strong&gt; contacts you first (in basic HTTP) — it only responds&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;This is like a restaurant:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You (client) call the waiter and place an order (request)&lt;/li&gt;
&lt;li&gt;The kitchen (server) prepares the food and the waiter brings it back (response)&lt;/li&gt;
&lt;li&gt;The kitchen never randomly walks up to your table with food you didn't order&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  13. The Full Journey — Step by Step
&lt;/h2&gt;

&lt;p&gt;This is the flow you need to understand. Let's trace what happens when you open Instagram:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; YOU                    "I want to see Instagram"
  ↓
 CHROME (Browser)       Types instagram.com, hits Enter
  ↓
 DNS                    Converts "instagram.com" → 157.240.1.174
  ↓
 INTERNET               Your request travels through cables/wifi
  ↓
 SERVER                  Instagram's server receives your request
  ↓
 APPLICATION             Instagram's code runs:
                         "This user is logged in, fetch their feed"
  ↓
 DATABASE                Queries: "Get latest 20 posts from
                         people this user follows"
  ↓
 APPLICATION             Formats the data into an HTML page / JSON
  ↓
 SERVER                  Sends the response back
  ↓
 INTERNET                Response travels back through cables/wifi
  ↓
 CHROME (Browser)        Receives HTML/CSS/JS, renders the page
  ↓
 YOU                     See your Instagram feed! 🎉
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Timing
&lt;/h3&gt;

&lt;p&gt;This entire journey happens in &lt;strong&gt;~200-500 milliseconds&lt;/strong&gt; (less than half a second). That's how fast the internet is.&lt;/p&gt;




&lt;h2&gt;
  
  
  14. 🧪 Practice Exercise — Using Browser DevTools
&lt;/h2&gt;

&lt;p&gt;This is your &lt;strong&gt;first hands-on practice&lt;/strong&gt;. No coding needed — just observation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Open DevTools
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Chrome&lt;/strong&gt; (or any browser)&lt;/li&gt;
&lt;li&gt;Press &lt;strong&gt;&lt;code&gt;F12&lt;/code&gt;&lt;/strong&gt; or &lt;strong&gt;&lt;code&gt;Ctrl + Shift + I&lt;/code&gt;&lt;/strong&gt; (Windows) / &lt;strong&gt;&lt;code&gt;Cmd + Option + I&lt;/code&gt;&lt;/strong&gt; (Mac)&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;"Network"&lt;/strong&gt; tab at the top&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fevkcumu5emixg23ywmpu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fevkcumu5emixg23ywmpu.png" alt=" " width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Visit a Website
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Make sure the Network tab is open and recording (there should be a red circle ● at the top-left)&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;https://httpbin.org/get&lt;/code&gt; in the address bar and hit Enter&lt;/li&gt;
&lt;li&gt;You'll see lines appear in the Network tab — each line is one request
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxklhxwdyicj3ou1ymk0o.png" alt=" " width="800" height="425"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 3: Observe the First Request
&lt;/h3&gt;

&lt;p&gt;Click on the &lt;strong&gt;first item&lt;/strong&gt; in the list (usually named &lt;code&gt;get&lt;/code&gt;). &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy9akxbeid7zyc24ezd8p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy9akxbeid7zyc24ezd8p.png" alt=" " width="799" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn5t8nor86gjphte7w6co.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn5t8nor86gjphte7w6co.png" alt=" " width="800" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fit9lbt475p6684etrkad.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fit9lbt475p6684etrkad.png" alt=" " width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You'll see panels showing:&lt;/p&gt;

&lt;h4&gt;
  
  
  ✅ What to look for:
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;th&gt;Where to find it&lt;/th&gt;
&lt;th&gt;Example value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;URL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;In the "Headers" section → Request URL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://httpbin.org/get&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Method&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;In the "Headers" section&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Status Code&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;In the "Headers" section&lt;/td&gt;
&lt;td&gt;&lt;code&gt;200 OK&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Response Headers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;In the "Headers" section → Response Headers&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Content-Type: application/json&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Response Body&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Click the "Response" or "Preview" tab&lt;/td&gt;
&lt;td&gt;JSON data&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 4: Try a POST Request
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open a new tab&lt;/li&gt;
&lt;li&gt;Open DevTools (F12) → Network tab&lt;/li&gt;
&lt;li&gt;Paste this into the address bar: &lt;code&gt;https://httpbin.org/post&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;You'll get an error (because browsers send GET by default) — &lt;strong&gt;that's expected!&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;This tells you: &lt;strong&gt;the server only accepts POST at this URL, but your browser sent GET&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvdphqzn0pjpvgvfpo0eq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvdphqzn0pjpvgvfpo0eq.png" alt=" " width="799" height="426"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7phbbr7sqapabt4unuic.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7phbbr7sqapabt4unuic.png" alt=" " width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Observe Multiple Requests
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;code&gt;https://www.google.com&lt;/code&gt; with DevTools Network tab open&lt;/li&gt;
&lt;li&gt;Notice there are &lt;strong&gt;dozens of requests&lt;/strong&gt; — not just one!&lt;/li&gt;
&lt;li&gt;Each image, CSS file, JavaScript file, and font is a &lt;strong&gt;separate request&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqrcjxrmukeidfj3ubxyu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqrcjxrmukeidfj3ubxyu.png" alt=" " width="799" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fse6gclk6pp7libx1e3hu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fse6gclk6pp7libx1e3hu.png" alt=" " width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsef4n28s7ftsskkk4ixx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsef4n28s7ftsskkk4ixx.png" alt=" " width="799" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvl2ukhb0z5gerf8sgbz0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvl2ukhb0z5gerf8sgbz0.png" alt=" " width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]&lt;br&gt;
A single webpage often makes &lt;strong&gt;30-100+ HTTP requests&lt;/strong&gt; to load completely. The HTML is just the skeleton — it then triggers requests for all the images, styles, and scripts.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 6: Status Codes in Action
&lt;/h3&gt;

&lt;p&gt;Try visiting these URLs and check the status code in DevTools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;https://httpbin.org/status/200&lt;/code&gt; → Should show &lt;strong&gt;200&lt;/strong&gt; (OK)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;https://httpbin.org/status/404&lt;/code&gt; → Should show &lt;strong&gt;404&lt;/strong&gt; (Not Found)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;https://httpbin.org/status/500&lt;/code&gt; → Should show &lt;strong&gt;500&lt;/strong&gt; (Server Error)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpopjdaddy7d7e1hfro7i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpopjdaddy7d7e1hfro7i.png" alt=" " width="800" height="428"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff1owuux23g7eyyapanv4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff1owuux23g7eyyapanv4.png" alt=" " width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdr1wihdm23ydm67wnepa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdr1wihdm23ydm67wnepa.png" alt=" " width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  15. Summary Cheat Sheet
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;One-Line Summary&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Website&lt;/td&gt;
&lt;td&gt;Files on a server, displayed by your browser&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser&lt;/td&gt;
&lt;td&gt;The app that requests and displays web pages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server&lt;/td&gt;
&lt;td&gt;A computer that listens for and responds to requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frontend&lt;/td&gt;
&lt;td&gt;What the user sees (HTML, CSS, JS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;Logic that runs on the server (Node, Python, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;Where data is stored (like a smart spreadsheet)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTP&lt;/td&gt;
&lt;td&gt;The rules/language browsers and servers speak&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Request&lt;/td&gt;
&lt;td&gt;What the browser sends ("give me this page")&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Response&lt;/td&gt;
&lt;td&gt;What the server sends back (the page + status)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;URL&lt;/td&gt;
&lt;td&gt;The address of a webpage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Domain&lt;/td&gt;
&lt;td&gt;Human-friendly name for a server (google.com)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IP Address&lt;/td&gt;
&lt;td&gt;The real numeric address of a server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTPS&lt;/td&gt;
&lt;td&gt;HTTP + encryption = secure communication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;"Read/fetch something"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;"Send/submit data"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client-Server&lt;/td&gt;
&lt;td&gt;Client asks → Server responds. Always.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  ✅ Phase 0 Checklist
&lt;/h2&gt;

&lt;p&gt;Before moving to Phase 1, make sure you can answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] What happens when I type a URL and press Enter?&lt;/li&gt;
&lt;li&gt;[ ] What's the difference between frontend and backend?&lt;/li&gt;
&lt;li&gt;[ ] What does a database do?&lt;/li&gt;
&lt;li&gt;[ ] What's a request? What's a response?&lt;/li&gt;
&lt;li&gt;[ ] What's the difference between GET and POST?&lt;/li&gt;
&lt;li&gt;[ ] What does a 404 error mean? What about 500?&lt;/li&gt;
&lt;li&gt;[ ] Why is HTTPS better than HTTP?&lt;/li&gt;
&lt;li&gt;[ ] I've opened DevTools and seen real requests/responses&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;[!TIP]&lt;br&gt;
You do NOT need to understand everything perfectly. If you can explain the restaurant analogy to someone — you're ready for Phase 1. Understanding deepens as you build things.&lt;/p&gt;
&lt;/blockquote&gt;




</description>
      <category>webdev</category>
      <category>fullstack</category>
      <category>website</category>
      <category>mern</category>
    </item>
    <item>
      <title>Hands-On Lab Guide: L1 Support Engineer Skills</title>
      <dc:creator>Yashvi Kothari</dc:creator>
      <pubDate>Mon, 17 Aug 2026 09:36:54 +0000</pubDate>
      <link>https://dev.to/aws-builders/hands-on-lab-guide-l1-support-engineer-skills-3pi7</link>
      <guid>https://dev.to/aws-builders/hands-on-lab-guide-l1-support-engineer-skills-3pi7</guid>
      <description>&lt;h1&gt;
  
  
  🛠️ Hands-On Lab Guide: L1 Support Engineer Skills
&lt;/h1&gt;




&lt;h2&gt;
  
  
  Lab 1: Windows Server + IIS Setup (Core L1 Skill)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Objective
&lt;/h3&gt;

&lt;p&gt;Launch a Windows Server EC2, install IIS, deploy a test website, and practice troubleshooting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step-by-Step
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Launch a Windows EC2 Instance&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1hzcqb8sk1hcqaehadr2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1hzcqb8sk1hcqaehadr2.png" alt=" " width="799" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fynk1obis8stb77hrqacf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fynk1obis8stb77hrqacf.png" alt=" " width="800" height="504"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhidssrukkhlammeen2gw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhidssrukkhlammeen2gw.png" alt=" " width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4biow9o1bbb0tsze80hw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4biow9o1bbb0tsze80hw.png" alt=" " width="800" height="487"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AWS Console → EC2 → Launch Instance

Name:              L1-Lab-Windows-IIS
AMI:               Microsoft Windows Server 2022 Base
Instance type:     t3.medium
Key pair:          Create new → "l1-lab-key" → Download .pem
Security Group:    Create new with these rules:
                   - RDP (port 3389) → My IP
                   - HTTP (port 80) → 0.0.0.0/0
                   - HTTPS (port 443) → 0.0.0.0/0

Click "Launch Instance"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Connect via RDP&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fszt2fa78xlzx7yna6np6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fszt2fa78xlzx7yna6np6.png" alt=" " width="799" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5r5ccjda8v8c33gh96a4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5r5ccjda8v8c33gh96a4.png" alt=" " width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fffvrdsmp8g0bn3yeyuju.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fffvrdsmp8g0bn3yeyuju.png" alt=" " width="800" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj48600qkap7w6nunf2ot.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj48600qkap7w6nunf2ot.png" alt=" " width="800" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fibldz7wnubbfs3iiym0t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fibldz7wnubbfs3iiym0t.png" alt=" " width="800" height="305"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3zxhvz2bjbmcij3g6sfo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3zxhvz2bjbmcij3g6sfo.png" alt=" " width="800" height="308"&gt;&lt;/a&gt;&lt;br&gt;
Password: &lt;br&gt;
6xr&amp;amp;;(LfLeaZyayHGSpjA9c@!OgA$xBF&lt;br&gt;
Private IP address&lt;br&gt;
172.31.7.190&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fngmp386joqahfhe5t5od.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fngmp386joqahfhe5t5od.png" alt=" " width="800" height="173"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzfuokl8n5f49npm4c296.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzfuokl8n5f49npm4c296.png" alt=" " width="800" height="423"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Select your instance → Click "Connect"
2. Go to "RDP Client" tab
3. Click "Get password" → Upload your .pem key file → Decrypt
4. Download the RDP file
5. Open it with Remote Desktop Connection
6. Enter the decrypted password
7. You're now on a Windows Server!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Install IIS (Internet Information Services)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9b1576sx6ngwofzz83lz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9b1576sx6ngwofzz83lz.png" alt=" " width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F39p60gy61kbpopmf25hv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F39p60gy61kbpopmf25hv.png" alt=" " width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftqqvlyfzs9zrcbz6snd1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftqqvlyfzs9zrcbz6snd1.png" alt=" " width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdmr8er0garctjptcbnbx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdmr8er0garctjptcbnbx.png" alt=" " width="799" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjyzx7q23ddz9zn9pjj99.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjyzx7q23ddz9zn9pjj99.png" alt=" " width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open &lt;strong&gt;PowerShell as Administrator&lt;/strong&gt; on the Windows Server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install IIS with management tools&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Install-WindowsFeature&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Web-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-IncludeManagementTools&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Verify IIS is running&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;W3SVC&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Check IIS is serving the default page&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Invoke-WebRequest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Uri&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;http://localhost&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-UseBasicParsing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StatusCode&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Deploy a Test Website&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F88ga9tp86ufdqmcl2ic1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F88ga9tp86ufdqmcl2ic1.png" alt=" " width="799" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftue5fho2dxn29xv6hzvx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftue5fho2dxn29xv6hzvx.png" alt=" " width="800" height="429"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Navigate to the default website directory&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\inetpub\wwwroot&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Backup the default page&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Rename-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;\iisstart.htm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;\iisstart.htm.bak&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Create a custom test page&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="sh"&gt;@"
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;L1 Lab - Test Application&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;L1 Support Lab - Application Running&amp;lt;/h1&amp;gt;
    &amp;lt;p&amp;gt;Server: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;&amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;Time: &amp;lt;span id="time"&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;Status: &amp;lt;span style="color:green;"&amp;gt;HEALTHY&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;
    &amp;lt;script&amp;gt;
        document.getElementById('time').textContent = new Date().toISOString();
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
"@&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Out-File&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilePath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;\index.html&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Encoding&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;UTF8&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5. Verify — Open a browser and navigate to your EC2 Public IP:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;http://&amp;lt;your-ec2-public-ip&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see your test page. ✅&lt;/p&gt;




&lt;h3&gt;
  
  
  🔥 Troubleshooting Exercises
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F927g2uk2uxzy1kuphp8r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F927g2uk2uxzy1kuphp8r.png" alt=" " width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fava6dfkrp87e9wr9hvkz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fava6dfkrp87e9wr9hvkz.png" alt=" " width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdlajape0t05csqaldnb4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdlajape0t05csqaldnb4.png" alt=" " width="799" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exercise A: Simulate "Website Down" (IIS Stopped)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Stop IIS&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Stop-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;W3SVC&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Now try accessing the website in browser — it fails!&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# This simulates a P1 incident: "Website is down"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# How to diagnose:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;W3SVC&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c"&gt;# Shows "Stopped"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# How to fix:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Start-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;W3SVC&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Verify:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Invoke-WebRequest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Uri&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;http://localhost&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-UseBasicParsing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StatusCode&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Exercise B: Simulate "Port Blocked"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F08ddq4f9kjv6nwx4gqqm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F08ddq4f9kjv6nwx4gqqm.png" alt=" " width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flyfedhm1uatwxh3ahb02.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flyfedhm1uatwxh3ahb02.png" alt=" " width="799" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn2o63evpaaa12ssmib49.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn2o63evpaaa12ssmib49.png" alt=" " width="799" height="424"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Block port 80 in Windows Firewall&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;New-NetFirewallRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DisplayName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Block HTTP"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Direction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Inbound&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LocalPort&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;80&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Protocol&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TCP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Action&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Block&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Website now unreachable from outside, but IIS is running!&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# This simulates: "IIS is running but website not accessible"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Diagnose:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetFirewallRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DisplayName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Block HTTP"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Fix:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Remove-NetFirewallRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DisplayName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Block HTTP"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Exercise C: Check Event Viewer for Errors&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2r8gnp8lule45wlbr35l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2r8gnp8lule45wlbr35l.png" alt=" " width="800" height="428"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# View recent IIS-related events&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-EventLog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;System&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"IIS*"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Newest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;10&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# View application errors&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-EventLog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Application&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-EntryType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Error&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Newest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;20&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# This is how you find error evidence for incident reports&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Lab 2: Linux Server + Log Analysis (Core L1 Skill)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Objective
&lt;/h3&gt;

&lt;p&gt;Launch a Linux EC2, practice essential commands, analyze logs, and simulate issues.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step-by-Step
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqihp42h0et3no8npn05h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqihp42h0et3no8npn05h.png" alt=" " width="799" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx3ln4w9tdj2whwmib3gh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx3ln4w9tdj2whwmib3gh.png" alt=" " width="799" height="322"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F46r40liugf62l4c1ls3t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F46r40liugf62l4c1ls3t.png" alt=" " width="799" height="303"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu5gh4f38km2m7c4pdh17.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu5gh4f38km2m7c4pdh17.png" alt=" " width="800" height="322"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Launch a Linux EC2 Instance&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AWS Console → EC2 → Launch Instance

Name:              L1-Lab-Linux
AMI:               Amazon Linux 2023
Instance type:     t3.micro (save your t3.medium for IIS)
Key pair:          Use same "l1-lab-key"
Security Group:    Allow SSH (port 22) from My IP

Click "Launch Instance"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Connect via SSH&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;From your local terminal (or use EC2 Instance Connect in the browser):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# If using terminal (convert .pem permissions first on Linux/Mac)&lt;/span&gt;
ssh &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"l1-lab-key.pem"&lt;/span&gt; ec2-user@&amp;lt;your-linux-public-ip&amp;gt;

&lt;span class="c"&gt;# Or: AWS Console → Select Instance → Connect → EC2 Instance Connect → Connect&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Essential L1 Commands — Practice Each One&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgygc7v67hsf0rofnaul8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgygc7v67hsf0rofnaul8.png" alt=" " width="800" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8je9t8gy0nbbefv3iile.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8je9t8gy0nbbefv3iile.png" alt=" " width="799" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhip69vz9798ilxbg89lo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhip69vz9798ilxbg89lo.png" alt=" " width="799" height="159"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm068m0zbzlw5dw51n7c8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm068m0zbzlw5dw51n7c8.png" alt=" " width="683" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzb8b83s7u2mwjmodc6zw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzb8b83s7u2mwjmodc6zw.png" alt=" " width="649" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftpmle0bv25xck7szs8uz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftpmle0bv25xck7szs8uz.png" alt=" " width="799" height="292"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd4lb30ptkaza4aqziocx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd4lb30ptkaza4aqziocx.png" alt=" " width="799" height="157"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5x5mu1n2cgal64i6r8c6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5x5mu1n2cgal64i6r8c6.png" alt=" " width="799" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmczbxdx4lijbk5vq0er0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmczbxdx4lijbk5vq0er0.png" alt=" " width="800" height="53"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmkyuy2ujoin5fv53c5dt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmkyuy2ujoin5fv53c5dt.png" alt=" " width="798" height="126"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# ===== SYSTEM INFORMATION =====&lt;/span&gt;

&lt;span class="c"&gt;# Check who you are&lt;/span&gt;
&lt;span class="nb"&gt;whoami&lt;/span&gt;

&lt;span class="c"&gt;# Check server hostname&lt;/span&gt;
&lt;span class="nb"&gt;hostname&lt;/span&gt;

&lt;span class="c"&gt;# Check OS version&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/os-release

&lt;span class="c"&gt;# Check uptime (how long server has been running)&lt;/span&gt;
&lt;span class="nb"&gt;uptime&lt;/span&gt;

&lt;span class="c"&gt;# ===== CPU &amp;amp; MEMORY =====&lt;/span&gt;

&lt;span class="c"&gt;# Check CPU usage (press 'q' to exit)&lt;/span&gt;
top

&lt;span class="c"&gt;# Check memory usage&lt;/span&gt;
free &lt;span class="nt"&gt;-m&lt;/span&gt;

&lt;span class="c"&gt;# Detailed memory info&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/meminfo | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-5&lt;/span&gt;

&lt;span class="c"&gt;# ===== DISK SPACE =====&lt;/span&gt;

&lt;span class="c"&gt;# Check disk usage (human-readable)&lt;/span&gt;
&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt;

&lt;span class="c"&gt;# Check which directories are using most space&lt;/span&gt;
&lt;span class="nb"&gt;du&lt;/span&gt; &lt;span class="nt"&gt;-sh&lt;/span&gt; /var/log/&lt;span class="k"&gt;*&lt;/span&gt;

&lt;span class="c"&gt;# ===== PROCESSES =====&lt;/span&gt;

&lt;span class="c"&gt;# List all running processes&lt;/span&gt;
ps aux

&lt;span class="c"&gt;# Find a specific process&lt;/span&gt;
ps aux | &lt;span class="nb"&gt;grep &lt;/span&gt;httpd

&lt;span class="c"&gt;# Count running processes&lt;/span&gt;
ps aux | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;

&lt;span class="c"&gt;# ===== NETWORK =====&lt;/span&gt;

&lt;span class="c"&gt;# Check network interfaces&lt;/span&gt;
ip addr show

&lt;span class="c"&gt;# Check open ports&lt;/span&gt;
ss &lt;span class="nt"&gt;-tlnp&lt;/span&gt;

&lt;span class="c"&gt;# Test if a remote service is reachable&lt;/span&gt;
curl &lt;span class="nt"&gt;-I&lt;/span&gt; http://google.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Log Analysis — The Core L1 Skill&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fidx2go8g0ieh0s0vohze.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fidx2go8g0ieh0s0vohze.png" alt=" " width="800" height="249"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fevml4nhkad8vjw1maw2a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fevml4nhkad8vjw1maw2a.png" alt=" " width="800" height="257"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6w20el14ib9cwemkeja8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6w20el14ib9cwemkeja8.png" alt=" " width="795" height="66"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fko4fk5k2rk23y5nhmys3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fko4fk5k2rk23y5nhmys3.png" alt=" " width="800" height="162"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# ===== VIEWING LOGS =====&lt;/span&gt;

&lt;span class="c"&gt;# View system logs&lt;/span&gt;
&lt;span class="nb"&gt;sudo cat&lt;/span&gt; /var/log/messages | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-50&lt;/span&gt;

&lt;span class="c"&gt;# Follow logs in real-time (CRITICAL L1 SKILL)&lt;/span&gt;
&lt;span class="nb"&gt;sudo tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/messages
&lt;span class="c"&gt;# (Press Ctrl+C to stop)&lt;/span&gt;

&lt;span class="c"&gt;# Search logs for errors&lt;/span&gt;
&lt;span class="nb"&gt;sudo grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"error"&lt;/span&gt; /var/log/messages

&lt;span class="c"&gt;# Search for specific timestamps&lt;/span&gt;
&lt;span class="nb"&gt;sudo grep&lt;/span&gt; &lt;span class="s2"&gt;"Aug 17"&lt;/span&gt; /var/log/messages

&lt;span class="c"&gt;# Count how many errors occurred&lt;/span&gt;
&lt;span class="nb"&gt;sudo grep&lt;/span&gt; &lt;span class="nt"&gt;-ic&lt;/span&gt; &lt;span class="s2"&gt;"error"&lt;/span&gt; /var/log/messages

&lt;span class="c"&gt;# ===== JOURNALCTL (systemd logs) =====&lt;/span&gt;

&lt;span class="c"&gt;# View recent logs&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;journalctl &lt;span class="nt"&gt;-n&lt;/span&gt; 50

&lt;span class="c"&gt;# View logs since a specific time&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;journalctl &lt;span class="nt"&gt;--since&lt;/span&gt; &lt;span class="s2"&gt;"1 hour ago"&lt;/span&gt;

&lt;span class="c"&gt;# View logs for a specific service&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; sshd &lt;span class="nt"&gt;-n&lt;/span&gt; 20

&lt;span class="c"&gt;# Follow logs live&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;journalctl &lt;span class="nt"&gt;-f&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5. Simulate and Analyze Errors&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0x2vvpfh7l41rap48n3a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0x2vvpfh7l41rap48n3a.png" alt=" " width="800" height="271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiy7l53mwlkulzw4ij068.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiy7l53mwlkulzw4ij068.png" alt=" " width="799" height="124"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fio10lezugtmhq1gu26za.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fio10lezugtmhq1gu26za.png" alt=" " width="800" height="144"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh3f9bxl2ulfn9bmgppzu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh3f9bxl2ulfn9bmgppzu.png" alt=" " width="784" height="149"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsa8rw7ryclhw4e9rlzbz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsa8rw7ryclhw4e9rlzbz.png" alt=" " width="798" height="195"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create a fake application log for practice&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'cat &amp;gt; /var/log/test-app.log &amp;lt;&amp;lt; EOF
2026-08-17 10:00:01 INFO  Application started successfully
2026-08-17 10:00:02 INFO  Database connection established
2026-08-17 10:05:15 WARN  Slow query detected: 3200ms on /api/users
2026-08-17 10:05:16 WARN  Connection pool usage at 85%
2026-08-17 10:10:30 ERROR Database connection timeout after 30000ms
2026-08-17 10:10:31 ERROR java.sql.SQLException: Cannot acquire connection from pool
2026-08-17 10:10:32 ERROR HTTP 500 returned for GET /api/users/123
2026-08-17 10:10:33 ERROR HTTP 500 returned for POST /api/orders
2026-08-17 10:10:34 WARN  Retry attempt 1 for database connection
2026-08-17 10:10:35 WARN  Retry attempt 2 for database connection
2026-08-17 10:10:36 ERROR All retry attempts exhausted. Service degraded.
2026-08-17 10:15:00 INFO  Database connection re-established
2026-08-17 10:15:01 INFO  Service recovered. All endpoints healthy.
EOF'&lt;/span&gt;

&lt;span class="c"&gt;# Now practice analysis:&lt;/span&gt;

&lt;span class="c"&gt;# Find all errors&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"ERROR"&lt;/span&gt; /var/log/test-app.log

&lt;span class="c"&gt;# Find when errors started&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"ERROR"&lt;/span&gt; /var/log/test-app.log | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt;

&lt;span class="c"&gt;# Find when service recovered&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"recovered"&lt;/span&gt; /var/log/test-app.log

&lt;span class="c"&gt;# Count errors vs warnings&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Errors: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'ERROR'&lt;/span&gt; /var/log/test-app.log&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Warnings: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'WARN'&lt;/span&gt; /var/log/test-app.log&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Find the root cause pattern&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"timeout|connection"&lt;/span&gt; /var/log/test-app.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;[!TIP]&lt;br&gt;
&lt;strong&gt;Practice narrating your findings out loud:&lt;/strong&gt;&lt;br&gt;
"Errors started at 10:10:30. The root cause appears to be database connection timeout. The connection pool was already at 85% utilization at 10:05. This caused HTTP 500 errors on multiple endpoints. Service auto-recovered at 10:15 after database connection was re-established."&lt;br&gt;
This is exactly how you'd communicate during a P1 bridge call.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Lab 3: AWS CloudWatch Monitoring (Monitoring Skill)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Objective
&lt;/h3&gt;

&lt;p&gt;Set up CloudWatch dashboards and alarms for your EC2 instances.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step-by-Step
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn1f2mgrchov3vj4fz3sc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn1f2mgrchov3vj4fz3sc.png" alt=" " width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftzfxq5lcxrsj15kk66qv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftzfxq5lcxrsj15kk66qv.png" alt=" " width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F41zdwoyqwswqw9lx3sqk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F41zdwoyqwswqw9lx3sqk.png" alt=" " width="799" height="309"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7cwm3ozsnvnqu1ahvukj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7cwm3ozsnvnqu1ahvukj.png" alt=" " width="800" height="324"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fddfsnq6icr6fgivbxbws.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fddfsnq6icr6fgivbxbws.png" alt=" " width="800" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. View Default EC2 Metrics&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AWS Console → CloudWatch → Metrics → All metrics

Click: EC2 → Per-Instance Metrics

Find your instances. Select:
  ✅ CPUUtilization
  ✅ NetworkIn
  ✅ NetworkOut
  ✅ StatusCheckFailed

Click "Graphed metrics" tab to see the charts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Create a CloudWatch Dashboard&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw4e73ni22jzvj6cufysr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw4e73ni22jzvj6cufysr.png" alt=" " width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffgvcpdu0j4axresewu6r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffgvcpdu0j4axresewu6r.png" alt=" " width="799" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0vso1va9xf2ogmjlwl2z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0vso1va9xf2ogmjlwl2z.png" alt=" " width="800" height="488"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4qkyr3kdn12qz7j9ikuc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4qkyr3kdn12qz7j9ikuc.png" alt=" " width="800" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5jrwb6wx8ets50h0ugb2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5jrwb6wx8ets50h0ugb2.png" alt=" " width="799" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F23tbxeflsfe90t6hpyz3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F23tbxeflsfe90t6hpyz3.png" alt=" " width="800" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe3c584wuehhvqexuf961.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe3c584wuehhvqexuf961.png" alt=" " width="800" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjhpj662i4ce0ffbexjxi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjhpj662i4ce0ffbexjxi.png" alt=" " width="800" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F76vzsjws34bscay8p4ky.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F76vzsjws34bscay8p4ky.png" alt=" " width="411" height="203"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CloudWatch → Dashboards → Create Dashboard

Name: "L1-Lab-Monitoring"

Add Widget → Line chart → Select:
  - EC2 &amp;gt; Per-Instance &amp;gt; CPUUtilization (for both instances)

Add Widget → Number → Select:
  - EC2 &amp;gt; Per-Instance &amp;gt; StatusCheckFailed

Add Widget → Line chart → Select:
  - EC2 &amp;gt; Per-Instance &amp;gt; NetworkIn + NetworkOut

Save Dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Create a CloudWatch Alarm (P1 Simulation)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5ntbrii9seeziafq9pji.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5ntbrii9seeziafq9pji.png" alt=" " width="800" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnynlvzgw3lyydpqbd1mf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnynlvzgw3lyydpqbd1mf.png" alt=" " width="799" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F76hbznig01ribarfu0tg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F76hbznig01ribarfu0tg.png" alt=" " width="800" height="297"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F61lq7irpgd773z2mn1kb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F61lq7irpgd773z2mn1kb.png" alt=" " width="800" height="317"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8rwwo3rzd7qjg1hmgk0w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8rwwo3rzd7qjg1hmgk0w.png" alt=" " width="799" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6ope9v1w69imb5ybivi7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6ope9v1w69imb5ybivi7.png" alt=" " width="799" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi865ogwb99j4hnowwuyk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi865ogwb99j4hnowwuyk.png" alt=" " width="800" height="275"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6yc0nzr8qsvrpwetlfr0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6yc0nzr8qsvrpwetlfr0.png" alt=" " width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F63ev20g3iz552445lce2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F63ev20g3iz552445lce2.png" alt=" " width="800" height="222"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CloudWatch → Alarms → Create Alarm

Select Metric: EC2 → Per-Instance → CPUUtilization
Select your Windows IIS instance

Conditions:
  Threshold type: Static
  Greater than: 80
  Period: 1 minute
  Datapoints: 1 out of 1

Notification:
  Create new SNS topic: "L1-Lab-Alerts"
  Email: your-email@example.com

Alarm name: "High-CPU-IIS-Server"
Description: "CPU above 80% on IIS production server"

Create Alarm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Trigger the Alarm (Simulate High CPU)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F337dy930e6w57wox4max.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F337dy930e6w57wox4max.png" alt=" " width="799" height="273"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fobycghxacdq8bqhkwmrc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fobycghxacdq8bqhkwmrc.png" alt=" " width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyt7u7dkrejw9gh9pxlbe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyt7u7dkrejw9gh9pxlbe.png" alt=" " width="799" height="306"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkync4c18hxpgal9ei5cq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkync4c18hxpgal9ei5cq.png" alt=" " width="797" height="52"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8ciqh1cn9c9qeywq875n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8ciqh1cn9c9qeywq875n.png" alt=" " width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8hsvzpdb1491pp8rccq9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8hsvzpdb1491pp8rccq9.png" alt=" " width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjv8q7tl0bdv03k3moaas.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjv8q7tl0bdv03k3moaas.png" alt=" " width="800" height="688"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;RDP into your Windows Server and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Simulate CPU load (will spike CPU to ~100%)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Run this in PowerShell:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$cores&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-WmiObject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_Processor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;NumberOfLogicalProcessors&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nx"&gt;1..&lt;/span&gt;&lt;span class="nv"&gt;$cores&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Start-Job&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ScriptBlock&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-Date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddMinutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nx"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;Get-Date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-lt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;Sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12345&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Out-Null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Watch CPU spike in Task Manager&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Check CloudWatch — the alarm should trigger within 2-3 minutes&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Stop the load after testing:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Job&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stop-Job&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nx"&gt;Get-Job&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Remove-Job&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5. Check the Alarm&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CloudWatch → Alarms → "High-CPU-IIS-Server"

State should change: OK → In alarm

This is exactly what happens in production.
You'd see this alarm, investigate CPU usage, and open an incident.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;[!NOTE]&lt;br&gt;
In real-world L1 support, you'd receive this alarm via email/Slack/PagerDuty, investigate the cause (runaway process? traffic spike? deployment?), and either fix it or escalate.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Lab 4: REST API Troubleshooting with Postman + curl
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Objective
&lt;/h3&gt;

&lt;p&gt;Test APIs, understand HTTP status codes, and diagnose API failures.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step-by-Step (No EC2 needed — use your local machine)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Install Postman&lt;/strong&gt;&lt;br&gt;
Download from: &lt;a href="https://www.postman.com/downloads/" rel="noopener noreferrer"&gt;https://www.postman.com/downloads/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Test a Public API&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Method: GET
URL: https://jsonplaceholder.typicode.com/posts/1

Click Send

Expected:
  Status: 200 OK
  Body: JSON with a post object (userId, id, title, body)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Test Different Status Codes&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;# 200 - Success
GET https://jsonplaceholder.typicode.com/posts/1

# 404 - Not Found
GET https://jsonplaceholder.typicode.com/posts/99999

# Test another API for different codes:
GET https://httpstat.us/200    → Returns 200
GET https://httpstat.us/401    → Returns 401 Unauthorized
GET https://httpstat.us/403    → Returns 403 Forbidden
GET https://httpstat.us/500    → Returns 500 Internal Server Error
GET https://httpstat.us/502    → Returns 502 Bad Gateway
GET https://httpstat.us/503    → Returns 503 Service Unavailable
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Test POST Request&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;Method:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;POST&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;URL:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;https://jsonplaceholder.typicode.com/posts&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Headers:&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;Content-Type:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;application/json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Body&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(raw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;JSON):&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Test from L1 Lab"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"body"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Testing API creation"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"userId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;Click&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Send&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;Expected:&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;Status:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Created&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;Body:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;JSON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;id:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5. Using curl from Command Line&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# GET request&lt;/span&gt;
curl &lt;span class="nt"&gt;-v&lt;/span&gt; https://jsonplaceholder.typicode.com/posts/1

&lt;span class="c"&gt;# POST request&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://jsonplaceholder.typicode.com/posts &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"title":"Test","body":"Testing","userId":1}'&lt;/span&gt;

&lt;span class="c"&gt;# Check only status code&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"%{http_code}"&lt;/span&gt; https://jsonplaceholder.typicode.com/posts/1

&lt;span class="c"&gt;# Check response headers&lt;/span&gt;
curl &lt;span class="nt"&gt;-I&lt;/span&gt; https://jsonplaceholder.typicode.com/posts/1

&lt;span class="c"&gt;# Test timeout behavior (useful for troubleshooting)&lt;/span&gt;
curl &lt;span class="nt"&gt;--max-time&lt;/span&gt; 5 https://httpstat.us/200?sleep&lt;span class="o"&gt;=&lt;/span&gt;10000
&lt;span class="c"&gt;# This will timeout after 5 seconds — simulates API timeout&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;6. Practice Scenario: "Client reports API not working"&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client says: "The /users endpoint is returning errors"

Your investigation steps:

1. Test the endpoint:
   GET https://jsonplaceholder.typicode.com/users

2. Check status code — is it 200, 401, 500, 503?

3. Check response time — Headers tab in Postman shows duration

4. Check response body — any error messages?

5. Test with different parameters:
   GET https://jsonplaceholder.typicode.com/users/1
   GET https://jsonplaceholder.typicode.com/users?email=Sincere@april.biz

6. Document your findings:
   "Tested /users endpoint at 14:30 UTC. 
    Status: 200 OK. 
    Response time: 245ms. 
    Data returned correctly for all test cases.
    Unable to reproduce client's issue.
    Requesting client to share:
    - Exact URL they're hitting
    - Request headers (especially Authorization)
    - Screenshot of the error
    - Browser/client they're using"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Lab 5: Writing an Incident Report + RCA
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Objective
&lt;/h3&gt;

&lt;p&gt;Practice writing a real incident report from the issues you simulated.&lt;/p&gt;

&lt;h3&gt;
  
  
  Template
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Incident Report&lt;/span&gt;

&lt;span class="gs"&gt;**Incident ID:**&lt;/span&gt; INC-2026-0817-001
&lt;span class="gs"&gt;**Priority:**&lt;/span&gt; P2 - High
&lt;span class="gs"&gt;**Status:**&lt;/span&gt; Resolved

&lt;span class="gu"&gt;## Summary&lt;/span&gt;
IIS web server on production EC2 instance became unreachable 
at 10:10 UTC on August 17, 2026. Root cause identified as 
IIS service failure. Service restored at 10:25 UTC.
Total downtime: 15 minutes.

&lt;span class="gu"&gt;## Timeline&lt;/span&gt;
| Time (UTC) | Event |
|------------|-------|
| 10:10 | CloudWatch alarm triggered: StatusCheckFailed |
| 10:12 | L1 engineer acknowledged the incident |
| 10:13 | Client notification sent: "Investigating reported downtime" |
| 10:15 | RDP to server confirmed IIS service stopped |
| 10:16 | Event Viewer checked — unexpected service termination logged |
| 10:18 | IIS service restarted |
| 10:20 | Website verified accessible |
| 10:22 | CloudWatch alarm returned to OK state |
| 10:25 | Client notified: "Service restored, monitoring for stability" |

&lt;span class="gu"&gt;## Root Cause&lt;/span&gt;
The IIS (W3SVC) service stopped unexpectedly due to [cause].
Event Viewer logs showed [specific error details].

&lt;span class="gu"&gt;## Impact&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; All users accessing the web application were affected
&lt;span class="p"&gt;-&lt;/span&gt; Duration: 15 minutes
&lt;span class="p"&gt;-&lt;/span&gt; No data loss occurred

&lt;span class="gu"&gt;## Resolution&lt;/span&gt;
IIS service was restarted manually via PowerShell:
&lt;span class="sb"&gt;`Start-Service W3SVC`&lt;/span&gt;

&lt;span class="gu"&gt;## Preventive Measures&lt;/span&gt;
&lt;span class="p"&gt;1.&lt;/span&gt; Configure IIS service auto-recovery (restart on failure)
&lt;span class="p"&gt;2.&lt;/span&gt; Add CloudWatch alarm for W3SVC service status
&lt;span class="p"&gt;3.&lt;/span&gt; Investigate root cause of service termination
&lt;span class="p"&gt;4.&lt;/span&gt; Add automated health check endpoint monitoring

&lt;span class="gu"&gt;## Lessons Learned&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Need automated service recovery configuration
&lt;span class="p"&gt;-&lt;/span&gt; CloudWatch alarm detected issue 2 minutes before client report
&lt;span class="p"&gt;-&lt;/span&gt; Communication template was used effectively
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;[!TIP]&lt;br&gt;
Write at least 3 RCA reports using different scenarios from these labs. This is a frequently asked skill in L1 support interviews.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Lab Checklist — Track Your Progress
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Lab&lt;/th&gt;
&lt;th&gt;Skill&lt;/th&gt;
&lt;th&gt;Done?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Windows EC2 + IIS&lt;/td&gt;
&lt;td&gt;Server management, IIS administration&lt;/td&gt;
&lt;td&gt;☐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Linux EC2 + Logs&lt;/td&gt;
&lt;td&gt;CLI commands, log analysis&lt;/td&gt;
&lt;td&gt;☐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;CloudWatch Monitoring&lt;/td&gt;
&lt;td&gt;Metrics, dashboards, alarms&lt;/td&gt;
&lt;td&gt;☐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Postman + curl&lt;/td&gt;
&lt;td&gt;API testing, status codes&lt;/td&gt;
&lt;td&gt;☐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Incident Report + RCA&lt;/td&gt;
&lt;td&gt;Documentation, communication&lt;/td&gt;
&lt;td&gt;☐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Quick Reference: Key Commands
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Windows (PowerShell)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;W3SVC&lt;/span&gt;&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="c"&gt;# Check IIS status&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Start-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;W3SVC&lt;/span&gt;&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="c"&gt;# Start IIS&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Stop-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;W3SVC&lt;/span&gt;&lt;span class="w"&gt;                   &lt;/span&gt;&lt;span class="c"&gt;# Stop IIS&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Restart-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;W3SVC&lt;/span&gt;&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="c"&gt;# Restart IIS&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-EventLog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;System&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Newest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;20&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c"&gt;# Recent system events&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Process&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CPU&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Desc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-First&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;10&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c"&gt;# Top CPU processes&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Test-NetConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;google.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;443&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c"&gt;# Test network connectivity&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Linux (Bash)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;top                    &lt;span class="c"&gt;# CPU/Memory usage (live)&lt;/span&gt;
free &lt;span class="nt"&gt;-m&lt;/span&gt;                &lt;span class="c"&gt;# Memory usage&lt;/span&gt;
&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt;                  &lt;span class="c"&gt;# Disk space&lt;/span&gt;
ps aux                 &lt;span class="c"&gt;# Running processes&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/messages   &lt;span class="c"&gt;# Follow logs&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"ERROR"&lt;/span&gt; logfile   &lt;span class="c"&gt;# Search for errors&lt;/span&gt;
journalctl &lt;span class="nt"&gt;-f&lt;/span&gt;          &lt;span class="c"&gt;# Follow system logs&lt;/span&gt;
ss &lt;span class="nt"&gt;-tlnp&lt;/span&gt;               &lt;span class="c"&gt;# Open ports&lt;/span&gt;
curl &lt;span class="nt"&gt;-I&lt;/span&gt; url            &lt;span class="c"&gt;# Check HTTP response&lt;/span&gt;
systemctl status httpd &lt;span class="c"&gt;# Check service status&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  AWS CLI (Bonus)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Describe your instances&lt;/span&gt;
aws ec2 describe-instances &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'Reservations[*].Instances[*].[InstanceId,State.Name,PublicIpAddress]'&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; table

&lt;span class="c"&gt;# Get CloudWatch CPU metric&lt;/span&gt;
aws cloudwatch get-metric-statistics &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--namespace&lt;/span&gt; AWS/EC2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--metric-name&lt;/span&gt; CPUUtilization &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--dimensions&lt;/span&gt; &lt;span class="nv"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;InstanceId,Value&lt;span class="o"&gt;=&lt;/span&gt;YOUR_INSTANCE_ID &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--start-time&lt;/span&gt; 2026-08-17T00:00:00Z &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--end-time&lt;/span&gt; 2026-08-17T23:59:59Z &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--period&lt;/span&gt; 300 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--statistics&lt;/span&gt; Average
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]&lt;br&gt;
&lt;strong&gt;Sandbox Time Management:&lt;/strong&gt; sandbox sessions expire. Prioritize:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Lab 1 (IIS) — takes ~30 min&lt;/li&gt;
&lt;li&gt;Lab 2 (Linux) — takes ~20 min
&lt;/li&gt;
&lt;li&gt;Lab 3 (CloudWatch) — takes ~15 min&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Labs 4 and 5 don't need the sandbox. Do them on your local machine anytime.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>cloud</category>
      <category>devops</category>
      <category>webapp</category>
      <category>database</category>
    </item>
    <item>
      <title>The L1 Support Engineer Nobody Talks About (But Every Company Desperately Needs)</title>
      <dc:creator>Yashvi Kothari</dc:creator>
      <pubDate>Mon, 17 Aug 2026 08:52:29 +0000</pubDate>
      <link>https://dev.to/yashvikothari/the-l1-support-engineer-nobody-talks-about-but-every-company-desperately-needs-203o</link>
      <guid>https://dev.to/yashvikothari/the-l1-support-engineer-nobody-talks-about-but-every-company-desperately-needs-203o</guid>
      <description>&lt;h1&gt;
  
  
  The L1 Support Engineer Nobody Talks About (But Every Company Desperately Needs)
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;How to become the person who keeps the internet running at 3 AM — and why that's a career superpower.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Here's a truth most tech influencers won't tell you:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fastest path into tech isn't learning to code. It's learning to troubleshoot.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;While thousands of people are grinding LeetCode, a quieter army of L1 Support Engineers is keeping production systems alive for millions of users. They're the first responders of the digital world. No glory. No fanfare. Just a Slack notification at 2 AM and a client in London who can't access their dashboard.&lt;/p&gt;

&lt;p&gt;And here's the kicker — the best ones get promoted faster than most junior developers.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is an L1 Support Engineer, Really?
&lt;/h2&gt;

&lt;p&gt;Strip away the jargon. An L1 Support Engineer is a &lt;strong&gt;technical detective with a customer-service heart.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You're not writing the code. You're figuring out &lt;em&gt;why the code broke&lt;/em&gt;. You're the person who:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reads the error log when everyone else panics&lt;/li&gt;
&lt;li&gt;Asks the right questions when the client says "everything is down"&lt;/li&gt;
&lt;li&gt;Knows the difference between "the server is slow" and "the database connection pool is exhausted"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Naval would say: &lt;em&gt;"An L1 engineer is leveraged. One person, monitoring systems that serve thousands."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ogilvy would say: &lt;em&gt;"The consumer isn't a moron. She's your client. Treat her with respect, even at 3 AM."&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The 7 Skills That Separate Good L1 Engineers From Great Ones
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. You Understand the Stack (Even If You Didn't Build It)
&lt;/h3&gt;

&lt;p&gt;You don't need to build a web application. You need to understand how one works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client (Browser) → DNS → Load Balancer → Web Server (IIS/Nginx) → Application → Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When a client says "the app is broken," a great L1 engineer mentally walks this chain. Where did it break?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practical Step:&lt;/strong&gt; Set up a Windows Server on AWS with IIS. Deploy a simple web app. Break it intentionally. Fix it. That's the entire training.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. You Can Read Logs Like a Detective Reads Crime Scenes
&lt;/h3&gt;

&lt;p&gt;Logs are your evidence. Every error tells a story.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;[2026-08-17 03:14:22 ERROR] System.Data.SqlClient.SqlException: 
Timeout expired. The timeout period elapsed prior to completion 
of the operation or the server is not responding.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A junior reads this and says: "Database error."&lt;br&gt;
A great L1 reads this and says: "The database query is timing out — could be a long-running query, connection pool exhaustion, or the DB server itself is under load. Let me check CloudWatch metrics for the RDS instance."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practical Step:&lt;/strong&gt; SSH into a Linux server. Run &lt;code&gt;tail -f /var/log/syslog&lt;/code&gt;. Break something. Watch the logs scream. Learn to hear what they're saying.&lt;/p&gt;


&lt;h3&gt;
  
  
  3. You Speak REST API
&lt;/h3&gt;

&lt;p&gt;Every modern application talks in APIs. You need to understand the conversation.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;Retrieve data&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /api/users/123&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;Create data&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST /api/orders&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PUT&lt;/td&gt;
&lt;td&gt;Update data&lt;/td&gt;
&lt;td&gt;&lt;code&gt;PUT /api/users/123&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DELETE&lt;/td&gt;
&lt;td&gt;Remove data&lt;/td&gt;
&lt;td&gt;&lt;code&gt;DELETE /api/orders/456&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Status codes are your vocabulary:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;200&lt;/code&gt; — All good&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;401&lt;/code&gt; — Authentication failed (wrong credentials)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;403&lt;/code&gt; — Forbidden (right credentials, wrong permissions)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;404&lt;/code&gt; — Resource not found&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;500&lt;/code&gt; — Server broke internally&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;502&lt;/code&gt; — Bad Gateway (upstream server failed)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;503&lt;/code&gt; — Service unavailable (server overloaded or down)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Practical Step:&lt;/strong&gt; Open Postman. Hit a public API like &lt;code&gt;https://jsonplaceholder.typicode.com/posts&lt;/code&gt;. Change the endpoint to something that doesn't exist. Observe the status codes. Now you speak the language.&lt;/p&gt;


&lt;h3&gt;
  
  
  4. You Know Enough SQL to Be Dangerous (In a Good Way)
&lt;/h3&gt;

&lt;p&gt;You're not writing stored procedures. You're running SELECT queries to verify data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Check if a user exists&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Users&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;Email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'client@example.com'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Check recent orders&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;TOP&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Orders&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;CreatedDate&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Check for failed transactions in the last hour&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Transactions&lt;/span&gt; 
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;Status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'FAILED'&lt;/span&gt; 
&lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;CreatedDate&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;DATEADD&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HOUR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;GETDATE&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Practical Step:&lt;/strong&gt; Install SQL Server Management Studio (SSMS). Connect to a local or cloud database. Write 10 SELECT queries. You'll use these daily.&lt;/p&gt;




&lt;h3&gt;
  
  
  5. You Understand Environments (And Never Confuse Them)
&lt;/h3&gt;

&lt;p&gt;This is where careers are saved or destroyed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Development → QA/Testing → UAT (User Acceptance) → Staging → Production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The golden rule:&lt;/strong&gt; You NEVER make changes directly in Production. Ever.&lt;/p&gt;

&lt;p&gt;Each environment has its own:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Server/URL&lt;/li&gt;
&lt;li&gt;Database&lt;/li&gt;
&lt;li&gt;Configuration&lt;/li&gt;
&lt;li&gt;Access controls&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;A real-world scenario:&lt;/strong&gt; Client reports a bug. You reproduce it in UAT. You confirm it exists in Production. You do NOT fix it in Production. You log it, escalate it, and the fix flows through the pipeline.&lt;/p&gt;




&lt;h3&gt;
  
  
  6. You Master the Incident Priority Matrix
&lt;/h3&gt;

&lt;p&gt;Not all fires are equal. Knowing which fire to fight first is the job.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;SLA Response&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;P1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Critical — System down, all users affected&lt;/td&gt;
&lt;td&gt;Production app completely inaccessible&lt;/td&gt;
&lt;td&gt;15 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;P2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High — Major feature broken, many users affected&lt;/td&gt;
&lt;td&gt;Payment processing failing&lt;/td&gt;
&lt;td&gt;30 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;P3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Medium — Feature degraded, workaround exists&lt;/td&gt;
&lt;td&gt;Reports loading slowly&lt;/td&gt;
&lt;td&gt;4 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;P4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low — Minor issue, cosmetic or enhancement&lt;/td&gt;
&lt;td&gt;Button color wrong on one page&lt;/td&gt;
&lt;td&gt;24 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The communication framework during a P1:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Acknowledge → "We are aware of the issue and investigating."
2. Update (every 15-30 min) → "Root cause identified. The team is working on a fix."
3. Resolution → "The issue has been resolved. Services are restored."
4. RCA (within 24-48h) → "Root Cause Analysis report with preventive measures."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Practical Step:&lt;/strong&gt; Write a mock RCA report. Take a real-world outage (AWS, Azure, any public postmortem) and rewrite their RCA in your own words. This is how you build the muscle.&lt;/p&gt;




&lt;h3&gt;
  
  
  7. You Monitor Before Things Break
&lt;/h3&gt;

&lt;p&gt;The best L1 engineers don't wait for the phone to ring. They watch the dashboards.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key metrics to watch:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CPU utilization&lt;/strong&gt; — above 80% for sustained periods = trouble&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory usage&lt;/strong&gt; — if it keeps climbing without dropping, you have a memory leak&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disk space&lt;/strong&gt; — databases and logs eat disk space silently&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Response time&lt;/strong&gt; — if your API goes from 200ms to 2000ms, something changed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error rate&lt;/strong&gt; — a sudden spike in 5xx errors means something broke&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Active connections&lt;/strong&gt; — connection pool exhaustion kills apps quietly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tools of the trade:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS CloudWatch (if you're on AWS)&lt;/li&gt;
&lt;li&gt;Azure Monitor / Application Insights (if you're on Azure)&lt;/li&gt;
&lt;li&gt;Grafana + Prometheus (open-source, powerful)&lt;/li&gt;
&lt;li&gt;New Relic / ELK Stack (enterprise-grade observability)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Career Path Nobody Draws For You
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;L1 Support Engineer
    ↓
L2 Support Engineer (deeper troubleshooting, some scripting)
    ↓
    ├── DevOps Engineer (automation, CI/CD, infrastructure)
    ├── Cloud Engineer (AWS/Azure architecture)
    ├── SRE (Site Reliability Engineering)
    └── Solutions Architect (client-facing technical leadership)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every great SRE I know started in support. Every great DevOps engineer I know started by reading logs at midnight. The path is real. The opportunity is real.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Mindset Shift
&lt;/h2&gt;

&lt;p&gt;Most people see L1 Support as a stepping stone. Something to survive.&lt;/p&gt;

&lt;p&gt;The best engineers see it as a &lt;strong&gt;training ground&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;You're learning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How production systems actually behave (not how textbooks say they should)&lt;/li&gt;
&lt;li&gt;How to communicate under pressure (a skill worth more than any certification)&lt;/li&gt;
&lt;li&gt;How to think systematically when everything is on fire&lt;/li&gt;
&lt;li&gt;How to own a problem from first ring to final resolution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Naval's principle applies perfectly here: &lt;strong&gt;"Specific knowledge is knowledge you cannot be trained for. It's found by pursuing your genuine curiosity."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An L1 Support role, done right, gives you the most specific knowledge in tech — how real systems fail, and how real teams fix them.&lt;/p&gt;




&lt;h2&gt;
  
  
  Your 30-Day Action Plan
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Week&lt;/th&gt;
&lt;th&gt;Focus&lt;/th&gt;
&lt;th&gt;Actions&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Week 1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Foundation&lt;/td&gt;
&lt;td&gt;Set up AWS EC2 (Windows + Linux), install IIS, deploy a test app, learn basic CLI commands&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Week 2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Monitoring &amp;amp; Logs&lt;/td&gt;
&lt;td&gt;Set up CloudWatch dashboards, practice log analysis, learn to read error patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Week 3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;APIs &amp;amp; Database&lt;/td&gt;
&lt;td&gt;Use Postman to test APIs, write 20+ SQL queries, understand connection strings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Week 4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Incident Management&lt;/td&gt;
&lt;td&gt;Write 3 mock RCA reports, practice client communication templates, simulate P1 response&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;The world doesn't need more people who can write "Hello World."&lt;/p&gt;

&lt;p&gt;The world needs people who can figure out why "Hello World" stopped working at 3 AM, fix it, and explain what happened to a client in London who just lost $10,000 per minute of downtime.&lt;/p&gt;

&lt;p&gt;That person is an L1 Support Engineer.&lt;/p&gt;

&lt;p&gt;That person might be you.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If this helped you, share it with someone who's trying to break into tech. The support path is underrated, undershared, and wildly effective.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>debugging</category>
      <category>cloud</category>
      <category>devops</category>
      <category>application</category>
    </item>
    <item>
      <title>How to Think Like a System Administrator: The Practical Interview Playbook</title>
      <dc:creator>Yashvi Kothari</dc:creator>
      <pubDate>Wed, 12 Aug 2026 11:33:27 +0000</pubDate>
      <link>https://dev.to/yashvikothari/how-to-think-like-a-system-administrator-the-practical-interview-playbook-2ppc</link>
      <guid>https://dev.to/yashvikothari/how-to-think-like-a-system-administrator-the-practical-interview-playbook-2ppc</guid>
      <description>&lt;p&gt;At 11:00 PM, the phone rings.&lt;/p&gt;

&lt;p&gt;A client says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“The website is down.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is where a junior administrator starts guessing.&lt;/p&gt;

&lt;p&gt;A strong system administrator starts asking questions.&lt;/p&gt;

&lt;p&gt;Is the server reachable?&lt;/p&gt;

&lt;p&gt;Is the web server running?&lt;/p&gt;

&lt;p&gt;Is PHP-FPM healthy?&lt;/p&gt;

&lt;p&gt;Is the database responding?&lt;/p&gt;

&lt;p&gt;Is the disk full?&lt;/p&gt;

&lt;p&gt;Did someone deploy something 10 minutes ago?&lt;/p&gt;

&lt;p&gt;Are there errors in the logs?&lt;/p&gt;

&lt;p&gt;The difference between a beginner and an experienced SysAdmin isn't how many commands they memorized.&lt;/p&gt;

&lt;p&gt;It's how systematically they think when something breaks.&lt;/p&gt;

&lt;h2&gt;
  
  
  The SysAdmin Mental Model
&lt;/h2&gt;

&lt;p&gt;Almost every production incident can be approached with the same pattern:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verify → Isolate → Inspect → Fix → Verify → Prevent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don't restart everything.&lt;/p&gt;

&lt;p&gt;Don't randomly change configuration.&lt;/p&gt;

&lt;p&gt;Don't immediately blame the application.&lt;/p&gt;

&lt;p&gt;Find the failure.&lt;/p&gt;

&lt;p&gt;Then fix the failure.&lt;/p&gt;




&lt;h2&gt;
  
  
  Scenario #1: The Website Is Down
&lt;/h2&gt;

&lt;p&gt;Imagine a production website stops responding at 11 PM.&lt;/p&gt;

&lt;p&gt;Your first step isn't:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your first step is verification.&lt;/p&gt;

&lt;p&gt;Try:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-I&lt;/span&gt; https://example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check connectivity:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ping SERVER_IP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then connect to the server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh user@SERVER_IP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check the basic health:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;uptime
&lt;/span&gt;free &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt;
top
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now inspect the web server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl status nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you're using Apache:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl status apache2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then check logs.&lt;/p&gt;

&lt;p&gt;For Nginx:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-50&lt;/span&gt; /var/log/nginx/error.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For PHP-FPM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-50&lt;/span&gt; /var/log/php8.2-fpm.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the site returns &lt;strong&gt;502 Bad Gateway&lt;/strong&gt;, investigate the upstream service.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl status php8.2-fpm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then check the database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl status mysql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And finally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because a surprisingly large number of “application problems” are actually &lt;strong&gt;disk-full problems&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The interview answer
&lt;/h3&gt;

&lt;p&gt;Don't simply say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I would restart Nginx.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“First I would verify the outage and determine whether it's isolated to one website or affects the entire server. Then I'd check server resources, web-server status, application services, database connectivity and logs. I would identify the root cause before making changes, verify the fix, and document the incident.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That sounds like an administrator.&lt;/p&gt;




&lt;h1&gt;
  
  
  Scenario #2: The Server Is Slow
&lt;/h1&gt;

&lt;p&gt;“It's slow” is not a diagnosis.&lt;/p&gt;

&lt;p&gt;It's a symptom.&lt;/p&gt;

&lt;p&gt;Start with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;uptime
&lt;/span&gt;free &lt;span class="nt"&gt;-h&lt;/span&gt;
htop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check CPU:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ps aux &lt;span class="nt"&gt;--sort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;-%cpu | &lt;span class="nb"&gt;head&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check memory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ps aux &lt;span class="nt"&gt;--sort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;-%mem | &lt;span class="nb"&gt;head&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check disk I/O:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;iostat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then investigate the web server.&lt;/p&gt;

&lt;p&gt;How much traffic are you receiving?&lt;/p&gt;

&lt;p&gt;Which IPs are generating the most requests?&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $1}'&lt;/span&gt; /var/log/nginx/access.log | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then investigate the database.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SHOW&lt;/span&gt; &lt;span class="n"&gt;PROCESSLIST&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A slow website might actually be:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nginx → PHP-FPM → MySQL → slow query&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Restarting Nginx won't fix that.&lt;/p&gt;

&lt;p&gt;This is why troubleshooting must follow the request path.&lt;/p&gt;




&lt;h1&gt;
  
  
  Scenario #3: SSL Certificate Expired
&lt;/h1&gt;

&lt;p&gt;Users see:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Your connection is not private.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Check the certificate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; | openssl s_client &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-connect&lt;/span&gt; example.com:443 2&amp;gt;/dev/null &lt;span class="se"&gt;\&lt;/span&gt;
| openssl x509 &lt;span class="nt"&gt;-noout&lt;/span&gt; &lt;span class="nt"&gt;-dates&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Let's Encrypt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;certbot renew &lt;span class="nt"&gt;--dry-run&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If renewal is required:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;certbot renew
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then validate Nginx before reloading:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nginx &lt;span class="nt"&gt;-t&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reload nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important interview point isn't knowing Certbot.&lt;/p&gt;

&lt;p&gt;It's knowing the sequence:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Identify → Renew → Validate → Reload → Verify → Automate&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And always test automatic renewal before assuming it works.&lt;/p&gt;




&lt;h1&gt;
  
  
  Scenario #4: Disk Is 95% Full
&lt;/h1&gt;

&lt;p&gt;This is where many administrators make dangerous mistakes.&lt;/p&gt;

&lt;p&gt;Don't immediately start deleting files.&lt;/p&gt;

&lt;p&gt;First identify the problem.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo du&lt;/span&gt; &lt;span class="nt"&gt;-sh&lt;/span&gt; /&lt;span class="k"&gt;*&lt;/span&gt; 2&amp;gt;/dev/null | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rh&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Drill deeper:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo du&lt;/span&gt; &lt;span class="nt"&gt;-sh&lt;/span&gt; /var/&lt;span class="k"&gt;*&lt;/span&gt; 2&amp;gt;/dev/null | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rh&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Common culprits include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nginx/Apache logs&lt;/li&gt;
&lt;li&gt;systemd journal logs&lt;/li&gt;
&lt;li&gt;database binary logs&lt;/li&gt;
&lt;li&gt;old backups&lt;/li&gt;
&lt;li&gt;temporary files&lt;/li&gt;
&lt;li&gt;application-generated files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clean safely.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt clean
&lt;span class="nb"&gt;sudo &lt;/span&gt;journalctl &lt;span class="nt"&gt;--vacuum-time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;7d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then investigate log rotation.&lt;/p&gt;

&lt;p&gt;The real solution isn't:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I deleted some files.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It's:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I identified the source of disk growth and implemented log rotation, backup retention and monitoring so the problem doesn't return.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the difference between &lt;strong&gt;incident response&lt;/strong&gt; and &lt;strong&gt;systems administration&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Scenario #5: Database Connection Errors
&lt;/h1&gt;

&lt;p&gt;Multiple websites suddenly report:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Cannot connect to database.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Start with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status mysql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check the logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo tail&lt;/span&gt; &lt;span class="nt"&gt;-50&lt;/span&gt; /var/log/mysql/error.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check disk:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check memory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;free &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look for OOM events:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dmesg | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"oom&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;killed process"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If MySQL is running but applications can't connect, investigate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;credentials&lt;/li&gt;
&lt;li&gt;database existence&lt;/li&gt;
&lt;li&gt;user permissions&lt;/li&gt;
&lt;li&gt;connection limits&lt;/li&gt;
&lt;li&gt;host restrictions&lt;/li&gt;
&lt;li&gt;application configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Test directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mysql &lt;span class="nt"&gt;-u&lt;/span&gt; appuser &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt; localhost database_name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SHOW&lt;/span&gt; &lt;span class="n"&gt;STATUS&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'Threads_connected'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SHOW&lt;/span&gt; &lt;span class="n"&gt;GRANTS&lt;/span&gt; &lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="s1"&gt;'appuser'&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="s1"&gt;'localhost'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Again, don't jump to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl restart mysql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Understand &lt;strong&gt;why&lt;/strong&gt; connections are failing.&lt;/p&gt;




&lt;h1&gt;
  
  
  Scenario #6: Migrating 15 Websites
&lt;/h1&gt;

&lt;p&gt;This is where planning matters more than commands.&lt;/p&gt;

&lt;p&gt;A migration should look something like:&lt;/p&gt;

&lt;h3&gt;
  
  
  Before migration
&lt;/h3&gt;

&lt;p&gt;Inventory:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;domains&lt;/li&gt;
&lt;li&gt;DNS records&lt;/li&gt;
&lt;li&gt;databases&lt;/li&gt;
&lt;li&gt;application versions&lt;/li&gt;
&lt;li&gt;PHP versions&lt;/li&gt;
&lt;li&gt;web-server configuration&lt;/li&gt;
&lt;li&gt;SSL certificates&lt;/li&gt;
&lt;li&gt;cron jobs&lt;/li&gt;
&lt;li&gt;firewall rules&lt;/li&gt;
&lt;li&gt;backups&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lower DNS TTL before migration.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;300 seconds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prepare the new server.&lt;/p&gt;

&lt;p&gt;Then perform an initial data synchronization.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rsync &lt;span class="nt"&gt;-avz&lt;/span&gt; /var/www/ user@NEW_SERVER:/var/www/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Import databases.&lt;/p&gt;

&lt;p&gt;Test websites against the new server before changing DNS.&lt;/p&gt;

&lt;p&gt;A useful technique is testing through the local hosts file.&lt;/p&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Final sync&lt;/li&gt;
&lt;li&gt;Final database migration&lt;/li&gt;
&lt;li&gt;DNS change&lt;/li&gt;
&lt;li&gt;Verify applications&lt;/li&gt;
&lt;li&gt;Monitor logs&lt;/li&gt;
&lt;li&gt;Keep the old server available as rollback&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The goal isn't simply:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Move the websites.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The goal is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Move the websites while minimizing risk and maintaining a rollback path.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Scenario #7: The Server Is Under Attack
&lt;/h1&gt;

&lt;p&gt;First determine what you're dealing with.&lt;/p&gt;

&lt;p&gt;Look at traffic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $1}'&lt;/span&gt; /var/log/nginx/access.log &lt;span class="se"&gt;\&lt;/span&gt;
| &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check connections:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ss &lt;span class="nt"&gt;-s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For HTTP connections:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ss &lt;span class="nt"&gt;-ant&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s1"&gt;':80'&lt;/span&gt; | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But remember:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not every traffic spike is a DDoS attack.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It could be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;legitimate traffic&lt;/li&gt;
&lt;li&gt;a broken client&lt;/li&gt;
&lt;li&gt;a crawler&lt;/li&gt;
&lt;li&gt;a brute-force attack&lt;/li&gt;
&lt;li&gt;an application bug&lt;/li&gt;
&lt;li&gt;a real DDoS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For application-layer attacks, rate limiting can help.&lt;/p&gt;

&lt;p&gt;For larger attacks, move protection upstream.&lt;/p&gt;

&lt;p&gt;A service such as Cloudflare can provide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WAF&lt;/li&gt;
&lt;li&gt;rate limiting&lt;/li&gt;
&lt;li&gt;bot protection&lt;/li&gt;
&lt;li&gt;DDoS mitigation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key interview answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I would identify the attack pattern first, apply the least disruptive mitigation available, involve the provider or upstream DDoS protection when necessary, and then implement permanent controls.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  The 10 Commands I Want Every SysAdmin to Know
&lt;/h1&gt;

&lt;p&gt;If you remember nothing else, remember these:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;uptime
&lt;/span&gt;free &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt;
htop
ss &lt;span class="nt"&gt;-tlnp&lt;/span&gt;
systemctl status nginx
journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; nginx
nginx &lt;span class="nt"&gt;-t&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/nginx/error.log
lsof &lt;span class="nt"&gt;-i&lt;/span&gt; :80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;They answer some of the most important questions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is the server healthy?&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;uptime
&lt;/span&gt;free &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What's consuming resources?&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;htop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What's listening?&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ss &lt;span class="nt"&gt;-tlnp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Is the service healthy?&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl status nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What went wrong?&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Is my configuration valid?&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nginx &lt;span class="nt"&gt;-t&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What's happening right now?&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/nginx/error.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What's using the port?&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lsof &lt;span class="nt"&gt;-i&lt;/span&gt; :80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  The Two-Week Interview Plan
&lt;/h1&gt;

&lt;p&gt;Don't spend two weeks just reading.&lt;/p&gt;

&lt;p&gt;Build.&lt;/p&gt;

&lt;h3&gt;
  
  
  Week 1
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Day 1:&lt;/strong&gt; Linux commands&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 2:&lt;/strong&gt; Users, permissions and SSH&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 3:&lt;/strong&gt; Apache&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 4:&lt;/strong&gt; Nginx&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 5:&lt;/strong&gt; DNS&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 6:&lt;/strong&gt; SSL&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 7:&lt;/strong&gt; PHP and PHP-FPM&lt;/p&gt;

&lt;h3&gt;
  
  
  Week 2
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Day 8:&lt;/strong&gt; MySQL/MariaDB&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 9:&lt;/strong&gt; Monitoring&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 10:&lt;/strong&gt; Firewall and security&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 11:&lt;/strong&gt; Backups and cron&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 12:&lt;/strong&gt; Docker&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 13:&lt;/strong&gt; Cloud and Git&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 14:&lt;/strong&gt; Scenario practice&lt;/p&gt;

&lt;p&gt;Every day:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1 hour theory&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2 hours hands-on&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1 hour interview practice&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And don't just read answers.&lt;/p&gt;

&lt;p&gt;Say them out loud.&lt;/p&gt;




&lt;h1&gt;
  
  
  Build Your Own Production-Like Lab
&lt;/h1&gt;

&lt;p&gt;A cheap Ubuntu VM is enough to learn the fundamentals.&lt;/p&gt;

&lt;p&gt;Install:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nginx&lt;/li&gt;
&lt;li&gt;PHP-FPM&lt;/li&gt;
&lt;li&gt;MySQL&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Git&lt;/li&gt;
&lt;li&gt;UFW&lt;/li&gt;
&lt;li&gt;Fail2ban&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then deliberately break things.&lt;/p&gt;

&lt;p&gt;Stop Nginx.&lt;/p&gt;

&lt;p&gt;Fill the disk.&lt;/p&gt;

&lt;p&gt;Break a configuration file.&lt;/p&gt;

&lt;p&gt;Stop PHP-FPM.&lt;/p&gt;

&lt;p&gt;Change a database password.&lt;/p&gt;

&lt;p&gt;Break DNS.&lt;/p&gt;

&lt;p&gt;Expire a certificate.&lt;/p&gt;

&lt;p&gt;Kill a process.&lt;/p&gt;

&lt;p&gt;Then recover.&lt;/p&gt;

&lt;p&gt;That is where real learning happens.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Golden Rule of Troubleshooting
&lt;/h1&gt;

&lt;p&gt;When something breaks:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't panic.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't guess.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't restart everything.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Verify → Isolate → Inspect → Fix → Verify → Prevent&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And remember five things interviewers want to hear:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Systematic thinking
&lt;/h3&gt;

&lt;p&gt;You investigate before changing things.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Security
&lt;/h3&gt;

&lt;p&gt;You don't use root unnecessarily.&lt;/p&gt;

&lt;p&gt;You don't expose databases publicly.&lt;/p&gt;

&lt;p&gt;You don't give developers root access.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Backups
&lt;/h3&gt;

&lt;p&gt;Before risky changes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Have a rollback plan.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Communication
&lt;/h3&gt;

&lt;p&gt;During incidents, stakeholders need updates.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Prevention
&lt;/h3&gt;

&lt;p&gt;Fixing today's problem isn't enough.&lt;/p&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“How do we make sure this doesn't happen again?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's what separates a command runner from a system administrator.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Interview Advice
&lt;/h1&gt;

&lt;p&gt;When asked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Tell me about your experience.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Don't give a list of technologies.&lt;/p&gt;

&lt;p&gt;Tell a story.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I know Linux, Nginx, MySQL, AWS and Docker.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I manage Linux-based servers and web applications, including Nginx/Apache, PHP-FPM and databases. I handle deployments, SSL, DNS, backups, monitoring and security. When incidents occur, I troubleshoot systematically using logs, system metrics and service health checks, then focus on preventing the same issue from happening again.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Technology tells them what you know.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem-solving tells them why they should hire you.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The best SysAdmins aren't the people who know the most commands.&lt;/p&gt;

&lt;p&gt;They're the people who can stay calm at 11 PM, find the signal inside the noise, restore service safely, and explain exactly what happened afterward.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learn the commands.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practice the scenarios.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build the habit of thinking in systems.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's how you become interview-ready.&lt;/p&gt;

&lt;h1&gt;
  
  
  Part 7: Scenario Questions, Study Plan &amp;amp; Quick Reference
&lt;/h1&gt;




&lt;h2&gt;
  
  
  7.1 Scenario-Based Interview Questions (MOST IMPORTANT)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]&lt;br&gt;
Interviewers love scenario questions because they test real-world problem-solving. Practice explaining these OUT LOUD.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Scenario 1: Website is Down
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Q: "It's 11 PM and a client reports their website is down. Walk me through your troubleshooting process."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. VERIFY the issue
   - Try accessing the site myself from browser + curl
   - Check if it's site-specific or all sites on the server
   - Ping the server IP

2. CHECK server connectivity
   - SSH into the server (if can't → check provider's console)
   - Run: uptime, free -h, df -h, top

3. CHECK web server
   - systemctl status nginx (or apache2)
   - If stopped → systemctl start nginx → check logs for why it stopped

4. CHECK error logs
   - tail -50 /var/log/nginx/error.log
   - tail -50 /var/log/php8.2-fpm.log

5. CHECK PHP-FPM (if PHP site)
   - systemctl status php8.2-fpm
   - If 502 → restart PHP-FPM

6. CHECK database
   - systemctl status mysql
   - If site shows DB error → restart MySQL, check credentials

7. CHECK disk space
   - df -h → if full → find and clean large files/logs

8. CHECK for recent changes
   - Did someone deploy code? Change config? Update server?

9. COMMUNICATE
   - Update client with status and ETA
   - Document the incident
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Scenario 2: Server is Slow
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Q: "Users report the website is very slow. How do you investigate?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. CHECK server resources
   - htop → CPU usage, RAM usage, load average
   - free -h → is swap being used heavily?
   - iostat → disk I/O bottleneck?

2. CHECK what's consuming resources
   - ps aux --sort=-%cpu | head → top CPU processes
   - ps aux --sort=-%mem | head → top RAM processes

3. CHECK web server
   - Access log analysis: are there too many requests? Bot traffic?
   - awk '{print $1}' access.log | sort | uniq -c | sort -rn | head

4. CHECK database
   - SHOW PROCESSLIST → stuck/slow queries?
   - Enable slow query log
   - Check if indexes are missing

5. CHECK PHP
   - PHP-FPM status → are all workers busy?
   - Check PHP error log for warnings
   - Check if OPcache is enabled

6. CHECK network
   - Is bandwidth maxed? → nload, vnstat
   - Is there a DDoS attack? → check access logs for patterns

7. QUICK FIXES
   - Kill stuck processes
   - Restart PHP-FPM (clears memory leaks)
   - Enable caching (Redis, OPcache, Nginx cache)
   - Block abusive IPs with fail2ban or UFW

8. LONG-TERM
   - Scale server (more CPU/RAM)
   - Add CDN (Cloudflare)
   - Optimize database queries
   - Implement application-level caching
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Scenario 3: SSL Certificate Expired
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Q: "A client's SSL certificate has expired and users are seeing security warnings. What do you do?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. IDENTIFY which certificate
   - echo | openssl s_client -connect domain.com:443 2&amp;gt;/dev/null | openssl x509 -noout -dates

2. RENEW the certificate
   - If Let's Encrypt: sudo certbot renew --force-renewal
   - If paid cert: generate new CSR, submit to provider, download new cert

3. INSTALL/VERIFY
   - sudo nginx -t &amp;amp;&amp;amp; sudo systemctl reload nginx
   - Verify in browser: check padlock icon

4. PREVENT recurrence
   - Verify certbot timer: sudo systemctl status certbot.timer
   - Or set up monitoring: SSL expiry alert 30 days before
   - Test auto-renewal: sudo certbot renew --dry-run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Scenario 4: Disk Space Full
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Q: "You receive an alert that the server's disk is 95% full. What steps do you take?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. IDENTIFY what's consuming space
   - df -h (which partition is full?)
   - du -sh /* | sort -rh | head -20
   - Then drill down: du -sh /var/* | sort -rh | head -20

2. QUICK CLEANUP
   - sudo apt clean                    # Clear apt cache
   - sudo journalctl --vacuum-time=7d  # Clear old systemd logs
   - find /var/log -name "*.gz" -delete # Delete compressed old logs
   - find /tmp -type f -mtime +7 -delete # Clean temp files
   - Check /var/log for huge log files → truncate or rotate

3. CHECK for common culprits
   - Large log files: /var/log/apache2/access.log, error.log
   - Old backups still on server
   - MySQL binary logs: PURGE BINARY LOGS BEFORE '2024-01-01'
   - Mail queue: mailq → clear if large

4. PREVENT recurrence
   - Set up logrotate for all logs
   - Move backups to S3/remote storage
   - Set up disk space alert at 80%
   - Add cron to clean old files
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Scenario 5: Database Connection Errors
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Q: "Multiple websites are showing 'Cannot connect to database'. How do you fix this?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. CHECK MySQL status
   - sudo systemctl status mysql
   - If stopped → sudo systemctl start mysql
   - Check: sudo tail -50 /var/log/mysql/error.log

2. IF MySQL won't start
   - Check disk space: df -h
   - Check RAM: free -h (OOM killer may have killed MySQL)
   - Check: sudo dmesg | grep -i "oom\|mysql"
   - Try: sudo mysqld_safe &amp;amp;

3. IF MySQL is running but connections fail
   - Check max connections: SHOW STATUS LIKE 'Threads_connected';
   - If maxed: kill idle connections, increase max_connections
   - Check credentials in website config files (.env, wp-config.php)
   - Test: mysql -u appuser -p -h localhost database_name

4. IF one site works but another doesn't
   - Check database-specific credentials
   - Check if specific database exists
   - Check user permissions: SHOW GRANTS FOR 'user'@'localhost';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Scenario 6: Server Migration
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Q: "We need to migrate 15 websites from an old server to a new server with zero downtime. How?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. PLAN (1-2 days before)
   - Inventory: list all domains, databases, configs, SSL certs
   - Set up new server with same software stack
   - Lower DNS TTL to 300 seconds (do this early!)

2. PREPARE NEW SERVER
   - Install: OS updates, Nginx/Apache, PHP (same version), MySQL
   - Configure: firewall, SSH, fail2ban
   - Set up same PHP extensions and configurations

3. SYNC DATA (night before)
   - rsync website files (first sync - bulk transfer)
   - Export all databases
   - Copy SSL certificates, configs, crontabs

4. MIGRATION DAY
   - Final rsync (only changed files, very fast)
   - Final database dump and import
   - Copy latest configs
   - Test each site on new server (use hosts file to test)

5. DNS SWITCH
   - Update A records to new server IP
   - Monitor propagation: dnschecker.org

6. VERIFY
   - Test all 15 sites on new server
   - Test SSL, forms, databases, email
   - Monitor error logs for 24-48 hours

7. POST-MIGRATION
   - Keep old server running 7 days as fallback
   - Raise DNS TTL back to normal
   - Update all documentation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Scenario 7: Server Under Attack
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Q: "The server is being hit by a DDoS attack. What do you do?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. IDENTIFY the attack
   - Check access logs for patterns:
     awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20
   - Check: ss -s (total connections)
   - Check: netstat -an | grep :80 | wc -l

2. IMMEDIATE ACTIONS
   - Block top attacking IPs:
     sudo ufw deny from ATTACKER_IP
   - Enable rate limiting in Nginx:
     limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;

3. CLOUDFLARE (if available)
   - Enable "Under Attack Mode"
   - Set up rate limiting rules
   - Block suspicious countries/ASNs
   - Enable Bot Fight Mode

4. SERVER-LEVEL
   - Configure fail2ban for HTTP flood
   - Increase worker_connections in Nginx
   - Enable connection limiting

5. LONG-TERM
   - Set up Cloudflare on all domains
   - Configure WAF rules
   - Set up monitoring alerts for traffic spikes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  More Rapid-Fire Scenario Questions
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Key Actions&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PHP upgrade needed&lt;/td&gt;
&lt;td&gt;Install new PHP alongside old, test sites, update Nginx/Apache fastcgi_pass, remove old version&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email not being delivered&lt;/td&gt;
&lt;td&gt;Check SPF/DKIM/DMARC, check mail logs, check blacklist status (mxtoolbox), verify port 25/587 open&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cron job not running&lt;/td&gt;
&lt;td&gt;Check &lt;code&gt;grep CRON /var/log/syslog&lt;/code&gt;, verify path, check permissions, test command manually&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MySQL table crashed&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;REPAIR TABLE tablename&lt;/code&gt;, or restore from backup if repair fails&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server rebooted unexpectedly&lt;/td&gt;
&lt;td&gt;Check &lt;code&gt;last reboot&lt;/code&gt;, check &lt;code&gt;dmesg&lt;/code&gt;, check &lt;code&gt;/var/log/syslog&lt;/code&gt;, check OOM killer, check provider status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New website deployment&lt;/td&gt;
&lt;td&gt;Create vhost, set up DNS, create DB + user, deploy code, fix permissions, install SSL, test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Developer needs database access&lt;/td&gt;
&lt;td&gt;Create MySQL user with limited permissions, never give root. &lt;code&gt;GRANT SELECT, INSERT, UPDATE on db.* TO 'dev'@'ip'&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backup restoration needed&lt;/td&gt;
&lt;td&gt;Verify backup integrity, create fresh DB, import SQL, update config, fix permissions, test&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  7.2 Two-Week Study Plan (Zero to Interview-Ready)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Week 1: Core Skills
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Day&lt;/th&gt;
&lt;th&gt;Topic&lt;/th&gt;
&lt;th&gt;Practice&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Day 1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Linux commands, file operations&lt;/td&gt;
&lt;td&gt;Set up Ubuntu VM, practice all commands from Part 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Day 2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Users, permissions, SSH&lt;/td&gt;
&lt;td&gt;Create users, set permissions, configure SSH keys &amp;amp; hardening&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Day 3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Apache configuration&lt;/td&gt;
&lt;td&gt;Install Apache, create 3 virtual hosts, set up .htaccess&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Day 4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Nginx configuration&lt;/td&gt;
&lt;td&gt;Install Nginx, create 3 server blocks, set up reverse proxy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Day 5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DNS &amp;amp; Domains&lt;/td&gt;
&lt;td&gt;Set up a domain with all record types (use free domains or Cloudflare)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Day 6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SSL Certificates&lt;/td&gt;
&lt;td&gt;Install Let's Encrypt on both Apache &amp;amp; Nginx, practice troubleshooting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Day 7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PHP &amp;amp; PHP-FPM&lt;/td&gt;
&lt;td&gt;Install PHP, configure php.ini, set up PHP-FPM with Nginx&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Week 2: Advanced Skills
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Day&lt;/th&gt;
&lt;th&gt;Topic&lt;/th&gt;
&lt;th&gt;Practice&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Day 8&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MySQL/MariaDB&lt;/td&gt;
&lt;td&gt;Install, create databases/users, backup/restore, slow query log&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Day 9&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Server monitoring&lt;/td&gt;
&lt;td&gt;Practice htop, disk analysis, log analysis, set up monitoring&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Day 10&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Firewall &amp;amp; Security&lt;/td&gt;
&lt;td&gt;Configure UFW, install fail2ban, SSH hardening, security audit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Day 11&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Backup &amp;amp; Cron&lt;/td&gt;
&lt;td&gt;Write backup scripts, set up cron jobs, test restore&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Day 12&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Docker basics&lt;/td&gt;
&lt;td&gt;Install Docker, run containers, create docker-compose.yml&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Day 13&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cloud &amp;amp; Git&lt;/td&gt;
&lt;td&gt;Deploy on DigitalOcean, set up Git deployment workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Day 14&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Scenario practice&lt;/td&gt;
&lt;td&gt;Review all scenarios, practice explaining solutions out loud&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Daily Routine
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Morning (1 hour):   Read theory for today's topic
Afternoon (2 hours): Hands-on practice on VM/VPS
Evening (1 hour):    Review interview Q&amp;amp;A, practice explaining answers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7.3 Hands-On Lab Setup
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Option A: Local VM (Free)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Download VirtualBox: virtualbox.org&lt;/span&gt;
&lt;span class="c"&gt;# 2. Download Ubuntu Server 22.04 LTS ISO&lt;/span&gt;
&lt;span class="c"&gt;# 3. Create VM: 2 CPU, 2GB RAM, 20GB disk&lt;/span&gt;
&lt;span class="c"&gt;# 4. Install Ubuntu Server&lt;/span&gt;
&lt;span class="c"&gt;# 5. Practice everything locally&lt;/span&gt;

&lt;span class="c"&gt;# Network setup for SSH from host:&lt;/span&gt;
&lt;span class="c"&gt;# VirtualBox → Settings → Network → Adapter 1 → Bridged Adapter&lt;/span&gt;
&lt;span class="c"&gt;# OR Port Forwarding: Host 2222 → Guest 22&lt;/span&gt;
ssh &lt;span class="nt"&gt;-p&lt;/span&gt; 2222 user@localhost
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Option B: DigitalOcean (Paid but realistic)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Sign up at digitalocean.com (get $200 free credit with referral)&lt;/span&gt;
&lt;span class="c"&gt;# 2. Create a $6/month Droplet: Ubuntu 22.04 LTS&lt;/span&gt;
&lt;span class="c"&gt;# 3. SSH in: ssh root@YOUR_DROPLET_IP&lt;/span&gt;
&lt;span class="c"&gt;# 4. Practice everything on real cloud server&lt;/span&gt;
&lt;span class="c"&gt;# 5. Destroy when done to stop billing&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7.4 Critical Commands Cheat Sheet
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# === SERVER STATUS ===&lt;/span&gt;
&lt;span class="nb"&gt;uptime&lt;/span&gt;                          &lt;span class="c"&gt;# Uptime + load average&lt;/span&gt;
free &lt;span class="nt"&gt;-h&lt;/span&gt;                         &lt;span class="c"&gt;# Memory usage&lt;/span&gt;
&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt;                           &lt;span class="c"&gt;# Disk space&lt;/span&gt;
htop                            &lt;span class="c"&gt;# Interactive process viewer&lt;/span&gt;
ss &lt;span class="nt"&gt;-tlnp&lt;/span&gt;                        &lt;span class="c"&gt;# Listening ports&lt;/span&gt;

&lt;span class="c"&gt;# === SERVICE MANAGEMENT ===&lt;/span&gt;
systemctl status nginx          &lt;span class="c"&gt;# Check service&lt;/span&gt;
systemctl restart nginx         &lt;span class="c"&gt;# Restart service&lt;/span&gt;
systemctl reload nginx          &lt;span class="c"&gt;# Reload config (zero downtime)&lt;/span&gt;
systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;nginx          &lt;span class="c"&gt;# Start on boot&lt;/span&gt;
journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; nginx &lt;span class="nt"&gt;-f&lt;/span&gt;          &lt;span class="c"&gt;# Follow service logs&lt;/span&gt;

&lt;span class="c"&gt;# === WEB SERVER ===&lt;/span&gt;
nginx &lt;span class="nt"&gt;-t&lt;/span&gt;                        &lt;span class="c"&gt;# Test Nginx config&lt;/span&gt;
apache2ctl configtest           &lt;span class="c"&gt;# Test Apache config&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/nginx/error.log       &lt;span class="c"&gt;# Follow error log&lt;/span&gt;

&lt;span class="c"&gt;# === DNS ===&lt;/span&gt;
dig example.com                 &lt;span class="c"&gt;# DNS lookup&lt;/span&gt;
dig @8.8.8.8 example.com       &lt;span class="c"&gt;# Lookup via Google DNS&lt;/span&gt;
dig example.com MX              &lt;span class="c"&gt;# Mail records&lt;/span&gt;
dig TXT _dmarc.example.com     &lt;span class="c"&gt;# DMARC record&lt;/span&gt;

&lt;span class="c"&gt;# === SSL ===&lt;/span&gt;
certbot &lt;span class="nt"&gt;--nginx&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; example.com  &lt;span class="c"&gt;# Get SSL cert&lt;/span&gt;
certbot renew &lt;span class="nt"&gt;--dry-run&lt;/span&gt;         &lt;span class="c"&gt;# Test renewal&lt;/span&gt;
openssl s_client &lt;span class="nt"&gt;-connect&lt;/span&gt; example.com:443  &lt;span class="c"&gt;# Check SSL&lt;/span&gt;

&lt;span class="c"&gt;# === DATABASE ===&lt;/span&gt;
mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt;                &lt;span class="c"&gt;# Login&lt;/span&gt;
mysqldump &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt; dbname | &lt;span class="nb"&gt;gzip&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; backup.sql.gz   &lt;span class="c"&gt;# Backup&lt;/span&gt;
&lt;span class="nb"&gt;gunzip&lt;/span&gt; &amp;lt; backup.sql.gz | mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt; dbname      &lt;span class="c"&gt;# Restore&lt;/span&gt;
SHOW PROCESSLIST&lt;span class="p"&gt;;&lt;/span&gt;               &lt;span class="c"&gt;# Running queries&lt;/span&gt;

&lt;span class="c"&gt;# === FIREWALL ===&lt;/span&gt;
ufw status                     &lt;span class="c"&gt;# Check firewall&lt;/span&gt;
ufw allow 80/tcp               &lt;span class="c"&gt;# Allow HTTP&lt;/span&gt;
ufw deny from 1.2.3.4          &lt;span class="c"&gt;# Block IP&lt;/span&gt;
fail2ban-client status sshd    &lt;span class="c"&gt;# Check banned IPs&lt;/span&gt;

&lt;span class="c"&gt;# === FILES &amp;amp; PERMISSIONS ===&lt;/span&gt;
&lt;span class="nb"&gt;chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; www-data:www-data /var/www/    &lt;span class="c"&gt;# Fix ownership&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;755 /var/www/html                 &lt;span class="c"&gt;# Dir permissions&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;644 /var/www/html/index.html      &lt;span class="c"&gt;# File permissions&lt;/span&gt;
find /var/www &lt;span class="nt"&gt;-type&lt;/span&gt; f &lt;span class="nt"&gt;-perm&lt;/span&gt; 0777        &lt;span class="c"&gt;# Find insecure files&lt;/span&gt;

&lt;span class="c"&gt;# === TROUBLESHOOTING ===&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/syslog         &lt;span class="c"&gt;# System log&lt;/span&gt;
dmesg | &lt;span class="nb"&gt;tail&lt;/span&gt;                    &lt;span class="c"&gt;# Kernel messages&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"error"&lt;/span&gt; /var/log/nginx/error.log   &lt;span class="c"&gt;# Search for errors&lt;/span&gt;
lsof &lt;span class="nt"&gt;-i&lt;/span&gt; :80                    &lt;span class="c"&gt;# What's using port 80&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7.5 Documentation Template
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Server Inventory Template
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Server: production-web-01&lt;/span&gt;

&lt;span class="gu"&gt;## Server Details&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Provider: DigitalOcean
&lt;span class="p"&gt;-&lt;/span&gt; IP: 192.168.1.100
&lt;span class="p"&gt;-&lt;/span&gt; OS: Ubuntu 22.04 LTS
&lt;span class="p"&gt;-&lt;/span&gt; CPU: 4 vCPUs
&lt;span class="p"&gt;-&lt;/span&gt; RAM: 8 GB
&lt;span class="p"&gt;-&lt;/span&gt; Disk: 160 GB SSD

&lt;span class="gu"&gt;## Software Stack&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Nginx 1.22
&lt;span class="p"&gt;-&lt;/span&gt; PHP 8.2-FPM
&lt;span class="p"&gt;-&lt;/span&gt; MySQL 8.0
&lt;span class="p"&gt;-&lt;/span&gt; Redis 7.0
&lt;span class="p"&gt;-&lt;/span&gt; Node.js 20 LTS

&lt;span class="gu"&gt;## Hosted Domains&lt;/span&gt;
| Domain | Type | Document Root | Database | SSL |
|--------|------|---------------|----------|-----|
| example.com | WordPress | /var/www/example.com | example_db | Let's Encrypt |
| app.company.com | Laravel | /var/www/app | app_db | Let's Encrypt |
| api.company.com | Node.js | Port 3000 | N/A | Let's Encrypt |

&lt;span class="gu"&gt;## Backups&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Database: Daily at 2 AM, retained 30 days
&lt;span class="p"&gt;-&lt;/span&gt; Files: Weekly Sunday 3 AM, retained 12 weeks
&lt;span class="p"&gt;-&lt;/span&gt; Location: S3 bucket: s3://company-backups/production/

&lt;span class="gu"&gt;## Access&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; SSH: Port 2222, key-based only
&lt;span class="p"&gt;-&lt;/span&gt; Users: john (sudo), deploy (limited)

&lt;span class="gu"&gt;## Monitoring&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; UptimeRobot: All domains monitored
&lt;span class="p"&gt;-&lt;/span&gt; Disk alert: &amp;gt; 80%
&lt;span class="p"&gt;-&lt;/span&gt; CPU alert: &amp;gt; 90% for 5 minutes

&lt;span class="gu"&gt;## Last Incidents&lt;/span&gt;
| Date | Issue | Resolution | Duration |
|------|-------|------------|----------|
| 2024-01-15 | Disk full | Cleaned old logs | 15 min |
| 2024-02-03 | MySQL crashed | OOM, increased RAM | 30 min |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Incident Report Template
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Incident Report: [Brief Description]&lt;/span&gt;

&lt;span class="gu"&gt;## Summary&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Date/Time: 2024-01-15 23:30 IST
&lt;span class="p"&gt;-&lt;/span&gt; Duration: 45 minutes
&lt;span class="p"&gt;-&lt;/span&gt; Impact: example.com was unreachable
&lt;span class="p"&gt;-&lt;/span&gt; Severity: High

&lt;span class="gu"&gt;## Timeline&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; 23:30 - Alert received: example.com is down
&lt;span class="p"&gt;-&lt;/span&gt; 23:32 - SSHed into server
&lt;span class="p"&gt;-&lt;/span&gt; 23:33 - Found: Nginx running but PHP-FPM stopped
&lt;span class="p"&gt;-&lt;/span&gt; 23:34 - Checked logs: OOM killer killed PHP-FPM
&lt;span class="p"&gt;-&lt;/span&gt; 23:35 - Restarted PHP-FPM, site came back up
&lt;span class="p"&gt;-&lt;/span&gt; 23:40 - Investigated: memory leak in custom plugin
&lt;span class="p"&gt;-&lt;/span&gt; 00:15 - Increased server RAM, disabled problematic plugin

&lt;span class="gu"&gt;## Root Cause&lt;/span&gt;
A WordPress plugin had a memory leak, causing PHP-FPM workers to consume
all available RAM. The OOM killer terminated PHP-FPM processes.

&lt;span class="gu"&gt;## Resolution&lt;/span&gt;
&lt;span class="p"&gt;1.&lt;/span&gt; Restarted PHP-FPM
&lt;span class="p"&gt;2.&lt;/span&gt; Disabled the problematic plugin
&lt;span class="p"&gt;3.&lt;/span&gt; Increased server RAM from 4GB to 8GB
&lt;span class="p"&gt;4.&lt;/span&gt; Set pm.max_requests = 500 to restart workers periodically

&lt;span class="gu"&gt;## Prevention&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Set up memory usage alerting at 80%
&lt;span class="p"&gt;-&lt;/span&gt; Added pm.max_requests to PHP-FPM config
&lt;span class="p"&gt;-&lt;/span&gt; Scheduled weekly plugin updates and review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7.6 Final Tips for the Interview
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;[!TIP]&lt;br&gt;
&lt;strong&gt;How to answer "Tell me about your experience":&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"I have X years managing Linux servers running Ubuntu with Nginx/Apache, PHP-FPM, and MySQL"&lt;/li&gt;
&lt;li&gt;"I manage Y domains across Z servers on [DigitalOcean/AWS]"&lt;/li&gt;
&lt;li&gt;"I handle SSL certificates, DNS management, server security, and automated backups"&lt;/li&gt;
&lt;li&gt;"I monitor server health including CPU, RAM, disk, and uptime using [tools]"&lt;/li&gt;
&lt;li&gt;Mention specific scenarios you've resolved&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;[!IMPORTANT]&lt;br&gt;
&lt;strong&gt;Key behaviors interviewers look for:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Systematic troubleshooting&lt;/strong&gt; - Don't jump to random fixes. Check logs first&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security mindset&lt;/strong&gt; - Always mention security considerations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backup awareness&lt;/strong&gt; - Always mention backup before making changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Communication&lt;/strong&gt; - Mention updating stakeholders during incidents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt; - Mention documenting changes and incidents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proactive approach&lt;/strong&gt; - Mention monitoring, alerts, and prevention&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;[!CAUTION]&lt;br&gt;
&lt;strong&gt;Common interview mistakes to avoid:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don't say "I would Google it" - show you know the commands&lt;/li&gt;
&lt;li&gt;Don't say "rm -rf /" as a joke - shows carelessness&lt;/li&gt;
&lt;li&gt;Don't say "just restart the server" for everything - shows lack of depth&lt;/li&gt;
&lt;li&gt;Don't admit to using root for everything - shows bad security practice&lt;/li&gt;
&lt;li&gt;Don't forget to mention testing config before restarting (&lt;code&gt;nginx -t&lt;/code&gt;, &lt;code&gt;apache2ctl configtest&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

</description>
      <category>linux</category>
      <category>devops</category>
      <category>sysadmin</category>
      <category>interviewprep</category>
    </item>
    <item>
      <title>The Linux Server Administrator’s Modern Survival Guide: Cloud, Docker, Git, CI/CD and Production Infrastructure</title>
      <dc:creator>Yashvi Kothari</dc:creator>
      <pubDate>Wed, 12 Aug 2026 11:29:38 +0000</pubDate>
      <link>https://dev.to/yashvikothari/the-linux-server-administrators-modern-survival-guide-cloud-docker-git-cicd-and-production-3lgp</link>
      <guid>https://dev.to/yashvikothari/the-linux-server-administrators-modern-survival-guide-cloud-docker-git-cicd-and-production-3lgp</guid>
      <description>&lt;h1&gt;
  
  
  The Linux Server Administrator’s Modern Survival Guide: Cloud, Docker, Git, CI/CD and Production Infrastructure
&lt;/h1&gt;

&lt;p&gt;Most server administrators start with:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ssh&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then they discover that modern infrastructure is much bigger than SSH.&lt;/p&gt;

&lt;p&gt;You need to understand cloud servers, containers, Git, CI/CD, reverse proxies, databases, caching, monitoring, backups, and disaster recovery.&lt;/p&gt;

&lt;p&gt;The good news?&lt;/p&gt;

&lt;p&gt;You don't need to memorize hundreds of commands.&lt;/p&gt;

&lt;p&gt;You need to understand &lt;strong&gt;how the pieces fit together.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is the difference between someone who can execute commands and someone who can operate production infrastructure.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Modern Server Stack
&lt;/h2&gt;

&lt;p&gt;A production application might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Users
   ↓
Cloudflare / CDN
   ↓
Load Balancer
   ↓
Nginx
   ↓
Application
   ↓
Redis
   ↓
Database
   ↓
Object Storage / Backups

GitHub
   ↓
CI/CD
   ↓
Deployment
   ↓
Monitoring
   ↓
Alerts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every layer solves a different problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cloud&lt;/strong&gt; provides infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nginx&lt;/strong&gt; handles web traffic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docker&lt;/strong&gt; packages applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Git&lt;/strong&gt; manages source code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CI/CD&lt;/strong&gt; automates delivery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Redis&lt;/strong&gt; accelerates frequently accessed data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prometheus/Grafana&lt;/strong&gt; tells you what is happening.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Backups and disaster recovery&lt;/strong&gt; make sure one failure doesn't become a catastrophe.&lt;/p&gt;

&lt;p&gt;Learn the architecture first.&lt;/p&gt;

&lt;p&gt;The commands become easier afterward.&lt;/p&gt;




&lt;h1&gt;
  
  
  1. Cloud: Stop Thinking in Terms of Servers
&lt;/h1&gt;

&lt;p&gt;AWS, DigitalOcean, and Azure all provide similar fundamental building blocks.&lt;/p&gt;

&lt;p&gt;You need to understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compute&lt;/li&gt;
&lt;li&gt;Storage&lt;/li&gt;
&lt;li&gt;Networking&lt;/li&gt;
&lt;li&gt;DNS&lt;/li&gt;
&lt;li&gt;Identity&lt;/li&gt;
&lt;li&gt;Firewalls&lt;/li&gt;
&lt;li&gt;Load balancing&lt;/li&gt;
&lt;li&gt;Monitoring&lt;/li&gt;
&lt;li&gt;Backups&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, on AWS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EC2       → Compute
S3        → Object storage
RDS       → Managed database
Route 53  → DNS
ELB       → Load balancing
CloudFront → CDN
IAM       → Identity and access
VPC       → Networking
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important interview question isn't:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What is EC2?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It's:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How would you deploy and protect an application running on EC2?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A strong answer includes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EC2
 ↓
Security Group
 ↓
Nginx
 ↓
Application
 ↓
Database
 ↓
S3 backups
 ↓
CloudWatch monitoring
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's infrastructure thinking.&lt;/p&gt;




&lt;h1&gt;
  
  
  2. Security Groups Are Not Just Another Firewall
&lt;/h1&gt;

&lt;p&gt;A common interview mistake is saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Security Groups are AWS firewalls."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's technically correct, but incomplete.&lt;/p&gt;

&lt;p&gt;A better answer:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Security Group controls network traffic to and from AWS resources such as EC2 instances through defined inbound and outbound rules.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws ec2 authorize-security-group-ingress &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--group-id&lt;/span&gt; sg-12345 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--protocol&lt;/span&gt; tcp &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--port&lt;/span&gt; 22 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--cidr&lt;/span&gt; 203.0.113.0/24
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But don't blindly open SSH to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0.0.0.0/0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Production security starts with one principle:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Allow only what is required, from only where it is required.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  3. Docker: Package the Application, Not the Server
&lt;/h1&gt;

&lt;p&gt;Before containers, deploying an application often meant:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Install OS
Install runtime
Install dependencies
Configure application
Configure services
Fix permissions
Hope nothing conflicts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Docker changes the model.&lt;/p&gt;

&lt;p&gt;You package the application and its environment into an image.&lt;/p&gt;

&lt;p&gt;Then run that image consistently.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker pull nginx

docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; my-nginx &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 80:80 &lt;span class="se"&gt;\&lt;/span&gt;
  nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now understand the difference:&lt;/p&gt;

&lt;h3&gt;
  
  
  Image
&lt;/h3&gt;

&lt;p&gt;The packaged blueprint.&lt;/p&gt;

&lt;h3&gt;
  
  
  Container
&lt;/h3&gt;

&lt;p&gt;A running instance of that image.&lt;/p&gt;

&lt;h3&gt;
  
  
  Volume
&lt;/h3&gt;

&lt;p&gt;Persistent storage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Network
&lt;/h3&gt;

&lt;p&gt;Communication between containers.&lt;/p&gt;

&lt;p&gt;This distinction appears constantly in interviews.&lt;/p&gt;




&lt;h1&gt;
  
  
  4. Containers Are Not Virtual Machines
&lt;/h1&gt;

&lt;p&gt;This question is almost guaranteed in DevOps interviews.&lt;/p&gt;

&lt;h3&gt;
  
  
  VM
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hardware
   ↓
Hypervisor
   ↓
Guest OS
   ↓
Application
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Container
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hardware
   ↓
Host OS / Kernel
   ↓
Container Runtime
   ↓
Container
   ↓
Application
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Containers generally start faster and use fewer resources because they share the host kernel.&lt;/p&gt;

&lt;p&gt;But that doesn't mean:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Containers are always better."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The correct engineering answer is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use the abstraction that fits the workload, isolation requirements, operational model, and scalability needs.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  5. Docker Compose: One Application, Multiple Services
&lt;/h1&gt;

&lt;p&gt;Real applications rarely contain only one process.&lt;/p&gt;

&lt;p&gt;You might have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nginx
PHP
MySQL
Redis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Docker Compose lets you describe that architecture as code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;nginx&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx:latest&lt;/span&gt;

  &lt;span class="na"&gt;php&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;php:8.2-fpm&lt;/span&gt;

  &lt;span class="na"&gt;mysql&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mysql:8.0&lt;/span&gt;

  &lt;span class="na"&gt;redis&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis:alpine&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One command.&lt;/p&gt;

&lt;p&gt;Four services.&lt;/p&gt;

&lt;p&gt;Repeatable infrastructure.&lt;/p&gt;

&lt;p&gt;That is the real value of containers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;consistency.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  6. Git Is Infrastructure Knowledge
&lt;/h1&gt;

&lt;p&gt;Git isn't just for developers.&lt;/p&gt;

&lt;p&gt;If you're managing servers, you should understand:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone
git status
git pull
git fetch
git add
git commit
git push
git diff
git log
git stash
git revert
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But don't just memorize commands.&lt;/p&gt;

&lt;p&gt;Understand this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Working Directory
       ↓
Staging Area
       ↓
Commit
       ↓
Remote Repository
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And understand the difference between:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git fetch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git pull
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;fetch&lt;/code&gt; downloads remote changes without modifying your current working tree.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pull&lt;/code&gt; generally performs a fetch followed by integration into your current branch.&lt;/p&gt;

&lt;p&gt;That distinction matters during production troubleshooting.&lt;/p&gt;




&lt;h1&gt;
  
  
  7. CI/CD Turns Deployment Into a Pipeline
&lt;/h1&gt;

&lt;p&gt;Without automation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Developer
   ↓
SSH server
   ↓
git pull
   ↓
install dependencies
   ↓
restart service
   ↓
hope
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With CI/CD:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Git Push
   ↓
Build
   ↓
Test
   ↓
Package
   ↓
Deploy
   ↓
Health Check
   ↓
Monitoring
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A simple GitHub Actions workflow might deploy after a push to &lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But production CI/CD should ideally also include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automated tests&lt;/li&gt;
&lt;li&gt;Security scanning&lt;/li&gt;
&lt;li&gt;Build verification&lt;/li&gt;
&lt;li&gt;Deployment approval where appropriate&lt;/li&gt;
&lt;li&gt;Secrets management&lt;/li&gt;
&lt;li&gt;Health checks&lt;/li&gt;
&lt;li&gt;Rollback strategy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal isn't simply:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Deploy automatically."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The goal is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Deploy safely and repeatably.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  8. Python and Node.js Need a Process Model
&lt;/h1&gt;

&lt;p&gt;An application running manually from a terminal is not production architecture.&lt;/p&gt;

&lt;p&gt;For Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nginx
  ↓
Gunicorn
  ↓
Flask/Django
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Node.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nginx
  ↓
Node.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A process manager such as PM2 can help manage Node.js processes.&lt;/p&gt;

&lt;p&gt;For Python applications, systemd plus Gunicorn is a common pattern.&lt;/p&gt;

&lt;p&gt;The important principle is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your application should survive logout, crashes, and server reboots.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That means:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;myapp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="py"&gt;Restart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;always&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;are not cosmetic configuration.&lt;/p&gt;

&lt;p&gt;They are operational resilience.&lt;/p&gt;




&lt;h1&gt;
  
  
  9. Redis: Fast Doesn't Mean Permanent
&lt;/h1&gt;

&lt;p&gt;Redis is commonly used for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Caching&lt;/li&gt;
&lt;li&gt;Sessions&lt;/li&gt;
&lt;li&gt;Queues&lt;/li&gt;
&lt;li&gt;Counters&lt;/li&gt;
&lt;li&gt;Temporary application state&lt;/li&gt;
&lt;li&gt;Real-time workloads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A basic test:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;redis-cli ping
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PONG
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should also understand dangerous commands.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;redis-cli FLUSHALL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;can delete all Redis data.&lt;/p&gt;

&lt;p&gt;And:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;redis-cli KEYS &lt;span class="s2"&gt;"*"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;can become expensive on large production datasets.&lt;/p&gt;

&lt;p&gt;A good administrator doesn't just know commands.&lt;/p&gt;

&lt;p&gt;They know which commands &lt;strong&gt;not&lt;/strong&gt; to run casually.&lt;/p&gt;




&lt;h1&gt;
  
  
  10. Elasticsearch: Search Is Different From a Database
&lt;/h1&gt;

&lt;p&gt;Elasticsearch is designed around searching and analyzing large amounts of data.&lt;/p&gt;

&lt;p&gt;Useful operational endpoints include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl localhost:9200

curl &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"localhost:9200/_cluster/health?pretty"&lt;/span&gt;

curl &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"localhost:9200/_cat/indices?v"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When troubleshooting, don't ask only:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Is Elasticsearch running?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ask:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Is the service running?
Is port 9200 listening?
Is the cluster healthy?
Are nodes connected?
Are indices available?
Is disk space sufficient?
Are requests succeeding?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the difference between service checking and system troubleshooting.&lt;/p&gt;




&lt;h1&gt;
  
  
  11. Monitoring: If You Can't See It, You Can't Operate It
&lt;/h1&gt;

&lt;p&gt;A server can be "up" while the application is effectively down.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CPU = 40%
RAM = 50%
Disk = 70%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything looks healthy.&lt;/p&gt;

&lt;p&gt;But:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Database connections = exhausted
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application is down.&lt;/p&gt;

&lt;p&gt;This is why production monitoring needs multiple layers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prometheus
&lt;/h3&gt;

&lt;p&gt;Collects and stores metrics.&lt;/p&gt;

&lt;h3&gt;
  
  
  Grafana
&lt;/h3&gt;

&lt;p&gt;Visualizes metrics.&lt;/p&gt;

&lt;h3&gt;
  
  
  Node Exporter
&lt;/h3&gt;

&lt;p&gt;Exposes Linux system metrics.&lt;/p&gt;

&lt;h3&gt;
  
  
  Zabbix
&lt;/h3&gt;

&lt;p&gt;Provides broader infrastructure monitoring and alerting.&lt;/p&gt;

&lt;p&gt;The key lesson:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Monitoring should measure user-impacting health, not just server health.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  12. Cloudflare Is More Than a CDN
&lt;/h1&gt;

&lt;p&gt;Cloudflare can provide:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DNS
CDN
DDoS protection
WAF
TLS
Caching
Traffic filtering
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A common architecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User
 ↓
Cloudflare
 ↓
Load Balancer
 ↓
Nginx
 ↓
Application
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For production TLS, understand:&lt;/p&gt;

&lt;h3&gt;
  
  
  Flexible
&lt;/h3&gt;

&lt;p&gt;Browser → HTTPS&lt;/p&gt;

&lt;p&gt;Cloudflare → HTTP&lt;/p&gt;

&lt;p&gt;Usually not desirable for secure applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Full
&lt;/h3&gt;

&lt;p&gt;HTTPS between Cloudflare and origin, including self-signed certificates.&lt;/p&gt;

&lt;h3&gt;
  
  
  Full Strict
&lt;/h3&gt;

&lt;p&gt;HTTPS end-to-end with a valid trusted origin certificate.&lt;/p&gt;

&lt;p&gt;For production:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Full (Strict) is generally the preferred model.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  13. Disaster Recovery Is Part of Being a Good Administrator
&lt;/h1&gt;

&lt;p&gt;The worst backup is the one you've never tested.&lt;/p&gt;

&lt;p&gt;A strong backup strategy follows the:&lt;/p&gt;

&lt;h2&gt;
  
  
  3-2-1 Rule
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;3 copies
2 different storage types
1 offsite copy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Production DB
      ↓
Local backup
      ↓
Cloud object storage
      ↓
Different region/provider
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But backups alone aren't enough.&lt;/p&gt;

&lt;p&gt;You need recovery procedures.&lt;/p&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"If this server disappears right now, how long until the application is running again?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question introduces two critical concepts:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RTO — Recovery Time Objective&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;How quickly must the service be restored?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RPO — Recovery Point Objective&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;How much data loss is acceptable?&lt;/p&gt;

&lt;p&gt;Production infrastructure is not about preventing every failure.&lt;/p&gt;

&lt;p&gt;It's about &lt;strong&gt;recovering intelligently when failure happens.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  14. High Traffic Requires Architecture, Not Just Bigger Servers
&lt;/h1&gt;

&lt;p&gt;When traffic increases, many administrators immediately think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Buy a bigger server."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's vertical scaling.&lt;/p&gt;

&lt;p&gt;Sometimes it works.&lt;/p&gt;

&lt;p&gt;But eventually you need horizontal scaling.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                  Load Balancer
                 /      |      \
                /       |       \
            App 1     App 2     App 3
               \        |        /
                \       |       /
                   Database
                      |
                  Read Replica
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CDN
Caching
Redis
Connection pooling
Database replicas
Autoscaling
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal is not to make one machine infinitely powerful.&lt;/p&gt;

&lt;p&gt;The goal is to remove single points of failure and distribute work.&lt;/p&gt;




&lt;h1&gt;
  
  
  15. The Most Important Skill: Troubleshooting
&lt;/h1&gt;

&lt;p&gt;Commands are easy to memorize.&lt;/p&gt;

&lt;p&gt;Troubleshooting is harder.&lt;/p&gt;

&lt;p&gt;Suppose a website returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;502 Bad Gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Don't randomly restart everything.&lt;/p&gt;

&lt;p&gt;Follow the path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client
 ↓
DNS
 ↓
Cloudflare
 ↓
Load Balancer
 ↓
Nginx
 ↓
Application
 ↓
Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check each layer.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig example.com

curl &lt;span class="nt"&gt;-I&lt;/span&gt; https://example.com

systemctl status nginx

nginx &lt;span class="nt"&gt;-t&lt;/span&gt;

ss &lt;span class="nt"&gt;-tulpn&lt;/span&gt;

curl http://127.0.0.1:3000

journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; myapp &lt;span class="nt"&gt;-n&lt;/span&gt; 100

docker ps

docker logs my-container
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You're narrowing the failure domain.&lt;/p&gt;

&lt;p&gt;That's what good troubleshooting looks like.&lt;/p&gt;




&lt;h1&gt;
  
  
  16. The Interview Mental Model
&lt;/h1&gt;

&lt;p&gt;When an interviewer gives you a production problem, don't jump immediately to commands.&lt;/p&gt;

&lt;p&gt;Use this framework:&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Observe
&lt;/h2&gt;

&lt;p&gt;What is the exact symptom?&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Scope
&lt;/h2&gt;

&lt;p&gt;Is one user affected?&lt;/p&gt;

&lt;p&gt;One server?&lt;/p&gt;

&lt;p&gt;One service?&lt;/p&gt;

&lt;p&gt;The entire application?&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Check
&lt;/h2&gt;

&lt;p&gt;Look at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Logs
Processes
Ports
CPU
Memory
Disk
Network
Dependencies
Configuration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Isolate
&lt;/h2&gt;

&lt;p&gt;Find the first layer where reality differs from expectation.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Fix
&lt;/h2&gt;

&lt;p&gt;Make the smallest safe change.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Verify
&lt;/h2&gt;

&lt;p&gt;Confirm the service works.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Prevent
&lt;/h2&gt;

&lt;p&gt;Add monitoring, automation, documentation, or configuration changes to prevent recurrence.&lt;/p&gt;

&lt;p&gt;This framework works across:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Linux
AWS
Docker
Nginx
MySQL
Redis
Kubernetes
CI/CD
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Final Lesson
&lt;/h1&gt;

&lt;p&gt;You don't become a strong Linux or DevOps engineer by memorizing 1,000 commands.&lt;/p&gt;

&lt;p&gt;You become one by understanding relationships.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cloud
 ↓
Network
 ↓
Load Balancer
 ↓
Web Server
 ↓
Application
 ↓
Cache
 ↓
Database
 ↓
Storage
 ↓
Monitoring
 ↓
Backup
 ↓
Recovery
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then automate the boring parts.&lt;/p&gt;

&lt;p&gt;Monitor the important parts.&lt;/p&gt;

&lt;p&gt;Secure the dangerous parts.&lt;/p&gt;

&lt;p&gt;Document the critical parts.&lt;/p&gt;

&lt;p&gt;And test your recovery before production forces you to.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The best administrator isn't the person who knows the most commands.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's the person who can look at a broken system, reduce the problem to a few possibilities, find the real cause, fix it safely, and make sure it doesn't happen again.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is the skill worth building.&lt;/p&gt;

&lt;h1&gt;
  
  
  Part 6: Cloud Platforms, Docker, Git, CI/CD &amp;amp; Preferred Skills
&lt;/h1&gt;




&lt;h2&gt;
  
  
  6.1 Cloud Platforms (AWS, DigitalOcean, Azure)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  AWS (Amazon Web Services)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Key AWS services for server admins:&lt;/span&gt;
&lt;span class="c"&gt;# EC2       - Virtual servers (VPS)&lt;/span&gt;
&lt;span class="c"&gt;# S3        - Object storage (backups, static files)&lt;/span&gt;
&lt;span class="c"&gt;# RDS       - Managed databases&lt;/span&gt;
&lt;span class="c"&gt;# Route53   - DNS management&lt;/span&gt;
&lt;span class="c"&gt;# ELB       - Load balancer&lt;/span&gt;
&lt;span class="c"&gt;# CloudFront - CDN&lt;/span&gt;
&lt;span class="c"&gt;# IAM       - User access management&lt;/span&gt;
&lt;span class="c"&gt;# VPC       - Virtual private network&lt;/span&gt;

&lt;span class="c"&gt;# AWS CLI setup&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;awscli
aws configure
&lt;span class="c"&gt;# Enter: Access Key ID, Secret Access Key, Region, Output format&lt;/span&gt;

&lt;span class="c"&gt;# EC2 operations&lt;/span&gt;
aws ec2 describe-instances                          &lt;span class="c"&gt;# List all instances&lt;/span&gt;
aws ec2 start-instances &lt;span class="nt"&gt;--instance-ids&lt;/span&gt; i-1234567    &lt;span class="c"&gt;# Start instance&lt;/span&gt;
aws ec2 stop-instances &lt;span class="nt"&gt;--instance-ids&lt;/span&gt; i-1234567     &lt;span class="c"&gt;# Stop instance&lt;/span&gt;
aws ec2 reboot-instances &lt;span class="nt"&gt;--instance-ids&lt;/span&gt; i-1234567   &lt;span class="c"&gt;# Reboot instance&lt;/span&gt;

&lt;span class="c"&gt;# S3 operations (backups)&lt;/span&gt;
aws s3 &lt;span class="nb"&gt;ls&lt;/span&gt;                                           &lt;span class="c"&gt;# List buckets&lt;/span&gt;
aws s3 &lt;span class="nb"&gt;ls &lt;/span&gt;s3://my-bucket/                          &lt;span class="c"&gt;# List bucket contents&lt;/span&gt;
aws s3 &lt;span class="nb"&gt;cp &lt;/span&gt;backup.tar.gz s3://my-bucket/backups/    &lt;span class="c"&gt;# Upload file&lt;/span&gt;
aws s3 &lt;span class="nb"&gt;sync&lt;/span&gt; /backups/ s3://my-bucket/backups/      &lt;span class="c"&gt;# Sync directory&lt;/span&gt;
aws s3 &lt;span class="nb"&gt;cp &lt;/span&gt;s3://my-bucket/backups/backup.tar.gz ./  &lt;span class="c"&gt;# Download file&lt;/span&gt;

&lt;span class="c"&gt;# SSH to EC2&lt;/span&gt;
ssh &lt;span class="nt"&gt;-i&lt;/span&gt; ~/.ssh/my-key.pem ubuntu@ec2-ip-address
&lt;span class="c"&gt;# Default users: ubuntu (Ubuntu), ec2-user (Amazon Linux), admin (Debian)&lt;/span&gt;

&lt;span class="c"&gt;# Security Groups (AWS firewall)&lt;/span&gt;
&lt;span class="c"&gt;# Configure in AWS Console or CLI:&lt;/span&gt;
aws ec2 authorize-security-group-ingress &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--group-id&lt;/span&gt; sg-12345 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--protocol&lt;/span&gt; tcp &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--port&lt;/span&gt; 22 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--cidr&lt;/span&gt; 203.0.113.0/24
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  DigitalOcean
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Key concepts:&lt;/span&gt;
&lt;span class="c"&gt;# Droplets   - Virtual servers&lt;/span&gt;
&lt;span class="c"&gt;# Spaces     - Object storage (like S3)&lt;/span&gt;
&lt;span class="c"&gt;# Managed DB - Managed databases&lt;/span&gt;
&lt;span class="c"&gt;# Load Balancers, Firewalls, Domains&lt;/span&gt;

&lt;span class="c"&gt;# doctl CLI setup&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;snap &lt;span class="nb"&gt;install &lt;/span&gt;doctl
doctl auth init                         &lt;span class="c"&gt;# Enter API token&lt;/span&gt;

&lt;span class="c"&gt;# Droplet operations&lt;/span&gt;
doctl compute droplet list             &lt;span class="c"&gt;# List all droplets&lt;/span&gt;
doctl compute droplet create my-server &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--size&lt;/span&gt; s-2vcpu-4gb &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--image&lt;/span&gt; ubuntu-22-04-x64 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--region&lt;/span&gt; blr1                       &lt;span class="c"&gt;# Create droplet&lt;/span&gt;

&lt;span class="c"&gt;# Firewall&lt;/span&gt;
doctl compute firewall create &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--name&lt;/span&gt; my-firewall &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--inbound-rules&lt;/span&gt; &lt;span class="s2"&gt;"protocol:tcp,ports:22,address:0.0.0.0/0 protocol:tcp,ports:80,address:0.0.0.0/0 protocol:tcp,ports:443,address:0.0.0.0/0"&lt;/span&gt;

&lt;span class="c"&gt;# Snapshots (backup)&lt;/span&gt;
doctl compute droplet-action snapshot DROPLET_ID &lt;span class="nt"&gt;--snapshot-name&lt;/span&gt; &lt;span class="s2"&gt;"pre-migration-backup"&lt;/span&gt;

&lt;span class="c"&gt;# DigitalOcean console access&lt;/span&gt;
&lt;span class="c"&gt;# Through web console when SSH is locked out&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Azure
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Key services:&lt;/span&gt;
&lt;span class="c"&gt;# Virtual Machines  - Compute&lt;/span&gt;
&lt;span class="c"&gt;# Blob Storage      - Object storage&lt;/span&gt;
&lt;span class="c"&gt;# Azure SQL         - Managed databases&lt;/span&gt;
&lt;span class="c"&gt;# Azure DNS         - DNS management&lt;/span&gt;
&lt;span class="c"&gt;# Azure CDN         - Content delivery&lt;/span&gt;

&lt;span class="c"&gt;# Azure CLI&lt;/span&gt;
curl &lt;span class="nt"&gt;-sL&lt;/span&gt; https://aka.ms/InstallAzureCLIDeb | &lt;span class="nb"&gt;sudo &lt;/span&gt;bash
az login

&lt;span class="c"&gt;# VM operations&lt;/span&gt;
az vm list &lt;span class="nt"&gt;--output&lt;/span&gt; table
az vm start &lt;span class="nt"&gt;--name&lt;/span&gt; myVM &lt;span class="nt"&gt;--resource-group&lt;/span&gt; myRG
az vm stop &lt;span class="nt"&gt;--name&lt;/span&gt; myVM &lt;span class="nt"&gt;--resource-group&lt;/span&gt; myRG
az vm restart &lt;span class="nt"&gt;--name&lt;/span&gt; myVM &lt;span class="nt"&gt;--resource-group&lt;/span&gt; myRG
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  VPS vs Cloud vs Dedicated Servers
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;VPS&lt;/th&gt;
&lt;th&gt;Cloud (AWS/DO/Azure)&lt;/th&gt;
&lt;th&gt;Dedicated&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;Low ($5-50/mo)&lt;/td&gt;
&lt;td&gt;Pay-as-you-go&lt;/td&gt;
&lt;td&gt;High ($100+/mo)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scalability&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Instant scaling&lt;/td&gt;
&lt;td&gt;Hardware limited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance&lt;/td&gt;
&lt;td&gt;Shared resources&lt;/td&gt;
&lt;td&gt;Variable&lt;/td&gt;
&lt;td&gt;Full resources&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Management&lt;/td&gt;
&lt;td&gt;Self-managed&lt;/td&gt;
&lt;td&gt;Managed options&lt;/td&gt;
&lt;td&gt;Self-managed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use case&lt;/td&gt;
&lt;td&gt;Small-medium sites&lt;/td&gt;
&lt;td&gt;Scalable apps&lt;/td&gt;
&lt;td&gt;High-performance&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Interview Q&amp;amp;A: Cloud
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Answer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Difference between VPS and cloud?&lt;/td&gt;
&lt;td&gt;VPS is a fixed virtual server. Cloud is scalable infrastructure (can add/remove resources instantly)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is an EC2 instance?&lt;/td&gt;
&lt;td&gt;AWS virtual server. You choose CPU, RAM, storage, OS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is S3?&lt;/td&gt;
&lt;td&gt;AWS object storage. Unlimited storage for files, backups, static assets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What are Security Groups in AWS?&lt;/td&gt;
&lt;td&gt;Virtual firewall rules for EC2 instances. Control inbound/outbound traffic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How do you access a cloud server?&lt;/td&gt;
&lt;td&gt;SSH with key pair. AWS uses .pem files, DigitalOcean uses SSH keys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is auto-scaling?&lt;/td&gt;
&lt;td&gt;Automatically adds/removes servers based on traffic/load&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  6.2 Cloudflare &amp;amp; CDN
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Cloudflare Setup
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Setup steps:&lt;/span&gt;
&lt;span class="c"&gt;# 1. Create Cloudflare account&lt;/span&gt;
&lt;span class="c"&gt;# 2. Add your domain&lt;/span&gt;
&lt;span class="c"&gt;# 3. Change nameservers at domain registrar to Cloudflare NS&lt;/span&gt;
&lt;span class="c"&gt;# 4. Configure DNS records in Cloudflare dashboard&lt;/span&gt;

&lt;span class="c"&gt;# Cloudflare provides:&lt;/span&gt;
&lt;span class="c"&gt;# - CDN (cache static files at edge locations)&lt;/span&gt;
&lt;span class="c"&gt;# - DDoS protection&lt;/span&gt;
&lt;span class="c"&gt;# - WAF (Web Application Firewall)&lt;/span&gt;
&lt;span class="c"&gt;# - Free SSL (Flexible, Full, Full Strict)&lt;/span&gt;
&lt;span class="c"&gt;# - DNS management&lt;/span&gt;
&lt;span class="c"&gt;# - Page Rules&lt;/span&gt;
&lt;span class="c"&gt;# - Caching Rules&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Cloudflare SSL Modes
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;When to use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Off&lt;/td&gt;
&lt;td&gt;No SSL&lt;/td&gt;
&lt;td&gt;Never&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flexible&lt;/td&gt;
&lt;td&gt;HTTPS browser→CF, HTTP CF→server&lt;/td&gt;
&lt;td&gt;No SSL on origin (not recommended)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;td&gt;HTTPS everywhere, self-signed OK&lt;/td&gt;
&lt;td&gt;Self-signed cert on origin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full (Strict)&lt;/td&gt;
&lt;td&gt;HTTPS everywhere, valid cert required&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Recommended&lt;/strong&gt; with Let's Encrypt&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Cloudflare Configuration Tips
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Page Rules examples:&lt;/span&gt;
&lt;span class="c"&gt;# Force HTTPS: URL pattern *.example.com/* → Always Use HTTPS&lt;/span&gt;
&lt;span class="c"&gt;# Cache everything: URL pattern *.example.com/static/* → Cache Level: Cache Everything&lt;/span&gt;

&lt;span class="c"&gt;# Common Cloudflare DNS settings:&lt;/span&gt;
&lt;span class="c"&gt;# Type | Name | Value           | Proxy Status&lt;/span&gt;
&lt;span class="c"&gt;# A    | @    | YOUR_SERVER_IP  | Proxied (orange cloud)&lt;/span&gt;
&lt;span class="c"&gt;# A    | www  | YOUR_SERVER_IP  | Proxied (orange cloud)&lt;/span&gt;
&lt;span class="c"&gt;# A    | api  | YOUR_SERVER_IP  | DNS only (grey cloud - for websockets/SSH)&lt;/span&gt;

&lt;span class="c"&gt;# Getting real visitor IP behind Cloudflare (Nginx)&lt;/span&gt;
&lt;span class="c"&gt;# Install ngx_http_realip_module, then:&lt;/span&gt;
set_real_ip_from 173.245.48.0/20&lt;span class="p"&gt;;&lt;/span&gt;
set_real_ip_from 103.21.244.0/22&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c"&gt;# ... (add all Cloudflare IP ranges)&lt;/span&gt;
real_ip_header CF-Connecting-IP&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c"&gt;# Apache: Install mod_remoteip&lt;/span&gt;
RemoteIPHeader CF-Connecting-IP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Interview Q&amp;amp;A: CDN
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Answer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;What is a CDN?&lt;/td&gt;
&lt;td&gt;Content Delivery Network. Caches content at edge servers globally for faster delivery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What does Cloudflare do?&lt;/td&gt;
&lt;td&gt;CDN, DDoS protection, WAF, DNS, SSL, performance optimization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is "Full (Strict)" SSL?&lt;/td&gt;
&lt;td&gt;Encrypts traffic end-to-end and requires a valid SSL certificate on the origin server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How do you see the real client IP behind Cloudflare?&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;CF-Connecting-IP&lt;/code&gt; header. Configure &lt;code&gt;real_ip_header&lt;/code&gt; in Nginx or &lt;code&gt;mod_remoteip&lt;/code&gt; in Apache&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How to bypass Cloudflare for debugging?&lt;/td&gt;
&lt;td&gt;Use DNS-only mode (grey cloud) or add server IP to local hosts file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What are Cloudflare Page Rules?&lt;/td&gt;
&lt;td&gt;URL-based rules for caching, redirects, SSL mode, and other behavior per URL pattern&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  6.3 Docker &amp;amp; Containerization
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Docker Basics
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install Docker&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://get.docker.com &lt;span class="nt"&gt;-o&lt;/span&gt; get-docker.sh
&lt;span class="nb"&gt;sudo &lt;/span&gt;sh get-docker.sh
&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; docker &lt;span class="nv"&gt;$USER&lt;/span&gt;         &lt;span class="c"&gt;# Add user to docker group&lt;/span&gt;
&lt;span class="c"&gt;# Log out and log back in&lt;/span&gt;

&lt;span class="c"&gt;# Docker commands&lt;/span&gt;
docker ps                              &lt;span class="c"&gt;# List running containers&lt;/span&gt;
docker ps &lt;span class="nt"&gt;-a&lt;/span&gt;                           &lt;span class="c"&gt;# List all containers (including stopped)&lt;/span&gt;
docker images                          &lt;span class="c"&gt;# List images&lt;/span&gt;
docker pull nginx                      &lt;span class="c"&gt;# Download image&lt;/span&gt;
docker pull php:8.2-fpm                &lt;span class="c"&gt;# Specific version&lt;/span&gt;

&lt;span class="c"&gt;# Run containers&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; my-nginx &lt;span class="nt"&gt;-p&lt;/span&gt; 80:80 nginx          &lt;span class="c"&gt;# Run Nginx&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; my-mysql &lt;span class="nt"&gt;-p&lt;/span&gt; 3306:3306 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;secret &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-v&lt;/span&gt; mysql_data:/var/lib/mysql mysql:8.0              &lt;span class="c"&gt;# Run MySQL with volume&lt;/span&gt;

&lt;span class="c"&gt;# Container management&lt;/span&gt;
docker start container_name
docker stop container_name
docker restart container_name
docker &lt;span class="nb"&gt;rm &lt;/span&gt;container_name               &lt;span class="c"&gt;# Remove stopped container&lt;/span&gt;
docker &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; container_name            &lt;span class="c"&gt;# Force remove running container&lt;/span&gt;
docker logs container_name             &lt;span class="c"&gt;# View logs&lt;/span&gt;
docker logs &lt;span class="nt"&gt;-f&lt;/span&gt; container_name          &lt;span class="c"&gt;# Follow logs&lt;/span&gt;
docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; container_name bash    &lt;span class="c"&gt;# Shell into container&lt;/span&gt;
docker inspect container_name          &lt;span class="c"&gt;# Detailed info&lt;/span&gt;

&lt;span class="c"&gt;# Clean up&lt;/span&gt;
docker system prune &lt;span class="nt"&gt;-a&lt;/span&gt;                 &lt;span class="c"&gt;# Remove unused images, containers, networks&lt;/span&gt;
docker volume prune                    &lt;span class="c"&gt;# Remove unused volumes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Docker Compose (Multi-Container Apps)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# docker-compose.yml&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;nginx&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx:latest&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;80:80"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;443:443"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./nginx.conf:/etc/nginx/nginx.conf&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./html:/var/www/html&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;php&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;

  &lt;span class="na"&gt;php&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;php:8.2-fpm&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./html:/var/www/html&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;

  &lt;span class="na"&gt;mysql&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mysql:8.0&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;secret&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_DATABASE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myapp&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;appuser&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apppassword&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;mysql_data:/var/lib/mysql&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3306:3306"&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;

  &lt;span class="na"&gt;redis&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis:alpine&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;6379:6379"&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;mysql_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Docker Compose commands&lt;/span&gt;
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;                   &lt;span class="c"&gt;# Start all services&lt;/span&gt;
docker compose down                    &lt;span class="c"&gt;# Stop all services&lt;/span&gt;
docker compose restart                 &lt;span class="c"&gt;# Restart all services&lt;/span&gt;
docker compose logs                    &lt;span class="c"&gt;# View all logs&lt;/span&gt;
docker compose logs &lt;span class="nt"&gt;-f&lt;/span&gt; php             &lt;span class="c"&gt;# Follow specific service logs&lt;/span&gt;
docker compose &lt;span class="nb"&gt;exec &lt;/span&gt;php bash           &lt;span class="c"&gt;# Shell into specific service&lt;/span&gt;
docker compose ps                      &lt;span class="c"&gt;# List services&lt;/span&gt;
docker compose pull                    &lt;span class="c"&gt;# Pull latest images&lt;/span&gt;
docker compose build                   &lt;span class="c"&gt;# Build images (if using Dockerfile)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Dockerfile (Custom Image)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Dockerfile&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; php:8.2-fpm&lt;/span&gt;

&lt;span class="c"&gt;# Install extensions&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;docker-php-ext-install pdo pdo_mysql mysqli mbstring

&lt;span class="c"&gt;# Install additional tools&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    curl &lt;span class="se"&gt;\
&lt;/span&gt;    zip &lt;span class="se"&gt;\
&lt;/span&gt;    unzip &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /var/lib/apt/lists/&lt;span class="k"&gt;*&lt;/span&gt;

&lt;span class="c"&gt;# Install Composer&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=composer:latest /usr/bin/composer /usr/bin/composer&lt;/span&gt;

&lt;span class="c"&gt;# Copy application&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . /var/www/html&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /var/www/html&lt;/span&gt;

&lt;span class="c"&gt;# Set permissions&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; www-data:www-data /var/www/html

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 9000&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["php-fpm"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Interview Q&amp;amp;A: Docker
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Answer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;What is Docker?&lt;/td&gt;
&lt;td&gt;Platform for building, shipping, and running apps in containers. Lightweight isolated environments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Container vs VM?&lt;/td&gt;
&lt;td&gt;Container shares host kernel (lightweight, fast). VM has its own kernel (heavier, more isolation)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is Docker Compose?&lt;/td&gt;
&lt;td&gt;Tool for defining multi-container apps in YAML. Start all services with one command&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is a volume?&lt;/td&gt;
&lt;td&gt;Persistent storage for containers. Data survives container restarts/deletion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How to debug a container?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;docker logs&lt;/code&gt;, &lt;code&gt;docker exec -it container bash&lt;/code&gt;, &lt;code&gt;docker inspect&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is a Dockerfile?&lt;/td&gt;
&lt;td&gt;Blueprint for building a custom Docker image. Defines base image, dependencies, files, commands&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  6.4 Git &amp;amp; GitHub
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Git Basics for Server Admin
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install Git&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;git

&lt;span class="c"&gt;# Configure Git&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.name &lt;span class="s2"&gt;"Your Name"&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.email &lt;span class="s2"&gt;"your@email.com"&lt;/span&gt;

&lt;span class="c"&gt;# Clone repository&lt;/span&gt;
git clone https://github.com/company/website.git
git clone git@github.com:company/website.git         &lt;span class="c"&gt;# SSH (preferred for deployments)&lt;/span&gt;

&lt;span class="c"&gt;# Basic workflow&lt;/span&gt;
git status                             &lt;span class="c"&gt;# Check changes&lt;/span&gt;
git pull origin main                   &lt;span class="c"&gt;# Pull latest changes&lt;/span&gt;
git add &lt;span class="nb"&gt;.&lt;/span&gt;                              &lt;span class="c"&gt;# Stage all changes&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Fix: update config"&lt;/span&gt;     &lt;span class="c"&gt;# Commit&lt;/span&gt;
git push origin main                   &lt;span class="c"&gt;# Push changes&lt;/span&gt;

&lt;span class="c"&gt;# Branches&lt;/span&gt;
git branch                             &lt;span class="c"&gt;# List branches&lt;/span&gt;
git branch &lt;span class="nt"&gt;-a&lt;/span&gt;                          &lt;span class="c"&gt;# List all (including remote)&lt;/span&gt;
git checkout main                      &lt;span class="c"&gt;# Switch to main&lt;/span&gt;
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; feature/new-feature    &lt;span class="c"&gt;# Create and switch to new branch&lt;/span&gt;
git merge feature/new-feature          &lt;span class="c"&gt;# Merge branch into current&lt;/span&gt;
git branch &lt;span class="nt"&gt;-d&lt;/span&gt; feature/new-feature      &lt;span class="c"&gt;# Delete branch&lt;/span&gt;

&lt;span class="c"&gt;# View history&lt;/span&gt;
git log &lt;span class="nt"&gt;--oneline&lt;/span&gt; &lt;span class="nt"&gt;-10&lt;/span&gt;                  &lt;span class="c"&gt;# Last 10 commits&lt;/span&gt;
git log &lt;span class="nt"&gt;--oneline&lt;/span&gt; &lt;span class="nt"&gt;--graph&lt;/span&gt;              &lt;span class="c"&gt;# Visual branch history&lt;/span&gt;
git diff                               &lt;span class="c"&gt;# View unstaged changes&lt;/span&gt;
git diff &lt;span class="nt"&gt;--cached&lt;/span&gt;                      &lt;span class="c"&gt;# View staged changes&lt;/span&gt;

&lt;span class="c"&gt;# Stash changes&lt;/span&gt;
git stash                              &lt;span class="c"&gt;# Save changes temporarily&lt;/span&gt;
git stash pop                          &lt;span class="c"&gt;# Restore stashed changes&lt;/span&gt;

&lt;span class="c"&gt;# Undo changes&lt;/span&gt;
git checkout &lt;span class="nt"&gt;--&lt;/span&gt; file.txt               &lt;span class="c"&gt;# Discard file changes&lt;/span&gt;
git reset &lt;span class="nt"&gt;--hard&lt;/span&gt; HEAD                  &lt;span class="c"&gt;# Discard ALL uncommitted changes&lt;/span&gt;
git revert abc1234                     &lt;span class="c"&gt;# Create new commit that undoes a commit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Deployment Workflows
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Simple Git Pull Deployment (basic)&lt;/span&gt;
&lt;span class="c"&gt;# On server:&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; /var/www/html
git pull origin main
&lt;span class="c"&gt;# Fix permissions, restart services if needed&lt;/span&gt;

&lt;span class="c"&gt;# Deploy Script (/usr/local/bin/deploy.sh)&lt;/span&gt;
&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt;

&lt;span class="nv"&gt;APP_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/var/www/html"&lt;/span&gt;
&lt;span class="nv"&gt;BRANCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"main"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Starting deployment..."&lt;/span&gt;

&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$APP_DIR&lt;/span&gt;

&lt;span class="c"&gt;# Pull latest code&lt;/span&gt;
git fetch origin
git reset &lt;span class="nt"&gt;--hard&lt;/span&gt; origin/&lt;span class="nv"&gt;$BRANCH&lt;/span&gt;

&lt;span class="c"&gt;# Install dependencies&lt;/span&gt;
composer &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-dev&lt;/span&gt; &lt;span class="nt"&gt;--optimize-autoloader&lt;/span&gt;  &lt;span class="c"&gt;# PHP&lt;/span&gt;
&lt;span class="c"&gt;# OR&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--production&lt;/span&gt;                          &lt;span class="c"&gt;# Node.js&lt;/span&gt;

&lt;span class="c"&gt;# Build assets (if applicable)&lt;/span&gt;
npm run build

&lt;span class="c"&gt;# Clear caches&lt;/span&gt;
php artisan cache:clear                           &lt;span class="c"&gt;# Laravel&lt;/span&gt;
php artisan config:cache
php artisan route:cache
php artisan view:cache

&lt;span class="c"&gt;# Run migrations&lt;/span&gt;
php artisan migrate &lt;span class="nt"&gt;--force&lt;/span&gt;

&lt;span class="c"&gt;# Fix permissions&lt;/span&gt;
&lt;span class="nb"&gt;chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; www-data:www-data &lt;span class="nv"&gt;$APP_DIR&lt;/span&gt;
&lt;span class="nb"&gt;chmod&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; 755 &lt;span class="nv"&gt;$APP_DIR&lt;/span&gt;

&lt;span class="c"&gt;# Restart services&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reload php8.2-fpm
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reload nginx

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Deployment complete!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  SSH Keys for GitHub (Server Deployment)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Generate deploy key on server&lt;/span&gt;
ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"server-deploy-key"&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; ~/.ssh/github_deploy

&lt;span class="c"&gt;# Add public key to GitHub repo → Settings → Deploy Keys&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/github_deploy.pub

&lt;span class="c"&gt;# Configure SSH to use this key for GitHub&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.ssh/config &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/github_deploy
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# Test connection&lt;/span&gt;
ssh &lt;span class="nt"&gt;-T&lt;/span&gt; git@github.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6.5 Deploying Python &amp;amp; Node.js Applications
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Python (Flask/Django) Deployment
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install Python&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;python3 python3-pip python3-venv

&lt;span class="c"&gt;# Create virtual environment&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; /var/www/myapp
python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv venv
&lt;span class="nb"&gt;source &lt;/span&gt;venv/bin/activate

&lt;span class="c"&gt;# Install dependencies&lt;/span&gt;
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="c"&gt;# Install Gunicorn (WSGI server)&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;gunicorn

&lt;span class="c"&gt;# Test run&lt;/span&gt;
gunicorn &lt;span class="nt"&gt;--bind&lt;/span&gt; 0.0.0.0:8000 app:app                &lt;span class="c"&gt;# Flask&lt;/span&gt;
gunicorn &lt;span class="nt"&gt;--bind&lt;/span&gt; 0.0.0.0:8000 myproject.wsgi:application  &lt;span class="c"&gt;# Django&lt;/span&gt;

&lt;span class="c"&gt;# Create systemd service&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/systemd/system/myapp.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[Unit]&lt;/span&gt;
&lt;span class="py"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;My Python Application&lt;/span&gt;
&lt;span class="py"&gt;After&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;network.target&lt;/span&gt;

&lt;span class="nn"&gt;[Service]&lt;/span&gt;
&lt;span class="py"&gt;User&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;www-data&lt;/span&gt;
&lt;span class="py"&gt;Group&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;www-data&lt;/span&gt;
&lt;span class="py"&gt;WorkingDirectory&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/var/www/myapp&lt;/span&gt;
&lt;span class="py"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"PATH=/var/www/myapp/venv/bin"&lt;/span&gt;
&lt;span class="py"&gt;ExecStart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/var/www/myapp/venv/bin/gunicorn --workers 3 --bind unix:myapp.sock app:app&lt;/span&gt;
&lt;span class="py"&gt;Restart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;always&lt;/span&gt;
&lt;span class="py"&gt;RestartSec&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;5&lt;/span&gt;

&lt;span class="nn"&gt;[Install]&lt;/span&gt;
&lt;span class="py"&gt;WantedBy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;multi-user.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start myapp
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;myapp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Nginx config for Python app&lt;/span&gt;
&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;myapp.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://unix:/var/www/myapp/myapp.sock&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Real-IP&lt;/span&gt; &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt; &lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/static&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;alias&lt;/span&gt; &lt;span class="n"&gt;/var/www/myapp/static&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Node.js Deployment
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install Node.js (using nvm - recommended)&lt;/span&gt;
curl &lt;span class="nt"&gt;-o-&lt;/span&gt; https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
nvm &lt;span class="nb"&gt;install &lt;/span&gt;20                         &lt;span class="c"&gt;# Install Node.js 20 LTS&lt;/span&gt;
nvm use 20

&lt;span class="c"&gt;# OR via apt&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://deb.nodesource.com/setup_20.x | &lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; bash -
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;nodejs

&lt;span class="c"&gt;# Deploy app&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; /var/www/nodeapp
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--production&lt;/span&gt;
npm run build                          &lt;span class="c"&gt;# If build step needed&lt;/span&gt;

&lt;span class="c"&gt;# Process Manager - PM2 (recommended for production)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; pm2

pm2 start app.js &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"my-app"&lt;/span&gt;       &lt;span class="c"&gt;# Start app&lt;/span&gt;
pm2 start npm &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"my-app"&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; start &lt;span class="c"&gt;# Start with npm start&lt;/span&gt;
pm2 list                               &lt;span class="c"&gt;# List all apps&lt;/span&gt;
pm2 logs                               &lt;span class="c"&gt;# View logs&lt;/span&gt;
pm2 restart my-app                     &lt;span class="c"&gt;# Restart&lt;/span&gt;
pm2 stop my-app                        &lt;span class="c"&gt;# Stop&lt;/span&gt;
pm2 delete my-app                      &lt;span class="c"&gt;# Remove&lt;/span&gt;
pm2 monit                              &lt;span class="c"&gt;# Real-time monitoring&lt;/span&gt;

&lt;span class="c"&gt;# PM2 auto-start on reboot&lt;/span&gt;
pm2 startup                            &lt;span class="c"&gt;# Generate startup script&lt;/span&gt;
pm2 save                               &lt;span class="c"&gt;# Save current process list&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Nginx config for Node.js&lt;/span&gt;
&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;nodeapp.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://127.0.0.1:3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_http_version&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Upgrade&lt;/span&gt; &lt;span class="nv"&gt;$http_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Connection&lt;/span&gt; &lt;span class="s"&gt;'upgrade'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Real-IP&lt;/span&gt; &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_cache_bypass&lt;/span&gt; &lt;span class="nv"&gt;$http_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6.6 Redis &amp;amp; Elasticsearch
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Redis
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install Redis&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;redis-server

&lt;span class="c"&gt;# Configure&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/redis/redis.conf
&lt;span class="c"&gt;# Key settings:&lt;/span&gt;
&lt;span class="c"&gt;# bind 127.0.0.1               # Listen on localhost only&lt;/span&gt;
&lt;span class="c"&gt;# requirepass YourStrongPassword # Set password&lt;/span&gt;
&lt;span class="c"&gt;# maxmemory 256mb               # Max memory usage&lt;/span&gt;
&lt;span class="c"&gt;# maxmemory-policy allkeys-lru  # Eviction policy&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart redis
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;redis

&lt;span class="c"&gt;# Redis CLI&lt;/span&gt;
redis-cli
redis-cli &lt;span class="nt"&gt;-a&lt;/span&gt; YourPassword          &lt;span class="c"&gt;# With password&lt;/span&gt;

&lt;span class="c"&gt;# Basic commands&lt;/span&gt;
redis-cli ping                      &lt;span class="c"&gt;# Test connection → PONG&lt;/span&gt;
redis-cli INFO                      &lt;span class="c"&gt;# Server info&lt;/span&gt;
redis-cli INFO memory               &lt;span class="c"&gt;# Memory usage&lt;/span&gt;
redis-cli DBSIZE                    &lt;span class="c"&gt;# Number of keys&lt;/span&gt;
redis-cli FLUSHALL                  &lt;span class="c"&gt;# Clear all data (CAREFUL!)&lt;/span&gt;
redis-cli MONITOR                   &lt;span class="c"&gt;# Real-time command monitoring&lt;/span&gt;

&lt;span class="c"&gt;# Key operations&lt;/span&gt;
redis-cli SET mykey &lt;span class="s2"&gt;"Hello"&lt;/span&gt;
redis-cli GET mykey
redis-cli DEL mykey
redis-cli KEYS &lt;span class="s2"&gt;"*"&lt;/span&gt;                  &lt;span class="c"&gt;# List all keys (don't use in production)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Elasticsearch
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install Elasticsearch&lt;/span&gt;
wget &lt;span class="nt"&gt;-qO&lt;/span&gt; - https://artifacts.elastic.co/GPG-KEY-elasticsearch | &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-key add -
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"deb https://artifacts.elastic.co/packages/8.x/apt stable main"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/elastic-8.x.list
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;elasticsearch

&lt;span class="c"&gt;# Configure&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/elasticsearch/elasticsearch.yml
&lt;span class="c"&gt;# Key settings:&lt;/span&gt;
&lt;span class="c"&gt;# cluster.name: my-cluster&lt;/span&gt;
&lt;span class="c"&gt;# node.name: node-1&lt;/span&gt;
&lt;span class="c"&gt;# network.host: 127.0.0.1&lt;/span&gt;
&lt;span class="c"&gt;# http.port: 9200&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start elasticsearch
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;elasticsearch

&lt;span class="c"&gt;# Test&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; GET &lt;span class="s2"&gt;"localhost:9200"&lt;/span&gt;          &lt;span class="c"&gt;# Check cluster health&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; GET &lt;span class="s2"&gt;"localhost:9200/_cluster/health?pretty"&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; GET &lt;span class="s2"&gt;"localhost:9200/_cat/indices?v"&lt;/span&gt;    &lt;span class="c"&gt;# List indices&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6.7 CI/CD &amp;amp; Automated Deployment
&lt;/h2&gt;

&lt;h3&gt;
  
  
  GitHub Actions (Simple CI/CD)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# .github/workflows/deploy.yml&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy to Production&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy to server&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;appleboy/ssh-action@master&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SERVER_HOST }}&lt;/span&gt;
          &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SERVER_USER }}&lt;/span&gt;
          &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_PRIVATE_KEY }}&lt;/span&gt;
          &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;cd /var/www/html&lt;/span&gt;
            &lt;span class="s"&gt;git pull origin main&lt;/span&gt;
            &lt;span class="s"&gt;composer install --no-dev&lt;/span&gt;
            &lt;span class="s"&gt;php artisan migrate --force&lt;/span&gt;
            &lt;span class="s"&gt;php artisan cache:clear&lt;/span&gt;
            &lt;span class="s"&gt;sudo systemctl reload php8.2-fpm&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Webhook-Based Deployment
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Simple webhook server for auto-deploy on git push&lt;/span&gt;
&lt;span class="c"&gt;# Install webhook tool&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;webhook

&lt;span class="c"&gt;# /etc/webhook.conf&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;
  &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"id"&lt;/span&gt;: &lt;span class="s2"&gt;"deploy"&lt;/span&gt;,
    &lt;span class="s2"&gt;"execute-command"&lt;/span&gt;: &lt;span class="s2"&gt;"/usr/local/bin/deploy.sh"&lt;/span&gt;,
    &lt;span class="s2"&gt;"command-working-directory"&lt;/span&gt;: &lt;span class="s2"&gt;"/var/www/html"&lt;/span&gt;,
    &lt;span class="s2"&gt;"pass-arguments-to-command"&lt;/span&gt;: &lt;span class="o"&gt;[]&lt;/span&gt;,
    &lt;span class="s2"&gt;"trigger-rule"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"match"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"type"&lt;/span&gt;: &lt;span class="s2"&gt;"value"&lt;/span&gt;,
        &lt;span class="s2"&gt;"value"&lt;/span&gt;: &lt;span class="s2"&gt;"your-webhook-secret"&lt;/span&gt;,
        &lt;span class="s2"&gt;"parameter"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"source"&lt;/span&gt;: &lt;span class="s2"&gt;"header"&lt;/span&gt;,
          &lt;span class="s2"&gt;"name"&lt;/span&gt;: &lt;span class="s2"&gt;"X-Hub-Signature"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6.8 Monitoring Tools (Grafana, Prometheus, Zabbix)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Quick Overview
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Key Feature&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prometheus&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Metrics collection &amp;amp; storage&lt;/td&gt;
&lt;td&gt;Pull-based, time-series DB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Grafana&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Visualization &amp;amp; dashboards&lt;/td&gt;
&lt;td&gt;Beautiful graphs, alerts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Zabbix&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full monitoring platform&lt;/td&gt;
&lt;td&gt;All-in-one, agent-based&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nagios&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Infrastructure monitoring&lt;/td&gt;
&lt;td&gt;Alerting, legacy but stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Netdata&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Real-time monitoring&lt;/td&gt;
&lt;td&gt;Zero config, instant dashboards&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Prometheus + Grafana Stack (Most Popular)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install Node Exporter (on each server to monitor)&lt;/span&gt;
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
&lt;span class="nb"&gt;tar &lt;/span&gt;xvfz node_exporter-&lt;span class="k"&gt;*&lt;/span&gt;.tar.gz
&lt;span class="nb"&gt;sudo mv &lt;/span&gt;node_exporter-&lt;span class="k"&gt;*&lt;/span&gt;/node_exporter /usr/local/bin/

&lt;span class="c"&gt;# Create systemd service&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/systemd/system/node_exporter.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[Unit]&lt;/span&gt;
&lt;span class="py"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Node Exporter&lt;/span&gt;
&lt;span class="py"&gt;After&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;network.target&lt;/span&gt;

&lt;span class="nn"&gt;[Service]&lt;/span&gt;
&lt;span class="py"&gt;User&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;nobody&lt;/span&gt;
&lt;span class="py"&gt;ExecStart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/local/bin/node_exporter&lt;/span&gt;
&lt;span class="py"&gt;Restart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;always&lt;/span&gt;

&lt;span class="nn"&gt;[Install]&lt;/span&gt;
&lt;span class="py"&gt;WantedBy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;multi-user.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start node_exporter
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;node_exporter
&lt;span class="c"&gt;# Metrics available at http://server:9100/metrics&lt;/span&gt;

&lt;span class="c"&gt;# Install Grafana&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; apt-transport-https software-properties-common
wget &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="nt"&gt;-O&lt;/span&gt; - https://packages.grafana.com/gpg.key | &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-key add -
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"deb https://packages.grafana.com/oss/deb stable main"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/grafana.list
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;grafana
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start grafana-server
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;grafana-server
&lt;span class="c"&gt;# Access Grafana at http://server:3000 (default: admin/admin)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Quick Monitoring with Netdata (Easiest)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# One-line install&lt;/span&gt;
bash &amp;lt;&lt;span class="o"&gt;(&lt;/span&gt;curl &lt;span class="nt"&gt;-Ss&lt;/span&gt; https://my-netdata.io/kickstart.sh&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="c"&gt;# Dashboard available at http://server:19999&lt;/span&gt;
&lt;span class="c"&gt;# Real-time CPU, RAM, disk, network, processes - zero config&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6.9 Disaster Recovery
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Disaster Recovery Plan
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;1.&lt;/span&gt; DOCUMENT EVERYTHING
&lt;span class="p"&gt;   -&lt;/span&gt; Server IPs, hostnames, OS versions
&lt;span class="p"&gt;   -&lt;/span&gt; All software versions and configurations
&lt;span class="p"&gt;   -&lt;/span&gt; DNS records for all domains
&lt;span class="p"&gt;   -&lt;/span&gt; Database credentials
&lt;span class="p"&gt;   -&lt;/span&gt; SSL certificate details
&lt;span class="p"&gt;   -&lt;/span&gt; Contact info for providers
&lt;span class="p"&gt;
2.&lt;/span&gt; BACKUP STRATEGY (3-2-1 Rule)
&lt;span class="p"&gt;   -&lt;/span&gt; 3 copies of all critical data
&lt;span class="p"&gt;   -&lt;/span&gt; 2 different storage types (local + cloud)
&lt;span class="p"&gt;   -&lt;/span&gt; 1 offsite copy (different region/provider)
&lt;span class="p"&gt;
3.&lt;/span&gt; AUTOMATED BACKUPS
&lt;span class="p"&gt;   -&lt;/span&gt; Daily database backups (retained 30 days)
&lt;span class="p"&gt;   -&lt;/span&gt; Weekly full server backups (retained 3 months)
&lt;span class="p"&gt;   -&lt;/span&gt; Real-time replication for critical databases
&lt;span class="p"&gt;
4.&lt;/span&gt; RECOVERY PROCEDURES
&lt;span class="p"&gt;   -&lt;/span&gt; Document step-by-step recovery for each service
&lt;span class="p"&gt;   -&lt;/span&gt; Test recovery quarterly
&lt;span class="p"&gt;   -&lt;/span&gt; Maintain runbooks for common failure scenarios
&lt;span class="p"&gt;
5.&lt;/span&gt; MONITORING &amp;amp; ALERTS
&lt;span class="p"&gt;   -&lt;/span&gt; Uptime monitoring (UptimeRobot, Pingdom)
&lt;span class="p"&gt;   -&lt;/span&gt; Resource alerts (CPU &amp;gt; 80%, disk &amp;gt; 90%, RAM &amp;gt; 85%)
&lt;span class="p"&gt;   -&lt;/span&gt; SSL expiry alerts (30 days before)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Recovery Commands Quick Reference
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Server won't boot → Use provider's console/recovery mode&lt;/span&gt;

&lt;span class="c"&gt;# Restore from backup&lt;/span&gt;
&lt;span class="c"&gt;# 1. Provision new server&lt;/span&gt;
&lt;span class="c"&gt;# 2. Install same software stack&lt;/span&gt;
&lt;span class="c"&gt;# 3. Restore files from backup&lt;/span&gt;
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xzf&lt;/span&gt; www_backup.tar.gz &lt;span class="nt"&gt;-C&lt;/span&gt; /var/www/
&lt;span class="c"&gt;# 4. Restore databases&lt;/span&gt;
&lt;span class="nb"&gt;gunzip&lt;/span&gt; &amp;lt; all_databases.sql.gz | mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt;
&lt;span class="c"&gt;# 5. Restore configurations&lt;/span&gt;
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xzf&lt;/span&gt; configs.tar.gz &lt;span class="nt"&gt;-C&lt;/span&gt; /etc/
&lt;span class="c"&gt;# 6. Fix permissions&lt;/span&gt;
&lt;span class="nb"&gt;chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; www-data:www-data /var/www/
&lt;span class="c"&gt;# 7. Restart all services&lt;/span&gt;
systemctl restart nginx php8.2-fpm mysql
&lt;span class="c"&gt;# 8. Update DNS if IP changed&lt;/span&gt;
&lt;span class="c"&gt;# 9. Verify SSL certificates&lt;/span&gt;
&lt;span class="c"&gt;# 10. Test all websites and services&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6.10 Handling High-Traffic Infrastructure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Performance optimization checklist for high traffic:&lt;/span&gt;

&lt;span class="c"&gt;# 1. Enable caching&lt;/span&gt;
&lt;span class="c"&gt;# - OPcache for PHP (bytecode caching)&lt;/span&gt;
&lt;span class="c"&gt;# - Redis/Memcached for application caching&lt;/span&gt;
&lt;span class="c"&gt;# - Nginx fastcgi_cache or proxy_cache&lt;/span&gt;
&lt;span class="c"&gt;# - Cloudflare CDN for static assets&lt;/span&gt;

&lt;span class="c"&gt;# 2. Optimize Nginx for high traffic&lt;/span&gt;
worker_processes auto&lt;span class="p"&gt;;&lt;/span&gt;
worker_connections 4096&lt;span class="p"&gt;;&lt;/span&gt;
multi_accept on&lt;span class="p"&gt;;&lt;/span&gt;
use epoll&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c"&gt;# 3. PHP-FPM tuning&lt;/span&gt;
pm &lt;span class="o"&gt;=&lt;/span&gt; static                            &lt;span class="c"&gt;# Or dynamic for variable traffic&lt;/span&gt;
pm.max_children &lt;span class="o"&gt;=&lt;/span&gt; 100                   &lt;span class="c"&gt;# Based on available RAM&lt;/span&gt;
&lt;span class="c"&gt;# Formula: max_children = (Total RAM - Other Services RAM) / PHP avg memory&lt;/span&gt;

&lt;span class="c"&gt;# 4. MySQL optimization&lt;/span&gt;
innodb_buffer_pool_size &lt;span class="o"&gt;=&lt;/span&gt; 4G           &lt;span class="c"&gt;# 60-70% of RAM for dedicated DB&lt;/span&gt;
innodb_log_file_size &lt;span class="o"&gt;=&lt;/span&gt; 512M
max_connections &lt;span class="o"&gt;=&lt;/span&gt; 500
query_cache_type &lt;span class="o"&gt;=&lt;/span&gt; 0                   &lt;span class="c"&gt;# Disabled in MySQL 8.0&lt;/span&gt;

&lt;span class="c"&gt;# 5. OS-level tuning&lt;/span&gt;
&lt;span class="c"&gt;# /etc/sysctl.conf&lt;/span&gt;
net.core.somaxconn &lt;span class="o"&gt;=&lt;/span&gt; 65535
net.core.netdev_max_backlog &lt;span class="o"&gt;=&lt;/span&gt; 65535
net.ipv4.tcp_max_syn_backlog &lt;span class="o"&gt;=&lt;/span&gt; 65535
fs.file-max &lt;span class="o"&gt;=&lt;/span&gt; 65535

&lt;span class="c"&gt;# Apply: sysctl -p&lt;/span&gt;

&lt;span class="c"&gt;# 6. Connection pooling&lt;/span&gt;
&lt;span class="c"&gt;# Use ProxySQL or PgBouncer for database connection pooling&lt;/span&gt;

&lt;span class="c"&gt;# 7. Horizontal scaling&lt;/span&gt;
&lt;span class="c"&gt;# Load balancer (Nginx, HAProxy, AWS ELB) distributing traffic&lt;/span&gt;
&lt;span class="c"&gt;# Multiple app servers behind load balancer&lt;/span&gt;
&lt;span class="c"&gt;# Read replicas for database&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Interview Q&amp;amp;A: Preferred Skills
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Answer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Docker vs VM?&lt;/td&gt;
&lt;td&gt;Docker: lightweight, shares kernel, fast startup. VM: full OS, more isolation, heavier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is PM2?&lt;/td&gt;
&lt;td&gt;Node.js process manager. Auto-restarts, clustering, log management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is Gunicorn?&lt;/td&gt;
&lt;td&gt;Python WSGI HTTP server. Runs Python apps, manages worker processes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Git pull vs Git fetch?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;pull&lt;/code&gt; = fetch + merge (updates working code). &lt;code&gt;fetch&lt;/code&gt; = download changes only (doesn't change files)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is Redis used for?&lt;/td&gt;
&lt;td&gt;In-memory cache, session storage, queues, real-time data. Very fast&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is CI/CD?&lt;/td&gt;
&lt;td&gt;Continuous Integration (auto test) / Continuous Deployment (auto deploy). Automates the release pipeline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How to handle sudden traffic spike?&lt;/td&gt;
&lt;td&gt;Scale vertically (bigger server), scale horizontally (more servers + load balancer), enable caching, use CDN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is Prometheus?&lt;/td&gt;
&lt;td&gt;Open-source monitoring system. Collects metrics via HTTP pull model, stores in time-series DB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is Grafana?&lt;/td&gt;
&lt;td&gt;Visualization platform. Creates dashboards from Prometheus/other data sources&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>cloud</category>
      <category>docker</category>
      <category>git</category>
      <category>cicd</category>
    </item>
    <item>
      <title>Linux Server Monitoring, Backup, Security &amp; Troubleshooting: The Practical SysAdmin Playbook</title>
      <dc:creator>Yashvi Kothari</dc:creator>
      <pubDate>Wed, 12 Aug 2026 11:24:59 +0000</pubDate>
      <link>https://dev.to/yashvikothari/linux-server-monitoring-backup-security-troubleshooting-the-practical-sysadmin-playbook-43nb</link>
      <guid>https://dev.to/yashvikothari/linux-server-monitoring-backup-security-troubleshooting-the-practical-sysadmin-playbook-43nb</guid>
      <description>&lt;h1&gt;
  
  
  Linux Server Monitoring, Backup, Security &amp;amp; Troubleshooting Guide
&lt;/h1&gt;

&lt;p&gt;Learn practical Linux server monitoring, backup, security, firewall configuration, and troubleshooting techniques with real commands and interview-ready explanations.&lt;/p&gt;

&lt;p&gt;A server rarely fails without leaving clues.&lt;/p&gt;

&lt;p&gt;CPU usage rises.&lt;/p&gt;

&lt;p&gt;Memory disappears.&lt;/p&gt;

&lt;p&gt;Disk space reaches 100%.&lt;/p&gt;

&lt;p&gt;A service stops listening.&lt;/p&gt;

&lt;p&gt;Nginx returns a 502.&lt;/p&gt;

&lt;p&gt;The database refuses connections.&lt;/p&gt;

&lt;p&gt;And suddenly someone asks:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Can you fix production?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Good system administrators don't panic.&lt;/p&gt;

&lt;p&gt;They investigate.&lt;/p&gt;

&lt;p&gt;They follow evidence.&lt;/p&gt;

&lt;p&gt;They fix the root cause.&lt;/p&gt;

&lt;p&gt;This guide covers the practical Linux skills every SysAdmin and DevOps engineer should know: &lt;strong&gt;monitoring, backup, security, and troubleshooting.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Monitoring: Know What Your Server Is Doing
&lt;/h2&gt;

&lt;p&gt;Monitoring isn't about staring at dashboards all day.&lt;/p&gt;

&lt;p&gt;It's about answering four questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Is the CPU overloaded?&lt;/li&gt;
&lt;li&gt;Is memory exhausted?&lt;/li&gt;
&lt;li&gt;Is disk space running out?&lt;/li&gt;
&lt;li&gt;Is the network or application behaving abnormally?&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  CPU Monitoring
&lt;/h3&gt;

&lt;p&gt;Start with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;uptime&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll see something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;load average: 0.50, 0.75, 0.80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The three values represent the &lt;strong&gt;1-minute, 5-minute, and 15-minute load averages&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But there's an important interview detail:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Load average is not the same thing as CPU percentage.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A rough rule is to compare load with the number of CPU cores.&lt;/p&gt;

&lt;p&gt;For a 4-core server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Load &amp;lt; 4     → generally comfortable
Load ≈ 4     → CPUs are fully utilized
Load &amp;gt; 4     → work is waiting for CPU/resources
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check CPU information:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lscpu
&lt;span class="nb"&gt;nproc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Find CPU-heavy processes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ps aux &lt;span class="nt"&gt;--sort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;-%cpu | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For interactive troubleshooting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;top
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;htop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Memory Monitoring
&lt;/h2&gt;

&lt;p&gt;Use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;free &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The most important number isn't always &lt;code&gt;free&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Look at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;available
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Linux intentionally uses unused RAM for filesystem cache and buffers.&lt;/p&gt;

&lt;p&gt;That memory can often be reclaimed when applications need it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Check memory-heavy processes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ps aux &lt;span class="nt"&gt;--sort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;-%mem | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Check swap
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;swapon &lt;span class="nt"&gt;--show&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;free &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also monitor swap activity:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vmstat 1 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pay attention to &lt;code&gt;si&lt;/code&gt; and &lt;code&gt;so&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Heavy, continuous swap activity can indicate memory pressure and often results in poor performance.&lt;/p&gt;




&lt;h1&gt;
  
  
  3. Disk Monitoring
&lt;/h1&gt;

&lt;p&gt;One of the most common production problems is surprisingly simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The disk is full.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Start with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then identify where the space went:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;du&lt;/span&gt; &lt;span class="nt"&gt;-sh&lt;/span&gt; /&lt;span class="k"&gt;*&lt;/span&gt; 2&amp;gt;/dev/null | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Investigate &lt;code&gt;/var&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;du&lt;/span&gt; &lt;span class="nt"&gt;-sh&lt;/span&gt; /var/&lt;span class="k"&gt;*&lt;/span&gt; 2&amp;gt;/dev/null | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rh&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Logs are frequent offenders:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;du&lt;/span&gt; &lt;span class="nt"&gt;-sh&lt;/span&gt; /var/log/&lt;span class="k"&gt;*&lt;/span&gt; 2&amp;gt;/dev/null | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Find huge files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;find / &lt;span class="nt"&gt;-type&lt;/span&gt; f &lt;span class="nt"&gt;-size&lt;/span&gt; +100M &lt;span class="nt"&gt;-exec&lt;/span&gt; &lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lh&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt; 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But disk space isn't the only resource that can run out.&lt;/p&gt;

&lt;h3&gt;
  
  
  Check inodes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A filesystem can have free GBs available while still being unable to create files because its inodes are exhausted.&lt;/p&gt;

&lt;p&gt;That's a classic interview question.&lt;/p&gt;




&lt;h1&gt;
  
  
  4. Disk I/O
&lt;/h1&gt;

&lt;p&gt;A server can have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;low CPU&lt;/li&gt;
&lt;li&gt;plenty of RAM&lt;/li&gt;
&lt;li&gt;plenty of disk space&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…and still be painfully slow.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disk I/O.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;iostat &lt;span class="nt"&gt;-x&lt;/span&gt; 1 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For process-level I/O:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;iotop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;High disk utilization or latency can point toward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;slow disks&lt;/li&gt;
&lt;li&gt;excessive logging&lt;/li&gt;
&lt;li&gt;database activity&lt;/li&gt;
&lt;li&gt;backups&lt;/li&gt;
&lt;li&gt;large file operations&lt;/li&gt;
&lt;li&gt;overloaded storage&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  5. Network Monitoring
&lt;/h1&gt;

&lt;p&gt;Check listening services:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ss &lt;span class="nt"&gt;-tlnp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get socket statistics:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ss &lt;span class="nt"&gt;-s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check network interfaces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ip addr show
ip &lt;span class="nb"&gt;link &lt;/span&gt;show
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test connectivity:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ping google.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Trace the route:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;traceroute google.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or combine latency and route analysis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mtr google.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For HTTP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-I&lt;/span&gt; https://example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is extremely useful because it tells you whether the server is actually returning an HTTP response.&lt;/p&gt;




&lt;h1&gt;
  
  
  6. Logs Are Your First Investigation Tool
&lt;/h1&gt;

&lt;p&gt;When something breaks, don't randomly restart everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read the logs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;System logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/syslog
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Authentication logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/auth.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Systemd:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;journalctl &lt;span class="nt"&gt;-f&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Recent logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;journalctl &lt;span class="nt"&gt;--since&lt;/span&gt; &lt;span class="s2"&gt;"1 hour ago"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Nginx:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/nginx/error.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Apache:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/apache2/error.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For MySQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/mysql/error.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The fastest troubleshooting path is often:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Symptom → service status → logs → dependency → configuration → resource usage&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  7. Backup: Assume the Server Will Fail
&lt;/h1&gt;

&lt;p&gt;A backup isn't:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I copied the website somewhere.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A proper backup strategy considers the entire system.&lt;/p&gt;

&lt;p&gt;You should consider backing up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/var/www/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;databases&lt;/li&gt;
&lt;li&gt;Nginx/Apache configuration&lt;/li&gt;
&lt;li&gt;PHP configuration&lt;/li&gt;
&lt;li&gt;MySQL configuration&lt;/li&gt;
&lt;li&gt;SSL certificates&lt;/li&gt;
&lt;li&gt;cron jobs&lt;/li&gt;
&lt;li&gt;user data&lt;/li&gt;
&lt;li&gt;custom scripts&lt;/li&gt;
&lt;li&gt;package information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For MySQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mysqldump &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nt"&gt;--all-databases&lt;/span&gt; &lt;span class="nt"&gt;--routines&lt;/span&gt; &lt;span class="nt"&gt;--triggers&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; all_databases.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compress it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;gzip &lt;/span&gt;all_databases.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-czf&lt;/span&gt; www_backup.tar.gz /var/www/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  8. Why rsync Is a SysAdmin Superpower
&lt;/h1&gt;

&lt;p&gt;For large migrations, &lt;code&gt;rsync&lt;/code&gt; is usually much more useful than repeatedly copying everything.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rsync &lt;span class="nt"&gt;-avz&lt;/span&gt; &lt;span class="nt"&gt;--progress&lt;/span&gt; /var/www/ user@newserver:/var/www/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because &lt;code&gt;rsync&lt;/code&gt; can synchronize only what changed.&lt;/p&gt;

&lt;p&gt;That makes it extremely useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;server migrations&lt;/li&gt;
&lt;li&gt;backups&lt;/li&gt;
&lt;li&gt;deployments&lt;/li&gt;
&lt;li&gt;synchronization&lt;/li&gt;
&lt;li&gt;large file transfers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A strong interview answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I prefer rsync for large transfers because it efficiently synchronizes changed files and can resume transfers.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  9. Remember the 3-2-1 Backup Rule
&lt;/h1&gt;

&lt;p&gt;A practical backup strategy follows:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3 copies of your data&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2 different types of storage&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1 copy offsite&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Production server
       ↓
Local backup
       ↓
Remote backup
       ↓
Cloud/offsite backup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And one more important principle:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A backup isn't proven until you've restored it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Test your backups.&lt;/p&gt;

&lt;p&gt;A backup that has never been restored is only a theory.&lt;/p&gt;




&lt;h1&gt;
  
  
  10. Firewall Security
&lt;/h1&gt;

&lt;p&gt;On Ubuntu, UFW provides a simpler interface for firewall management.&lt;/p&gt;

&lt;p&gt;Install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;ufw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before enabling it, make sure SSH is allowed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow ssh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw &lt;span class="nb"&gt;enable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw status verbose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A typical web server may need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow ssh
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow http
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow https
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then use restrictive defaults:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw default deny incoming
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw default allow outgoing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The principle is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Don't expose services that don't need to be exposed.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  11. iptables
&lt;/h1&gt;

&lt;p&gt;For lower-level firewall control:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Allow established connections:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-A&lt;/span&gt; INPUT &lt;span class="nt"&gt;-m&lt;/span&gt; state &lt;span class="nt"&gt;--state&lt;/span&gt; ESTABLISHED,RELATED &lt;span class="nt"&gt;-j&lt;/span&gt; ACCEPT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Allow loopback:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-A&lt;/span&gt; INPUT &lt;span class="nt"&gt;-i&lt;/span&gt; lo &lt;span class="nt"&gt;-j&lt;/span&gt; ACCEPT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Allow SSH:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-A&lt;/span&gt; INPUT &lt;span class="nt"&gt;-p&lt;/span&gt; tcp &lt;span class="nt"&gt;--dport&lt;/span&gt; 22 &lt;span class="nt"&gt;-j&lt;/span&gt; ACCEPT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Allow HTTP/HTTPS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-A&lt;/span&gt; INPUT &lt;span class="nt"&gt;-p&lt;/span&gt; tcp &lt;span class="nt"&gt;--dport&lt;/span&gt; 80 &lt;span class="nt"&gt;-j&lt;/span&gt; ACCEPT
&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-A&lt;/span&gt; INPUT &lt;span class="nt"&gt;-p&lt;/span&gt; tcp &lt;span class="nt"&gt;--dport&lt;/span&gt; 443 &lt;span class="nt"&gt;-j&lt;/span&gt; ACCEPT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then carefully define your default policy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Never experiment with firewall rules remotely without ensuring you won't lock yourself out.&lt;/p&gt;




&lt;h1&gt;
  
  
  12. Fail2ban
&lt;/h1&gt;

&lt;p&gt;A firewall controls network access.&lt;/p&gt;

&lt;p&gt;Fail2ban adds another layer by watching logs for suspicious authentication behavior and temporarily banning offending IP addresses.&lt;/p&gt;

&lt;p&gt;Install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;fail2ban
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check status:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;fail2ban-client status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check SSH protection:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;fail2ban-client status sshd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Unban an IP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;fail2ban-client &lt;span class="nb"&gt;set &lt;/span&gt;sshd unbanip 1.2.3.4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Think of it as:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Logs → Detect repeated abuse → Ban IP&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  13. Server Hardening
&lt;/h1&gt;

&lt;p&gt;A secure server starts with basic discipline.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep packages updated
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Remove unnecessary packages
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt autoremove &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Enable automatic security updates
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;unattended-upgrades
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Audit permissions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;find /var/www &lt;span class="nt"&gt;-type&lt;/span&gt; f &lt;span class="nt"&gt;-perm&lt;/span&gt; 0777
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;World-writable files deserve investigation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Audit open ports
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ss &lt;span class="nt"&gt;-tlnp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal isn't:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Close every port.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The goal is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Know why every exposed port exists.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  14. Troubleshooting HTTP 500
&lt;/h1&gt;

&lt;p&gt;A &lt;code&gt;500 Internal Server Error&lt;/code&gt; means the server encountered an application-side error.&lt;/p&gt;

&lt;p&gt;Don't immediately blame Nginx.&lt;/p&gt;

&lt;p&gt;Start with logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo tail&lt;/span&gt; &lt;span class="nt"&gt;-50&lt;/span&gt; /var/log/nginx/error.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo tail&lt;/span&gt; &lt;span class="nt"&gt;-50&lt;/span&gt; /var/log/apache2/error.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If PHP is involved:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo tail&lt;/span&gt; &lt;span class="nt"&gt;-50&lt;/span&gt; /var/log/php8.2-fpm.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then investigate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;application errors&lt;/li&gt;
&lt;li&gt;permissions&lt;/li&gt;
&lt;li&gt;PHP extensions&lt;/li&gt;
&lt;li&gt;PHP configuration&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.htaccess&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;application code&lt;/li&gt;
&lt;li&gt;memory limits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most important habit:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check the error log first.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  15. Troubleshooting 502 Bad Gateway
&lt;/h1&gt;

&lt;p&gt;This error is especially common with reverse proxies.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client
  ↓
Nginx
  ↓
Backend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A &lt;code&gt;502&lt;/code&gt; generally means Nginx cannot successfully communicate with the upstream.&lt;/p&gt;

&lt;p&gt;Check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status php8.2-fpm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check the PHP-FPM socket:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /var/run/php/php8.2-fpm.sock
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a Node.js application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;lsof &lt;span class="nt"&gt;-i&lt;/span&gt; :3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The critical question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Is the backend running, and is Nginx connecting to the correct socket or port?”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  16. 503 Service Unavailable
&lt;/h1&gt;

&lt;p&gt;A 503 generally means the service cannot currently handle the request.&lt;/p&gt;

&lt;p&gt;Check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;uptime&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status nginx
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status apache2
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status php8.2-fpm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check connections:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ss &lt;span class="nt"&gt;-s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Possible causes include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;overloaded server&lt;/li&gt;
&lt;li&gt;stopped backend&lt;/li&gt;
&lt;li&gt;maintenance mode&lt;/li&gt;
&lt;li&gt;rate limiting&lt;/li&gt;
&lt;li&gt;exhausted application workers&lt;/li&gt;
&lt;li&gt;overloaded database&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  17. 504 Gateway Timeout
&lt;/h1&gt;

&lt;p&gt;A 504 tells a different story.&lt;/p&gt;

&lt;p&gt;The backend may be reachable.&lt;/p&gt;

&lt;p&gt;But it didn't respond within the required time.&lt;/p&gt;

&lt;p&gt;Possible causes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;slow database queries&lt;/li&gt;
&lt;li&gt;slow application code&lt;/li&gt;
&lt;li&gt;overloaded backend&lt;/li&gt;
&lt;li&gt;network latency&lt;/li&gt;
&lt;li&gt;insufficient PHP workers&lt;/li&gt;
&lt;li&gt;overly aggressive timeout settings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"SHOW FULL PROCESSLIST;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check resources:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;htop
iostat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only increase timeouts after understanding why the backend is slow.&lt;/p&gt;

&lt;p&gt;Increasing a timeout can hide the symptom while making resource consumption worse.&lt;/p&gt;




&lt;h1&gt;
  
  
  18. DNS Troubleshooting
&lt;/h1&gt;

&lt;p&gt;When a website doesn't open, don't immediately restart Nginx.&lt;/p&gt;

&lt;p&gt;Check DNS.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get the IP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig +short example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Query a public resolver:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig @8.8.8.8 example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For mail:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig MX example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For SPF:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig TXT example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For DMARC:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig TXT _dmarc.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The troubleshooting chain becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Domain
  ↓
DNS
  ↓
IP
  ↓
Firewall
  ↓
Port
  ↓
Web server
  ↓
Reverse proxy
  ↓
Application
  ↓
Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's how you avoid guessing.&lt;/p&gt;




&lt;h1&gt;
  
  
  19. SSL Troubleshooting
&lt;/h1&gt;

&lt;p&gt;Check certificate dates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; | openssl s_client &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-connect&lt;/span&gt; example.com:443 2&amp;gt;/dev/null &lt;span class="se"&gt;\&lt;/span&gt;
| openssl x509 &lt;span class="nt"&gt;-noout&lt;/span&gt; &lt;span class="nt"&gt;-dates&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test Let's Encrypt renewal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;certbot renew &lt;span class="nt"&gt;--dry-run&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Common causes of renewal failures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DNS points somewhere else&lt;/li&gt;
&lt;li&gt;port 80 blocked&lt;/li&gt;
&lt;li&gt;HTTP challenge inaccessible&lt;/li&gt;
&lt;li&gt;incorrect web-server configuration&lt;/li&gt;
&lt;li&gt;certificate configuration errors&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  20. Database Troubleshooting
&lt;/h1&gt;

&lt;p&gt;If MySQL isn't responding:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status mysql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo tail&lt;/span&gt; &lt;span class="nt"&gt;-50&lt;/span&gt; /var/log/mysql/error.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test credentials:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check connections:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"SHOW STATUS LIKE 'Threads_connected';"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check maximum connections:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"SHOW VARIABLES LIKE 'max_connections';"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Don't blindly increase &lt;code&gt;max_connections&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;More connections require more resources.&lt;/p&gt;

&lt;p&gt;First understand why the connections are being consumed.&lt;/p&gt;




&lt;h1&gt;
  
  
  21. The SysAdmin Troubleshooting Framework
&lt;/h1&gt;

&lt;p&gt;When production breaks, use this sequence:&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1 — Confirm the symptom
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-I&lt;/span&gt; https://example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2 — Check the service
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl status nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3 — Check logs
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; nginx &lt;span class="nt"&gt;--since&lt;/span&gt; &lt;span class="s2"&gt;"10 minutes ago"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4 — Check ports
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ss &lt;span class="nt"&gt;-tlnp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5 — Check resources
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;uptime
&lt;/span&gt;free &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 6 — Check dependencies
&lt;/h3&gt;

&lt;p&gt;Database?&lt;/p&gt;

&lt;p&gt;PHP-FPM?&lt;/p&gt;

&lt;p&gt;Node.js?&lt;/p&gt;

&lt;p&gt;Redis?&lt;/p&gt;

&lt;p&gt;External API?&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 7 — Check configuration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nginx &lt;span class="nt"&gt;-t&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 8 — Make the smallest safe change
&lt;/h3&gt;

&lt;p&gt;Avoid changing five things at once.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 9 — Verify
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-I&lt;/span&gt; https://example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 10 — Document the root cause
&lt;/h3&gt;

&lt;p&gt;A production fix is not complete until someone understands &lt;strong&gt;why it happened&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  22. Interview Questions You Should Be Ready For
&lt;/h1&gt;

&lt;h3&gt;
  
  
  How do you check server load?
&lt;/h3&gt;

&lt;p&gt;Use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;uptime&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then compare load average with available CPU cores and investigate CPU, I/O, and other bottlenecks.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do you find what's filling the disk?
&lt;/h3&gt;

&lt;p&gt;Start with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;du&lt;/span&gt; &lt;span class="nt"&gt;-sh&lt;/span&gt; /&lt;span class="k"&gt;*&lt;/span&gt; 2&amp;gt;/dev/null | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What's the difference between 502 and 504?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;502:&lt;/strong&gt; The proxy couldn't successfully communicate with the upstream.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;504:&lt;/strong&gt; The proxy waited for the upstream but timed out.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is rsync?
&lt;/h3&gt;

&lt;p&gt;A file synchronization tool that efficiently transfers changed data and is particularly useful for backups and migrations.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the 3-2-1 backup rule?
&lt;/h3&gt;

&lt;p&gt;Three copies, two different storage types, one offsite.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do you secure a Linux server?
&lt;/h3&gt;

&lt;p&gt;Update the OS, minimize exposed services, configure a firewall, harden SSH, use automatic security updates, monitor authentication, use appropriate intrusion-prevention controls, and maintain tested backups.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is your first step when a website is down?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Confirm the symptom and check the relevant service and logs before making changes.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Lesson
&lt;/h1&gt;

&lt;p&gt;The best SysAdmins don't memorize hundreds of commands.&lt;/p&gt;

&lt;p&gt;They understand what the commands are trying to prove.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CPU problem?
    → top / htop / uptime

Memory problem?
    → free / vmstat

Disk problem?
    → df / du / iostat

Network problem?
    → ss / ping / mtr / curl

Service problem?
    → systemctl / journalctl

Application problem?
    → application logs

Security problem?
    → auth logs / firewall / open ports

Backup problem?
    → restore test

HTTP problem?
    → status code → logs → backend → dependencies
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the difference between knowing Linux commands and actually knowing how to operate Linux servers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Commands are tools.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Troubleshooting is the skill.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And in production, the engineer who can calmly turn a symptom into evidence into a root cause is the engineer everyone wants on the incident call.&lt;/p&gt;

&lt;h1&gt;
  
  
  Part 5: Server Monitoring, Backup, Security &amp;amp; Troubleshooting
&lt;/h1&gt;




&lt;h2&gt;
  
  
  5.1 Server Monitoring
&lt;/h2&gt;

&lt;h3&gt;
  
  
  CPU Monitoring
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Real-time CPU usage&lt;/span&gt;
top                                    &lt;span class="c"&gt;# Press 'P' to sort by CPU&lt;/span&gt;
htop                                   &lt;span class="c"&gt;# Better interactive viewer (install: apt install htop)&lt;/span&gt;

&lt;span class="c"&gt;# CPU info&lt;/span&gt;
lscpu                                 &lt;span class="c"&gt;# CPU architecture info&lt;/span&gt;
&lt;span class="nb"&gt;nproc&lt;/span&gt;                                 &lt;span class="c"&gt;# Number of CPU cores&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/cpuinfo                     &lt;span class="c"&gt;# Detailed CPU info&lt;/span&gt;

&lt;span class="c"&gt;# Load average&lt;/span&gt;
&lt;span class="nb"&gt;uptime&lt;/span&gt;                                &lt;span class="c"&gt;# Shows load average (1, 5, 15 min)&lt;/span&gt;
&lt;span class="c"&gt;# Output: load average: 0.50, 0.75, 0.80&lt;/span&gt;
&lt;span class="c"&gt;# Rule: load average should be &amp;lt; number of CPU cores&lt;/span&gt;
&lt;span class="c"&gt;# 4 cores → load &amp;lt; 4.0 is OK, &amp;gt; 4.0 means overloaded&lt;/span&gt;

&lt;span class="c"&gt;# CPU usage snapshot&lt;/span&gt;
mpstat                                &lt;span class="c"&gt;# CPU usage per core (install: apt install sysstat)&lt;/span&gt;
vmstat 1 5                            &lt;span class="c"&gt;# System stats every 1 sec, 5 times&lt;/span&gt;
sar &lt;span class="nt"&gt;-u&lt;/span&gt; 1 5                            &lt;span class="c"&gt;# CPU usage (requires sysstat)&lt;/span&gt;

&lt;span class="c"&gt;# Top CPU-consuming processes&lt;/span&gt;
ps aux &lt;span class="nt"&gt;--sort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;-%cpu | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  RAM Monitoring
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Memory usage&lt;/span&gt;
free &lt;span class="nt"&gt;-h&lt;/span&gt;                               &lt;span class="c"&gt;# Human-readable memory info&lt;/span&gt;
&lt;span class="c"&gt;# Key: Available (not Free) is what matters&lt;/span&gt;

&lt;span class="c"&gt;# Detailed memory&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/meminfo

&lt;span class="c"&gt;# Top memory-consuming processes&lt;/span&gt;
ps aux &lt;span class="nt"&gt;--sort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;-%mem | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt;

&lt;span class="c"&gt;# Check for memory issues&lt;/span&gt;
vmstat 1 5                            &lt;span class="c"&gt;# Watch si/so columns (swap in/out)&lt;/span&gt;
&lt;span class="c"&gt;# If si/so are high → server needs more RAM&lt;/span&gt;

&lt;span class="c"&gt;# Check swap&lt;/span&gt;
swapon &lt;span class="nt"&gt;--show&lt;/span&gt;
free &lt;span class="nt"&gt;-h&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;Swap
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Disk Space Monitoring
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Disk usage overview&lt;/span&gt;
&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt;                                 &lt;span class="c"&gt;# All mounted filesystems&lt;/span&gt;
&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt; /                               &lt;span class="c"&gt;# Root partition specifically&lt;/span&gt;

&lt;span class="c"&gt;# Find what's using space&lt;/span&gt;
&lt;span class="nb"&gt;du&lt;/span&gt; &lt;span class="nt"&gt;-sh&lt;/span&gt; /&lt;span class="k"&gt;*&lt;/span&gt;                             &lt;span class="c"&gt;# Size of top-level directories&lt;/span&gt;
&lt;span class="nb"&gt;du&lt;/span&gt; &lt;span class="nt"&gt;-sh&lt;/span&gt; /var/&lt;span class="k"&gt;*&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rh&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt;   &lt;span class="c"&gt;# Largest dirs in /var&lt;/span&gt;
&lt;span class="nb"&gt;du&lt;/span&gt; &lt;span class="nt"&gt;-sh&lt;/span&gt; /var/log/&lt;span class="k"&gt;*&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rh&lt;/span&gt;          &lt;span class="c"&gt;# Log sizes&lt;/span&gt;
ncdu /                                &lt;span class="c"&gt;# Interactive disk usage tool&lt;/span&gt;

&lt;span class="c"&gt;# Find large files&lt;/span&gt;
find / &lt;span class="nt"&gt;-type&lt;/span&gt; f &lt;span class="nt"&gt;-size&lt;/span&gt; +100M &lt;span class="nt"&gt;-exec&lt;/span&gt; &lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lh&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt;  &lt;span class="c"&gt;# Files &amp;gt; 100MB&lt;/span&gt;
find /var/log &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.log"&lt;/span&gt; &lt;span class="nt"&gt;-size&lt;/span&gt; +50M          &lt;span class="c"&gt;# Large log files&lt;/span&gt;

&lt;span class="c"&gt;# Check inodes&lt;/span&gt;
&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;                                 &lt;span class="c"&gt;# Inode usage (can run out before disk space)&lt;/span&gt;

&lt;span class="c"&gt;# Monitor disk I/O&lt;/span&gt;
iostat &lt;span class="nt"&gt;-x&lt;/span&gt; 1 5                         &lt;span class="c"&gt;# Disk I/O stats (install: apt install sysstat)&lt;/span&gt;
iotop                                 &lt;span class="c"&gt;# Real-time I/O by process (install: apt install iotop)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Bandwidth &amp;amp; Network Monitoring
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Current connections&lt;/span&gt;
ss &lt;span class="nt"&gt;-s&lt;/span&gt;                                 &lt;span class="c"&gt;# Socket statistics summary&lt;/span&gt;
ss &lt;span class="nt"&gt;-tlnp&lt;/span&gt;                              &lt;span class="c"&gt;# Listening ports&lt;/span&gt;
netstat &lt;span class="nt"&gt;-tlnp&lt;/span&gt;                         &lt;span class="c"&gt;# Alternative (legacy)&lt;/span&gt;

&lt;span class="c"&gt;# Bandwidth usage&lt;/span&gt;
iftop                                 &lt;span class="c"&gt;# Real-time bandwidth by connection (install: apt install iftop)&lt;/span&gt;
nload                                 &lt;span class="c"&gt;# Real-time bandwidth graph (install: apt install nload)&lt;/span&gt;
vnstat                                &lt;span class="c"&gt;# Historical bandwidth (install: apt install vnstat)&lt;/span&gt;
vnstat &lt;span class="nt"&gt;-d&lt;/span&gt;                             &lt;span class="c"&gt;# Daily traffic&lt;/span&gt;
vnstat &lt;span class="nt"&gt;-m&lt;/span&gt;                             &lt;span class="c"&gt;# Monthly traffic&lt;/span&gt;

&lt;span class="c"&gt;# Network interface info&lt;/span&gt;
ip addr show                          &lt;span class="c"&gt;# IP addresses&lt;/span&gt;
ip &lt;span class="nb"&gt;link &lt;/span&gt;show                          &lt;span class="c"&gt;# Network interfaces&lt;/span&gt;

&lt;span class="c"&gt;# Test connectivity&lt;/span&gt;
ping google.com                       &lt;span class="c"&gt;# Basic connectivity&lt;/span&gt;
traceroute google.com                  &lt;span class="c"&gt;# Route to destination&lt;/span&gt;
mtr google.com                        &lt;span class="c"&gt;# Combined ping + traceroute (install: apt install mtr)&lt;/span&gt;
curl &lt;span class="nt"&gt;-I&lt;/span&gt; https://example.com           &lt;span class="c"&gt;# HTTP response headers&lt;/span&gt;
wget &lt;span class="nt"&gt;--spider&lt;/span&gt; https://example.com     &lt;span class="c"&gt;# Check if URL is accessible&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Server Uptime &amp;amp; Load
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# System uptime&lt;/span&gt;
&lt;span class="nb"&gt;uptime&lt;/span&gt;
&lt;span class="c"&gt;# Output: 14:30:05 up 45 days, 3:22, 2 users, load average: 0.50, 0.75, 0.80&lt;/span&gt;

&lt;span class="c"&gt;# System info&lt;/span&gt;
&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt;                              &lt;span class="c"&gt;# Kernel version, architecture&lt;/span&gt;
hostnamectl                            &lt;span class="c"&gt;# Hostname, OS, kernel, architecture&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/os-release                    &lt;span class="c"&gt;# OS version&lt;/span&gt;

&lt;span class="c"&gt;# Last reboot&lt;/span&gt;
last reboot | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-10&lt;/span&gt;
&lt;span class="nb"&gt;who&lt;/span&gt; &lt;span class="nt"&gt;-b&lt;/span&gt;                                &lt;span class="c"&gt;# Last boot time&lt;/span&gt;

&lt;span class="c"&gt;# System resource summary (one command)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== UPTIME ==="&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;uptime&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== MEMORY ==="&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; free &lt;span class="nt"&gt;-h&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== DISK ==="&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt; / &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== CPU LOAD ==="&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cat&lt;/span&gt; /proc/loadavg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Log Monitoring
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# System logs&lt;/span&gt;
&lt;span class="nb"&gt;sudo tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/syslog                    &lt;span class="c"&gt;# System log (live)&lt;/span&gt;
&lt;span class="nb"&gt;sudo tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/auth.log                  &lt;span class="c"&gt;# Authentication log&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;journalctl &lt;span class="nt"&gt;-f&lt;/span&gt;                              &lt;span class="c"&gt;# systemd journal (live)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;journalctl &lt;span class="nt"&gt;--since&lt;/span&gt; &lt;span class="s2"&gt;"1 hour ago"&lt;/span&gt;            &lt;span class="c"&gt;# Recent logs&lt;/span&gt;

&lt;span class="c"&gt;# Web server logs&lt;/span&gt;
&lt;span class="nb"&gt;sudo tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/apache2/error.log         &lt;span class="c"&gt;# Apache errors&lt;/span&gt;
&lt;span class="nb"&gt;sudo tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/nginx/error.log           &lt;span class="c"&gt;# Nginx errors&lt;/span&gt;
&lt;span class="nb"&gt;sudo tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/apache2/access.log        &lt;span class="c"&gt;# Apache access&lt;/span&gt;

&lt;span class="c"&gt;# PHP logs&lt;/span&gt;
&lt;span class="nb"&gt;sudo tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/php8.2-fpm.log            &lt;span class="c"&gt;# PHP-FPM log&lt;/span&gt;

&lt;span class="c"&gt;# MySQL logs&lt;/span&gt;
&lt;span class="nb"&gt;sudo tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/mysql/error.log           &lt;span class="c"&gt;# MySQL errors&lt;/span&gt;

&lt;span class="c"&gt;# Analyze access logs&lt;/span&gt;
&lt;span class="c"&gt;# Top 10 IPs hitting the server&lt;/span&gt;
&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $1}'&lt;/span&gt; /var/log/nginx/access.log | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-10&lt;/span&gt;

&lt;span class="c"&gt;# Top 10 requested URLs&lt;/span&gt;
&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $7}'&lt;/span&gt; /var/log/nginx/access.log | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-10&lt;/span&gt;

&lt;span class="c"&gt;# Count 404 errors&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;" 404 "&lt;/span&gt; /var/log/nginx/access.log | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;

&lt;span class="c"&gt;# Count 500 errors&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;" 500 "&lt;/span&gt; /var/log/nginx/access.log | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;

&lt;span class="c"&gt;# Requests per minute/hour&lt;/span&gt;
&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $4}'&lt;/span&gt; /var/log/nginx/access.log | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;: &lt;span class="nt"&gt;-f1-3&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Interview Q&amp;amp;A: Monitoring
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Answer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;How do you check server load?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;uptime&lt;/code&gt; shows load average. Compare to CPU cores: load &amp;gt; cores = overloaded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What's the difference between free and available memory?&lt;/td&gt;
&lt;td&gt;Free = completely unused. Available = free + cache/buffer that can be freed. Available is what matters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How to find what's filling up disk?&lt;/td&gt;
&lt;td&gt;`du -sh /* \&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How do you monitor in real-time?&lt;/td&gt;
&lt;td&gt;{% raw %}&lt;code&gt;htop&lt;/code&gt; (CPU/RAM), &lt;code&gt;iftop&lt;/code&gt; (bandwidth), &lt;code&gt;tail -f&lt;/code&gt; (logs), &lt;code&gt;iostat&lt;/code&gt; (disk I/O)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is swap? When is it bad?&lt;/td&gt;
&lt;td&gt;Overflow area on disk when RAM is full. High swap usage = server needs more RAM, causes slowness&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How to identify a DDoS attack?&lt;/td&gt;
&lt;td&gt;Check access logs for unusual traffic from single IPs, high connection count, &lt;code&gt;ss -s&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  5.2 Server Backup, Restore &amp;amp; Migration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Full Server Backup Strategy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# What to backup:&lt;/span&gt;
&lt;span class="c"&gt;# 1. Website files (/var/www/)&lt;/span&gt;
&lt;span class="c"&gt;# 2. Databases (mysqldump)&lt;/span&gt;
&lt;span class="c"&gt;# 3. Server configurations (/etc/nginx, /etc/apache2, /etc/php, /etc/mysql)&lt;/span&gt;
&lt;span class="c"&gt;# 4. SSL certificates (/etc/letsencrypt)&lt;/span&gt;
&lt;span class="c"&gt;# 5. Cron jobs (crontab -l)&lt;/span&gt;
&lt;span class="c"&gt;# 6. User home directories&lt;/span&gt;
&lt;span class="c"&gt;# 7. Custom scripts&lt;/span&gt;

&lt;span class="c"&gt;# Full website backup script&lt;/span&gt;
&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nv"&gt;DATE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%Y-%m-%d&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;BACKUP_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/backups/&lt;/span&gt;&lt;span class="nv"&gt;$DATE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nv"&gt;$BACKUP_DIR&lt;/span&gt;

&lt;span class="c"&gt;# 1. Backup website files&lt;/span&gt;
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-czf&lt;/span&gt; &lt;span class="nv"&gt;$BACKUP_DIR&lt;/span&gt;/www_backup.tar.gz /var/www/

&lt;span class="c"&gt;# 2. Backup all databases&lt;/span&gt;
mysqldump &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt;&lt;span class="s1"&gt;'password'&lt;/span&gt; &lt;span class="nt"&gt;--all-databases&lt;/span&gt; &lt;span class="nt"&gt;--routines&lt;/span&gt; &lt;span class="nt"&gt;--triggers&lt;/span&gt; | &lt;span class="nb"&gt;gzip&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$BACKUP_DIR&lt;/span&gt;/all_databases.sql.gz

&lt;span class="c"&gt;# 3. Backup configs&lt;/span&gt;
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-czf&lt;/span&gt; &lt;span class="nv"&gt;$BACKUP_DIR&lt;/span&gt;/configs.tar.gz /etc/nginx/ /etc/apache2/ /etc/php/ /etc/mysql/ /etc/letsencrypt/

&lt;span class="c"&gt;# 4. Backup crontabs&lt;/span&gt;
crontab &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$BACKUP_DIR&lt;/span&gt;/root_crontab.txt
crontab &lt;span class="nt"&gt;-u&lt;/span&gt; www-data &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$BACKUP_DIR&lt;/span&gt;/www-data_crontab.txt 2&amp;gt;/dev/null

&lt;span class="c"&gt;# 5. Server info&lt;/span&gt;
dpkg &lt;span class="nt"&gt;--get-selections&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$BACKUP_DIR&lt;/span&gt;/installed_packages.txt
ip addr &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$BACKUP_DIR&lt;/span&gt;/network_config.txt
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/hosts &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$BACKUP_DIR&lt;/span&gt;/hosts.txt

&lt;span class="c"&gt;# 6. Sync to remote/cloud&lt;/span&gt;
rsync &lt;span class="nt"&gt;-avz&lt;/span&gt; &lt;span class="nv"&gt;$BACKUP_DIR&lt;/span&gt;/ backup@remote-server:/offsite-backups/&lt;span class="nv"&gt;$DATE&lt;/span&gt;/
&lt;span class="c"&gt;# OR to S3:&lt;/span&gt;
&lt;span class="c"&gt;# aws s3 sync $BACKUP_DIR/ s3://my-backups/$DATE/&lt;/span&gt;

&lt;span class="c"&gt;# 7. Cleanup old backups (keep 30 days)&lt;/span&gt;
find /backups/ &lt;span class="nt"&gt;-maxdepth&lt;/span&gt; 1 &lt;span class="nt"&gt;-type&lt;/span&gt; d &lt;span class="nt"&gt;-mtime&lt;/span&gt; +30 &lt;span class="nt"&gt;-exec&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Backup completed: &lt;/span&gt;&lt;span class="nv"&gt;$BACKUP_DIR&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Server Migration Steps
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Step-by-step server migration checklist:&lt;/span&gt;

&lt;span class="c"&gt;# 1. PREPARE NEW SERVER&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="c"&gt;# Install all required software: nginx, php, mysql, etc.&lt;/span&gt;
&lt;span class="c"&gt;# Configure same PHP version and extensions&lt;/span&gt;

&lt;span class="c"&gt;# 2. BACKUP OLD SERVER (everything listed above)&lt;/span&gt;

&lt;span class="c"&gt;# 3. TRANSFER FILES&lt;/span&gt;
&lt;span class="c"&gt;# Option A: rsync (best for large transfers, supports resume)&lt;/span&gt;
rsync &lt;span class="nt"&gt;-avz&lt;/span&gt; &lt;span class="nt"&gt;--progress&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"ssh -p 22"&lt;/span&gt; /var/www/ newserver:/var/www/

&lt;span class="c"&gt;# Option B: scp&lt;/span&gt;
scp &lt;span class="nt"&gt;-r&lt;/span&gt; /var/www/ user@newserver:/var/www/

&lt;span class="c"&gt;# Option C: tar + transfer&lt;/span&gt;
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-czf&lt;/span&gt; /tmp/www_backup.tar.gz /var/www/
scp /tmp/www_backup.tar.gz user@newserver:/tmp/
&lt;span class="c"&gt;# On new server: tar -xzf /tmp/www_backup.tar.gz -C /&lt;/span&gt;

&lt;span class="c"&gt;# 4. TRANSFER DATABASES&lt;/span&gt;
&lt;span class="c"&gt;# On old server:&lt;/span&gt;
mysqldump &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nt"&gt;--all-databases&lt;/span&gt; | &lt;span class="nb"&gt;gzip&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /tmp/all_db.sql.gz
scp /tmp/all_db.sql.gz user@newserver:/tmp/
&lt;span class="c"&gt;# On new server:&lt;/span&gt;
&lt;span class="nb"&gt;gunzip&lt;/span&gt; &amp;lt; /tmp/all_db.sql.gz | mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt;

&lt;span class="c"&gt;# 5. TRANSFER CONFIGURATIONS&lt;/span&gt;
scp &lt;span class="nt"&gt;-r&lt;/span&gt; /etc/nginx/sites-available/ user@newserver:/etc/nginx/sites-available/
scp &lt;span class="nt"&gt;-r&lt;/span&gt; /etc/letsencrypt/ user@newserver:/etc/letsencrypt/
&lt;span class="c"&gt;# Copy php.ini, mysql configs, etc.&lt;/span&gt;

&lt;span class="c"&gt;# 6. FIX PERMISSIONS&lt;/span&gt;
&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; www-data:www-data /var/www/
&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; 755 /var/www/

&lt;span class="c"&gt;# 7. UPDATE DNS (point to new server IP)&lt;/span&gt;
&lt;span class="c"&gt;# Lower TTL first (300 seconds), wait for propagation&lt;/span&gt;
&lt;span class="c"&gt;# Change A records to new server IP&lt;/span&gt;
&lt;span class="c"&gt;# Wait for propagation (check with dig @8.8.8.8 domain.com)&lt;/span&gt;

&lt;span class="c"&gt;# 8. VERIFY&lt;/span&gt;
&lt;span class="c"&gt;# Test all websites&lt;/span&gt;
&lt;span class="c"&gt;# Test database connections&lt;/span&gt;
&lt;span class="c"&gt;# Test SSL certificates&lt;/span&gt;
&lt;span class="c"&gt;# Test email delivery&lt;/span&gt;
&lt;span class="c"&gt;# Monitor logs for errors&lt;/span&gt;

&lt;span class="c"&gt;# 9. KEEP OLD SERVER running for a few days as fallback&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Interview Q&amp;amp;A: Backup &amp;amp; Migration
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Answer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;What should be included in a server backup?&lt;/td&gt;
&lt;td&gt;Website files, databases, configs (nginx/apache/php/mysql), SSL certs, crontabs, custom scripts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is rsync? Why use it?&lt;/td&gt;
&lt;td&gt;File synchronization tool. Only transfers changed files, supports resume, efficient for large transfers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How often should you backup?&lt;/td&gt;
&lt;td&gt;Daily for databases, weekly for full backups. Keep 30 days of daily + 3 months of weekly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is the 3-2-1 backup rule?&lt;/td&gt;
&lt;td&gt;3 copies of data, on 2 different media types, 1 offsite (cloud/remote)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How do you minimize downtime during migration?&lt;/td&gt;
&lt;td&gt;Sync data before DNS change, lower TTL, test on new server first, keep old server as fallback&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How do you verify a backup is good?&lt;/td&gt;
&lt;td&gt;Periodically do test restores to a staging server&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  5.3 Firewall &amp;amp; Server Security
&lt;/h2&gt;

&lt;h3&gt;
  
  
  UFW (Uncomplicated Firewall) - Ubuntu Default
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install and enable&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;ufw
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw &lt;span class="nb"&gt;enable&lt;/span&gt;                        &lt;span class="c"&gt;# CAREFUL: make sure SSH is allowed first!&lt;/span&gt;

&lt;span class="c"&gt;# Check status&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw status
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw status verbose
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw status numbered               &lt;span class="c"&gt;# Show rule numbers&lt;/span&gt;

&lt;span class="c"&gt;# Allow common services&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow ssh                     &lt;span class="c"&gt;# Port 22&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow 2222/tcp                &lt;span class="c"&gt;# Custom SSH port&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow http                    &lt;span class="c"&gt;# Port 80&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow https                   &lt;span class="c"&gt;# Port 443&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow 3306/tcp               &lt;span class="c"&gt;# MySQL (only if needed remotely)&lt;/span&gt;

&lt;span class="c"&gt;# Allow from specific IP&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow from 192.168.1.100
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow from 192.168.1.100 to any port 22  &lt;span class="c"&gt;# SSH from specific IP only&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow from 192.168.1.0/24 to any port 3306  &lt;span class="c"&gt;# MySQL from subnet&lt;/span&gt;

&lt;span class="c"&gt;# Deny rules&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw deny 23                       &lt;span class="c"&gt;# Deny telnet&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw deny from 1.2.3.4             &lt;span class="c"&gt;# Block specific IP&lt;/span&gt;

&lt;span class="c"&gt;# Delete rules&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw delete allow 3306/tcp
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw delete 5                      &lt;span class="c"&gt;# Delete rule by number&lt;/span&gt;

&lt;span class="c"&gt;# Rate limiting (brute force protection)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw limit ssh                     &lt;span class="c"&gt;# Limit SSH connections (6 in 30 seconds)&lt;/span&gt;

&lt;span class="c"&gt;# Default policies&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw default deny incoming
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw default allow outgoing

&lt;span class="c"&gt;# Reset all rules&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw reset

&lt;span class="c"&gt;# Logging&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw logging on
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw logging medium
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  iptables (Advanced Firewall)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List rules&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;--line-numbers&lt;/span&gt;

&lt;span class="c"&gt;# Allow SSH&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-A&lt;/span&gt; INPUT &lt;span class="nt"&gt;-p&lt;/span&gt; tcp &lt;span class="nt"&gt;--dport&lt;/span&gt; 22 &lt;span class="nt"&gt;-j&lt;/span&gt; ACCEPT

&lt;span class="c"&gt;# Allow HTTP/HTTPS&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-A&lt;/span&gt; INPUT &lt;span class="nt"&gt;-p&lt;/span&gt; tcp &lt;span class="nt"&gt;--dport&lt;/span&gt; 80 &lt;span class="nt"&gt;-j&lt;/span&gt; ACCEPT
&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-A&lt;/span&gt; INPUT &lt;span class="nt"&gt;-p&lt;/span&gt; tcp &lt;span class="nt"&gt;--dport&lt;/span&gt; 443 &lt;span class="nt"&gt;-j&lt;/span&gt; ACCEPT

&lt;span class="c"&gt;# Allow established connections&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-A&lt;/span&gt; INPUT &lt;span class="nt"&gt;-m&lt;/span&gt; state &lt;span class="nt"&gt;--state&lt;/span&gt; ESTABLISHED,RELATED &lt;span class="nt"&gt;-j&lt;/span&gt; ACCEPT

&lt;span class="c"&gt;# Allow loopback&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-A&lt;/span&gt; INPUT &lt;span class="nt"&gt;-i&lt;/span&gt; lo &lt;span class="nt"&gt;-j&lt;/span&gt; ACCEPT

&lt;span class="c"&gt;# Drop everything else&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-A&lt;/span&gt; INPUT &lt;span class="nt"&gt;-j&lt;/span&gt; DROP

&lt;span class="c"&gt;# Block specific IP&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-A&lt;/span&gt; INPUT &lt;span class="nt"&gt;-s&lt;/span&gt; 1.2.3.4 &lt;span class="nt"&gt;-j&lt;/span&gt; DROP

&lt;span class="c"&gt;# Rate limit SSH&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-A&lt;/span&gt; INPUT &lt;span class="nt"&gt;-p&lt;/span&gt; tcp &lt;span class="nt"&gt;--dport&lt;/span&gt; 22 &lt;span class="nt"&gt;-m&lt;/span&gt; connlimit &lt;span class="nt"&gt;--connlimit-above&lt;/span&gt; 3 &lt;span class="nt"&gt;-j&lt;/span&gt; DROP

&lt;span class="c"&gt;# Save rules (persist after reboot)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;iptables-persistent
&lt;span class="nb"&gt;sudo &lt;/span&gt;netfilter-persistent save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Fail2ban (Brute Force Protection)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;fail2ban

&lt;span class="c"&gt;# Configure&lt;/span&gt;
&lt;span class="nb"&gt;sudo cp&lt;/span&gt; /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/fail2ban/jail.local

&lt;span class="c"&gt;# Key settings in jail.local:&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;DEFAULT]
bantime &lt;span class="o"&gt;=&lt;/span&gt; 3600                         &lt;span class="c"&gt;# Ban for 1 hour&lt;/span&gt;
findtime &lt;span class="o"&gt;=&lt;/span&gt; 600                         &lt;span class="c"&gt;# Within 10 minutes&lt;/span&gt;
maxretry &lt;span class="o"&gt;=&lt;/span&gt; 5                           &lt;span class="c"&gt;# After 5 failed attempts&lt;/span&gt;
destemail &lt;span class="o"&gt;=&lt;/span&gt; admin@example.com
action &lt;span class="o"&gt;=&lt;/span&gt; %&lt;span class="o"&gt;(&lt;/span&gt;action_mwl&lt;span class="o"&gt;)&lt;/span&gt;s                &lt;span class="c"&gt;# Ban + email with whois + logs&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;sshd]
enabled &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true
&lt;/span&gt;port &lt;span class="o"&gt;=&lt;/span&gt; ssh
filter &lt;span class="o"&gt;=&lt;/span&gt; sshd
logpath &lt;span class="o"&gt;=&lt;/span&gt; /var/log/auth.log
maxretry &lt;span class="o"&gt;=&lt;/span&gt; 3

&lt;span class="o"&gt;[&lt;/span&gt;apache-auth]
enabled &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true
&lt;/span&gt;port &lt;span class="o"&gt;=&lt;/span&gt; http,https
filter &lt;span class="o"&gt;=&lt;/span&gt; apache-auth
logpath &lt;span class="o"&gt;=&lt;/span&gt; /var/log/apache2/error.log

&lt;span class="o"&gt;[&lt;/span&gt;nginx-http-auth]
enabled &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true
&lt;/span&gt;port &lt;span class="o"&gt;=&lt;/span&gt; http,https
filter &lt;span class="o"&gt;=&lt;/span&gt; nginx-http-auth
logpath &lt;span class="o"&gt;=&lt;/span&gt; /var/log/nginx/error.log

&lt;span class="c"&gt;# Service management&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start fail2ban
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;fail2ban
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status fail2ban

&lt;span class="c"&gt;# Check banned IPs&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;fail2ban-client status
&lt;span class="nb"&gt;sudo &lt;/span&gt;fail2ban-client status sshd

&lt;span class="c"&gt;# Unban an IP&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;fail2ban-client &lt;span class="nb"&gt;set &lt;/span&gt;sshd unbanip 1.2.3.4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Server Hardening Checklist
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Keep system updated&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt autoremove &lt;span class="nt"&gt;-y&lt;/span&gt;

&lt;span class="c"&gt;# 2. Automatic security updates&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;unattended-upgrades
&lt;span class="nb"&gt;sudo &lt;/span&gt;dpkg-reconfigure &lt;span class="nt"&gt;-plow&lt;/span&gt; unattended-upgrades

&lt;span class="c"&gt;# 3. SSH hardening (see Part 1 SSH section)&lt;/span&gt;

&lt;span class="c"&gt;# 4. Disable root login&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;passwd &lt;span class="nt"&gt;-l&lt;/span&gt; root                   &lt;span class="c"&gt;# Lock root password&lt;/span&gt;

&lt;span class="c"&gt;# 5. Remove unnecessary packages&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt remove telnet ftp             &lt;span class="c"&gt;# Remove insecure services&lt;/span&gt;

&lt;span class="c"&gt;# 6. Secure /tmp&lt;/span&gt;
&lt;span class="c"&gt;# Mount /tmp with noexec option&lt;/span&gt;

&lt;span class="c"&gt;# 7. Security headers (in Nginx/Apache)&lt;/span&gt;
add_header X-Frame-Options &lt;span class="s2"&gt;"SAMEORIGIN"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
add_header X-Content-Type-Options &lt;span class="s2"&gt;"nosniff"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
add_header X-XSS-Protection &lt;span class="s2"&gt;"1; mode=block"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
add_header Strict-Transport-Security &lt;span class="s2"&gt;"max-age=31536000; includeSubDomains"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
add_header Content-Security-Policy &lt;span class="s2"&gt;"default-src 'self'"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
add_header Referrer-Policy &lt;span class="s2"&gt;"strict-origin-when-cross-origin"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c"&gt;# 8. File permissions audit&lt;/span&gt;
find /var/www &lt;span class="nt"&gt;-type&lt;/span&gt; f &lt;span class="nt"&gt;-perm&lt;/span&gt; 0777       &lt;span class="c"&gt;# Find world-writable files&lt;/span&gt;
find /var/www &lt;span class="nt"&gt;-type&lt;/span&gt; d &lt;span class="nt"&gt;-perm&lt;/span&gt; 0777       &lt;span class="c"&gt;# Find world-writable directories&lt;/span&gt;

&lt;span class="c"&gt;# 9. Monitor auth logs&lt;/span&gt;
&lt;span class="nb"&gt;sudo tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/auth.log
&lt;span class="nb"&gt;sudo grep&lt;/span&gt; &lt;span class="s2"&gt;"Failed password"&lt;/span&gt; /var/log/auth.log | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt;

&lt;span class="c"&gt;# 10. Check for rootkits&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;rkhunter
&lt;span class="nb"&gt;sudo &lt;/span&gt;rkhunter &lt;span class="nt"&gt;--check&lt;/span&gt;

&lt;span class="c"&gt;# 11. Audit open ports&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ss &lt;span class="nt"&gt;-tlnp&lt;/span&gt;                         &lt;span class="c"&gt;# Should only show expected ports&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sT&lt;/span&gt; localhost                &lt;span class="c"&gt;# Scan own ports&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Interview Q&amp;amp;A: Security
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Answer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;How do you secure a new server?&lt;/td&gt;
&lt;td&gt;Update OS, configure firewall (UFW), SSH hardening, fail2ban, disable root, security headers, automatic updates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is fail2ban?&lt;/td&gt;
&lt;td&gt;Monitors logs for failed auth attempts, bans IPs after threshold. Prevents brute force&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is UFW?&lt;/td&gt;
&lt;td&gt;Uncomplicated Firewall - simplified interface for iptables on Ubuntu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What ports should be open on a web server?&lt;/td&gt;
&lt;td&gt;22 (or custom SSH), 80 (HTTP), 443 (HTTPS). Everything else blocked&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How to check for unauthorized access?&lt;/td&gt;
&lt;td&gt;Check &lt;code&gt;/var/log/auth.log&lt;/code&gt;, check &lt;code&gt;last&lt;/code&gt; command, check running processes, audit open ports&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What are security headers?&lt;/td&gt;
&lt;td&gt;HTTP headers that protect against XSS, clickjacking, content sniffing. Set in web server config&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  5.4 Troubleshooting HTTP Errors
&lt;/h2&gt;

&lt;h3&gt;
  
  
  500 Internal Server Error
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Most common causes &amp;amp; fixes:&lt;/span&gt;

&lt;span class="c"&gt;# 1. Check error logs FIRST&lt;/span&gt;
&lt;span class="nb"&gt;sudo tail&lt;/span&gt; &lt;span class="nt"&gt;-50&lt;/span&gt; /var/log/apache2/error.log
&lt;span class="nb"&gt;sudo tail&lt;/span&gt; &lt;span class="nt"&gt;-50&lt;/span&gt; /var/log/nginx/error.log
&lt;span class="nb"&gt;sudo tail&lt;/span&gt; &lt;span class="nt"&gt;-50&lt;/span&gt; /var/log/php8.2-fpm.log

&lt;span class="c"&gt;# 2. PHP errors&lt;/span&gt;
&lt;span class="c"&gt;# Check php.ini:&lt;/span&gt;
display_errors &lt;span class="o"&gt;=&lt;/span&gt; On   &lt;span class="c"&gt;# Temporarily (NEVER in production)&lt;/span&gt;
&lt;span class="c"&gt;# Or check PHP error log&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/php/error.log

&lt;span class="c"&gt;# 3. .htaccess issues (Apache)&lt;/span&gt;
&lt;span class="c"&gt;# Temporarily rename .htaccess to test:&lt;/span&gt;
&lt;span class="nb"&gt;mv&lt;/span&gt; /var/www/html/.htaccess /var/www/html/.htaccess.bak
&lt;span class="c"&gt;# If site works → .htaccess has syntax error&lt;/span&gt;

&lt;span class="c"&gt;# 4. File permissions&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /var/www/html/
&lt;span class="c"&gt;# Files should be 644, dirs 755, owned by www-data&lt;/span&gt;

&lt;span class="c"&gt;# 5. PHP memory limit&lt;/span&gt;
&lt;span class="c"&gt;# Error: "Allowed memory size exhausted"&lt;/span&gt;
&lt;span class="c"&gt;# Fix in php.ini: memory_limit = 256M&lt;/span&gt;

&lt;span class="c"&gt;# 6. Missing PHP extensions&lt;/span&gt;
php &lt;span class="nt"&gt;-m&lt;/span&gt;  &lt;span class="c"&gt;# Check if required extensions are installed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  502 Bad Gateway
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Means: Nginx/Apache can't reach the backend (PHP-FPM, Node.js, etc.)&lt;/span&gt;

&lt;span class="c"&gt;# 1. Check if PHP-FPM is running&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status php8.2-fpm

&lt;span class="c"&gt;# 2. Check PHP-FPM socket&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /var/run/php/php8.2-fpm.sock
&lt;span class="c"&gt;# If missing → restart PHP-FPM&lt;/span&gt;

&lt;span class="c"&gt;# 3. Check Nginx config matches PHP-FPM socket&lt;/span&gt;
&lt;span class="c"&gt;# Nginx should have: fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;&lt;/span&gt;
&lt;span class="c"&gt;# PHP-FPM should have: listen = /var/run/php/php8.2-fpm.sock&lt;/span&gt;

&lt;span class="c"&gt;# 4. Check backend app (Node.js, Python)&lt;/span&gt;
&lt;span class="c"&gt;# Is the app running? Is it on the right port?&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;lsof &lt;span class="nt"&gt;-i&lt;/span&gt; :3000                    &lt;span class="c"&gt;# Check if app is listening&lt;/span&gt;

&lt;span class="c"&gt;# 5. Check PHP-FPM pool config&lt;/span&gt;
&lt;span class="c"&gt;# Too few workers? Increase pm.max_children&lt;/span&gt;

&lt;span class="c"&gt;# 6. Check memory - OOM killer may have killed PHP-FPM&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dmesg | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"out of memory"&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dmesg | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"oom"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  503 Service Unavailable
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Means: Server is overloaded or in maintenance&lt;/span&gt;

&lt;span class="c"&gt;# 1. Check server load&lt;/span&gt;
&lt;span class="nb"&gt;uptime
&lt;/span&gt;htop

&lt;span class="c"&gt;# 2. Check if service is running&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status nginx
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status apache2
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status php8.2-fpm

&lt;span class="c"&gt;# 3. Check connections&lt;/span&gt;
ss &lt;span class="nt"&gt;-s&lt;/span&gt;                                 &lt;span class="c"&gt;# Socket summary&lt;/span&gt;
ss &lt;span class="nt"&gt;-tlnp&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; :80                   &lt;span class="c"&gt;# Connections on port 80&lt;/span&gt;

&lt;span class="c"&gt;# 4. Check rate limiting&lt;/span&gt;
&lt;span class="c"&gt;# Nginx: check if limit_req is too aggressive&lt;/span&gt;
&lt;span class="c"&gt;# Cloudflare: check if WAF is blocking&lt;/span&gt;

&lt;span class="c"&gt;# 5. Database overloaded&lt;/span&gt;
mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"SHOW PROCESSLIST;"&lt;/span&gt;
&lt;span class="c"&gt;# Too many connections? Kill stuck queries&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  504 Gateway Timeout
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Means: Backend took too long to respond&lt;/span&gt;

&lt;span class="c"&gt;# 1. Increase timeout in Nginx&lt;/span&gt;
proxy_read_timeout 300&lt;span class="p"&gt;;&lt;/span&gt;
proxy_connect_timeout 300&lt;span class="p"&gt;;&lt;/span&gt;
fastcgi_read_timeout 300&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c"&gt;# 2. Increase timeout in Apache&lt;/span&gt;
ProxyTimeout 300
Timeout 300

&lt;span class="c"&gt;# 3. Increase PHP execution time&lt;/span&gt;
&lt;span class="c"&gt;# php.ini: max_execution_time = 300&lt;/span&gt;

&lt;span class="c"&gt;# 4. Check for slow database queries&lt;/span&gt;
mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"SHOW FULL PROCESSLIST;"&lt;/span&gt;
&lt;span class="c"&gt;# Check slow query log&lt;/span&gt;

&lt;span class="c"&gt;# 5. Check if server is overloaded&lt;/span&gt;
htop                                   &lt;span class="c"&gt;# High CPU/RAM usage?&lt;/span&gt;
iostat                                 &lt;span class="c"&gt;# High disk I/O?&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  DNS Issues Troubleshooting
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Domain not resolving&lt;/span&gt;
dig example.com                        &lt;span class="c"&gt;# Check A record&lt;/span&gt;
dig @8.8.8.8 example.com              &lt;span class="c"&gt;# Check with Google DNS&lt;/span&gt;
ping example.com                       &lt;span class="c"&gt;# Test connectivity&lt;/span&gt;

&lt;span class="c"&gt;# 2. Wrong IP&lt;/span&gt;
dig +short example.com                 &lt;span class="c"&gt;# What IP is it resolving to?&lt;/span&gt;
&lt;span class="c"&gt;# Update A record in DNS provider&lt;/span&gt;

&lt;span class="c"&gt;# 3. Propagation delay&lt;/span&gt;
&lt;span class="c"&gt;# Check propagation: dnschecker.org&lt;/span&gt;
&lt;span class="c"&gt;# Solution: Wait, or flush local DNS cache&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemd-resolve &lt;span class="nt"&gt;--flush-caches&lt;/span&gt;

&lt;span class="c"&gt;# 4. Subdomain not working&lt;/span&gt;
dig subdomain.example.com              &lt;span class="c"&gt;# Check if A/CNAME record exists&lt;/span&gt;
&lt;span class="c"&gt;# Add appropriate record in DNS&lt;/span&gt;

&lt;span class="c"&gt;# 5. Email not working&lt;/span&gt;
dig MX example.com                     &lt;span class="c"&gt;# Check MX records&lt;/span&gt;
dig TXT example.com                    &lt;span class="c"&gt;# Check SPF/DKIM&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  SSL Issues Troubleshooting
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Certificate expired&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; | openssl s_client &lt;span class="nt"&gt;-connect&lt;/span&gt; example.com:443 2&amp;gt;/dev/null | openssl x509 &lt;span class="nt"&gt;-noout&lt;/span&gt; &lt;span class="nt"&gt;-dates&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;certbot renew

&lt;span class="c"&gt;# 2. Mixed content (HTTP on HTTPS page)&lt;/span&gt;
&lt;span class="c"&gt;# Fix URLs in code/database to use HTTPS&lt;/span&gt;
&lt;span class="c"&gt;# WordPress: update site URL in wp_options table&lt;/span&gt;

&lt;span class="c"&gt;# 3. Certificate doesn't match domain&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; | openssl s_client &lt;span class="nt"&gt;-connect&lt;/span&gt; example.com:443 &lt;span class="nt"&gt;-servername&lt;/span&gt; example.com 2&amp;gt;/dev/null | openssl x509 &lt;span class="nt"&gt;-noout&lt;/span&gt; &lt;span class="nt"&gt;-subject&lt;/span&gt; &lt;span class="nt"&gt;-issuer&lt;/span&gt;
&lt;span class="c"&gt;# Reissue certificate for correct domain&lt;/span&gt;

&lt;span class="c"&gt;# 4. Let's Encrypt renewal failing&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;certbot renew &lt;span class="nt"&gt;--dry-run&lt;/span&gt;          &lt;span class="c"&gt;# Test renewal&lt;/span&gt;
&lt;span class="c"&gt;# Common issues:&lt;/span&gt;
&lt;span class="c"&gt;# - Port 80 blocked (needs to be open for HTTP challenge)&lt;/span&gt;
&lt;span class="c"&gt;# - DNS not pointing to this server&lt;/span&gt;
&lt;span class="c"&gt;# - .well-known/acme-challenge not accessible&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Database Connectivity Issues
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Can't connect to MySQL&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status mysql            &lt;span class="c"&gt;# Is it running?&lt;/span&gt;
&lt;span class="nb"&gt;sudo tail&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt; /var/log/mysql/error.log &lt;span class="c"&gt;# Check error log&lt;/span&gt;

&lt;span class="c"&gt;# 2. Access denied&lt;/span&gt;
mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt;                       &lt;span class="c"&gt;# Test credentials&lt;/span&gt;
&lt;span class="c"&gt;# Check user@host: SELECT user, host FROM mysql.user;&lt;/span&gt;

&lt;span class="c"&gt;# 3. Too many connections&lt;/span&gt;
mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"SHOW STATUS LIKE 'Threads_connected';"&lt;/span&gt;
mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"SHOW VARIABLES LIKE 'max_connections';"&lt;/span&gt;
&lt;span class="c"&gt;# Increase max_connections if needed&lt;/span&gt;

&lt;span class="c"&gt;# 4. MySQL crashed&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart mysql
&lt;span class="nb"&gt;sudo tail&lt;/span&gt; &lt;span class="nt"&gt;-50&lt;/span&gt; /var/log/mysql/error.log
&lt;span class="c"&gt;# Check for OOM: sudo dmesg | grep -i mysql&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Email/SMTP Troubleshooting
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Check mail queue&lt;/span&gt;
mailq                                  &lt;span class="c"&gt;# View pending emails&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;postqueue &lt;span class="nt"&gt;-f&lt;/span&gt;                      &lt;span class="c"&gt;# Flush/retry mail queue&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;postsuper &lt;span class="nt"&gt;-d&lt;/span&gt; ALL                  &lt;span class="c"&gt;# Delete all queued mail&lt;/span&gt;

&lt;span class="c"&gt;# 2. Check mail logs&lt;/span&gt;
&lt;span class="nb"&gt;sudo tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/mail.log
&lt;span class="nb"&gt;sudo grep&lt;/span&gt; &lt;span class="s2"&gt;"status=bounced"&lt;/span&gt; /var/log/mail.log | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt;

&lt;span class="c"&gt;# 3. Test SMTP&lt;/span&gt;
telnet mail.example.com 25             &lt;span class="c"&gt;# Test SMTP connection&lt;/span&gt;
openssl s_client &lt;span class="nt"&gt;-connect&lt;/span&gt; mail.example.com:587 &lt;span class="nt"&gt;-starttls&lt;/span&gt; smtp  &lt;span class="c"&gt;# Test STARTTLS&lt;/span&gt;

&lt;span class="c"&gt;# 4. Check SPF/DKIM/DMARC&lt;/span&gt;
dig TXT example.com                    &lt;span class="c"&gt;# SPF&lt;/span&gt;
dig TXT default._domainkey.example.com &lt;span class="c"&gt;# DKIM&lt;/span&gt;
dig TXT _dmarc.example.com            &lt;span class="c"&gt;# DMARC&lt;/span&gt;

&lt;span class="c"&gt;# 5. Test email delivery&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Test"&lt;/span&gt; | mail &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"Test Email"&lt;/span&gt; user@example.com

&lt;span class="c"&gt;# 6. Check if port 25/587 is blocked&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ss &lt;span class="nt"&gt;-tlnp&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"25|587"&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw status | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"25|587"&lt;/span&gt;

&lt;span class="c"&gt;# 7. Check blacklist status&lt;/span&gt;
&lt;span class="c"&gt;# Use: mxtoolbox.com/blacklists.aspx&lt;/span&gt;
&lt;span class="c"&gt;# Check reverse DNS: dig -x YOUR_SERVER_IP&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Interview Q&amp;amp;A: Troubleshooting
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Answer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;First thing you do when a site is down?&lt;/td&gt;
&lt;td&gt;Check if server is reachable (ping), check web server status, check error logs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How to diagnose a 500 error?&lt;/td&gt;
&lt;td&gt;Check error logs (apache/nginx/php), check permissions, check .htaccess, check PHP config&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference between 502 and 504?&lt;/td&gt;
&lt;td&gt;502: backend unreachable/crashed. 504: backend is running but too slow to respond&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Website is slow. How to diagnose?&lt;/td&gt;
&lt;td&gt;Check server load (htop), check slow query log, check PHP-FPM status, check disk I/O, check network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server ran out of disk space. Quick fix?&lt;/td&gt;
&lt;td&gt;Find large files (&lt;code&gt;du -sh&lt;/code&gt;), clean old logs, clear apt cache (&lt;code&gt;apt clean&lt;/code&gt;), remove old backups&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How to handle DDoS?&lt;/td&gt;
&lt;td&gt;Enable Cloudflare, configure rate limiting, use fail2ban, block suspicious IPs, enable UFW rate limiting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How to check if emails are being delivered?&lt;/td&gt;
&lt;td&gt;Check mail logs, verify SPF/DKIM/DMARC records, check blacklists, test with mxtoolbox&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>linux</category>
      <category>monitoring</category>
      <category>security</category>
      <category>backup</category>
    </item>
  </channel>
</rss>
