<?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>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>
    <item>
      <title>MySQL &amp; MariaDB Database Administration</title>
      <dc:creator>Yashvi Kothari</dc:creator>
      <pubDate>Wed, 12 Aug 2026 11:19:23 +0000</pubDate>
      <link>https://dev.to/yashvikothari/mysql-mariadb-database-administration-4pcc</link>
      <guid>https://dev.to/yashvikothari/mysql-mariadb-database-administration-4pcc</guid>
      <description>&lt;h1&gt;
  
  
  MySQL &amp;amp; MariaDB Database Administration: The Practical Guide Every Linux/DevOps Engineer Should Know
&lt;/h1&gt;

&lt;p&gt;Most people learn MySQL by memorizing SQL commands.&lt;/p&gt;

&lt;p&gt;That’s not database administration.&lt;/p&gt;

&lt;p&gt;A real DBA or DevOps engineer needs to know five things:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install it. Secure it. Manage it. Back it up. Recover it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And when production gets slow?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Find out why.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This guide covers the practical MySQL and MariaDB skills you need to work with databases on Linux servers—and explain them confidently in an interview.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Start With Installation
&lt;/h2&gt;

&lt;p&gt;On Ubuntu:&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 update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;mysql-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then secure the installation:&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;mysql_secure_installation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is one of the first things you should do after installation.&lt;/p&gt;

&lt;p&gt;Typical hardening includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Removing anonymous users&lt;/li&gt;
&lt;li&gt;Preventing remote root login&lt;/li&gt;
&lt;li&gt;Removing the test database&lt;/li&gt;
&lt;li&gt;Setting appropriate root authentication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For MariaDB:&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;mariadb-server
&lt;span class="nb"&gt;sudo &lt;/span&gt;mysql_secure_installation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check the service:&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;Start, stop, restart, and enable 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;sudo &lt;/span&gt;systemctl start mysql
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl stop mysql
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart mysql
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;mysql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check the version:&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;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Login:&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;On Ubuntu, root may use socket authentication, so this can also work:&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;mysql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  2. Users Are a Security Boundary
&lt;/h1&gt;

&lt;p&gt;Never give every application full database access.&lt;/p&gt;

&lt;p&gt;Create users with the minimum permissions they need.&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;CREATE&lt;/span&gt; &lt;span class="k"&gt;USER&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="n"&gt;IDENTIFIED&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="s1"&gt;'StrongP@ssw0rd!'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a remote application:&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;CREATE&lt;/span&gt; &lt;span class="k"&gt;USER&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;'192.168.1.%'&lt;/span&gt;
&lt;span class="n"&gt;IDENTIFIED&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="s1"&gt;'StrongP@ssw0rd!'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then grant only what is required:&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;GRANT&lt;/span&gt; &lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;INSERT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;UPDATE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;DELETE&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;mydb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;TO&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;Need full access to one 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;GRANT&lt;/span&gt; &lt;span class="k"&gt;ALL&lt;/span&gt; &lt;span class="k"&gt;PRIVILEGES&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;mydb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;TO&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;Check permissions:&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;Change a password:&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;USER&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="n"&gt;IDENTIFIED&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="s1"&gt;'NewP@ssw0rd!'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Remove the user:&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;DROP&lt;/span&gt; &lt;span class="k"&gt;USER&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;h3&gt;
  
  
  The important interview concept
&lt;/h3&gt;

&lt;p&gt;MySQL permissions are not simply about the username.&lt;/p&gt;

&lt;p&gt;They are based on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;'user'@'host'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are different accounts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;'appuser'@'localhost'
'appuser'@'%'
'appuser'@'192.168.1.%'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That distinction matters enormously when troubleshooting:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Access denied.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  3. Database Administration Starts With Visibility
&lt;/h1&gt;

&lt;p&gt;Before changing anything, inspect the system.&lt;/p&gt;

&lt;p&gt;List databases:&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;DATABASES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create one:&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;CREATE&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;myapp_production&lt;/span&gt;
&lt;span class="nb"&gt;CHARACTER&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;utf8mb4&lt;/span&gt;
&lt;span class="k"&gt;COLLATE&lt;/span&gt; &lt;span class="n"&gt;utf8mb4_unicode_ci&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Select it:&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="n"&gt;USE&lt;/span&gt; &lt;span class="n"&gt;myapp_production&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;List tables:&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;TABLES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inspect a 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;DESCRIBE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the complete table definition:&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="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  4. Know Your Database Size
&lt;/h1&gt;

&lt;p&gt;Disk usage becomes a production problem faster than most people expect.&lt;/p&gt;

&lt;p&gt;Check table sizes:&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;SELECT&lt;/span&gt;
    &lt;span class="k"&gt;table_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ROUND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data_length&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="s1"&gt;'Data (MB)'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ROUND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index_length&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="s1"&gt;'Index (MB)'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ROUND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data_length&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;index_length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="s1"&gt;'Total (MB)'&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;information_schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tables&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;table_schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'myapp_production'&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data_length&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;index_length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check database sizes:&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;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;table_schema&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="s1"&gt;'Database'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ROUND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data_length&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;index_length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="s1"&gt;'Size (MB)'&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;information_schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tables&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;table_schema&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data_length&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;index_length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives you something much more useful than:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“The database seems large.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can identify &lt;strong&gt;which database and which tables are consuming the space.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  5. CRUD Is Basic—But You Must Know It
&lt;/h1&gt;

&lt;p&gt;Insert:&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;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'John'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'john@example.com'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read:&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;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="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Filter:&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;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;'john@example.com'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get recent records:&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;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;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Count:&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;SELECT&lt;/span&gt; &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&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="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Update:&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;UPDATE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'John Doe'&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Delete:&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;DELETE&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;id&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Production rule
&lt;/h3&gt;

&lt;p&gt;Be extremely careful with:&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;UPDATE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;SET&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;DELETE&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without a &lt;code&gt;WHERE&lt;/code&gt; clause, you may modify or delete every row.&lt;/p&gt;




&lt;h1&gt;
  
  
  6. Learn to Troubleshoot Live Queries
&lt;/h1&gt;

&lt;p&gt;When the database is slow, don't guess.&lt;/p&gt;

&lt;p&gt;Start here:&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;For more detail:&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="k"&gt;FULL&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;Look for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Long-running queries&lt;/li&gt;
&lt;li&gt;Locked queries&lt;/li&gt;
&lt;li&gt;Waiting transactions&lt;/li&gt;
&lt;li&gt;Too many connections&lt;/li&gt;
&lt;li&gt;Queries stuck in unusual states&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a query is genuinely stuck and you understand the consequences:&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="n"&gt;KILL&lt;/span&gt; &lt;span class="n"&gt;process_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important skill isn't memorizing &lt;code&gt;KILL&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It's knowing &lt;strong&gt;why you're killing the connection.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  7. Backups Are Not Optional
&lt;/h1&gt;

&lt;p&gt;A database without a tested backup is a disaster waiting for a date.&lt;/p&gt;

&lt;p&gt;Single database:&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; myapp_production &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /backups/myapp_production_&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;.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compressed:&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; myapp_production |
&lt;span class="nb"&gt;gzip&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /backups/myapp_production_&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;.sql.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All databases:&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="se"&gt;\&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /backups/all_databases_&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;.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Specific tables:&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; myapp_production &lt;span class="nb"&gt;users &lt;/span&gt;orders &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /backups/tables_backup.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Schema only:&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;--no-data&lt;/span&gt; myapp_production &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /backups/schema_only.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Data only:&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;--no-create-info&lt;/span&gt; myapp_production &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /backups/data_only.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Include routines, triggers, and events:&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="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--routines&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--triggers&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--events&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
myapp_production &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /backups/full_backup.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For larger InnoDB databases:&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="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--single-transaction&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--quick&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--lock-tables&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
myapp_production |
&lt;span class="nb"&gt;gzip&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /backups/myapp_production_&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;.sql.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Remember this
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Backup ≠ recovery.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A backup becomes valuable only when you can successfully restore it.&lt;/p&gt;




&lt;h1&gt;
  
  
  8. Restore Like You Mean It
&lt;/h1&gt;

&lt;p&gt;Restore an SQL dump:&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; myapp_production &lt;span class="se"&gt;\&lt;/span&gt;
&amp;lt; /backups/myapp_production_20240101.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compressed backup:&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;gunzip&lt;/span&gt; &amp;lt; /backups/myapp_production_20240101.sql.gz |
mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt; myapp_production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restore all databases:&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="se"&gt;\&lt;/span&gt;
&amp;lt; /backups/all_databases_20240101.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the database doesn't exist:&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="se"&gt;\&lt;/span&gt;
&lt;span class="s2"&gt;"CREATE DATABASE IF NOT EXISTS myapp_production
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then restore:&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; myapp_production &lt;span class="se"&gt;\&lt;/span&gt;
&amp;lt; /backups/myapp_production_20240101.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A good administrator doesn't merely say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“We have backups.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They can answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“How long does restoration take, where are the backups stored, and when was the last restore test?”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  9. Automate Backups
&lt;/h1&gt;

&lt;p&gt;Manual backups eventually become forgotten backups.&lt;/p&gt;

&lt;p&gt;A simple script can automate them:&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;#!/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_%H-%M&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/mysql"&lt;/span&gt;
&lt;span class="nv"&gt;RETENTION_DAYS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;30

&lt;span class="nv"&gt;DB_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"backup_user"&lt;/span&gt;
&lt;span class="nv"&gt;DB_PASS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"secure_password"&lt;/span&gt;

&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$BACKUP_DIR&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nv"&gt;DATABASES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;mysql &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$DB_USER&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-p&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$DB_PASS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"SHOW DATABASES"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;--skip-column-names&lt;/span&gt; |
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-Ev&lt;/span&gt; &lt;span class="s2"&gt;"(information_schema|performance_schema|sys|mysql)"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;DB &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;$DATABASES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do

    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Backing up &lt;/span&gt;&lt;span class="nv"&gt;$DB&lt;/span&gt;&lt;span class="s2"&gt;..."&lt;/span&gt;

    mysqldump &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$DB_USER&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-p&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$DB_PASS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--single-transaction&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--quick&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--routines&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--triggers&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$DB&lt;/span&gt;&lt;span class="s2"&gt;"&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="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$BACKUP_DIR&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DB&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;_&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DATE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.sql.gz"&lt;/span&gt;

    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Done: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DB&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;_&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DATE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.sql.gz"&lt;/span&gt;

&lt;span class="k"&gt;done

&lt;/span&gt;find &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$BACKUP_DIR&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.sql.gz"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-mtime&lt;/span&gt; +&lt;span class="nv"&gt;$RETENTION_DAYS&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-delete&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Backup completed at &lt;/span&gt;&lt;span class="nv"&gt;$DATE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make it executable:&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;chmod&lt;/span&gt; +x /usr/local/bin/mysql_backup.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Schedule it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;crontab &lt;span class="nt"&gt;-e&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0 2 * * * /usr/local/bin/mysql_backup.sh &amp;gt;&amp;gt; /var/log/mysql_backup.log 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the database gets backed up every day at 2 AM.&lt;/p&gt;




&lt;h1&gt;
  
  
  10. Performance Tuning: Don't Change Random Variables
&lt;/h1&gt;

&lt;p&gt;One of the most important MySQL tuning parameters is:&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="err"&gt;innodb_buffer_pool_size&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The buffer pool caches InnoDB data and indexes in memory.&lt;/p&gt;

&lt;p&gt;For a dedicated database server, a common starting point is roughly &lt;strong&gt;50–70% of available RAM&lt;/strong&gt;, but the correct value depends on the workload and what else runs on the machine.&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 ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[mysqld]&lt;/span&gt;

&lt;span class="py"&gt;max_connections&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;200&lt;/span&gt;

&lt;span class="py"&gt;wait_timeout&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;600&lt;/span&gt;
&lt;span class="py"&gt;interactive_timeout&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;600&lt;/span&gt;

&lt;span class="py"&gt;innodb_buffer_pool_size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;1G&lt;/span&gt;

&lt;span class="py"&gt;innodb_flush_log_at_trx_commit&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;2&lt;/span&gt;
&lt;span class="py"&gt;innodb_flush_method&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;O_DIRECT&lt;/span&gt;

&lt;span class="py"&gt;tmp_table_size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;64M&lt;/span&gt;
&lt;span class="py"&gt;max_heap_table_size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;64M&lt;/span&gt;

&lt;span class="py"&gt;slow_query_log&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;1&lt;/span&gt;
&lt;span class="py"&gt;slow_query_log_file&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;/var/log/mysql/slow.log&lt;/span&gt;
&lt;span class="py"&gt;long_query_time&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;2&lt;/span&gt;

&lt;span class="py"&gt;bind-address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;127.0.0.1&lt;/span&gt;

&lt;span class="py"&gt;character-set-server&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;utf8mb4&lt;/span&gt;
&lt;span class="py"&gt;collation-server&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;utf8mb4_unicode_ci&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Don't blindly copy production values from a tutorial.&lt;/p&gt;

&lt;p&gt;A 1 GB buffer pool makes sense on one server and is completely wrong on another.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tune based on workload, RAM, concurrency, and measurements.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  11. Find Slow Queries
&lt;/h1&gt;

&lt;p&gt;Enable the slow query log:&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;slow_query_log&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;1&lt;/span&gt;
&lt;span class="py"&gt;slow_query_log_file&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;/var/log/mysql/slow.log&lt;/span&gt;
&lt;span class="py"&gt;long_query_time&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then inspect:&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;VARIABLES&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'slow_query_log%'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;SHOW&lt;/span&gt; &lt;span class="n"&gt;VARIABLES&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'long_query_time'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal isn't simply:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Find queries taking more than 2 seconds.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The goal is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Understand why they're slow.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  12. EXPLAIN Is One of Your Best Friends
&lt;/h1&gt;

&lt;p&gt;Suppose this query is slow:&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;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;'john@example.com'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run:&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;EXPLAIN&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;'john@example.com'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On supported MySQL versions:&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;EXPLAIN&lt;/span&gt; &lt;span class="k"&gt;ANALYZE&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;'john@example.com'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look for issues such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full table scans&lt;/li&gt;
&lt;li&gt;Poor index selection&lt;/li&gt;
&lt;li&gt;Excessive rows examined&lt;/li&gt;
&lt;li&gt;Bad join strategies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check existing indexes:&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="k"&gt;INDEX&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add an index when appropriate:&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;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_email&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another example:&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;users&lt;/span&gt;
&lt;span class="k"&gt;ADD&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_created&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&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 optimize the query you think is slow. Measure the query that is actually slow.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  13. Remote MySQL Access
&lt;/h1&gt;

&lt;p&gt;By default, MySQL is often configured for local access.&lt;/p&gt;

&lt;p&gt;To permit remote connections, modify:&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;nano /etc/mysql/mysql.conf.d/mysqld.cnf
&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 ini"&gt;&lt;code&gt;&lt;span class="py"&gt;bind-address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;0.0.0.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But don't stop there.&lt;/p&gt;

&lt;p&gt;Opening MySQL to the entire internet is a bad idea.&lt;/p&gt;

&lt;p&gt;Create a restricted user:&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;CREATE&lt;/span&gt; &lt;span class="k"&gt;USER&lt;/span&gt; &lt;span class="s1"&gt;'remote_user'&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="s1"&gt;'192.168.1.%'&lt;/span&gt;
&lt;span class="n"&gt;IDENTIFIED&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="s1"&gt;'StrongP@ss!'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Grant only the required database permissions:&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;GRANT&lt;/span&gt; &lt;span class="k"&gt;ALL&lt;/span&gt; &lt;span class="k"&gt;PRIVILEGES&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;mydb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="s1"&gt;'remote_user'&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="s1"&gt;'192.168.1.%'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restrict the firewall:&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 from 192.168.1.0/24 to any port 3306
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart:&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 mysql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Better security principle
&lt;/h3&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Internet → MySQL:3306
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;prefer 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;Application Server
       ↓
Private Network
       ↓
MySQL Server:3306
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Database ports should be exposed only where necessary.&lt;/p&gt;




&lt;h1&gt;
  
  
  14. Common Production Problems
&lt;/h1&gt;

&lt;h3&gt;
  
  
  ERROR 1045: Access denied
&lt;/h3&gt;

&lt;p&gt;Check:&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;SELECT&lt;/span&gt; &lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;plugin&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="p"&gt;;&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 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;'username'&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="s1"&gt;'host'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user@localhost
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is not necessarily the same account as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user@%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Can't connect to socket
&lt;/h3&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 mysql
&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 start mysql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If necessary, verify the socket path and server configuration.&lt;/p&gt;




&lt;h3&gt;
  
  
  Too many connections
&lt;/h3&gt;

&lt;p&gt;Check:&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;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;'Max_used_connections'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;SHOW&lt;/span&gt; &lt;span class="n"&gt;VARIABLES&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'max_connections'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then investigate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Connection leaks&lt;/li&gt;
&lt;li&gt;Application pooling&lt;/li&gt;
&lt;li&gt;Long-running sessions&lt;/li&gt;
&lt;li&gt;Incorrect application configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't automatically increase &lt;code&gt;max_connections&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;More connections also mean more memory pressure.&lt;/p&gt;




&lt;h3&gt;
  
  
  Slow queries
&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 sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SHOW&lt;/span&gt; &lt;span class="k"&gt;FULL&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;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;EXPLAIN&lt;/span&gt; &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="p"&gt;...;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check indexes:&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="k"&gt;INDEX&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And inspect the slow query log.&lt;/p&gt;




&lt;h3&gt;
  
  
  Disk full
&lt;/h3&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;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 investigate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MySQL logs&lt;/li&gt;
&lt;li&gt;Binary logs&lt;/li&gt;
&lt;li&gt;Old backups&lt;/li&gt;
&lt;li&gt;Large tables&lt;/li&gt;
&lt;li&gt;Temporary files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A full filesystem can quickly turn a database problem into a complete application outage.&lt;/p&gt;




&lt;h3&gt;
  
  
  MySQL won't start
&lt;/h3&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 mysql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then inspect 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/mysql/error.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also validate configuration before restarting after configuration changes.&lt;/p&gt;




&lt;h1&gt;
  
  
  15. MySQL vs MariaDB
&lt;/h1&gt;

&lt;p&gt;MariaDB began as a fork of MySQL and remains highly compatible with MySQL in many common use cases.&lt;/p&gt;

&lt;p&gt;But don't assume they are identical.&lt;/p&gt;

&lt;p&gt;Over time, the two projects have diverged in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Features&lt;/li&gt;
&lt;li&gt;Storage engines&lt;/li&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;li&gt;Optimizer behavior&lt;/li&gt;
&lt;li&gt;System variables&lt;/li&gt;
&lt;li&gt;Replication capabilities&lt;/li&gt;
&lt;li&gt;Version-specific syntax&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For an interview, a good answer is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“MariaDB originated as a MySQL fork and maintains substantial compatibility, but modern MySQL and MariaDB have diverged, so I always verify version-specific behavior before migrating or configuring production systems.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's much stronger than:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“They're basically the same.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  16. The Interview Questions You Should Be Ready For
&lt;/h1&gt;

&lt;h3&gt;
  
  
  How do you back up MySQL?
&lt;/h3&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; mydb |
&lt;span class="nb"&gt;gzip&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; backup.sql.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  How do you restore it?
&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;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; mydb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  What is InnoDB?
&lt;/h3&gt;

&lt;p&gt;InnoDB is the primary transactional storage engine used by modern MySQL installations.&lt;/p&gt;

&lt;p&gt;It supports features such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Transactions&lt;/li&gt;
&lt;li&gt;Row-level locking&lt;/li&gt;
&lt;li&gt;Foreign keys&lt;/li&gt;
&lt;li&gt;Crash recovery&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  What is &lt;code&gt;innodb_buffer_pool_size&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;It's the memory area InnoDB uses to cache data and indexes.&lt;/p&gt;

&lt;p&gt;For a dedicated database server, it is often one of the most important memory-related tuning parameters.&lt;/p&gt;




&lt;h3&gt;
  
  
  How do you find slow queries?
&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 plaintext"&gt;&lt;code&gt;Slow Query Log
        ↓
Identify expensive queries
        ↓
EXPLAIN / EXPLAIN ANALYZE
        ↓
Indexes / query optimization
        ↓
Measure again
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  What port does MySQL normally use?
&lt;/h3&gt;



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

&lt;/div&gt;






&lt;h3&gt;
  
  
  How do you check database size?
&lt;/h3&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;information_schema.tables
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and calculate:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;






&lt;h3&gt;
  
  
  How do you secure MySQL?
&lt;/h3&gt;

&lt;p&gt;A strong answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I would run the secure installation process, remove anonymous users and unnecessary test databases, restrict root access, create least-privilege application accounts, restrict network access to port 3306, use strong authentication, protect backups, and monitor logs.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  The Mental Model
&lt;/h1&gt;

&lt;p&gt;Don't memorize 100 MySQL commands.&lt;/p&gt;

&lt;p&gt;Remember the workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;INSTALL
   ↓
SECURE
   ↓
CREATE USERS
   ↓
GRANT LEAST PRIVILEGE
   ↓
CREATE DATABASE
   ↓
MONITOR
   ↓
BACKUP
   ↓
TEST RESTORE
   ↓
TUNE
   ↓
TROUBLESHOOT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's database administration.&lt;/p&gt;

&lt;p&gt;And this is the bigger DevOps lesson:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A database administrator isn't paid to know commands.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;They're paid to prevent data loss, reduce downtime, control access, diagnose performance problems, and recover when something goes wrong.&lt;/p&gt;

&lt;p&gt;Learn the commands.&lt;/p&gt;

&lt;p&gt;But master the reasoning behind them.&lt;/p&gt;

&lt;h1&gt;
  
  
  Part 4: MySQL &amp;amp; MariaDB Database Administration
&lt;/h1&gt;




&lt;h2&gt;
  
  
  4.1 Installation &amp;amp; Setup
&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;# Install MySQL&lt;/span&gt;
&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;mysql-server
&lt;span class="nb"&gt;sudo &lt;/span&gt;mysql_secure_installation         &lt;span class="c"&gt;# ALWAYS run this after install&lt;/span&gt;
&lt;span class="c"&gt;# Answer: Set root password, remove anonymous users, disable remote root login, remove test DB&lt;/span&gt;

&lt;span class="c"&gt;# Install MariaDB (drop-in MySQL replacement)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;mariadb-server
&lt;span class="nb"&gt;sudo &lt;/span&gt;mysql_secure_installation

&lt;span class="c"&gt;# Service management&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start mysql
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl stop mysql
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart mysql
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status mysql
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;mysql

&lt;span class="c"&gt;# Check version&lt;/span&gt;
mysql &lt;span class="nt"&gt;--version&lt;/span&gt;

&lt;span class="c"&gt;# Login&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 as root with password prompt&lt;/span&gt;
mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root                          &lt;span class="c"&gt;# On Ubuntu, root uses socket auth by default&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;mysql                             &lt;span class="c"&gt;# If socket auth is configured&lt;/span&gt;
mysql &lt;span class="nt"&gt;-u&lt;/span&gt; username &lt;span class="nt"&gt;-p&lt;/span&gt; database_name     &lt;span class="c"&gt;# Login to specific database&lt;/span&gt;
mysql &lt;span class="nt"&gt;-h&lt;/span&gt; 192.168.1.100 &lt;span class="nt"&gt;-u&lt;/span&gt; user &lt;span class="nt"&gt;-p&lt;/span&gt;     &lt;span class="c"&gt;# Remote connection&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4.2 User &amp;amp; Permission Management
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- View all users&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;plugin&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Create a new user&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;USER&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="n"&gt;IDENTIFIED&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="s1"&gt;'StrongP@ssw0rd!'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;USER&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;'%'&lt;/span&gt; &lt;span class="n"&gt;IDENTIFIED&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="s1"&gt;'StrongP@ssw0rd!'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;-- Allow from any host&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;USER&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;'192.168.1.%'&lt;/span&gt; &lt;span class="n"&gt;IDENTIFIED&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="s1"&gt;'StrongP@ssw0rd!'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;-- From subnet&lt;/span&gt;

&lt;span class="c1"&gt;-- Grant permissions&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;ALL&lt;/span&gt; &lt;span class="k"&gt;PRIVILEGES&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;mydb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;TO&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;span class="c1"&gt;-- All on specific DB&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;INSERT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;UPDATE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;mydb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;TO&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;span class="c1"&gt;-- Specific&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;ALL&lt;/span&gt; &lt;span class="k"&gt;PRIVILEGES&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="s1"&gt;'admin'&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="s1"&gt;'localhost'&lt;/span&gt; &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;OPTION&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;-- Super admin&lt;/span&gt;

&lt;span class="c1"&gt;-- Revoke permissions&lt;/span&gt;
&lt;span class="k"&gt;REVOKE&lt;/span&gt; &lt;span class="k"&gt;ALL&lt;/span&gt; &lt;span class="k"&gt;PRIVILEGES&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;mydb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&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;span class="c1"&gt;-- Show grants for user&lt;/span&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;span class="c1"&gt;-- Change password&lt;/span&gt;
&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;USER&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="n"&gt;IDENTIFIED&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="s1"&gt;'NewP@ssw0rd!'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Delete user&lt;/span&gt;
&lt;span class="k"&gt;DROP&lt;/span&gt; &lt;span class="k"&gt;USER&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;span class="c1"&gt;-- Apply changes&lt;/span&gt;
&lt;span class="n"&gt;FLUSH&lt;/span&gt; &lt;span class="k"&gt;PRIVILEGES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4.3 Database Operations
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Show all databases&lt;/span&gt;
&lt;span class="k"&gt;SHOW&lt;/span&gt; &lt;span class="n"&gt;DATABASES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Create database&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;myapp_production&lt;/span&gt; &lt;span class="nb"&gt;CHARACTER&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;utf8mb4&lt;/span&gt; &lt;span class="k"&gt;COLLATE&lt;/span&gt; &lt;span class="n"&gt;utf8mb4_unicode_ci&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Use database&lt;/span&gt;
&lt;span class="n"&gt;USE&lt;/span&gt; &lt;span class="n"&gt;myapp_production&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Show tables&lt;/span&gt;
&lt;span class="k"&gt;SHOW&lt;/span&gt; &lt;span class="n"&gt;TABLES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Describe table structure&lt;/span&gt;
&lt;span class="k"&gt;DESCRIBE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;SHOW&lt;/span&gt; &lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Show table sizes&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;table_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
       &lt;span class="n"&gt;ROUND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data_length&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="s1"&gt;'Data (MB)'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;ROUND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index_length&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="s1"&gt;'Index (MB)'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;ROUND&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;data_length&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;index_length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="s1"&gt;'Total (MB)'&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;information_schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tables&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;table_schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'myapp_production'&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data_length&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;index_length&lt;/span&gt;&lt;span class="p"&gt;)&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;-- Show database sizes&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;table_schema&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="s1"&gt;'Database'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;ROUND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data_length&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;index_length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="s1"&gt;'Size (MB)'&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;information_schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tables&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;table_schema&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data_length&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;index_length&lt;/span&gt;&lt;span class="p"&gt;)&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;-- Basic CRUD Operations&lt;/span&gt;
&lt;span class="c1"&gt;-- Create&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'John'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'john@example.com'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Read&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="p"&gt;;&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;'john@example.com'&lt;/span&gt;&lt;span class="p"&gt;;&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;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt; &lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&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="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Update&lt;/span&gt;
&lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'John Doe'&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&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="c1"&gt;-- Delete&lt;/span&gt;
&lt;span class="k"&gt;DELETE&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;id&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="c1"&gt;-- Show running queries&lt;/span&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;span class="k"&gt;SHOW&lt;/span&gt; &lt;span class="k"&gt;FULL&lt;/span&gt; &lt;span class="n"&gt;PROCESSLIST&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Kill a stuck query&lt;/span&gt;
&lt;span class="n"&gt;KILL&lt;/span&gt; &lt;span class="n"&gt;process_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Check server status&lt;/span&gt;
&lt;span class="k"&gt;SHOW&lt;/span&gt; &lt;span class="n"&gt;STATUS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;SHOW&lt;/span&gt; &lt;span class="n"&gt;VARIABLES&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'max_connections'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;SHOW&lt;/span&gt; &lt;span class="n"&gt;VARIABLES&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'%buffer%'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4.4 Backup &amp;amp; Restore (CRITICAL)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Backup Methods
&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;# Single database backup&lt;/span&gt;
mysqldump &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt; myapp_production &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /backups/myapp_production_&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;.sql

&lt;span class="c"&gt;# Single database with compression&lt;/span&gt;
mysqldump &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt; myapp_production | &lt;span class="nb"&gt;gzip&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /backups/myapp_production_&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;.sql.gz

&lt;span class="c"&gt;# ALL databases backup&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="o"&gt;&amp;gt;&lt;/span&gt; /backups/all_databases_&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;.sql

&lt;span class="c"&gt;# Specific tables only&lt;/span&gt;
mysqldump &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt; myapp_production &lt;span class="nb"&gt;users &lt;/span&gt;orders &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /backups/tables_backup.sql

&lt;span class="c"&gt;# Structure only (no data)&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;--no-data&lt;/span&gt; myapp_production &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /backups/schema_only.sql

&lt;span class="c"&gt;# Data only (no structure)&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;--no-create-info&lt;/span&gt; myapp_production &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /backups/data_only.sql

&lt;span class="c"&gt;# With routines, triggers, events&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;--routines&lt;/span&gt; &lt;span class="nt"&gt;--triggers&lt;/span&gt; &lt;span class="nt"&gt;--events&lt;/span&gt; myapp_production &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /backups/full_backup.sql

&lt;span class="c"&gt;# Large databases - add options for reliability&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;--single-transaction&lt;/span&gt; &lt;span class="nt"&gt;--quick&lt;/span&gt; &lt;span class="nt"&gt;--lock-tables&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false &lt;/span&gt;myapp_production | &lt;span class="nb"&gt;gzip&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /backups/myapp_production_&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;.sql.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Restore Methods
&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;# Restore from SQL file&lt;/span&gt;
mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt; myapp_production &amp;lt; /backups/myapp_production_20240101.sql

&lt;span class="c"&gt;# Restore from compressed file&lt;/span&gt;
&lt;span class="nb"&gt;gunzip&lt;/span&gt; &amp;lt; /backups/myapp_production_20240101.sql.gz | mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt; myapp_production

&lt;span class="c"&gt;# Restore all databases&lt;/span&gt;
mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt; &amp;lt; /backups/all_databases_20240101.sql

&lt;span class="c"&gt;# Create database first if it doesn't exist&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;"CREATE DATABASE IF NOT EXISTS myapp_production CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"&lt;/span&gt;
mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt; myapp_production &amp;lt; /backups/myapp_production_20240101.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Automated Backup Script
&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;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# /usr/local/bin/mysql_backup.sh&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_%H-%M&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/mysql"&lt;/span&gt;
&lt;span class="nv"&gt;RETENTION_DAYS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;30
&lt;span class="nv"&gt;DB_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"backup_user"&lt;/span&gt;
&lt;span class="nv"&gt;DB_PASS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"secure_password"&lt;/span&gt;

&lt;span class="c"&gt;# Create backup directory&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;# Get list of all databases (excluding system databases)&lt;/span&gt;
&lt;span class="nv"&gt;DATABASES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;mysql &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="nv"&gt;$DB_USER&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt;&lt;span class="nv"&gt;$DB_PASS&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"SHOW DATABASES"&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;--skip-column-names&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-Ev&lt;/span&gt; &lt;span class="s2"&gt;"(information_schema|performance_schema|sys|mysql)"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Backup each database&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;DB &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;$DATABASES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Backing up &lt;/span&gt;&lt;span class="nv"&gt;$DB&lt;/span&gt;&lt;span class="s2"&gt;..."&lt;/span&gt;
    mysqldump &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="nv"&gt;$DB_USER&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt;&lt;span class="nv"&gt;$DB_PASS&lt;/span&gt; &lt;span class="nt"&gt;--single-transaction&lt;/span&gt; &lt;span class="nt"&gt;--quick&lt;/span&gt; &lt;span class="nt"&gt;--routines&lt;/span&gt; &lt;span class="nt"&gt;--triggers&lt;/span&gt; &lt;span class="nv"&gt;$DB&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;/&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DB&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;_&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DATE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;.sql.gz
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Done: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DB&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;_&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DATE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.sql.gz"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="c"&gt;# Delete old backups&lt;/span&gt;
find &lt;span class="nv"&gt;$BACKUP_DIR&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.sql.gz"&lt;/span&gt; &lt;span class="nt"&gt;-mtime&lt;/span&gt; +&lt;span class="nv"&gt;$RETENTION_DAYS&lt;/span&gt; &lt;span class="nt"&gt;-delete&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Backup completed at &lt;/span&gt;&lt;span class="nv"&gt;$DATE&lt;/span&gt;&lt;span class="s2"&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;# Make executable and add to cron&lt;/span&gt;
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x /usr/local/bin/mysql_backup.sh
&lt;span class="c"&gt;# crontab -e&lt;/span&gt;
&lt;span class="c"&gt;# 0 2 * * * /usr/local/bin/mysql_backup.sh &amp;gt;&amp;gt; /var/log/mysql_backup.log 2&amp;gt;&amp;amp;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4.5 MySQL Performance Tuning
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Key Configuration (&lt;code&gt;/etc/mysql/mysql.conf.d/mysqld.cnf&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[mysqld]&lt;/span&gt;
&lt;span class="c"&gt;# Connection settings
&lt;/span&gt;&lt;span class="py"&gt;max_connections&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;200&lt;/span&gt;
&lt;span class="py"&gt;wait_timeout&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;600&lt;/span&gt;
&lt;span class="py"&gt;interactive_timeout&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;600&lt;/span&gt;

&lt;span class="c"&gt;# InnoDB settings (most important)
&lt;/span&gt;&lt;span class="py"&gt;innodb_buffer_pool_size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;1G           # 50-70% of total RAM for dedicated DB server&lt;/span&gt;
&lt;span class="py"&gt;innodb_log_file_size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;256M&lt;/span&gt;
&lt;span class="py"&gt;innodb_flush_log_at_trx_commit&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;2     # Better performance (1 = safest)&lt;/span&gt;
&lt;span class="py"&gt;innodb_flush_method&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;O_DIRECT&lt;/span&gt;

&lt;span class="c"&gt;# Query cache (MySQL 5.7, removed in 8.0)
# query_cache_type = 1
# query_cache_size = 64M
&lt;/span&gt;
&lt;span class="c"&gt;# Temporary tables
&lt;/span&gt;&lt;span class="py"&gt;tmp_table_size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;64M&lt;/span&gt;
&lt;span class="py"&gt;max_heap_table_size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;64M&lt;/span&gt;

&lt;span class="c"&gt;# Logging
&lt;/span&gt;&lt;span class="py"&gt;slow_query_log&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;1&lt;/span&gt;
&lt;span class="py"&gt;slow_query_log_file&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;/var/log/mysql/slow.log&lt;/span&gt;
&lt;span class="py"&gt;long_query_time&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;2                     # Log queries taking &amp;gt; 2 seconds&lt;/span&gt;

&lt;span class="c"&gt;# Binary logging (for replication)
# log_bin = /var/log/mysql/mysql-bin.log
# server_id = 1
# expire_logs_days = 14
&lt;/span&gt;
&lt;span class="c"&gt;# Security
&lt;/span&gt;&lt;span class="py"&gt;bind-address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;127.0.0.1               # Only allow local connections&lt;/span&gt;
&lt;span class="c"&gt;# bind-address = 0.0.0.0               # Allow remote connections (use with firewall)
&lt;/span&gt;
&lt;span class="c"&gt;# Character set
&lt;/span&gt;&lt;span class="py"&gt;character-set-server&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;utf8mb4&lt;/span&gt;
&lt;span class="py"&gt;collation-server&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;utf8mb4_unicode_ci&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Performance Monitoring
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Check slow queries&lt;/span&gt;
&lt;span class="k"&gt;SHOW&lt;/span&gt; &lt;span class="n"&gt;VARIABLES&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'slow_query_log%'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;SHOW&lt;/span&gt; &lt;span class="n"&gt;VARIABLES&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'long_query_time'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Check connection usage&lt;/span&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;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;'Max_used_connections'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;SHOW&lt;/span&gt; &lt;span class="n"&gt;VARIABLES&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'max_connections'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Check InnoDB buffer pool usage&lt;/span&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;'Innodb_buffer_pool%'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Explain a query (find performance issues)&lt;/span&gt;
&lt;span class="k"&gt;EXPLAIN&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;'john@example.com'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;EXPLAIN&lt;/span&gt; &lt;span class="k"&gt;ANALYZE&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;'john@example.com'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Check indexes&lt;/span&gt;
&lt;span class="k"&gt;SHOW&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Add index for performance&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_email&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&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;users&lt;/span&gt; &lt;span class="k"&gt;ADD&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_created&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Optimize table (after large deletes)&lt;/span&gt;
&lt;span class="n"&gt;OPTIMIZE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Repair table&lt;/span&gt;
&lt;span class="n"&gt;REPAIR&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Check table integrity&lt;/span&gt;
&lt;span class="k"&gt;CHECK&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4.6 MySQL Remote Access Setup
&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;# Step 1: Edit MySQL config&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/mysql/mysql.conf.d/mysqld.cnf
&lt;span class="c"&gt;# Change: bind-address = 0.0.0.0&lt;/span&gt;

&lt;span class="c"&gt;# Step 2: Create user with remote access&lt;/span&gt;
mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt;
CREATE USER &lt;span class="s1"&gt;'remote_user'&lt;/span&gt;@&lt;span class="s1"&gt;'192.168.1.%'&lt;/span&gt; IDENTIFIED BY &lt;span class="s1"&gt;'StrongP@ss!'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
GRANT ALL PRIVILEGES ON mydb.&lt;span class="k"&gt;*&lt;/span&gt; TO &lt;span class="s1"&gt;'remote_user'&lt;/span&gt;@&lt;span class="s1"&gt;'192.168.1.%'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
FLUSH PRIVILEGES&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c"&gt;# Step 3: Open firewall port&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;# Step 4: Restart MySQL&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart mysql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4.7 Common Issues &amp;amp; Fixes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Issue&lt;/th&gt;
&lt;th&gt;Cause&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ERROR 1045: Access denied&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Wrong credentials or host&lt;/td&gt;
&lt;td&gt;Check user@host, password, grants&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ERROR 2002: Can't connect to socket&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;MySQL not running or wrong socket&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;systemctl start mysql&lt;/code&gt;, check socket path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Too many connections&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Connection limit reached&lt;/td&gt;
&lt;td&gt;Increase &lt;code&gt;max_connections&lt;/code&gt;, check for leaks, add connection pooling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Table is marked as crashed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Corrupted table&lt;/td&gt;
&lt;td&gt;&lt;code&gt;REPAIR TABLE tablename&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Disk full&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No space for MySQL&lt;/td&gt;
&lt;td&gt;Clear old logs, backups, increase disk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Slow queries&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Missing indexes, bad queries&lt;/td&gt;
&lt;td&gt;Enable slow query log, use EXPLAIN, add indexes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Lock wait timeout exceeded&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Long-running transactions&lt;/td&gt;
&lt;td&gt;Find and kill blocking queries with &lt;code&gt;SHOW PROCESSLIST&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MySQL won't start&lt;/td&gt;
&lt;td&gt;Config error or corrupt files&lt;/td&gt;
&lt;td&gt;Check &lt;code&gt;/var/log/mysql/error.log&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Interview Q&amp;amp;A: MySQL/MariaDB
&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 backup a database?&lt;/td&gt;
&lt;td&gt;`mysqldump -u root -p dbname \&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How do you restore a database?&lt;/td&gt;
&lt;td&gt;{% raw %}`gunzip &amp;lt; backup.sql.gz \&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference between MySQL and MariaDB?&lt;/td&gt;
&lt;td&gt;MariaDB is a fork of MySQL, community-driven, mostly compatible. Created by MySQL founder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is InnoDB?&lt;/td&gt;
&lt;td&gt;Default storage engine. Supports transactions, row-level locking, foreign keys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is {% raw %}&lt;code&gt;innodb_buffer_pool_size&lt;/code&gt;?&lt;/td&gt;
&lt;td&gt;Memory area for caching data and indexes. Most important MySQL tuning parameter. Set to 50-70% of RAM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How do you find slow queries?&lt;/td&gt;
&lt;td&gt;Enable slow query log, set &lt;code&gt;long_query_time&lt;/code&gt;, use &lt;code&gt;EXPLAIN&lt;/code&gt; on queries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How do you optimize a slow query?&lt;/td&gt;
&lt;td&gt;Check EXPLAIN output, add proper indexes, avoid SELECT *, optimize JOINs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What port does MySQL use?&lt;/td&gt;
&lt;td&gt;3306&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How to check database size?&lt;/td&gt;
&lt;td&gt;Query &lt;code&gt;information_schema.tables&lt;/code&gt; with SUM of &lt;code&gt;data_length + index_length&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How do you secure MySQL?&lt;/td&gt;
&lt;td&gt;Run &lt;code&gt;mysql_secure_installation&lt;/code&gt;, remove anonymous users, restrict root, use strong passwords, bind to 127.0.0.1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>linux</category>
      <category>database</category>
      <category>mysql</category>
      <category>mariadb</category>
    </item>
    <item>
      <title>DNS, SSL &amp; PHP on Linux: Practical DevOps Guide</title>
      <dc:creator>Yashvi Kothari</dc:creator>
      <pubDate>Wed, 12 Aug 2026 11:15:34 +0000</pubDate>
      <link>https://dev.to/yashvikothari/dns-ssl-php-on-linux-practical-devops-guide-fkk</link>
      <guid>https://dev.to/yashvikothari/dns-ssl-php-on-linux-practical-devops-guide-fkk</guid>
      <description>&lt;h1&gt;
  
  
  DNS, SSL &amp;amp; PHP on Linux: A Practical Guide for DevOps Engineers
&lt;/h1&gt;

&lt;p&gt;Learn DNS records, SPF, DKIM, DMARC, SSL certificates, Let's Encrypt, PHP-FPM, Nginx, and PHP troubleshooting with practical Linux commands.&lt;/p&gt;




&lt;h2&gt;
  
  
  DNS, SSL &amp;amp; PHP on Linux: What Every DevOps Engineer Should Know
&lt;/h2&gt;

&lt;p&gt;A website can be running perfectly on a server and still be unreachable.&lt;/p&gt;

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

&lt;p&gt;Because infrastructure has layers.&lt;/p&gt;

&lt;p&gt;Your application may be healthy.&lt;br&gt;
Your web server may be running.&lt;br&gt;
Your SSL certificate may be valid.&lt;/p&gt;

&lt;p&gt;But if DNS points to the wrong IP, users never reach your server.&lt;/p&gt;

&lt;p&gt;And if SSL is misconfigured, they may reach it—but receive a certificate error.&lt;/p&gt;

&lt;p&gt;And if PHP-FPM is broken, Nginx may return a &lt;code&gt;502 Bad Gateway&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is why DevOps engineers need to understand the entire path:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Domain → DNS → Server → Web Server → SSL/TLS → Application Runtime&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let's break down the most important concepts and commands.&lt;/p&gt;


&lt;h2&gt;
  
  
  1. Understanding DNS Records
&lt;/h2&gt;

&lt;p&gt;DNS, or Domain Name System, translates human-readable domain names into information computers can use.&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;example.com → 192.168.1.100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The most important DNS records to know are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Record&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;A&lt;/td&gt;
&lt;td&gt;Maps a domain to an IPv4 address&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AAAA&lt;/td&gt;
&lt;td&gt;Maps a domain to an IPv6 address&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CNAME&lt;/td&gt;
&lt;td&gt;Creates an alias to another domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MX&lt;/td&gt;
&lt;td&gt;Defines mail servers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TXT&lt;/td&gt;
&lt;td&gt;Stores text data such as SPF and verification records&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NS&lt;/td&gt;
&lt;td&gt;Defines authoritative nameservers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SOA&lt;/td&gt;
&lt;td&gt;Contains authority information for a DNS zone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PTR&lt;/td&gt;
&lt;td&gt;Maps an IP address back to a domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SRV&lt;/td&gt;
&lt;td&gt;Defines the location of specific services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CAA&lt;/td&gt;
&lt;td&gt;Controls which certificate authorities can issue certificates&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The key distinction to remember:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A record → IP address&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CNAME → another domain name&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That simple difference appears frequently in DevOps and infrastructure interviews.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. DNS Troubleshooting With Linux Commands
&lt;/h2&gt;

&lt;p&gt;When a domain isn't resolving correctly, don't immediately blame the application.&lt;/p&gt;

&lt;p&gt;Start with DNS.&lt;/p&gt;

&lt;h3&gt;
  
  
  Check the A record
&lt;/h3&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;Or:&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 A
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a cleaner result:&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;h3&gt;
  
  
  Query a specific DNS resolver
&lt;/h3&gt;

&lt;p&gt;Google 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 @8.8.8.8 example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cloudflare 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 @1.1.1.1 example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is useful when troubleshooting DNS propagation or resolver-specific problems.&lt;/p&gt;

&lt;h3&gt;
  
  
  Check MX records
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig example.com MX
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Check TXT records
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig example.com TXT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Check nameservers
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig example.com NS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Check reverse DNS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig &lt;span class="nt"&gt;-x&lt;/span&gt; 192.168.1.100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This checks the PTR record.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. SPF, DKIM and DMARC
&lt;/h2&gt;

&lt;p&gt;DNS isn't only about websites.&lt;/p&gt;

&lt;p&gt;It's also critical for email security.&lt;/p&gt;

&lt;p&gt;Three records you should understand are:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SPF&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DKIM&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DMARC&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  SPF
&lt;/h3&gt;

&lt;p&gt;SPF specifies which servers are authorized to send email for a domain.&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 plaintext"&gt;&lt;code&gt;v=spf1 ip4:192.168.1.100 include:_spf.google.com include:sendgrid.net ~all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;SPF answers: “Which servers are allowed to send email for this domain?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  DKIM
&lt;/h3&gt;

&lt;p&gt;DKIM adds a cryptographic signature to outgoing email.&lt;/p&gt;

&lt;p&gt;The receiving mail server can use that signature to verify that the message hasn't been improperly modified.&lt;/p&gt;

&lt;p&gt;A DKIM record is commonly stored under:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;selector._domainkey.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  DMARC
&lt;/h3&gt;

&lt;p&gt;DMARC tells receiving mail servers what to do when SPF or DKIM checks fail.&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 plaintext"&gt;&lt;code&gt;v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com; pct=100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Possible policies include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;p=none
p=quarantine
p=reject
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A useful mental model is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SPF → Who can send?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DKIM → Was the message cryptographically signed?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DMARC → What should happen if authentication fails?&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  4. SSL/TLS: Securing Web Traffic
&lt;/h2&gt;

&lt;p&gt;DNS gets users to your server.&lt;/p&gt;

&lt;p&gt;SSL/TLS secures the communication between the client and server.&lt;/p&gt;

&lt;p&gt;Modern systems use &lt;strong&gt;TLS&lt;/strong&gt;. SSL is the older terminology.&lt;/p&gt;

&lt;p&gt;For most Linux web servers, HTTPS traffic is handled on:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;HTTP commonly uses:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Let's Encrypt and Certbot
&lt;/h2&gt;

&lt;p&gt;One of the most common ways to obtain free TLS certificates is Let's Encrypt.&lt;/p&gt;

&lt;p&gt;Certbot automates much of the certificate process.&lt;/p&gt;

&lt;p&gt;Install 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;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;certbot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Apache
&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;python3-certbot-apache
&lt;span class="nb"&gt;sudo &lt;/span&gt;certbot &lt;span class="nt"&gt;--apache&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; example.com &lt;span class="nt"&gt;-d&lt;/span&gt; www.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Nginx
&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;python3-certbot-nginx
&lt;span class="nb"&gt;sudo &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="nt"&gt;-d&lt;/span&gt; www.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Standalone mode
&lt;/h3&gt;

&lt;p&gt;If no web server is running:&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 certonly &lt;span class="nt"&gt;--standalone&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Webroot mode
&lt;/h3&gt;

&lt;p&gt;If a web server is already running:&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 certonly &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--webroot&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-w&lt;/span&gt; /var/www/example.com/public &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; example.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; www.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. SSL Renewal
&lt;/h2&gt;

&lt;p&gt;Getting the certificate is only half the job.&lt;/p&gt;

&lt;p&gt;You also need to make sure it doesn't expire.&lt;/p&gt;

&lt;p&gt;Check certificates:&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 certificates
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test 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;Renew certificates:&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;You can also verify the Certbot systemd timer:&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 certbot.timer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A good production habit is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Don't wait for users to discover that your certificate expired.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Automate renewal and test it before you need it.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Troubleshooting SSL From the Command Line
&lt;/h2&gt;

&lt;p&gt;When HTTPS isn't behaving correctly, OpenSSL is one of your best friends.&lt;/p&gt;

&lt;p&gt;Check the TLS connection:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl s_client &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-connect&lt;/span&gt; example.com:443 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-servername&lt;/span&gt; example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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 |
  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;Check certificate details:&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 |
  openssl x509 &lt;span class="nt"&gt;-noout&lt;/span&gt; &lt;span class="nt"&gt;-text&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These commands help you investigate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Certificate expiration&lt;/li&gt;
&lt;li&gt;Certificate details&lt;/li&gt;
&lt;li&gt;TLS connections&lt;/li&gt;
&lt;li&gt;Certificate configuration&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  8. Common SSL Errors
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;ERR_CERT_HAS_EXPIRED&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The certificate has expired.&lt;/p&gt;

&lt;p&gt;Potential solution:&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;h3&gt;
  
  
  &lt;code&gt;ERR_CERT_COMMON_NAME_INVALID&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The certificate doesn't match the requested domain.&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;Requested:
api.example.com

Certificate:
example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The certificate needs to cover the appropriate hostname.&lt;/p&gt;

&lt;h3&gt;
  
  
  Certificate chain incomplete
&lt;/h3&gt;

&lt;p&gt;The server may be missing an intermediate certificate.&lt;/p&gt;

&lt;p&gt;A full certificate chain may be required.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mixed content
&lt;/h3&gt;

&lt;p&gt;The main website uses HTTPS, but some resources still use HTTP.&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;https://example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://example.com/style.css
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That can trigger browser security warnings.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Installing PHP on Linux
&lt;/h2&gt;

&lt;p&gt;PHP is commonly used for dynamic web applications.&lt;/p&gt;

&lt;p&gt;With 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 &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;php libapache2-mod-php
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With Nginx, PHP typically runs through 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;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;php-fpm php-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PHP-FPM stands for:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PHP FastCGI Process Manager&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It manages PHP worker processes separately from Nginx.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Why PHP-FPM Matters With Nginx
&lt;/h2&gt;

&lt;p&gt;Nginx doesn't execute PHP code directly.&lt;/p&gt;

&lt;p&gt;Instead, the architecture looks 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;Client
   ↓
Nginx
   ↓
PHP-FPM
   ↓
PHP Application
   ↓
Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nginx receives the HTTP request.&lt;/p&gt;

&lt;p&gt;PHP-FPM manages PHP processes.&lt;/p&gt;

&lt;p&gt;The PHP application executes.&lt;/p&gt;

&lt;p&gt;This separation is one reason PHP-FPM is commonly used with Nginx.&lt;/p&gt;




&lt;h2&gt;
  
  
  11. Configure PHP-FPM
&lt;/h2&gt;

&lt;p&gt;A common PHP-FPM pool configuration is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/etc/php/8.2/fpm/pool.d/www.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Important settings include:&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;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;listen&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;/var/run/php/php8.2-fpm.sock&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PHP-FPM can communicate through a Unix socket or TCP:&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;listen&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;/var/run/php/php8.2-fpm.sock&lt;/span&gt;
&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 ini"&gt;&lt;code&gt;&lt;span class="py"&gt;listen&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;127.0.0.1:9000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Unix sockets are commonly used when Nginx and PHP-FPM are on the same server.&lt;/p&gt;




&lt;h2&gt;
  
  
  12. PHP-FPM Process Management
&lt;/h2&gt;

&lt;p&gt;PHP-FPM supports different process manager modes:&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;pm&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;dynamic&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Other options include:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;For dynamic mode, important settings include:&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;pm.max_children&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;50&lt;/span&gt;
&lt;span class="py"&gt;pm.start_servers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;5&lt;/span&gt;
&lt;span class="py"&gt;pm.min_spare_servers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;5&lt;/span&gt;
&lt;span class="py"&gt;pm.max_spare_servers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;35&lt;/span&gt;
&lt;span class="py"&gt;pm.max_requests&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;500&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These settings control how PHP worker processes are created and managed.&lt;/p&gt;

&lt;p&gt;The important operational lesson is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;PHP performance isn't only about PHP code. Process management matters too.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  13. PHP Configuration
&lt;/h2&gt;

&lt;p&gt;The main PHP configuration file is &lt;code&gt;php.ini&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Find the configuration being used:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php &lt;span class="nt"&gt;--ini&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also inspect specific settings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php &lt;span class="nt"&gt;-i&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;memory_limit
&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;php &lt;span class="nt"&gt;-i&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;upload_max_filesize
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Common production settings include:&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;memory_limit&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;256M&lt;/span&gt;
&lt;span class="py"&gt;upload_max_filesize&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;64M&lt;/span&gt;
&lt;span class="py"&gt;post_max_size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;70M&lt;/span&gt;
&lt;span class="py"&gt;max_execution_time&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;300&lt;/span&gt;
&lt;span class="py"&gt;max_input_time&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;300&lt;/span&gt;
&lt;span class="py"&gt;max_input_vars&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;5000&lt;/span&gt;
&lt;span class="py"&gt;date.timezone&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Asia/Kolkata&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For production:&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;display_errors&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Off&lt;/span&gt;
&lt;span class="py"&gt;log_errors&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;On&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A production server should log errors rather than expose them directly to visitors.&lt;/p&gt;




&lt;h2&gt;
  
  
  14. OPcache for PHP Performance
&lt;/h2&gt;

&lt;p&gt;PHP can improve performance by caching compiled bytecode.&lt;/p&gt;

&lt;p&gt;That's where OPcache comes in.&lt;/p&gt;

&lt;p&gt;Example configuration:&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;opcache.enable&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;1&lt;/span&gt;
&lt;span class="py"&gt;opcache.memory_consumption&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;128&lt;/span&gt;
&lt;span class="py"&gt;opcache.max_accelerated_files&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;10000&lt;/span&gt;
&lt;span class="py"&gt;opcache.revalidate_freq&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;2&lt;/span&gt;
&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 repeatedly do work that can be cached safely.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is one of the small configuration decisions that can have a meaningful effect on application performance.&lt;/p&gt;




&lt;h2&gt;
  
  
  15. Multiple PHP Versions
&lt;/h2&gt;

&lt;p&gt;Sometimes different applications require different PHP versions.&lt;/p&gt;

&lt;p&gt;You can install multiple PHP-FPM versions:&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;php7.4-fpm php8.0-fpm php8.1-fpm php8.2-fpm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also change the CLI version:&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;update-alternatives &lt;span class="nt"&gt;--config&lt;/span&gt; php
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The bigger advantage is that Nginx can route different websites to different PHP-FPM sockets.&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 nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt; &lt;span class="sr"&gt;\.php$&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;fastcgi_pass&lt;/span&gt; &lt;span class="s"&gt;unix:/var/run/php/php7.4-fpm.sock&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;p&gt;Another site could use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt; &lt;span class="sr"&gt;\.php$&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;fastcgi_pass&lt;/span&gt; &lt;span class="s"&gt;unix:/var/run/php/php8.2-fpm.sock&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;p&gt;This allows different applications to coexist on the same server with different runtime requirements.&lt;/p&gt;




&lt;h2&gt;
  
  
  16. Composer
&lt;/h2&gt;

&lt;p&gt;Composer is the package manager commonly used for PHP projects.&lt;/p&gt;

&lt;p&gt;Install it and then use commands such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer &lt;span class="nb"&gt;install&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;composer update
&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;composer require package/name
&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;composer dump-autoload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important distinction:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;is generally used to install the dependencies defined by the project.&lt;/p&gt;

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

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

&lt;/div&gt;



&lt;p&gt;updates dependency versions according to the project's dependency constraints.&lt;/p&gt;




&lt;h2&gt;
  
  
  17. A Practical Troubleshooting Mindset
&lt;/h2&gt;

&lt;p&gt;Here's the most important lesson.&lt;/p&gt;

&lt;p&gt;Don't troubleshoot randomly.&lt;/p&gt;

&lt;p&gt;Follow the request path.&lt;/p&gt;

&lt;p&gt;If a website isn't working, think:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Does DNS resolve?
        ↓
2. Does the server respond?
        ↓
3. Is the web server running?
        ↓
4. Is port 80/443 reachable?
        ↓
5. Is TLS configured correctly?
        ↓
6. Is Nginx/Apache routing correctly?
        ↓
7. Is PHP-FPM running?
        ↓
8. Is the PHP application working?
        ↓
9. Can the application reach its database?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This turns troubleshooting from guessing into a process.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Takeaway
&lt;/h1&gt;

&lt;p&gt;DevOps isn't about memorizing hundreds of commands.&lt;/p&gt;

&lt;p&gt;It's about understanding &lt;strong&gt;how systems connect&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;DNS tells users where to go.&lt;/p&gt;

&lt;p&gt;SSL/TLS protects the connection.&lt;/p&gt;

&lt;p&gt;Nginx or Apache handles HTTP traffic.&lt;/p&gt;

&lt;p&gt;PHP-FPM executes PHP workloads.&lt;/p&gt;

&lt;p&gt;The application talks to its dependencies.&lt;/p&gt;

&lt;p&gt;And Linux gives you the tools to inspect every layer.&lt;/p&gt;

&lt;p&gt;If you understand that chain, troubleshooting becomes much easier.&lt;/p&gt;

&lt;p&gt;Because instead of asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“Why is my website down?”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;you start asking better questions:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“Where does the request fail?”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the mindset that turns a person who knows commands into an engineer who knows how systems work.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Interview Revision
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A vs CNAME?&lt;/strong&gt;&lt;br&gt;
A points to an IPv4 address. CNAME points to another domain name.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does SPF do?&lt;/strong&gt;&lt;br&gt;
Defines authorized email senders for a domain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does DKIM do?&lt;/strong&gt;&lt;br&gt;
Provides a cryptographic signature for email authentication.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does DMARC do?&lt;/strong&gt;&lt;br&gt;
Defines how receivers should handle SPF/DKIM authentication failures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is TLS?&lt;/strong&gt;&lt;br&gt;
A protocol used to secure network communication, including HTTPS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is PHP-FPM?&lt;/strong&gt;&lt;br&gt;
A process manager for PHP applications, commonly used with Nginx.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do you check SSL expiry?&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;sudo &lt;/span&gt;certbot certificates
&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;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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How do you check DNS?&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;dig example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How do you test certificate renewal?&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;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;&lt;strong&gt;The biggest DevOps lesson?&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Understand the request path. Troubleshoot the layer where the request actually fails.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Part 3: DNS, SSL Certificates &amp;amp; PHP Environments
&lt;/h1&gt;




&lt;h2&gt;
  
  
  3.1 DNS &amp;amp; Domain Configuration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  DNS Record Types (MUST KNOW ALL)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Record&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;strong&gt;A&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Maps domain to IPv4 address&lt;/td&gt;
&lt;td&gt;&lt;code&gt;example.com → 192.168.1.100&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AAAA&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Maps domain to IPv6 address&lt;/td&gt;
&lt;td&gt;&lt;code&gt;example.com → 2001:db8::1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CNAME&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Alias pointing to another domain&lt;/td&gt;
&lt;td&gt;&lt;code&gt;www.example.com → example.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MX&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mail server for the domain&lt;/td&gt;
&lt;td&gt;&lt;code&gt;example.com → mail.example.com (priority 10)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TXT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Text records (SPF, DKIM, verification)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;v=spf1 include:_spf.google.com ~all&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Nameservers for the domain&lt;/td&gt;
&lt;td&gt;&lt;code&gt;example.com → ns1.digitalocean.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SOA&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Start of Authority (primary NS, admin email)&lt;/td&gt;
&lt;td&gt;Auto-managed by DNS provider&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PTR&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Reverse DNS (IP to domain)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;192.168.1.100 → example.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SRV&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Service location records&lt;/td&gt;
&lt;td&gt;Used for SIP, XMPP, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CAA&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Certificate Authority Authorization&lt;/td&gt;
&lt;td&gt;Controls who can issue SSL for domain&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  SPF, DKIM &amp;amp; DMARC (Email Authentication - CRITICAL)
&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;# SPF (Sender Policy Framework) - TXT record&lt;/span&gt;
&lt;span class="c"&gt;# Specifies which servers can send email for your domain&lt;/span&gt;
&lt;span class="c"&gt;# Add as TXT record for @ (root domain):&lt;/span&gt;
&lt;span class="nv"&gt;v&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;spf1 ip4:192.168.1.100 include:_spf.google.com include:sendgrid.net ~all

&lt;span class="c"&gt;# Explanation:&lt;/span&gt;
&lt;span class="c"&gt;# v=spf1          - SPF version 1&lt;/span&gt;
&lt;span class="c"&gt;# ip4:192.168.1.100 - Allow this IP to send mail&lt;/span&gt;
&lt;span class="c"&gt;# include:_spf.google.com - Allow Google Workspace to send mail&lt;/span&gt;
&lt;span class="c"&gt;# include:sendgrid.net - Allow SendGrid to send mail&lt;/span&gt;
&lt;span class="c"&gt;# ~all            - Soft fail everything else (mark as suspicious)&lt;/span&gt;
&lt;span class="c"&gt;# -all            - Hard fail everything else (reject)&lt;/span&gt;

&lt;span class="c"&gt;# DKIM (DomainKeys Identified Mail) - TXT record&lt;/span&gt;
&lt;span class="c"&gt;# Adds a digital signature to emails to verify they're not tampered&lt;/span&gt;
&lt;span class="c"&gt;# Usually provided by your email service&lt;/span&gt;
&lt;span class="c"&gt;# Add as TXT record for selector._domainkey.example.com:&lt;/span&gt;
&lt;span class="c"&gt;# Name: google._domainkey&lt;/span&gt;
&lt;span class="c"&gt;# Value: v=DKIM1; k=rsa; p=MIGfMA0GCS... (public key from provider)&lt;/span&gt;

&lt;span class="c"&gt;# DMARC (Domain-based Message Authentication Reporting &amp;amp; Conformance) - TXT record&lt;/span&gt;
&lt;span class="c"&gt;# Tells receivers what to do when SPF/DKIM fail&lt;/span&gt;
&lt;span class="c"&gt;# Add as TXT record for _dmarc.example.com:&lt;/span&gt;
&lt;span class="nv"&gt;v&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;DMARC1&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;p&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;quarantine&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;rua&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mailto:dmarc@example.com&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;pct&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;100

&lt;span class="c"&gt;# Explanation:&lt;/span&gt;
&lt;span class="c"&gt;# v=DMARC1        - DMARC version 1&lt;/span&gt;
&lt;span class="c"&gt;# p=none          - Monitor only (start here)&lt;/span&gt;
&lt;span class="c"&gt;# p=quarantine    - Send to spam if fails&lt;/span&gt;
&lt;span class="c"&gt;# p=reject        - Reject email if fails&lt;/span&gt;
&lt;span class="c"&gt;# rua=mailto:...  - Where to send aggregate reports&lt;/span&gt;
&lt;span class="c"&gt;# pct=100         - Apply to 100% of emails&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  DNS Troubleshooting Commands
&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;# Query DNS records&lt;/span&gt;
dig example.com                       &lt;span class="c"&gt;# A record&lt;/span&gt;
dig example.com A                     &lt;span class="c"&gt;# A record explicitly&lt;/span&gt;
dig example.com AAAA                  &lt;span class="c"&gt;# IPv6&lt;/span&gt;
dig example.com MX                    &lt;span class="c"&gt;# Mail records&lt;/span&gt;
dig example.com TXT                   &lt;span class="c"&gt;# TXT records (SPF, DKIM)&lt;/span&gt;
dig example.com NS                    &lt;span class="c"&gt;# Nameservers&lt;/span&gt;
dig example.com CNAME                 &lt;span class="c"&gt;# CNAME records&lt;/span&gt;
dig example.com ANY                   &lt;span class="c"&gt;# All records&lt;/span&gt;
dig +short example.com                &lt;span class="c"&gt;# Short output&lt;/span&gt;
dig @8.8.8.8 example.com             &lt;span class="c"&gt;# Query specific DNS server (Google)&lt;/span&gt;
dig @1.1.1.1 example.com             &lt;span class="c"&gt;# Query Cloudflare DNS&lt;/span&gt;

&lt;span class="c"&gt;# Alternative tools&lt;/span&gt;
nslookup example.com                  &lt;span class="c"&gt;# Basic DNS lookup&lt;/span&gt;
nslookup &lt;span class="nt"&gt;-type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;MX example.com         &lt;span class="c"&gt;# MX records&lt;/span&gt;
host example.com                      &lt;span class="c"&gt;# Simple DNS lookup&lt;/span&gt;

&lt;span class="c"&gt;# Check DNS propagation&lt;/span&gt;
&lt;span class="c"&gt;# Use online tools: dnschecker.org, whatsmydns.net&lt;/span&gt;

&lt;span class="c"&gt;# Check PTR (reverse DNS)&lt;/span&gt;
dig &lt;span class="nt"&gt;-x&lt;/span&gt; 192.168.1.100

&lt;span class="c"&gt;# Check current DNS cache&lt;/span&gt;
systemd-resolve &lt;span class="nt"&gt;--status&lt;/span&gt;              &lt;span class="c"&gt;# systemd-resolved stats&lt;/span&gt;
systemd-resolve &lt;span class="nt"&gt;--flush-caches&lt;/span&gt;        &lt;span class="c"&gt;# Flush DNS cache on Ubuntu&lt;/span&gt;

&lt;span class="c"&gt;# Trace DNS resolution&lt;/span&gt;
dig +trace example.com                &lt;span class="c"&gt;# Shows full DNS resolution path&lt;/span&gt;

&lt;span class="c"&gt;# Check SPF record&lt;/span&gt;
dig TXT example.com | &lt;span class="nb"&gt;grep &lt;/span&gt;spf

&lt;span class="c"&gt;# Check DKIM record&lt;/span&gt;
dig TXT google._domainkey.example.com

&lt;span class="c"&gt;# Check DMARC record&lt;/span&gt;
dig TXT _dmarc.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Practical DNS Setup Scenarios
&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;# Scenario 1: Point domain to new server&lt;/span&gt;
&lt;span class="c"&gt;# In DNS provider (Cloudflare/GoDaddy/Route53):&lt;/span&gt;
&lt;span class="c"&gt;# Type: A    | Name: @   | Value: NEW_SERVER_IP  | TTL: 300&lt;/span&gt;
&lt;span class="c"&gt;# Type: A    | Name: www | Value: NEW_SERVER_IP  | TTL: 300&lt;/span&gt;

&lt;span class="c"&gt;# Scenario 2: Subdomain for staging&lt;/span&gt;
&lt;span class="c"&gt;# Type: A    | Name: staging | Value: STAGING_SERVER_IP | TTL: 300&lt;/span&gt;

&lt;span class="c"&gt;# Scenario 3: Setup Google Workspace email&lt;/span&gt;
&lt;span class="c"&gt;# Type: MX   | Name: @   | Value: aspmx.l.google.com      | Priority: 1&lt;/span&gt;
&lt;span class="c"&gt;# Type: MX   | Name: @   | Value: alt1.aspmx.l.google.com  | Priority: 5&lt;/span&gt;
&lt;span class="c"&gt;# Type: MX   | Name: @   | Value: alt2.aspmx.l.google.com  | Priority: 5&lt;/span&gt;
&lt;span class="c"&gt;# Type: TXT  | Name: @   | Value: v=spf1 include:_spf.google.com ~all&lt;/span&gt;

&lt;span class="c"&gt;# Scenario 4: Cloudflare CDN setup&lt;/span&gt;
&lt;span class="c"&gt;# Change nameservers to Cloudflare NS at domain registrar&lt;/span&gt;
&lt;span class="c"&gt;# Cloudflare manages all DNS records after that&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Interview Q&amp;amp;A: DNS
&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 DNS propagation?&lt;/td&gt;
&lt;td&gt;Time for DNS changes to spread globally (can take up to 48 hours, usually 15 min - 4 hours)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How to speed up DNS propagation?&lt;/td&gt;
&lt;td&gt;Lower TTL before making changes (e.g., 300 seconds), then change, then raise TTL back&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A record vs CNAME?&lt;/td&gt;
&lt;td&gt;A maps to IP, CNAME maps to another domain name. Root domain (@) cannot have CNAME&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is TTL?&lt;/td&gt;
&lt;td&gt;Time To Live - how long DNS resolvers cache the record (in seconds)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What happens if MX records are wrong?&lt;/td&gt;
&lt;td&gt;Email for your domain won't be delivered&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How to verify DNS changes?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;dig @8.8.8.8 example.com&lt;/code&gt;, use dnschecker.org, whatsmydns.net&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is reverse DNS?&lt;/td&gt;
&lt;td&gt;Maps IP to domain name (PTR record). Important for email delivery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Why is SPF important?&lt;/td&gt;
&lt;td&gt;Prevents email spoofing by specifying authorized mail servers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What does DKIM do?&lt;/td&gt;
&lt;td&gt;Adds cryptographic signature to emails proving they're not tampered&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What does DMARC do?&lt;/td&gt;
&lt;td&gt;Tells receiving servers what to do when SPF/DKIM checks fail&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  3.2 SSL Certificate Management
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Let's Encrypt (Free SSL - Most Common)
&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 Certbot&lt;/span&gt;
&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;certbot

&lt;span class="c"&gt;# For Apache&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;python3-certbot-apache
&lt;span class="nb"&gt;sudo &lt;/span&gt;certbot &lt;span class="nt"&gt;--apache&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; example.com &lt;span class="nt"&gt;-d&lt;/span&gt; www.example.com

&lt;span class="c"&gt;# For Nginx&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;python3-certbot-nginx
&lt;span class="nb"&gt;sudo &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="nt"&gt;-d&lt;/span&gt; www.example.com

&lt;span class="c"&gt;# Standalone (when no web server is running)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;certbot certonly &lt;span class="nt"&gt;--standalone&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; example.com

&lt;span class="c"&gt;# Webroot (web server running, no plugin)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;certbot certonly &lt;span class="nt"&gt;--webroot&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt; /var/www/example.com/public &lt;span class="nt"&gt;-d&lt;/span&gt; example.com &lt;span class="nt"&gt;-d&lt;/span&gt; www.example.com

&lt;span class="c"&gt;# Wildcard certificate (covers *.example.com)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;certbot certonly &lt;span class="nt"&gt;--manual&lt;/span&gt; &lt;span class="nt"&gt;--preferred-challenges&lt;/span&gt; dns &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"*.example.com"&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; example.com
&lt;span class="c"&gt;# This requires adding a TXT record to DNS&lt;/span&gt;

&lt;span class="c"&gt;# Check certificate expiry&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;certbot certificates

&lt;span class="c"&gt;# Renew all certificates&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;certbot renew

&lt;span class="c"&gt;# Renew with dry run (test)&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;# Auto-renewal cron (usually set up automatically)&lt;/span&gt;
&lt;span class="c"&gt;# Verify timer exists:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status certbot.timer

&lt;span class="c"&gt;# Or add to crontab:&lt;/span&gt;
0 0,12 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; certbot renew &lt;span class="nt"&gt;--quiet&lt;/span&gt; &lt;span class="nt"&gt;--post-hook&lt;/span&gt; &lt;span class="s2"&gt;"systemctl reload nginx"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Manual SSL Installation (Paid certificates)
&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;# SSL files you'll receive:&lt;/span&gt;
&lt;span class="c"&gt;# 1. certificate.crt     - Your domain certificate&lt;/span&gt;
&lt;span class="c"&gt;# 2. ca_bundle.crt        - Intermediate/CA bundle&lt;/span&gt;
&lt;span class="c"&gt;# 3. private.key          - Private key (you generated this)&lt;/span&gt;

&lt;span class="c"&gt;# Step 1: Generate CSR (Certificate Signing Request)&lt;/span&gt;
openssl req &lt;span class="nt"&gt;-new&lt;/span&gt; &lt;span class="nt"&gt;-newkey&lt;/span&gt; rsa:2048 &lt;span class="nt"&gt;-nodes&lt;/span&gt; &lt;span class="nt"&gt;-keyout&lt;/span&gt; example.com.key &lt;span class="nt"&gt;-out&lt;/span&gt; example.com.csr
&lt;span class="c"&gt;# Fill in: Country, State, City, Org, Common Name (example.com)&lt;/span&gt;

&lt;span class="c"&gt;# Step 2: Submit CSR to certificate provider (GoDaddy, DigiCert, Comodo, etc.)&lt;/span&gt;

&lt;span class="c"&gt;# Step 3: Download and install certificates&lt;/span&gt;
&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /etc/ssl/example.com
&lt;span class="nb"&gt;sudo cp &lt;/span&gt;example.com.crt /etc/ssl/example.com/
&lt;span class="nb"&gt;sudo cp &lt;/span&gt;ca_bundle.crt /etc/ssl/example.com/
&lt;span class="nb"&gt;sudo cp &lt;/span&gt;example.com.key /etc/ssl/example.com/
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;600 /etc/ssl/example.com/example.com.key

&lt;span class="c"&gt;# Step 4: Configure in Nginx&lt;/span&gt;
ssl_certificate /etc/ssl/example.com/example.com.crt&lt;span class="p"&gt;;&lt;/span&gt;
ssl_certificate_key /etc/ssl/example.com/example.com.key&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c"&gt;# Note: you may need to combine cert + CA bundle:&lt;/span&gt;
&lt;span class="nb"&gt;cat &lt;/span&gt;example.com.crt ca_bundle.crt &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; fullchain.crt

&lt;span class="c"&gt;# Step 4b: Configure in Apache&lt;/span&gt;
SSLCertificateFile /etc/ssl/example.com/example.com.crt
SSLCertificateKeyFile /etc/ssl/example.com/example.com.key
SSLCACertificateFile /etc/ssl/example.com/ca_bundle.crt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  SSL 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;# Check SSL certificate from command line&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

&lt;span class="c"&gt;# Check certificate expiry date&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="c"&gt;# Check certificate details&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;-text&lt;/span&gt;

&lt;span class="c"&gt;# Verify certificate chain&lt;/span&gt;
openssl verify &lt;span class="nt"&gt;-CAfile&lt;/span&gt; ca_bundle.crt example.com.crt

&lt;span class="c"&gt;# Check if private key matches certificate&lt;/span&gt;
openssl x509 &lt;span class="nt"&gt;-noout&lt;/span&gt; &lt;span class="nt"&gt;-modulus&lt;/span&gt; &lt;span class="nt"&gt;-in&lt;/span&gt; cert.crt | openssl md5
openssl rsa &lt;span class="nt"&gt;-noout&lt;/span&gt; &lt;span class="nt"&gt;-modulus&lt;/span&gt; &lt;span class="nt"&gt;-in&lt;/span&gt; private.key | openssl md5
&lt;span class="c"&gt;# Both MD5 hashes should match!&lt;/span&gt;

&lt;span class="c"&gt;# Online tools for SSL checking:&lt;/span&gt;
&lt;span class="c"&gt;# ssllabs.com/ssltest&lt;/span&gt;
&lt;span class="c"&gt;# sslshopper.com/ssl-checker.html&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Common SSL Issues &amp;amp; Fixes
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Issue&lt;/th&gt;
&lt;th&gt;Cause&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ERR_CERT_HAS_EXPIRED&lt;/td&gt;
&lt;td&gt;Certificate expired&lt;/td&gt;
&lt;td&gt;Renew with &lt;code&gt;certbot renew&lt;/code&gt; or get new cert&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ERR_CERT_COMMON_NAME_INVALID&lt;/td&gt;
&lt;td&gt;Domain doesn't match cert&lt;/td&gt;
&lt;td&gt;Issue cert for correct domain name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mixed content warnings&lt;/td&gt;
&lt;td&gt;HTTP resources on HTTPS page&lt;/td&gt;
&lt;td&gt;Update all URLs to HTTPS in code/DB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Certificate chain incomplete&lt;/td&gt;
&lt;td&gt;Missing intermediate cert&lt;/td&gt;
&lt;td&gt;Add CA bundle/intermediate certificate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSL handshake failed&lt;/td&gt;
&lt;td&gt;Protocol/cipher mismatch&lt;/td&gt;
&lt;td&gt;Update ssl_protocols, check TLS version&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Let's Encrypt rate limit&lt;/td&gt;
&lt;td&gt;Too many certs in short time&lt;/td&gt;
&lt;td&gt;Wait, use staging for testing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Interview Q&amp;amp;A: SSL
&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 SSL/TLS?&lt;/td&gt;
&lt;td&gt;Encryption protocol securing data between browser and server. SSL is deprecated, TLS is current (1.2/1.3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How does Let's Encrypt work?&lt;/td&gt;
&lt;td&gt;Free, automated CA. Validates domain ownership via HTTP challenge or DNS challenge, issues 90-day certs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How do you handle SSL renewal?&lt;/td&gt;
&lt;td&gt;Certbot auto-renewal via systemd timer or cron job, runs twice daily&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is a wildcard SSL?&lt;/td&gt;
&lt;td&gt;Covers all subdomains: *.example.com. Requires DNS challenge for Let's Encrypt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is HSTS?&lt;/td&gt;
&lt;td&gt;HTTP Strict Transport Security. Forces browsers to always use HTTPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is a CSR?&lt;/td&gt;
&lt;td&gt;Certificate Signing Request. Contains public key + domain info, sent to CA to get certificate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How to troubleshoot "certificate not trusted"?&lt;/td&gt;
&lt;td&gt;Check chain is complete, intermediate certs included, cert matches domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What's the difference between DV, OV, EV certs?&lt;/td&gt;
&lt;td&gt;DV: domain validation only. OV: org verified. EV: extended validation (green bar, most trust)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  3.3 PHP Server Environment
&lt;/h2&gt;

&lt;h3&gt;
  
  
  PHP Installation &amp;amp; Management
&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 PHP (with Apache)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;php libapache2-mod-php

&lt;span class="c"&gt;# Install PHP (with Nginx - uses PHP-FPM)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;php-fpm php-cli

&lt;span class="c"&gt;# Install specific PHP version&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;add-apt-repository ppa:ondrej/php    &lt;span class="c"&gt;# Add PHP repository&lt;/span&gt;
&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;php8.2-fpm php8.2-cli

&lt;span class="c"&gt;# Install common PHP extensions&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;php8.2-mysql php8.2-pgsql php8.2-sqlite3  &lt;span class="c"&gt;# Database&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;php8.2-curl php8.2-gd php8.2-mbstring     &lt;span class="c"&gt;# Common&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;php8.2-xml php8.2-zip php8.2-intl         &lt;span class="c"&gt;# Processing&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;php8.2-bcmath php8.2-soap php8.2-redis    &lt;span class="c"&gt;# Additional&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;php8.2-imagick php8.2-opcache              &lt;span class="c"&gt;# Performance&lt;/span&gt;

&lt;span class="c"&gt;# Check PHP version&lt;/span&gt;
php &lt;span class="nt"&gt;-v&lt;/span&gt;

&lt;span class="c"&gt;# List installed modules&lt;/span&gt;
php &lt;span class="nt"&gt;-m&lt;/span&gt;

&lt;span class="c"&gt;# Find php.ini location&lt;/span&gt;
php &lt;span class="nt"&gt;--ini&lt;/span&gt;
php &lt;span class="nt"&gt;-i&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"php.ini"&lt;/span&gt;

&lt;span class="c"&gt;# Check specific PHP config&lt;/span&gt;
php &lt;span class="nt"&gt;-i&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;memory_limit
php &lt;span class="nt"&gt;-i&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;upload_max_filesize
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  PHP Configuration (&lt;code&gt;php.ini&lt;/code&gt;)
&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;# Find and edit php.ini&lt;/span&gt;
&lt;span class="c"&gt;# For CLI:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/php/8.2/cli/php.ini
&lt;span class="c"&gt;# For Apache:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/php/8.2/apache2/php.ini
&lt;span class="c"&gt;# For FPM (Nginx):&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/php/8.2/fpm/php.ini

&lt;span class="c"&gt;# IMPORTANT settings to know:&lt;/span&gt;
memory_limit &lt;span class="o"&gt;=&lt;/span&gt; 256M                    &lt;span class="c"&gt;# Max memory per script&lt;/span&gt;
upload_max_filesize &lt;span class="o"&gt;=&lt;/span&gt; 64M              &lt;span class="c"&gt;# Max file upload size&lt;/span&gt;
post_max_size &lt;span class="o"&gt;=&lt;/span&gt; 70M                    &lt;span class="c"&gt;# Max POST data (must be &amp;gt; upload_max_filesize)&lt;/span&gt;
max_execution_time &lt;span class="o"&gt;=&lt;/span&gt; 300               &lt;span class="c"&gt;# Max script execution time (seconds)&lt;/span&gt;
max_input_time &lt;span class="o"&gt;=&lt;/span&gt; 300                   &lt;span class="c"&gt;# Max time to parse input&lt;/span&gt;
max_input_vars &lt;span class="o"&gt;=&lt;/span&gt; 5000                  &lt;span class="c"&gt;# Max input variables&lt;/span&gt;
date.timezone &lt;span class="o"&gt;=&lt;/span&gt; Asia/Kolkata           &lt;span class="c"&gt;# Timezone&lt;/span&gt;

&lt;span class="c"&gt;# Error handling&lt;/span&gt;
display_errors &lt;span class="o"&gt;=&lt;/span&gt; Off                   &lt;span class="c"&gt;# NEVER On in production&lt;/span&gt;
log_errors &lt;span class="o"&gt;=&lt;/span&gt; On                        &lt;span class="c"&gt;# Always log errors&lt;/span&gt;
error_log &lt;span class="o"&gt;=&lt;/span&gt; /var/log/php/error.log     &lt;span class="c"&gt;# Error log path&lt;/span&gt;
error_reporting &lt;span class="o"&gt;=&lt;/span&gt; E_ALL &amp;amp; ~E_DEPRECATED &amp;amp; ~E_STRICT

&lt;span class="c"&gt;# Session settings&lt;/span&gt;
session.save_handler &lt;span class="o"&gt;=&lt;/span&gt; files
session.save_path &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"/var/lib/php/sessions"&lt;/span&gt;
session.gc_maxlifetime &lt;span class="o"&gt;=&lt;/span&gt; 1440

&lt;span class="c"&gt;# OPcache (Performance - MUST enable)&lt;/span&gt;
opcache.enable &lt;span class="o"&gt;=&lt;/span&gt; 1
opcache.memory_consumption &lt;span class="o"&gt;=&lt;/span&gt; 128
opcache.max_accelerated_files &lt;span class="o"&gt;=&lt;/span&gt; 10000
opcache.revalidate_freq &lt;span class="o"&gt;=&lt;/span&gt; 2

&lt;span class="c"&gt;# After changes:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart php8.2-fpm     &lt;span class="c"&gt;# For Nginx&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart apache2         &lt;span class="c"&gt;# For Apache&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  PHP-FPM Configuration (for Nginx)
&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;# Pool config file&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/php/8.2/fpm/pool.d/www.conf

&lt;span class="c"&gt;# Key settings:&lt;/span&gt;
user &lt;span class="o"&gt;=&lt;/span&gt; www-data
group &lt;span class="o"&gt;=&lt;/span&gt; www-data
listen &lt;span class="o"&gt;=&lt;/span&gt; /var/run/php/php8.2-fpm.sock  &lt;span class="c"&gt;# Unix socket (preferred)&lt;/span&gt;
&lt;span class="c"&gt;# OR&lt;/span&gt;
listen &lt;span class="o"&gt;=&lt;/span&gt; 127.0.0.1:9000                &lt;span class="c"&gt;# TCP socket&lt;/span&gt;

&lt;span class="c"&gt;# Process manager settings&lt;/span&gt;
pm &lt;span class="o"&gt;=&lt;/span&gt; dynamic                           &lt;span class="c"&gt;# dynamic, static, or ondemand&lt;/span&gt;
pm.max_children &lt;span class="o"&gt;=&lt;/span&gt; 50                   &lt;span class="c"&gt;# Max worker processes&lt;/span&gt;
pm.start_servers &lt;span class="o"&gt;=&lt;/span&gt; 5                   &lt;span class="c"&gt;# Initial workers&lt;/span&gt;
pm.min_spare_servers &lt;span class="o"&gt;=&lt;/span&gt; 5               &lt;span class="c"&gt;# Min idle workers&lt;/span&gt;
pm.max_spare_servers &lt;span class="o"&gt;=&lt;/span&gt; 35              &lt;span class="c"&gt;# Max idle workers&lt;/span&gt;
pm.max_requests &lt;span class="o"&gt;=&lt;/span&gt; 500                  &lt;span class="c"&gt;# Requests before worker restart (prevents memory leaks)&lt;/span&gt;

&lt;span class="c"&gt;# Status page (for monitoring)&lt;/span&gt;
pm.status_path &lt;span class="o"&gt;=&lt;/span&gt; /php-fpm-status

&lt;span class="c"&gt;# Slow log (for debugging)&lt;/span&gt;
slowlog &lt;span class="o"&gt;=&lt;/span&gt; /var/log/php/slow.log
request_slowlog_timeout &lt;span class="o"&gt;=&lt;/span&gt; 5s           &lt;span class="c"&gt;# Log requests taking &amp;gt; 5s&lt;/span&gt;

&lt;span class="c"&gt;# Restart PHP-FPM&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart php8.2-fpm
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status php8.2-fpm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Multiple PHP Versions
&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 multiple versions&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;php7.4-fpm php8.0-fpm php8.1-fpm php8.2-fpm

&lt;span class="c"&gt;# Switch CLI version&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;update-alternatives &lt;span class="nt"&gt;--set&lt;/span&gt; php /usr/bin/php8.2
&lt;span class="nb"&gt;sudo &lt;/span&gt;update-alternatives &lt;span class="nt"&gt;--config&lt;/span&gt; php    &lt;span class="c"&gt;# Interactive selection&lt;/span&gt;

&lt;span class="c"&gt;# Use different PHP versions for different sites in Nginx:&lt;/span&gt;
&lt;span class="c"&gt;# Site 1 (PHP 7.4):&lt;/span&gt;
location ~ &lt;span class="se"&gt;\.&lt;/span&gt;php&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# Site 2 (PHP 8.2):&lt;/span&gt;
location ~ &lt;span class="se"&gt;\.&lt;/span&gt;php&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
    fastcgi_pass unix:/var/run/php/php8.2-fpm.sock&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Composer (PHP Package Manager)
&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 Composer&lt;/span&gt;
curl &lt;span class="nt"&gt;-sS&lt;/span&gt; https://getcomposer.org/installer | php
&lt;span class="nb"&gt;sudo mv &lt;/span&gt;composer.phar /usr/local/bin/composer

&lt;span class="c"&gt;# Usage&lt;/span&gt;
composer &lt;span class="nb"&gt;install&lt;/span&gt;                       &lt;span class="c"&gt;# Install dependencies from composer.json&lt;/span&gt;
composer update                        &lt;span class="c"&gt;# Update dependencies&lt;/span&gt;
composer require package/name          &lt;span class="c"&gt;# Add new package&lt;/span&gt;
composer dump-autoload                 &lt;span class="c"&gt;# Regenerate autoloader&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Interview Q&amp;amp;A: PHP
&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 PHP-FPM?&lt;/td&gt;
&lt;td&gt;FastCGI Process Manager. Manages PHP worker processes. Used with Nginx&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference between mod_php and PHP-FPM?&lt;/td&gt;
&lt;td&gt;mod_php runs inside Apache (simpler). PHP-FPM is separate process (better performance, works with Nginx)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How to increase file upload limit?&lt;/td&gt;
&lt;td&gt;Change &lt;code&gt;upload_max_filesize&lt;/code&gt; and &lt;code&gt;post_max_size&lt;/code&gt; in php.ini, also &lt;code&gt;client_max_body_size&lt;/code&gt; in Nginx&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is OPcache?&lt;/td&gt;
&lt;td&gt;Caches compiled PHP bytecode in memory, massive performance improvement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How to check which PHP extensions are installed?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;php -m&lt;/code&gt; or &lt;code&gt;php -i&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What causes a PHP memory limit error?&lt;/td&gt;
&lt;td&gt;Script needs more memory than &lt;code&gt;memory_limit&lt;/code&gt; in php.ini. Increase it or optimize code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How to handle multiple PHP versions?&lt;/td&gt;
&lt;td&gt;Install via ondrej PPA, each version runs its own FPM pool, configure per-site in Nginx&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Where do PHP errors go?&lt;/td&gt;
&lt;td&gt;Check &lt;code&gt;error_log&lt;/code&gt; in php.ini, or &lt;code&gt;/var/log/php/error.log&lt;/code&gt;, or site-specific error log&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is &lt;code&gt;pm = dynamic&lt;/code&gt; vs &lt;code&gt;static&lt;/code&gt; vs &lt;code&gt;ondemand&lt;/code&gt;?&lt;/td&gt;
&lt;td&gt;Dynamic: scales workers within limits. Static: fixed workers. Ondemand: creates workers only when needed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>dns</category>
      <category>ssl</category>
      <category>php</category>
      <category>linux</category>
    </item>
    <item>
      <title>Apache vs Nginx: Linux Web Server Administration Guide</title>
      <dc:creator>Yashvi Kothari</dc:creator>
      <pubDate>Wed, 12 Aug 2026 10:35:49 +0000</pubDate>
      <link>https://dev.to/yashvikothari/apache-vs-nginx-linux-web-server-administration-guide-2k36</link>
      <guid>https://dev.to/yashvikothari/apache-vs-nginx-linux-web-server-administration-guide-2k36</guid>
      <description>&lt;p&gt;Apache vs Nginx: Which Web Server Should a DevOps Engineer Learn?&lt;/p&gt;

&lt;p&gt;Most people learning DevOps jump straight into Docker, Kubernetes, Terraform, and CI/CD.&lt;/p&gt;

&lt;p&gt;But there is a layer underneath all of them that is easy to overlook:&lt;/p&gt;

&lt;p&gt;The web server.&lt;/p&gt;

&lt;p&gt;When a browser requests:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://example.com" rel="noopener noreferrer"&gt;https://example.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;something has to receive that request, decide what should happen to it, serve static files, terminate SSL, or forward the request to an application.&lt;/p&gt;

&lt;p&gt;That is where web servers such as Apache and Nginx become essential.&lt;/p&gt;

&lt;p&gt;Understanding both isn't just useful for interviews.&lt;/p&gt;

&lt;p&gt;It helps you understand how real Linux-based applications are deployed.&lt;/p&gt;

&lt;p&gt;What Is a Web Server?&lt;/p&gt;

&lt;p&gt;A web server accepts HTTP/HTTPS requests and returns responses to clients.&lt;/p&gt;

&lt;p&gt;A simplified architecture looks like this:&lt;/p&gt;

&lt;p&gt;Client&lt;br&gt;
   |&lt;br&gt;
   | HTTP/HTTPS&lt;br&gt;
   v&lt;br&gt;
Nginx / Apache&lt;br&gt;
   |&lt;br&gt;
   +---- Static files&lt;br&gt;
   |&lt;br&gt;
   +---- PHP-FPM&lt;br&gt;
   |&lt;br&gt;
   +---- Node.js&lt;br&gt;
   |&lt;br&gt;
   +---- Python&lt;br&gt;
   |&lt;br&gt;
   +---- Backend API&lt;/p&gt;

&lt;p&gt;A web server can therefore do much more than simply serve an index.html file.&lt;/p&gt;

&lt;p&gt;It can handle:&lt;/p&gt;

&lt;p&gt;HTTP/HTTPS&lt;br&gt;
SSL/TLS termination&lt;br&gt;
Virtual hosting&lt;br&gt;
Reverse proxying&lt;br&gt;
Load balancing&lt;br&gt;
Static file delivery&lt;br&gt;
Access and error logging&lt;br&gt;
Compression&lt;br&gt;
Security headers&lt;br&gt;
Request routing&lt;br&gt;
Apache Web Server Administration&lt;/p&gt;

&lt;p&gt;Apache is one of the most established web servers in the Linux ecosystem.&lt;/p&gt;

&lt;p&gt;On Ubuntu, installation is straightforward:&lt;/p&gt;

&lt;p&gt;sudo apt update&lt;br&gt;
sudo apt install apache2&lt;/p&gt;

&lt;p&gt;Start Apache:&lt;/p&gt;

&lt;p&gt;sudo systemctl start apache2&lt;/p&gt;

&lt;p&gt;Enable it at boot:&lt;/p&gt;

&lt;p&gt;sudo systemctl enable apache2&lt;/p&gt;

&lt;p&gt;Check its status:&lt;/p&gt;

&lt;p&gt;sudo systemctl status apache2&lt;/p&gt;

&lt;p&gt;But there is one command every Linux administrator should get into the habit of using:&lt;/p&gt;

&lt;p&gt;sudo apache2ctl configtest&lt;/p&gt;

&lt;p&gt;It checks the configuration before you reload or restart Apache.&lt;/p&gt;

&lt;p&gt;Never blindly restart a production web server after changing its configuration.&lt;/p&gt;

&lt;p&gt;Test first.&lt;/p&gt;

&lt;p&gt;Apache Virtual Hosts&lt;/p&gt;

&lt;p&gt;One of Apache's most important concepts is the Virtual Host.&lt;/p&gt;

&lt;p&gt;Virtual hosts allow one server to host multiple websites.&lt;/p&gt;

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

&lt;p&gt;example.com&lt;br&gt;
blog.example.com&lt;br&gt;
shop.example.com&lt;/p&gt;

&lt;p&gt;Each can have its own configuration.&lt;/p&gt;

&lt;p&gt;A basic virtual host might look like:&lt;/p&gt;

&lt;p&gt;&lt;br&gt;
    ServerName example.com&lt;br&gt;
    ServerAlias &lt;a href="http://www.example.com" rel="noopener noreferrer"&gt;www.example.com&lt;/a&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DocumentRoot /var/www/example.com/public

&amp;lt;Directory /var/www/example.com/public&amp;gt;
    Options -Indexes +FollowSymLinks
    AllowOverride All
    Require all granted
&amp;lt;/Directory&amp;gt;

ErrorLog ${APACHE_LOG_DIR}/example.com_error.log
CustomLog ${APACHE_LOG_DIR}/example.com_access.log combined
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then enable the site:&lt;/p&gt;

&lt;p&gt;sudo a2ensite example.com.conf&lt;/p&gt;

&lt;p&gt;Test the configuration:&lt;/p&gt;

&lt;p&gt;sudo apache2ctl configtest&lt;/p&gt;

&lt;p&gt;Reload Apache:&lt;/p&gt;

&lt;p&gt;sudo systemctl reload apache2&lt;/p&gt;

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

&lt;p&gt;Edit&lt;br&gt;
 ↓&lt;br&gt;
Test&lt;br&gt;
 ↓&lt;br&gt;
Reload&lt;/p&gt;

&lt;p&gt;Not:&lt;/p&gt;

&lt;p&gt;Edit&lt;br&gt;
 ↓&lt;br&gt;
Restart&lt;br&gt;
 ↓&lt;br&gt;
Hope&lt;br&gt;
Apache as a Reverse Proxy&lt;/p&gt;

&lt;p&gt;Apache can also sit in front of an application.&lt;/p&gt;

&lt;p&gt;Suppose your Node.js application runs on:&lt;/p&gt;

&lt;p&gt;127.0.0.1:3000&lt;/p&gt;

&lt;p&gt;Apache can expose it publicly:&lt;/p&gt;

&lt;p&gt;Internet&lt;br&gt;
    |&lt;br&gt;
    v&lt;br&gt;
Apache :80&lt;br&gt;
    |&lt;br&gt;
    v&lt;br&gt;
Node.js :3000&lt;/p&gt;

&lt;p&gt;The configuration uses:&lt;/p&gt;

&lt;p&gt;ProxyPreserveHost On&lt;br&gt;
ProxyPass / &lt;a href="http://127.0.0.1:3000/" rel="noopener noreferrer"&gt;http://127.0.0.1:3000/&lt;/a&gt;&lt;br&gt;
ProxyPassReverse / &lt;a href="http://127.0.0.1:3000/" rel="noopener noreferrer"&gt;http://127.0.0.1:3000/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a fundamental DevOps pattern.&lt;/p&gt;

&lt;p&gt;The application doesn't necessarily need to listen directly on the public interface.&lt;/p&gt;

&lt;p&gt;The web server becomes the controlled entry point.&lt;/p&gt;

&lt;p&gt;Nginx Web Server Administration&lt;/p&gt;

&lt;p&gt;Nginx is another essential tool for Linux and DevOps engineers.&lt;/p&gt;

&lt;p&gt;Install it with:&lt;/p&gt;

&lt;p&gt;sudo apt update&lt;br&gt;
sudo apt install nginx&lt;/p&gt;

&lt;p&gt;Start it:&lt;/p&gt;

&lt;p&gt;sudo systemctl start nginx&lt;/p&gt;

&lt;p&gt;Enable it at boot:&lt;/p&gt;

&lt;p&gt;sudo systemctl enable nginx&lt;/p&gt;

&lt;p&gt;Check the service:&lt;/p&gt;

&lt;p&gt;sudo systemctl status nginx&lt;/p&gt;

&lt;p&gt;Before changing anything in production:&lt;/p&gt;

&lt;p&gt;sudo nginx -t&lt;/p&gt;

&lt;p&gt;If the configuration is valid, reload:&lt;/p&gt;

&lt;p&gt;sudo systemctl reload nginx&lt;br&gt;
Nginx Server Blocks&lt;/p&gt;

&lt;p&gt;Nginx uses server blocks for virtual hosting.&lt;/p&gt;

&lt;p&gt;A typical configuration looks like:&lt;/p&gt;

&lt;p&gt;server {&lt;br&gt;
    listen 80;&lt;br&gt;
    server_name example.com &lt;a href="http://www.example.com" rel="noopener noreferrer"&gt;www.example.com&lt;/a&gt;;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;root /var/www/example.com/public;
index index.html;

location / {
    try_files $uri $uri/ /index.php?$query_string;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;A common Linux workflow is:&lt;/p&gt;

&lt;p&gt;sudo nano /etc/nginx/sites-available/example.com&lt;/p&gt;

&lt;p&gt;Then create the symbolic link:&lt;/p&gt;

&lt;p&gt;sudo ln -s /etc/nginx/sites-available/example.com \&lt;br&gt;
/etc/nginx/sites-enabled/&lt;/p&gt;

&lt;p&gt;Test:&lt;/p&gt;

&lt;p&gt;sudo nginx -t&lt;/p&gt;

&lt;p&gt;Reload:&lt;/p&gt;

&lt;p&gt;sudo systemctl reload nginx&lt;br&gt;
Nginx as a Reverse Proxy&lt;/p&gt;

&lt;p&gt;This is where Nginx becomes especially useful in modern application deployments.&lt;/p&gt;

&lt;p&gt;Imagine your application runs on:&lt;/p&gt;

&lt;p&gt;127.0.0.1:3000&lt;/p&gt;

&lt;p&gt;Nginx can receive public traffic on port 80:&lt;/p&gt;

&lt;p&gt;User&lt;br&gt;
 |&lt;br&gt;
 v&lt;br&gt;
Nginx :80&lt;br&gt;
 |&lt;br&gt;
 v&lt;br&gt;
Application :3000&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;server {&lt;br&gt;
    listen 80;&lt;br&gt;
    server_name nodeapp.com;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;location / {
    proxy_pass http://127.0.0.1:3000;

    proxy_http_version 1.1;

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;Now the user doesn't need to know that the application is running on port 3000.&lt;/p&gt;

&lt;p&gt;Nginx handles the public-facing request.&lt;/p&gt;

&lt;p&gt;Nginx Load Balancing&lt;/p&gt;

&lt;p&gt;Nginx can also distribute traffic across multiple backend servers.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;             +--&amp;gt; App Server 1
             |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Client --&amp;gt; Nginx +--&amp;gt; App Server 2&lt;br&gt;
                 |&lt;br&gt;
                 +--&amp;gt; App Server 3&lt;/p&gt;

&lt;p&gt;A basic upstream configuration:&lt;/p&gt;

&lt;p&gt;upstream backend {&lt;br&gt;
    least_conn;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;server 127.0.0.1:3001;
server 127.0.0.1:3002;
server 127.0.0.1:3003;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;Then proxy requests to it:&lt;/p&gt;

&lt;p&gt;server {&lt;br&gt;
    listen 80;&lt;br&gt;
    server_name app.example.com;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;location / {
    proxy_pass http://backend;

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;Instead of sending every request to one application instance, Nginx can distribute requests across multiple backends.&lt;/p&gt;

&lt;p&gt;This becomes important when building applications that need greater availability and scalability.&lt;/p&gt;

&lt;p&gt;HTTPS and SSL&lt;/p&gt;

&lt;p&gt;Modern applications should use HTTPS.&lt;/p&gt;

&lt;p&gt;Both Apache and Nginx can terminate SSL/TLS.&lt;/p&gt;

&lt;p&gt;For Nginx, an HTTPS server block can include:&lt;/p&gt;

&lt;p&gt;server {&lt;br&gt;
    listen 443 ssl http2;&lt;br&gt;
    server_name example.com &lt;a href="http://www.example.com" rel="noopener noreferrer"&gt;www.example.com&lt;/a&gt;;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

ssl_protocols TLSv1.2 TLSv1.3;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;A common architecture is:&lt;/p&gt;

&lt;p&gt;Client&lt;br&gt;
  |&lt;br&gt;
 HTTPS&lt;br&gt;
  |&lt;br&gt;
  v&lt;br&gt;
Nginx&lt;br&gt;
  |&lt;br&gt;
 HTTP/internal network&lt;br&gt;
  |&lt;br&gt;
  v&lt;br&gt;
Application&lt;/p&gt;

&lt;p&gt;This allows Nginx to handle TLS while the backend application focuses on application logic.&lt;/p&gt;

&lt;p&gt;Apache vs Nginx&lt;/p&gt;

&lt;p&gt;So which one should you learn?&lt;/p&gt;

&lt;p&gt;The answer isn't simply:&lt;/p&gt;

&lt;p&gt;"Nginx is better."&lt;/p&gt;

&lt;p&gt;The tools solve overlapping problems but have different strengths.&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%2Fx1po1ymyreledmfu8jlv.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%2Fx1po1ymyreledmfu8jlv.png" alt=" " width="728" height="454"&gt;&lt;/a&gt;&lt;br&gt;
The practical lesson:&lt;/p&gt;

&lt;p&gt;Learn both.&lt;/p&gt;

&lt;p&gt;You don't want to be the engineer who knows only one command because every production environment is different.&lt;br&gt;
Apache and Nginx Can Work Together&lt;/p&gt;

&lt;p&gt;You don't always have to choose one.&lt;/p&gt;

&lt;p&gt;A common architecture is:&lt;/p&gt;

&lt;p&gt;Internet&lt;br&gt;
   |&lt;br&gt;
   v&lt;br&gt;
Nginx&lt;br&gt;
   |&lt;br&gt;
   +---- Static files&lt;br&gt;
   |&lt;br&gt;
   +---- Apache&lt;br&gt;
           |&lt;br&gt;
           +---- PHP/Application&lt;/p&gt;

&lt;p&gt;Nginx can act as the public-facing reverse proxy while Apache handles application-specific functionality.&lt;/p&gt;

&lt;p&gt;The important thing isn't choosing a "winner."&lt;/p&gt;

&lt;p&gt;It's understanding where each component belongs in the request path.&lt;/p&gt;

&lt;p&gt;Restart vs Reload: A Small Detail That Matters&lt;/p&gt;

&lt;p&gt;This is one of those concepts that looks trivial until you're troubleshooting production.&lt;/p&gt;

&lt;p&gt;Restart&lt;br&gt;
sudo systemctl restart nginx&lt;/p&gt;

&lt;p&gt;The service is stopped and started again.&lt;/p&gt;

&lt;p&gt;Reload&lt;br&gt;
sudo systemctl reload nginx&lt;/p&gt;

&lt;p&gt;Nginx re-reads its configuration without completely stopping the service.&lt;/p&gt;

&lt;p&gt;That's why configuration changes often follow this pattern:&lt;/p&gt;

&lt;p&gt;sudo nginx -t&lt;br&gt;
sudo systemctl reload nginx&lt;/p&gt;

&lt;p&gt;The principle is simple:&lt;/p&gt;

&lt;p&gt;Validate first. Change second.&lt;/p&gt;

&lt;p&gt;Important Linux Web Server Files&lt;/p&gt;

&lt;p&gt;If you're preparing for a DevOps interview, know where the configuration lives.&lt;/p&gt;

&lt;p&gt;Apache&lt;br&gt;
/etc/apache2/apache2.conf&lt;br&gt;
/etc/apache2/ports.conf&lt;br&gt;
/etc/apache2/sites-available/&lt;br&gt;
/etc/apache2/sites-enabled/&lt;br&gt;
/etc/apache2/mods-available/&lt;br&gt;
/etc/apache2/mods-enabled/&lt;br&gt;
/var/log/apache2/&lt;br&gt;
/var/www/html/&lt;br&gt;
Nginx&lt;br&gt;
/etc/nginx/nginx.conf&lt;br&gt;
/etc/nginx/sites-available/&lt;br&gt;
/etc/nginx/sites-enabled/&lt;br&gt;
/etc/nginx/conf.d/&lt;br&gt;
/var/log/nginx/&lt;br&gt;
/var/www/html/&lt;/p&gt;

&lt;p&gt;Knowing these paths makes troubleshooting much faster.&lt;/p&gt;

&lt;p&gt;The Most Important Troubleshooting Habit&lt;/p&gt;

&lt;p&gt;When a web server stops working, don't randomly restart services.&lt;/p&gt;

&lt;p&gt;Work from the bottom up.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check the service
sudo systemctl status nginx&lt;/li&gt;
&lt;li&gt;Validate configuration
sudo nginx -t&lt;/li&gt;
&lt;li&gt;Check listening ports
sudo ss -tulpn&lt;/li&gt;
&lt;li&gt;Check logs
sudo tail -f /var/log/nginx/error.log&lt;/li&gt;
&lt;li&gt;Test locally
curl &lt;a href="http://127.0.0.1" rel="noopener noreferrer"&gt;http://127.0.0.1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Check connectivity&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then investigate:&lt;/p&gt;

&lt;p&gt;firewall rules&lt;br&gt;
DNS&lt;br&gt;
security groups&lt;br&gt;
backend availability&lt;br&gt;
application ports&lt;br&gt;
file permissions&lt;/p&gt;

&lt;p&gt;This approach is much more reliable than guessing.&lt;/p&gt;

&lt;p&gt;What DevOps Engineers Should Actually Learn&lt;/p&gt;

&lt;p&gt;Don't memorize hundreds of configuration directives.&lt;/p&gt;

&lt;p&gt;Understand the request flow:&lt;/p&gt;

&lt;p&gt;DNS&lt;br&gt;
 ↓&lt;br&gt;
Load Balancer&lt;br&gt;
 ↓&lt;br&gt;
Nginx / Apache&lt;br&gt;
 ↓&lt;br&gt;
Reverse Proxy&lt;br&gt;
 ↓&lt;br&gt;
Application&lt;br&gt;
 ↓&lt;br&gt;
Database&lt;/p&gt;

&lt;p&gt;Then learn how to troubleshoot each layer.&lt;/p&gt;

&lt;p&gt;Because production incidents rarely announce themselves with:&lt;/p&gt;

&lt;p&gt;"The problem is on line 47 of nginx.conf."&lt;/p&gt;

&lt;p&gt;Instead, you get:&lt;/p&gt;

&lt;p&gt;502 Bad Gateway&lt;br&gt;
Connection refused&lt;br&gt;
403 Forbidden&lt;br&gt;
404 Not Found&lt;br&gt;
500 Internal Server Error&lt;/p&gt;

&lt;p&gt;Your job is to find which layer failed and why.&lt;/p&gt;

&lt;p&gt;Final Takeaway&lt;/p&gt;

&lt;p&gt;Apache and Nginx aren't just "web server packages."&lt;/p&gt;

&lt;p&gt;They are fundamental building blocks of Linux infrastructure.&lt;/p&gt;

&lt;p&gt;If you're serious about DevOps, learn how to:&lt;/p&gt;

&lt;p&gt;Install and manage Apache and Nginx&lt;br&gt;
Configure virtual hosts/server blocks&lt;br&gt;
Serve static websites&lt;br&gt;
Configure HTTPS&lt;br&gt;
Use reverse proxies&lt;br&gt;
Configure load balancing&lt;br&gt;
Read access and error logs&lt;br&gt;
Test configurations safely&lt;br&gt;
Understand reload vs restart&lt;br&gt;
Troubleshoot ports and connectivity&lt;/p&gt;

&lt;p&gt;The deeper lesson is even more important:&lt;/p&gt;

&lt;p&gt;DevOps isn't about memorizing commands.&lt;/p&gt;

&lt;p&gt;It's about understanding how systems communicate.&lt;/p&gt;

&lt;p&gt;Once you understand the request path, the commands start making sense.&lt;/p&gt;

&lt;p&gt;And that's when Linux administration stops feeling like a collection of random commands—and starts becoming engineering.&lt;/p&gt;

&lt;p&gt;Frequently Asked Questions&lt;br&gt;
Is Apache better than Nginx?&lt;/p&gt;

&lt;p&gt;Not universally. Apache is particularly useful when .htaccess and per-directory configuration are important. Nginx is commonly used for high-concurrency workloads, static content, reverse proxying, and load balancing.&lt;/p&gt;

&lt;p&gt;Is Nginx a web server or a reverse proxy?&lt;/p&gt;

&lt;p&gt;Both. Nginx can directly serve static content and can also act as a reverse proxy in front of applications.&lt;/p&gt;

&lt;p&gt;What command checks Nginx configuration?&lt;br&gt;
sudo nginx -t&lt;br&gt;
What command checks Apache configuration?&lt;br&gt;
sudo apache2ctl configtest&lt;br&gt;
What is a reverse proxy?&lt;/p&gt;

&lt;p&gt;A reverse proxy receives client requests and forwards them to backend servers or applications.&lt;/p&gt;

&lt;p&gt;Why use Nginx in front of an application?&lt;/p&gt;

&lt;p&gt;It can provide a controlled public entry point while handling tasks such as TLS termination, request routing, static content, and load balancing.&lt;/p&gt;

&lt;p&gt;Should DevOps engineers learn Apache and Nginx?&lt;/p&gt;

&lt;p&gt;Yes. Understanding both makes it easier to work with existing Linux infrastructure and troubleshoot real production environments.&lt;/p&gt;

&lt;p&gt;If you remember only one thing:&lt;/p&gt;

&lt;p&gt;Don't memorize the web server. Understand the request.&lt;/p&gt;

&lt;p&gt;That mindset will take you much further in DevOps than memorizing configuration files.&lt;/p&gt;

&lt;h1&gt;
  
  
  Part 2: Apache &amp;amp; Nginx Web Server Administration
&lt;/h1&gt;




&lt;h2&gt;
  
  
  2.1 Apache Web Server
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Installation &amp;amp; Basic Management
&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 Apache&lt;/span&gt;
&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;apache2

&lt;span class="c"&gt;# Service management&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start apache2
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl stop apache2
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart apache2
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reload apache2          &lt;span class="c"&gt;# Reload config without downtime&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;apache2          &lt;span class="c"&gt;# Start on boot&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status apache2

&lt;span class="c"&gt;# Test configuration before restart&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apache2ctl configtest             &lt;span class="c"&gt;# ALWAYS do this before restart&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apachectl &lt;span class="nt"&gt;-t&lt;/span&gt;                      &lt;span class="c"&gt;# Alternative&lt;/span&gt;

&lt;span class="c"&gt;# Check Apache version&lt;/span&gt;
apache2 &lt;span class="nt"&gt;-v&lt;/span&gt;

&lt;span class="c"&gt;# List enabled modules&lt;/span&gt;
apache2ctl &lt;span class="nt"&gt;-M&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Apache Virtual Hosts (CRITICAL - You WILL be asked)
&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;# Create virtual host config&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/apache2/sites-available/example.com.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;&lt;span class="c"&gt;# /etc/apache2/sites-available/example.com.conf&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nl"&gt;VirtualHost&lt;/span&gt;&lt;span class="sr"&gt; *:80&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="nc"&gt;ServerName&lt;/span&gt; example.com
    &lt;span class="nc"&gt;ServerAlias&lt;/span&gt; www.example.com
    &lt;span class="nc"&gt;ServerAdmin&lt;/span&gt; admin@example.com
    &lt;span class="nc"&gt;DocumentRoot&lt;/span&gt; /var/www/example.com/public

    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nl"&gt;Directory&lt;/span&gt;&lt;span class="sr"&gt; /var/www/example.com/public&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="nc"&gt;Options&lt;/span&gt; -Indexes +FollowSymLinks
        &lt;span class="nc"&gt;AllowOverride&lt;/span&gt; &lt;span class="ss"&gt;All&lt;/span&gt;
        &lt;span class="nc"&gt;Require&lt;/span&gt; &lt;span class="ss"&gt;all&lt;/span&gt; granted
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;Directory&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;
    &lt;span class="nc"&gt;ErrorLog&lt;/span&gt; ${APACHE_LOG_DIR}/example.com_error.log
    &lt;span class="nc"&gt;CustomLog&lt;/span&gt; ${APACHE_LOG_DIR}/example.com_access.log combined
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;VirtualHost&lt;/span&gt;&lt;span class="p"&gt;&amp;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 apache"&gt;&lt;code&gt;&lt;span class="c"&gt;# HTTPS Virtual Host (with SSL)&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nl"&gt;VirtualHost&lt;/span&gt;&lt;span class="sr"&gt; *:443&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="nc"&gt;ServerName&lt;/span&gt; example.com
    &lt;span class="nc"&gt;ServerAlias&lt;/span&gt; www.example.com
    &lt;span class="nc"&gt;DocumentRoot&lt;/span&gt; /var/www/example.com/public

    &lt;span class="nc"&gt;SSLEngine&lt;/span&gt; &lt;span class="ss"&gt;on&lt;/span&gt;
    &lt;span class="nc"&gt;SSLCertificateFile&lt;/span&gt; /etc/letsencrypt/live/example.com/fullchain.pem
    &lt;span class="nc"&gt;SSLCertificateKeyFile&lt;/span&gt; /etc/letsencrypt/live/example.com/privkey.pem

    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nl"&gt;Directory&lt;/span&gt;&lt;span class="sr"&gt; /var/www/example.com/public&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="nc"&gt;Options&lt;/span&gt; -Indexes +FollowSymLinks
        &lt;span class="nc"&gt;AllowOverride&lt;/span&gt; &lt;span class="ss"&gt;All&lt;/span&gt;
        &lt;span class="nc"&gt;Require&lt;/span&gt; &lt;span class="ss"&gt;all&lt;/span&gt; granted
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;Directory&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;
    &lt;span class="nc"&gt;ErrorLog&lt;/span&gt; ${APACHE_LOG_DIR}/example.com_ssl_error.log
    &lt;span class="nc"&gt;CustomLog&lt;/span&gt; ${APACHE_LOG_DIR}/example.com_ssl_access.log combined
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;VirtualHost&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="c"&gt;# HTTP to HTTPS redirect&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nl"&gt;VirtualHost&lt;/span&gt;&lt;span class="sr"&gt; *:80&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="nc"&gt;ServerName&lt;/span&gt; example.com
    &lt;span class="nc"&gt;ServerAlias&lt;/span&gt; www.example.com
    &lt;span class="nc"&gt;Redirect&lt;/span&gt; &lt;span class="ss"&gt;permanent&lt;/span&gt; / https://example.com/
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;VirtualHost&lt;/span&gt;&lt;span class="p"&gt;&amp;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;# Enable the site&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;a2ensite example.com.conf

&lt;span class="c"&gt;# Disable a site&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;a2dissite example.com.conf

&lt;span class="c"&gt;# Enable required modules&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;a2enmod rewrite                   &lt;span class="c"&gt;# For .htaccess URL rewriting&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;a2enmod ssl                       &lt;span class="c"&gt;# For HTTPS&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;a2enmod headers                   &lt;span class="c"&gt;# For security headers&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;a2enmod proxy                     &lt;span class="c"&gt;# For reverse proxy&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;a2enmod proxy_http                &lt;span class="c"&gt;# For HTTP reverse proxy&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;a2enmod expires                   &lt;span class="c"&gt;# For caching&lt;/span&gt;

&lt;span class="c"&gt;# Disable a module&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;a2dismod module_name

&lt;span class="c"&gt;# Create document root and set permissions&lt;/span&gt;
&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /var/www/example.com/public
&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/example.com
&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; 755 /var/www/example.com

&lt;span class="c"&gt;# Test and reload&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apache2ctl configtest
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reload apache2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Apache as Reverse Proxy (for Node.js, Python apps)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;&lt;span class="c"&gt;# /etc/apache2/sites-available/nodeapp.com.conf&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nl"&gt;VirtualHost&lt;/span&gt;&lt;span class="sr"&gt; *:80&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="nc"&gt;ServerName&lt;/span&gt; nodeapp.com

    &lt;span class="nc"&gt;ProxyPreserveHost&lt;/span&gt; &lt;span class="ss"&gt;On&lt;/span&gt;
    &lt;span class="nc"&gt;ProxyPass&lt;/span&gt; / http://127.0.0.1:3000/
    &lt;span class="nc"&gt;ProxyPassReverse&lt;/span&gt; / http://127.0.0.1:3000/

    &lt;span class="nc"&gt;ErrorLog&lt;/span&gt; ${APACHE_LOG_DIR}/nodeapp_error.log
    &lt;span class="nc"&gt;CustomLog&lt;/span&gt; ${APACHE_LOG_DIR}/nodeapp_access.log combined
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;VirtualHost&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Apache .htaccess (Common Rules)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;&lt;span class="c"&gt;# /var/www/example.com/public/.htaccess&lt;/span&gt;

&lt;span class="c"&gt;# Enable URL rewriting&lt;/span&gt;
&lt;span class="nc"&gt;RewriteEngine&lt;/span&gt; &lt;span class="ss"&gt;On&lt;/span&gt;

&lt;span class="c"&gt;# Force HTTPS&lt;/span&gt;
&lt;span class="nc"&gt;RewriteCond&lt;/span&gt; %{HTTPS} &lt;span class="ss"&gt;off&lt;/span&gt;
&lt;span class="nc"&gt;RewriteRule&lt;/span&gt; ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

&lt;span class="c"&gt;# Remove www&lt;/span&gt;
&lt;span class="nc"&gt;RewriteCond&lt;/span&gt; %{HTTP_HOST} ^www\.(.+)$ [NC]
&lt;span class="nc"&gt;RewriteRule&lt;/span&gt; ^(.*)$ https://%1/$1 [R=301,L]

&lt;span class="c"&gt;# Laravel/PHP Framework front controller&lt;/span&gt;
&lt;span class="nc"&gt;RewriteCond&lt;/span&gt; %{REQUEST_FILENAME} !-d
&lt;span class="nc"&gt;RewriteCond&lt;/span&gt; %{REQUEST_FILENAME} !-f
&lt;span class="nc"&gt;RewriteRule&lt;/span&gt; ^ index.php [L]

&lt;span class="c"&gt;# Deny access to sensitive files&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nl"&gt;FilesMatch&lt;/span&gt;&lt;span class="sr"&gt; "\.(env|htpasswd|ini|log|sh|sql)$"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="nc"&gt;Require&lt;/span&gt; &lt;span class="ss"&gt;all&lt;/span&gt; denied
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;FilesMatch&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="c"&gt;# Security headers&lt;/span&gt;
&lt;span class="nc"&gt;Header&lt;/span&gt; &lt;span class="ss"&gt;always&lt;/span&gt; &lt;span class="ss"&gt;set&lt;/span&gt; X-Content-Type-Options "nosniff"
&lt;span class="nc"&gt;Header&lt;/span&gt; &lt;span class="ss"&gt;always&lt;/span&gt; &lt;span class="ss"&gt;set&lt;/span&gt; X-Frame-Options "SAMEORIGIN"
&lt;span class="nc"&gt;Header&lt;/span&gt; &lt;span class="ss"&gt;always&lt;/span&gt; &lt;span class="ss"&gt;set&lt;/span&gt; X-XSS-Protection "1; mode=block"

&lt;span class="c"&gt;# Enable compression&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nl"&gt;IfModule&lt;/span&gt;&lt;span class="sr"&gt; mod_deflate.c&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="nc"&gt;AddOutputFilterByType&lt;/span&gt; DEFLATE text/html text/css text/javascript application/javascript application/json
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;IfModule&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="c"&gt;# Browser caching&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nl"&gt;IfModule&lt;/span&gt;&lt;span class="sr"&gt; mod_expires.c&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="nc"&gt;ExpiresActive&lt;/span&gt; &lt;span class="ss"&gt;On&lt;/span&gt;
    &lt;span class="nc"&gt;ExpiresByType&lt;/span&gt; image/jpg "access plus 1 year"
    &lt;span class="nc"&gt;ExpiresByType&lt;/span&gt; image/jpeg "access plus 1 year"
    &lt;span class="nc"&gt;ExpiresByType&lt;/span&gt; image/png "access plus 1 year"
    &lt;span class="nc"&gt;ExpiresByType&lt;/span&gt; text/css "access plus 1 month"
    &lt;span class="nc"&gt;ExpiresByType&lt;/span&gt; application/javascript "access plus 1 month"
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;IfModule&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Apache Key Files &amp;amp; Directories
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Path&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;/etc/apache2/apache2.conf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Main config file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/etc/apache2/ports.conf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Listening ports&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/etc/apache2/sites-available/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Available virtual host configs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/etc/apache2/sites-enabled/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enabled virtual hosts (symlinks)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/etc/apache2/mods-available/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Available modules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/etc/apache2/mods-enabled/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enabled modules (symlinks)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/var/log/apache2/error.log&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Error log&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/var/log/apache2/access.log&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Access log&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/var/www/html/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Default document root&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  2.2 Nginx Web Server
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Installation &amp;amp; Basic Management
&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 Nginx&lt;/span&gt;
&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;nginx

&lt;span class="c"&gt;# Service management&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start nginx
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl stop nginx
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart nginx
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reload nginx
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;nginx
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status nginx

&lt;span class="c"&gt;# Test configuration (ALWAYS before restart/reload)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nginx &lt;span class="nt"&gt;-t&lt;/span&gt;

&lt;span class="c"&gt;# Check Nginx version&lt;/span&gt;
nginx &lt;span class="nt"&gt;-v&lt;/span&gt;                              &lt;span class="c"&gt;# Version only&lt;/span&gt;
nginx &lt;span class="nt"&gt;-V&lt;/span&gt;                              &lt;span class="c"&gt;# Version + compile options&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Nginx Server Blocks (Virtual Hosts)
&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;nano /etc/nginx/sites-available/example.com
&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;# /etc/nginx/sites-available/example.com&lt;/span&gt;

&lt;span class="c1"&gt;# HTTP - redirect to HTTPS&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;listen&lt;/span&gt; &lt;span class="s"&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;example.com&lt;/span&gt; &lt;span class="s"&gt;www.example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;301&lt;/span&gt; &lt;span class="s"&gt;https://example.com&lt;/span&gt;&lt;span class="nv"&gt;$request_uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# HTTPS&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;443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt; &lt;span class="s"&gt;http2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="s"&gt;[::]:443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt; &lt;span class="s"&gt;http2&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;example.com&lt;/span&gt; &lt;span class="s"&gt;www.example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;# Document root&lt;/span&gt;
    &lt;span class="kn"&gt;root&lt;/span&gt; &lt;span class="n"&gt;/var/www/example.com/public&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;index&lt;/span&gt; &lt;span class="s"&gt;index.php&lt;/span&gt; &lt;span class="s"&gt;index.html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;# SSL&lt;/span&gt;
    &lt;span class="kn"&gt;ssl_certificate&lt;/span&gt; &lt;span class="n"&gt;/etc/letsencrypt/live/example.com/fullchain.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;ssl_certificate_key&lt;/span&gt; &lt;span class="n"&gt;/etc/letsencrypt/live/example.com/privkey.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;ssl_protocols&lt;/span&gt; &lt;span class="s"&gt;TLSv1.2&lt;/span&gt; &lt;span class="s"&gt;TLSv1.3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;ssl_ciphers&lt;/span&gt; &lt;span class="s"&gt;HIGH:!aNULL:!MD5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;# Security headers&lt;/span&gt;
    &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-Frame-Options&lt;/span&gt; &lt;span class="s"&gt;"SAMEORIGIN"&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-Content-Type-Options&lt;/span&gt; &lt;span class="s"&gt;"nosniff"&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-XSS-Protection&lt;/span&gt; &lt;span class="s"&gt;"1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="kn"&gt;mode=block"&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Strict-Transport-Security&lt;/span&gt; &lt;span class="s"&gt;"max-age=31536000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="kn"&gt;includeSubDomains"&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;# Logging&lt;/span&gt;
    &lt;span class="kn"&gt;access_log&lt;/span&gt; &lt;span class="n"&gt;/var/log/nginx/example.com_access.log&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;error_log&lt;/span&gt; &lt;span class="n"&gt;/var/log/nginx/example.com_error.log&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;# Main location&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;try_files&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt;&lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="n"&gt;/index.php?&lt;/span&gt;&lt;span class="nv"&gt;$query_string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;# PHP processing (PHP-FPM)&lt;/span&gt;
    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt; &lt;span class="sr"&gt;\.php$&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;fastcgi_pass&lt;/span&gt; &lt;span class="s"&gt;unix:/var/run/php/php8.2-fpm.sock&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;fastcgi_param&lt;/span&gt; &lt;span class="s"&gt;SCRIPT_FILENAME&lt;/span&gt; &lt;span class="nv"&gt;$realpath_root$fastcgi_script_name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;include&lt;/span&gt; &lt;span class="s"&gt;fastcgi_params&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;fastcgi_read_timeout&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;# Deny access to hidden files&lt;/span&gt;
    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt; &lt;span class="sr"&gt;/\.&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;deny&lt;/span&gt; &lt;span class="s"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;access_log&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;log_not_found&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;# Static file caching&lt;/span&gt;
    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s"&gt;.(jpg|jpeg|png|gif|ico|css|js|woff2|svg)&lt;/span&gt;$ &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;expires&lt;/span&gt; &lt;span class="s"&gt;30d&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Cache-Control&lt;/span&gt; &lt;span class="s"&gt;"public,&lt;/span&gt; &lt;span class="s"&gt;immutable"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;access_log&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;# Block sensitive files&lt;/span&gt;
    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s"&gt;.(env|log|sql|sh|bak)&lt;/span&gt;$ &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;deny&lt;/span&gt; &lt;span class="s"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;# Gzip compression&lt;/span&gt;
    &lt;span class="kn"&gt;gzip&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;gzip_types&lt;/span&gt; &lt;span class="nc"&gt;text/plain&lt;/span&gt; &lt;span class="nc"&gt;text/css&lt;/span&gt; &lt;span class="nc"&gt;application/json&lt;/span&gt; &lt;span class="nc"&gt;application/javascript&lt;/span&gt; &lt;span class="nc"&gt;text/xml&lt;/span&gt; &lt;span class="nc"&gt;application/xml&lt;/span&gt; &lt;span class="nc"&gt;text/javascript&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;gzip_min_length&lt;/span&gt; &lt;span class="mi"&gt;256&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Enable site (create symlink)&lt;/span&gt;
&lt;span class="nb"&gt;sudo ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

&lt;span class="c"&gt;# Disable site&lt;/span&gt;
&lt;span class="nb"&gt;sudo rm&lt;/span&gt; /etc/nginx/sites-enabled/example.com

&lt;span class="c"&gt;# Test and reload&lt;/span&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;h3&gt;
  
  
  Nginx as Reverse Proxy (for Node.js, Python, etc.)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="c1"&gt;# /etc/nginx/sites-available/nodeapp.com&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_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="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-Proto&lt;/span&gt; &lt;span class="nv"&gt;$scheme&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="kn"&gt;proxy_read_timeout&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_connect_timeout&lt;/span&gt; &lt;span class="mi"&gt;300&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;
  
  
  Nginx Load Balancing
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Load balancing across multiple backend servers&lt;/span&gt;
&lt;span class="k"&gt;upstream&lt;/span&gt; &lt;span class="s"&gt;backend&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;least_conn&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                        &lt;span class="c1"&gt;# Load balancing method&lt;/span&gt;
    &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="nf"&gt;127.0.0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3001&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="nf"&gt;127.0.0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3002&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="nf"&gt;127.0.0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3003&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&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;app.example.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://backend&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="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;
  
  
  Nginx Key Files &amp;amp; Directories
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Path&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;/etc/nginx/nginx.conf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Main config file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/etc/nginx/sites-available/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Available server block configs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/etc/nginx/sites-enabled/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enabled server blocks (symlinks)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/etc/nginx/conf.d/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Additional config files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/var/log/nginx/error.log&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Error log&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/var/log/nginx/access.log&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Access log&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/var/www/html/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Default document root&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Nginx Performance Tuning (&lt;code&gt;/etc/nginx/nginx.conf&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;worker_processes&lt;/span&gt; &lt;span class="s"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                  &lt;span class="c1"&gt;# Match CPU cores&lt;/span&gt;
&lt;span class="k"&gt;worker_connections&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                &lt;span class="c1"&gt;# Connections per worker&lt;/span&gt;

&lt;span class="c1"&gt;# In http block:&lt;/span&gt;
&lt;span class="k"&gt;keepalive_timeout&lt;/span&gt; &lt;span class="mi"&gt;65&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;client_max_body_size&lt;/span&gt; &lt;span class="mi"&gt;100M&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;             &lt;span class="c1"&gt;# Max upload size&lt;/span&gt;
&lt;span class="k"&gt;server_tokens&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                      &lt;span class="c1"&gt;# Hide Nginx version&lt;/span&gt;

&lt;span class="c1"&gt;# Buffer sizes&lt;/span&gt;
&lt;span class="k"&gt;client_body_buffer_size&lt;/span&gt; &lt;span class="mi"&gt;10K&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;client_header_buffer_size&lt;/span&gt; &lt;span class="mi"&gt;1k&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;large_client_header_buffers&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="mi"&gt;8k&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;# Timeouts&lt;/span&gt;
&lt;span class="k"&gt;client_body_timeout&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;client_header_timeout&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;send_timeout&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2.3 Apache vs Nginx Comparison
&lt;/h2&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;Apache&lt;/th&gt;
&lt;th&gt;Nginx&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Architecture&lt;/td&gt;
&lt;td&gt;Process/Thread-based&lt;/td&gt;
&lt;td&gt;Event-driven, async&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance&lt;/td&gt;
&lt;td&gt;Good for dynamic content&lt;/td&gt;
&lt;td&gt;Better for static content &amp;amp; high concurrency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Config style&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.htaccess&lt;/code&gt; per-directory&lt;/td&gt;
&lt;td&gt;Centralized config only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP handling&lt;/td&gt;
&lt;td&gt;mod_php (built-in)&lt;/td&gt;
&lt;td&gt;PHP-FPM (external)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reverse proxy&lt;/td&gt;
&lt;td&gt;mod_proxy&lt;/td&gt;
&lt;td&gt;Built-in, excellent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory usage&lt;/td&gt;
&lt;td&gt;Higher&lt;/td&gt;
&lt;td&gt;Lower&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use case&lt;/td&gt;
&lt;td&gt;Shared hosting, .htaccess needed&lt;/td&gt;
&lt;td&gt;High-traffic, reverse proxy, microservices&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Config test&lt;/td&gt;
&lt;td&gt;&lt;code&gt;apache2ctl configtest&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nginx -t&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reload&lt;/td&gt;
&lt;td&gt;&lt;code&gt;systemctl reload apache2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;systemctl reload nginx&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Interview Q&amp;amp;A: Web Servers
&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;When would you use Apache over Nginx?&lt;/td&gt;
&lt;td&gt;When you need &lt;code&gt;.htaccess&lt;/code&gt; support, mod_php, or per-directory config (shared hosting)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;When would you use Nginx over Apache?&lt;/td&gt;
&lt;td&gt;High-traffic sites, reverse proxy, static files, lower memory footprint&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can you use both together?&lt;/td&gt;
&lt;td&gt;Yes! Nginx as reverse proxy in front of Apache. Nginx handles static files, Apache handles PHP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is &lt;code&gt;try_files&lt;/code&gt;?&lt;/td&gt;
&lt;td&gt;Nginx directive that checks for files in order, falls back to last option (usually index.php for frameworks)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What's &lt;code&gt;AllowOverride All&lt;/code&gt; in Apache?&lt;/td&gt;
&lt;td&gt;Enables .htaccess files in that directory to override server config&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How to test config before restarting?&lt;/td&gt;
&lt;td&gt;Apache: &lt;code&gt;apache2ctl configtest&lt;/code&gt;. Nginx: &lt;code&gt;nginx -t&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What's the difference between restart and reload?&lt;/td&gt;
&lt;td&gt;Restart: stops and starts (brief downtime). Reload: re-reads config without stopping (zero downtime)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is &lt;code&gt;proxy_pass&lt;/code&gt;?&lt;/td&gt;
&lt;td&gt;Nginx directive to forward requests to another server (reverse proxy)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How do you handle file upload size limits?&lt;/td&gt;
&lt;td&gt;Apache: &lt;code&gt;LimitRequestBody&lt;/code&gt; or PHP &lt;code&gt;upload_max_filesize&lt;/code&gt;. Nginx: &lt;code&gt;client_max_body_size&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is &lt;code&gt;worker_processes auto&lt;/code&gt;?&lt;/td&gt;
&lt;td&gt;Sets Nginx worker processes to match CPU cores automatically&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>linux</category>
      <category>nginx</category>
      <category>cloudcomputing</category>
      <category>devops</category>
    </item>
    <item>
      <title>Linux Server Administration: The Skills That Actually Make You Dangerous in Production</title>
      <dc:creator>Yashvi Kothari</dc:creator>
      <pubDate>Wed, 12 Aug 2026 08:57:53 +0000</pubDate>
      <link>https://dev.to/yashvikothari/linux-server-administration-the-skills-that-actually-make-you-dangerous-in-production-47h6</link>
      <guid>https://dev.to/yashvikothari/linux-server-administration-the-skills-that-actually-make-you-dangerous-in-production-47h6</guid>
      <description>&lt;h1&gt;
  
  
  Linux Server Administration: The Skills That Actually Make You Dangerous in Production
&lt;/h1&gt;

&lt;p&gt;Most people learning DevOps start with Kubernetes.&lt;/p&gt;

&lt;p&gt;That’s backwards.&lt;/p&gt;

&lt;p&gt;Before containers, pipelines, cloud architecture, or Kubernetes, there is a machine.&lt;/p&gt;

&lt;p&gt;And that machine is usually running Linux.&lt;/p&gt;

&lt;p&gt;If you cannot confidently answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is using port 80?&lt;/li&gt;
&lt;li&gt;Why did Nginx fail?&lt;/li&gt;
&lt;li&gt;Where did the disk space go?&lt;/li&gt;
&lt;li&gt;Which process is consuming CPU?&lt;/li&gt;
&lt;li&gt;Who owns this file?&lt;/li&gt;
&lt;li&gt;Why can't this user SSH?&lt;/li&gt;
&lt;li&gt;Why didn't the cron job run?&lt;/li&gt;
&lt;li&gt;Why did the service stop after reboot?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;then Kubernetes won't save you.&lt;/p&gt;

&lt;p&gt;Linux server administration is the foundation underneath modern infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Learn to Think Like a Server Administrator
&lt;/h2&gt;

&lt;p&gt;A junior administrator often asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What command should I run?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A strong administrator asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What evidence do I need?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the difference.&lt;/p&gt;

&lt;p&gt;If a website is down, don't randomly restart services.&lt;/p&gt;

&lt;p&gt;Build a chain of evidence:&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;Is the service running?&lt;/p&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;ss &lt;span class="nt"&gt;-tlnp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Is something actually listening on the expected port?&lt;/p&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;journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What does the service log say?&lt;/p&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;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;Is the server out of disk space?&lt;/p&gt;

&lt;p&gt;Then inspect the application and web-server logs.&lt;/p&gt;

&lt;p&gt;The goal isn't to memorize 500 commands.&lt;/p&gt;

&lt;p&gt;The goal is to know &lt;strong&gt;which command answers which question&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Master the Linux Filesystem
&lt;/h2&gt;

&lt;p&gt;You should be able to navigate a server without thinking.&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;pwd
ls&lt;/span&gt; &lt;span class="nt"&gt;-lah&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; /var/www/html
&lt;span class="nb"&gt;cd&lt;/span&gt; ..
&lt;span class="nb"&gt;cd&lt;/span&gt; ~
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then learn the basic file operations:&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;cp &lt;/span&gt;file.txt /backup/
&lt;span class="nb"&gt;mv &lt;/span&gt;old.txt new.txt
&lt;span class="nb"&gt;rm &lt;/span&gt;file.txt
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /var/www/site/logs
&lt;span class="nb"&gt;touch &lt;/span&gt;newfile.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And become comfortable reading logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;less /var/log/syslog
&lt;span class="nb"&gt;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;That last command is especially important.&lt;/p&gt;

&lt;p&gt;Production troubleshooting often means watching a log while reproducing a problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Learn How to Find Problems
&lt;/h2&gt;

&lt;p&gt;Linux gives you powerful tools for searching.&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;grep&lt;/span&gt; &lt;span class="s2"&gt;"error"&lt;/span&gt; /var/log/syslog
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Search recursively:&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;grep&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"db_password"&lt;/span&gt; /var/www/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Find 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;-name&lt;/span&gt; &lt;span class="s2"&gt;"php.ini"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Find old logs:&lt;br&gt;
&lt;/p&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;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.log"&lt;/span&gt; &lt;span class="nt"&gt;-mtime&lt;/span&gt; +30
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And when disk space disappears:&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; /var/www/&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The pattern is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Detect → Locate → Investigate → Fix → Verify&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's server administration.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Permissions Are Not Optional
&lt;/h2&gt;

&lt;p&gt;Linux permissions are one of the first things interviewers test.&lt;/p&gt;

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

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

&lt;/div&gt;



&lt;p&gt;It represents:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Owner | Group | Others
&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 plaintext"&gt;&lt;code&gt;r = 4
w = 2
x = 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So:&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;chmod &lt;/span&gt;755 directory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Owner  = rwx
Group  = r-x
Others = r-x
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;While:&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;chmod &lt;/span&gt;644 file
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Owner  = rw-
Group  = r--
Others = r--
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For sensitive 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;chmod &lt;/span&gt;600 .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And don't forget ownership:&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;chown &lt;/span&gt;www-data:www-data /var/www/html &lt;span class="nt"&gt;-R&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A web application can be perfectly configured and still fail because the process cannot read or write the required files.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. SSH Is Your Remote Hands
&lt;/h2&gt;

&lt;p&gt;If you're managing Linux servers, SSH becomes one of your most important tools.&lt;/p&gt;

&lt;p&gt;Basic connection:&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
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Custom port:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-p&lt;/span&gt; 2222 user@server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using an AWS private key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-i&lt;/span&gt; ~/.ssh/mykey.pem ubuntu@aws-ip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Better yet, use SSH keys.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then configure hosts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Host production
    HostName 192.168.1.100
    User deploy
    Port 2222
    IdentityFile ~/.ssh/production_key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple.&lt;/p&gt;

&lt;p&gt;Repeatable.&lt;/p&gt;

&lt;p&gt;Less typing.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. SSH Hardening Is More Than Changing the Port
&lt;/h2&gt;

&lt;p&gt;Changing port 22 is not a security strategy by itself.&lt;/p&gt;

&lt;p&gt;A stronger configuration includes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
AllowUsers john deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And after changing SSH configuration:&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;sshd &lt;span class="nt"&gt;-t&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only after validating the configuration should you apply the change.&lt;/p&gt;

&lt;p&gt;And keep your current SSH session open while testing a new connection.&lt;/p&gt;

&lt;p&gt;That tiny habit can save you from locking yourself out of a server.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Cron Turns Scripts Into Automation
&lt;/h2&gt;

&lt;p&gt;A script becomes much more useful when it can run automatically.&lt;/p&gt;

&lt;p&gt;Cron format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;* * * * * command
│ │ │ │ │
│ │ │ │ └── day of week
│ │ │ └──── month
│ │ └────── day of month
│ └──────── hour
└────────── minute
&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 shell"&gt;&lt;code&gt;0 2 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; /usr/local/bin/backup_db.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;&lt;strong&gt;Run the database backup every day at 2 AM.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every five minutes:&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="k"&gt;*&lt;/span&gt;/5 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And one of the most important troubleshooting concepts:&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="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /var/log/backup.log 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The command's output gets captured so you can investigate failures later.&lt;/p&gt;

&lt;p&gt;Automation without observability is just scheduled confusion.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Systemd Controls Your Services
&lt;/h2&gt;

&lt;p&gt;Modern Linux servers rely heavily on systemd.&lt;/p&gt;

&lt;p&gt;Know these commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl start nginx
systemctl stop nginx
systemctl restart nginx
systemctl reload nginx
systemctl status nginx
systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But don't stop at &lt;code&gt;status&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;When something fails:&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;-u&lt;/span&gt; nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For live 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;-u&lt;/span&gt; nginx &lt;span class="nt"&gt;-f&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One of the most useful interview questions is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the difference between restart and reload?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Restart:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Stop the service and start it again.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Reload:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Reload configuration without fully stopping the service.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For services that support it, reload can avoid unnecessary downtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Processes Tell You What the Machine Is Actually Doing
&lt;/h2&gt;

&lt;p&gt;When the server becomes slow, start looking at processes.&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;p&gt;For a snapshot:&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Find a process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pgrep &lt;span class="nt"&gt;-a&lt;/span&gt; nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And when necessary:&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;kill &lt;/span&gt;PID
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A graceful termination should normally be preferred over:&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;kill&lt;/span&gt; &lt;span class="nt"&gt;-9&lt;/span&gt; PID
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;SIGKILL&lt;/code&gt; is the hammer.&lt;/p&gt;

&lt;p&gt;Don't use a hammer when a normal shutdown will work.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Ports Are One of Your Best Troubleshooting Clues
&lt;/h2&gt;

&lt;p&gt;A service can be "running" and still be unreachable.&lt;/p&gt;

&lt;p&gt;Check listening ports:&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;ss &lt;span class="nt"&gt;-tlnp&lt;/span&gt;
&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 &lt;/span&gt;lsof &lt;span class="nt"&gt;-i&lt;/span&gt; :80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This answers an extremely important question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What process is actually listening on this port?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If your application should listen on port 8080 but nothing is listening there, investigating DNS is probably not your first move.&lt;/p&gt;

&lt;p&gt;Follow the evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. The Real DevOps Skill: Connecting the Dots
&lt;/h2&gt;

&lt;p&gt;Imagine this production incident:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The website is down."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Don't panic.&lt;/p&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;h3&gt;
  
  
  Is the service running?
&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;
  
  
  Is the port listening?
&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;h3&gt;
  
  
  Are there errors?
&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;journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Is the disk full?
&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;-h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Is a process consuming resources?
&lt;/h3&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;h3&gt;
  
  
  What do the application logs say?
&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;tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you're troubleshooting.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  12. The Interview Questions You Should Be Able to Answer
&lt;/h2&gt;

&lt;p&gt;If you're preparing for a Linux/DevOps/SysAdmin interview, know questions such as:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do you find which process is using a 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;&lt;span class="nb"&gt;sudo &lt;/span&gt;lsof &lt;span class="nt"&gt;-i&lt;/span&gt; :80
&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 &lt;/span&gt;ss &lt;span class="nt"&gt;-tlnp&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; :80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How do you find large files?&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;du&lt;/span&gt; &lt;span class="nt"&gt;-sh&lt;/span&gt; /&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How do you check whether a service is running?&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 does &lt;code&gt;chmod 755&lt;/code&gt; mean?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Owner has &lt;code&gt;rwx&lt;/code&gt;; group and others have &lt;code&gt;r-x&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do you check the OS version?&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;cat&lt;/span&gt; /etc/os-release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How do you troubleshoot a failed service?&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 service
journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What does &lt;code&gt;2&amp;gt;&amp;amp;1&lt;/code&gt; mean?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It redirects stderr to stdout, allowing both streams to be captured together.&lt;/p&gt;

&lt;p&gt;These aren't trivia questions.&lt;/p&gt;

&lt;p&gt;They represent real operational tasks.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Bigger Lesson
&lt;/h1&gt;

&lt;p&gt;DevOps isn't primarily about knowing more tools.&lt;/p&gt;

&lt;p&gt;It's about understanding systems.&lt;/p&gt;

&lt;p&gt;Linux teaches you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;processes&lt;/li&gt;
&lt;li&gt;networking&lt;/li&gt;
&lt;li&gt;permissions&lt;/li&gt;
&lt;li&gt;services&lt;/li&gt;
&lt;li&gt;logs&lt;/li&gt;
&lt;li&gt;storage&lt;/li&gt;
&lt;li&gt;automation&lt;/li&gt;
&lt;li&gt;security&lt;/li&gt;
&lt;li&gt;troubleshooting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once those fundamentals become second nature, tools like Docker, Kubernetes, Jenkins, Terraform, and AWS become much easier to understand.&lt;/p&gt;

&lt;p&gt;Because you're no longer memorizing commands.&lt;/p&gt;

&lt;p&gt;You're understanding what the infrastructure is doing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't learn Linux to pass an interview.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Learn Linux so that when production breaks at 2 AM, you know where to look.&lt;/p&gt;

&lt;p&gt;That's the skill that compounds.&lt;/p&gt;

&lt;h1&gt;
  
  
  Part 1: Linux Server Administration Fundamentals
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;[!TIP]&lt;br&gt;
Practice every command on a free VPS (DigitalOcean $4/mo, AWS Free Tier, or a local VM using VirtualBox + Ubuntu Server).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  1.1 Essential Linux Commands (Must Know Cold)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  File &amp;amp; Directory Operations
&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;# Navigation&lt;/span&gt;
&lt;span class="nb"&gt;pwd&lt;/span&gt;                          &lt;span class="c"&gt;# Print current directory&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt;                       &lt;span class="c"&gt;# List all files with permissions, sizes&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lah&lt;/span&gt;                      &lt;span class="c"&gt;# Human-readable sizes&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; /var/www/html             &lt;span class="c"&gt;# Change directory&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ..                        &lt;span class="c"&gt;# Go up one level&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ~                         &lt;span class="c"&gt;# Go to home directory&lt;/span&gt;

&lt;span class="c"&gt;# File operations&lt;/span&gt;
&lt;span class="nb"&gt;cp &lt;/span&gt;file.txt /backup/         &lt;span class="c"&gt;# Copy file&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; /source/ /dest/        &lt;span class="c"&gt;# Copy directory recursively&lt;/span&gt;
&lt;span class="nb"&gt;mv &lt;/span&gt;old.txt new.txt           &lt;span class="c"&gt;# Rename/move&lt;/span&gt;
&lt;span class="nb"&gt;rm &lt;/span&gt;file.txt                  &lt;span class="c"&gt;# Delete file&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /path/to/dir/         &lt;span class="c"&gt;# Delete directory recursively (DANGEROUS)&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /var/www/site/logs  &lt;span class="c"&gt;# Create nested directories&lt;/span&gt;
&lt;span class="nb"&gt;touch &lt;/span&gt;newfile.txt            &lt;span class="c"&gt;# Create empty file&lt;/span&gt;

&lt;span class="c"&gt;# Viewing files&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/hosts               &lt;span class="c"&gt;# View entire file&lt;/span&gt;
less /var/log/syslog         &lt;span class="c"&gt;# Paginated view (q to quit)&lt;/span&gt;
&lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 50 error.log         &lt;span class="c"&gt;# First 50 lines&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 100 error.log        &lt;span class="c"&gt;# Last 100 lines&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/apache2/error.log  &lt;span class="c"&gt;# Live follow (VERY common in troubleshooting)&lt;/span&gt;

&lt;span class="c"&gt;# Searching&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"error"&lt;/span&gt; /var/log/syslog          &lt;span class="c"&gt;# Search for text in file&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"db_password"&lt;/span&gt; /var/www/       &lt;span class="c"&gt;# Recursive search&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"warning"&lt;/span&gt; error.log           &lt;span class="c"&gt;# Case-insensitive&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"404"&lt;/span&gt; access.log              &lt;span class="c"&gt;# Count matches&lt;/span&gt;
find / &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"php.ini"&lt;/span&gt;                &lt;span class="c"&gt;# Find file by name&lt;/span&gt;
find /var/www &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.log"&lt;/span&gt; &lt;span class="nt"&gt;-mtime&lt;/span&gt; +30 &lt;span class="nt"&gt;-delete&lt;/span&gt;  &lt;span class="c"&gt;# Delete logs older than 30 days&lt;/span&gt;
locate php.ini                        &lt;span class="c"&gt;# Fast search (uses database, run updatedb first)&lt;/span&gt;

&lt;span class="c"&gt;# Disk &amp;amp; Space&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 usage&lt;/span&gt;
&lt;span class="nb"&gt;du&lt;/span&gt; &lt;span class="nt"&gt;-sh&lt;/span&gt; /var/www/&lt;span class="k"&gt;*&lt;/span&gt;             &lt;span class="c"&gt;# Directory sizes&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="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt;  &lt;span class="c"&gt;# Top 20 largest dirs in /var/log&lt;/span&gt;
ncdu /                       &lt;span class="c"&gt;# Interactive disk usage (install: apt install ncdu)&lt;/span&gt;

&lt;span class="c"&gt;# Text manipulation&lt;/span&gt;
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/old/new/g'&lt;/span&gt; file.txt         &lt;span class="c"&gt;# Find and replace in file&lt;/span&gt;
&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $1}'&lt;/span&gt; access.log           &lt;span class="c"&gt;# Print first column&lt;/span&gt;
&lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; access.log                      &lt;span class="c"&gt;# Count lines&lt;/span&gt;
&lt;span class="nb"&gt;sort &lt;/span&gt;access.log | &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="c"&gt;# Count unique lines, sorted&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Interview Q&amp;amp;A: Linux Commands
&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 find which process is using the most CPU?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;top&lt;/code&gt; or &lt;code&gt;htop&lt;/code&gt;, press &lt;code&gt;P&lt;/code&gt; to sort by CPU&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How do you find which process is using a specific port?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;sudo lsof -i :80&lt;/code&gt; or `sudo netstat -tlnp \&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How do you find large files consuming disk space?&lt;/td&gt;
&lt;td&gt;{% raw %}`du -sh /* \&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How do you check if a service is running?&lt;/td&gt;
&lt;td&gt;{% raw %}&lt;code&gt;systemctl status nginx&lt;/code&gt; or `ps aux \&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How to check system uptime?&lt;/td&gt;
&lt;td&gt;{% raw %}&lt;code&gt;uptime&lt;/code&gt; command&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What does &lt;code&gt;chmod 755&lt;/code&gt; mean?&lt;/td&gt;
&lt;td&gt;Owner: rwx (7), Group: r-x (5), Others: r-x (5)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What does &lt;code&gt;chmod 644&lt;/code&gt; mean?&lt;/td&gt;
&lt;td&gt;Owner: rw- (6), Group: r-- (4), Others: r-- (4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference between &lt;code&gt;&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt;?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;&amp;gt;&lt;/code&gt; overwrites file, &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt; appends to file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is a symlink? How to create?&lt;/td&gt;
&lt;td&gt;Shortcut/pointer to another file. &lt;code&gt;ln -s /target /link_name&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How to check OS version?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;cat /etc/os-release&lt;/code&gt; or &lt;code&gt;lsb_release -a&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  1.2 Users, Groups &amp;amp; Permissions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  User Management
&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;# Create users&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;adduser john                     &lt;span class="c"&gt;# Interactive user creation (preferred on Ubuntu)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;useradd &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /bin/bash john     &lt;span class="c"&gt;# Non-interactive, creates home dir, sets shell&lt;/span&gt;

&lt;span class="c"&gt;# Set/change password&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;passwd john

&lt;span class="c"&gt;# Delete user&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;userdel john                     &lt;span class="c"&gt;# Delete user only&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;userdel &lt;span class="nt"&gt;-r&lt;/span&gt; john                  &lt;span class="c"&gt;# Delete user + home directory&lt;/span&gt;

&lt;span class="c"&gt;# Modify user&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;john           &lt;span class="c"&gt;# Add john to sudo group&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; www-data john       &lt;span class="c"&gt;# Add john to www-data group (for web files)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-s&lt;/span&gt; /usr/sbin/nologin john  &lt;span class="c"&gt;# Disable shell login (for service accounts)&lt;/span&gt;

&lt;span class="c"&gt;# View user info&lt;/span&gt;
&lt;span class="nb"&gt;id &lt;/span&gt;john                               &lt;span class="c"&gt;# Show UID, GID, groups&lt;/span&gt;
&lt;span class="nb"&gt;whoami&lt;/span&gt;                                &lt;span class="c"&gt;# Current user&lt;/span&gt;
&lt;span class="nb"&gt;groups &lt;/span&gt;john                           &lt;span class="c"&gt;# List groups for user&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/passwd                       &lt;span class="c"&gt;# All users&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/group                        &lt;span class="c"&gt;# All groups&lt;/span&gt;

&lt;span class="c"&gt;# Switch user&lt;/span&gt;
su - john                             &lt;span class="c"&gt;# Switch to john (with john's environment)&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; www-data &lt;span class="nb"&gt;command&lt;/span&gt;              &lt;span class="c"&gt;# Run command as www-data user&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  File Permissions
&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;# Permission format: -rwxrwxrwx (owner/group/others)&lt;/span&gt;
&lt;span class="c"&gt;# r=4, w=2, x=1&lt;/span&gt;

&lt;span class="c"&gt;# Common permissions for web servers&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;755 /var/www/html               &lt;span class="c"&gt;# Directories: rwxr-xr-x&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;644 /var/www/html/index.html    &lt;span class="c"&gt;# Files: rw-r--r--&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;600 /var/www/html/.env          &lt;span class="c"&gt;# Sensitive files: rw-------&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;700 /home/john/.ssh             &lt;span class="c"&gt;# SSH directory&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;600 /home/john/.ssh/authorized_keys  &lt;span class="c"&gt;# SSH keys&lt;/span&gt;

&lt;span class="c"&gt;# Ownership&lt;/span&gt;
&lt;span class="nb"&gt;chown &lt;/span&gt;www-data:www-data /var/www/html &lt;span class="nt"&gt;-R&lt;/span&gt;   &lt;span class="c"&gt;# Change owner+group recursively&lt;/span&gt;
&lt;span class="nb"&gt;chown &lt;/span&gt;john:john file.txt                    &lt;span class="c"&gt;# Change owner and group&lt;/span&gt;

&lt;span class="c"&gt;# Special permissions&lt;/span&gt;
&lt;span class="nb"&gt;chmod&lt;/span&gt; +s /usr/bin/program              &lt;span class="c"&gt;# SetUID - runs as file owner&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;g+s /var/www/shared/             &lt;span class="c"&gt;# SetGID - new files inherit group&lt;/span&gt;
&lt;span class="nb"&gt;chmod&lt;/span&gt; +t /tmp                          &lt;span class="c"&gt;# Sticky bit - only owner can delete&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Interview Q&amp;amp;A: Users &amp;amp; Permissions
&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 permissions should web files have?&lt;/td&gt;
&lt;td&gt;Directories: 755, Files: 644, Sensitive (.env, config): 600&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What user should own web files?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;www-data:www-data&lt;/code&gt; (for Apache/Nginx on Ubuntu)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What's the difference between &lt;code&gt;adduser&lt;/code&gt; and &lt;code&gt;useradd&lt;/code&gt;?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;adduser&lt;/code&gt; is interactive, creates home dir, sets password. &lt;code&gt;useradd&lt;/code&gt; is low-level, non-interactive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How to give a user sudo access?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sudo usermod -aG sudo username&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is &lt;code&gt;/etc/passwd&lt;/code&gt; vs &lt;code&gt;/etc/shadow&lt;/code&gt;?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;passwd&lt;/code&gt; has user info (public), &lt;code&gt;shadow&lt;/code&gt; has encrypted passwords (root only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How do you prevent a user from logging in via SSH?&lt;/td&gt;
&lt;td&gt;Set shell to &lt;code&gt;/usr/sbin/nologin&lt;/code&gt; or &lt;code&gt;/bin/false&lt;/code&gt;, or use &lt;code&gt;DenyUsers&lt;/code&gt; in sshd_config&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is umask?&lt;/td&gt;
&lt;td&gt;Default permission mask. umask 022 = new files get 644, dirs get 755&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  1.3 SSH (Secure Shell)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  SSH Configuration &amp;amp; Usage
&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;# Connect to server&lt;/span&gt;
ssh root@192.168.1.100                &lt;span class="c"&gt;# Basic connection&lt;/span&gt;
ssh &lt;span class="nt"&gt;-p&lt;/span&gt; 2222 john@server.com           &lt;span class="c"&gt;# Custom port&lt;/span&gt;
ssh &lt;span class="nt"&gt;-i&lt;/span&gt; ~/.ssh/mykey.pem ubuntu@aws-ip &lt;span class="c"&gt;# Using private key (AWS)&lt;/span&gt;

&lt;span class="c"&gt;# SSH Key Generation (on your local machine)&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;"john@company.com"&lt;/span&gt;   &lt;span class="c"&gt;# Modern, preferred&lt;/span&gt;
ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; rsa &lt;span class="nt"&gt;-b&lt;/span&gt; 4096 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"john@company.com"&lt;/span&gt;  &lt;span class="c"&gt;# RSA alternative&lt;/span&gt;

&lt;span class="c"&gt;# Copy public key to server&lt;/span&gt;
ssh-copy-id john@192.168.1.100
&lt;span class="c"&gt;# OR manually:&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/id_ed25519.pub &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.ssh/authorized_keys  &lt;span class="c"&gt;# On server&lt;/span&gt;

&lt;span class="c"&gt;# SSH Config file (~/.ssh/config) - saves time&lt;/span&gt;
&lt;span class="c"&gt;# Create/edit: nano ~/.ssh/config&lt;/span&gt;
Host production
    HostName 192.168.1.100
    User john
    Port 2222
    IdentityFile ~/.ssh/production_key

Host staging
    HostName 192.168.1.101
    User deploy
    Port 22
    IdentityFile ~/.ssh/staging_key

&lt;span class="c"&gt;# Now you can just type:&lt;/span&gt;
ssh production
ssh staging
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  SSH Hardening (Server-side: &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;)
&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;# Edit SSH config&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/ssh/sshd_config

&lt;span class="c"&gt;# IMPORTANT changes:&lt;/span&gt;
Port 2222                         &lt;span class="c"&gt;# Change default port (not 22)&lt;/span&gt;
PermitRootLogin no                &lt;span class="c"&gt;# Disable root SSH login&lt;/span&gt;
PasswordAuthentication no         &lt;span class="c"&gt;# Force key-based auth only&lt;/span&gt;
PubkeyAuthentication &lt;span class="nb"&gt;yes&lt;/span&gt;          &lt;span class="c"&gt;# Enable key authentication&lt;/span&gt;
MaxAuthTries 3                    &lt;span class="c"&gt;# Limit login attempts&lt;/span&gt;
AllowUsers john deploy            &lt;span class="c"&gt;# Whitelist specific users&lt;/span&gt;
ClientAliveInterval 300           &lt;span class="c"&gt;# Timeout after 5 min idle&lt;/span&gt;
ClientAliveCountMax 2             &lt;span class="c"&gt;# Disconnect after 2 missed keepalives&lt;/span&gt;
Protocol 2                        &lt;span class="c"&gt;# Use SSH protocol 2 only&lt;/span&gt;

&lt;span class="c"&gt;# After changes, ALWAYS test before disconnecting:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;sshd &lt;span class="nt"&gt;-t&lt;/span&gt;                      &lt;span class="c"&gt;# Test config for syntax errors&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart sshd       &lt;span class="c"&gt;# Apply changes&lt;/span&gt;

&lt;span class="c"&gt;# IMPORTANT: Keep current session open, test new connection in another terminal!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Interview Q&amp;amp;A: SSH
&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 harden SSH?&lt;/td&gt;
&lt;td&gt;Change port, disable root login, disable password auth, use key-based auth, whitelist users, use fail2ban&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What's the difference between SSH and SFTP?&lt;/td&gt;
&lt;td&gt;SSH = remote shell access. SFTP = secure file transfer over SSH (port 22)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How do you transfer files via SSH?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;scp file.txt user@server:/path/&lt;/code&gt; or use SFTP client (FileZilla, WinSCP)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What port does SSH use?&lt;/td&gt;
&lt;td&gt;Default: 22 (should be changed in production)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What do you do if you're locked out of SSH?&lt;/td&gt;
&lt;td&gt;Access via hosting provider's console/VNC, check sshd_config, check firewall rules, check fail2ban&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference between SSH key types?&lt;/td&gt;
&lt;td&gt;ed25519 (modern, fast, secure), RSA (legacy, use 4096-bit minimum)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  1.4 SFTP &amp;amp; FTP
&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;# SFTP (Secure - uses SSH, port 22) - PREFERRED&lt;/span&gt;
sftp john@server.com
sftp &lt;span class="nt"&gt;-P&lt;/span&gt; 2222 john@server.com          &lt;span class="c"&gt;# Custom SSH port&lt;/span&gt;

&lt;span class="c"&gt;# Inside SFTP session:&lt;/span&gt;
put localfile.txt /remote/path/        &lt;span class="c"&gt;# Upload&lt;/span&gt;
get /remote/file.txt ./local/          &lt;span class="c"&gt;# Download&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt;                                      &lt;span class="c"&gt;# List remote files&lt;/span&gt;
lls                                     &lt;span class="c"&gt;# List local files&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; /var/www/html                        &lt;span class="c"&gt;# Change remote directory&lt;/span&gt;
lcd ~/Desktop                           &lt;span class="c"&gt;# Change local directory&lt;/span&gt;

&lt;span class="c"&gt;# FTP (Insecure - port 21) - AVOID if possible&lt;/span&gt;
&lt;span class="c"&gt;# If needed, use vsftpd:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;vsftpd
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/vsftpd.conf
&lt;span class="c"&gt;# Key settings:&lt;/span&gt;
&lt;span class="c"&gt;# anonymous_enable=NO&lt;/span&gt;
&lt;span class="c"&gt;# local_enable=YES&lt;/span&gt;
&lt;span class="c"&gt;# write_enable=YES&lt;/span&gt;
&lt;span class="c"&gt;# chroot_local_user=YES     # Jail users to home directory&lt;/span&gt;
&lt;span class="c"&gt;# ssl_enable=YES             # Enable FTPS (FTP over SSL)&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart vsftpd

&lt;span class="c"&gt;# SCP (Secure Copy)&lt;/span&gt;
scp file.txt john@server:/var/www/html/           &lt;span class="c"&gt;# Upload file&lt;/span&gt;
scp &lt;span class="nt"&gt;-r&lt;/span&gt; /local/dir/ john@server:/remote/dir/       &lt;span class="c"&gt;# Upload directory&lt;/span&gt;
scp john@server:/var/log/error.log ./              &lt;span class="c"&gt;# Download file&lt;/span&gt;
scp &lt;span class="nt"&gt;-P&lt;/span&gt; 2222 file.txt john@server:/path/           &lt;span class="c"&gt;# Custom port&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Interview Q&amp;amp;A: File Transfer
&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;SFTP vs FTP vs SCP?&lt;/td&gt;
&lt;td&gt;SFTP: secure, over SSH. FTP: insecure, legacy. SCP: secure copy, simpler but no resume&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Why prefer SFTP over FTP?&lt;/td&gt;
&lt;td&gt;SFTP encrypts data in transit, uses SSH port (no extra ports), supports key auth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What port does FTP use?&lt;/td&gt;
&lt;td&gt;21 (control), 20 (data in active mode), random high ports (passive mode)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  1.5 Cron Jobs
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Setting Up Cron Jobs
&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;# Edit crontab for current user&lt;/span&gt;
crontab &lt;span class="nt"&gt;-e&lt;/span&gt;

&lt;span class="c"&gt;# Edit crontab for specific user (as root)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;crontab &lt;span class="nt"&gt;-u&lt;/span&gt; www-data &lt;span class="nt"&gt;-e&lt;/span&gt;

&lt;span class="c"&gt;# View crontab&lt;/span&gt;
crontab &lt;span class="nt"&gt;-l&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;crontab &lt;span class="nt"&gt;-u&lt;/span&gt; www-data &lt;span class="nt"&gt;-l&lt;/span&gt;

&lt;span class="c"&gt;# Cron format:&lt;/span&gt;
&lt;span class="c"&gt;# ┌───────── minute (0-59)&lt;/span&gt;
&lt;span class="c"&gt;# │ ┌─────── hour (0-23)&lt;/span&gt;
&lt;span class="c"&gt;# │ │ ┌───── day of month (1-31)&lt;/span&gt;
&lt;span class="c"&gt;# │ │ │ ┌─── month (1-12)&lt;/span&gt;
&lt;span class="c"&gt;# │ │ │ │ ┌─ day of week (0-7, 0 and 7 = Sunday)&lt;/span&gt;
&lt;span class="c"&gt;# │ │ │ │ │&lt;/span&gt;
&lt;span class="c"&gt;# * * * * * command_to_run&lt;/span&gt;

&lt;span class="c"&gt;# PRACTICAL EXAMPLES:&lt;/span&gt;

&lt;span class="c"&gt;# Database backup every day at 2 AM&lt;/span&gt;
0 2 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; /usr/local/bin/backup_db.sh &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /var/log/backup.log 2&amp;gt;&amp;amp;1

&lt;span class="c"&gt;# Website backup every Sunday at 3 AM&lt;/span&gt;
0 3 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; 0 /usr/local/bin/backup_website.sh &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /var/log/backup.log 2&amp;gt;&amp;amp;1

&lt;span class="c"&gt;# Clear tmp files every hour&lt;/span&gt;
0 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; find /tmp &lt;span class="nt"&gt;-type&lt;/span&gt; f &lt;span class="nt"&gt;-mtime&lt;/span&gt; +1 &lt;span class="nt"&gt;-delete&lt;/span&gt;

&lt;span class="c"&gt;# Check disk space every 30 minutes&lt;/span&gt;
&lt;span class="k"&gt;*&lt;/span&gt;/30 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; /usr/local/bin/check_disk.sh

&lt;span class="c"&gt;# SSL certificate auto-renew (Let's Encrypt) - twice daily&lt;/span&gt;
0 0,12 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; certbot renew &lt;span class="nt"&gt;--quiet&lt;/span&gt;

&lt;span class="c"&gt;# Restart PHP-FPM every night at 4 AM (performance)&lt;/span&gt;
0 4 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; systemctl restart php8.2-fpm

&lt;span class="c"&gt;# Run Laravel scheduler every minute&lt;/span&gt;
&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; /var/www/html &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; php artisan schedule:run &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /dev/null 2&amp;gt;&amp;amp;1

&lt;span class="c"&gt;# Rotate logs weekly&lt;/span&gt;
0 0 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; 0 logrotate /etc/logrotate.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sample Backup Script (&lt;code&gt;/usr/local/bin/backup_db.sh&lt;/code&gt;)
&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;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# Database backup script&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_%H-%M&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/mysql"&lt;/span&gt;
&lt;span class="nv"&gt;DB_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"production_db"&lt;/span&gt;
&lt;span class="nv"&gt;DB_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"backup_user"&lt;/span&gt;
&lt;span class="nv"&gt;DB_PASS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"secure_password"&lt;/span&gt;

&lt;span class="c"&gt;# Create backup directory&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;# Dump database&lt;/span&gt;
mysqldump &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="nv"&gt;$DB_USER&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt;&lt;span class="nv"&gt;$DB_PASS&lt;/span&gt; &lt;span class="nv"&gt;$DB_NAME&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;/&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DB_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;_&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DATE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;.sql.gz

&lt;span class="c"&gt;# Delete backups older than 30 days&lt;/span&gt;
find &lt;span class="nv"&gt;$BACKUP_DIR&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.sql.gz"&lt;/span&gt; &lt;span class="nt"&gt;-mtime&lt;/span&gt; +30 &lt;span class="nt"&gt;-delete&lt;/span&gt;

&lt;span class="c"&gt;# Log the backup&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[&lt;/span&gt;&lt;span class="nv"&gt;$DATE&lt;/span&gt;&lt;span class="s2"&gt;] Backup completed: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DB_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;_&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DATE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.sql.gz"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /var/log/backup.log
&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;# Make script executable&lt;/span&gt;
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x /usr/local/bin/backup_db.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Interview Q&amp;amp;A: Cron Jobs
&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 does &lt;code&gt;*/5 * * * *&lt;/code&gt; mean?&lt;/td&gt;
&lt;td&gt;Every 5 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What does &lt;code&gt;0 2 * * *&lt;/code&gt; mean?&lt;/td&gt;
&lt;td&gt;Every day at 2:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What does &lt;code&gt;0 0 * * 0&lt;/code&gt; mean?&lt;/td&gt;
&lt;td&gt;Every Sunday at midnight&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What does &lt;code&gt;2&amp;gt;&amp;amp;1&lt;/code&gt; mean?&lt;/td&gt;
&lt;td&gt;Redirects stderr to stdout (captures all output)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Where are system cron jobs stored?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/etc/crontab&lt;/code&gt;, &lt;code&gt;/etc/cron.d/&lt;/code&gt;, &lt;code&gt;/etc/cron.daily/&lt;/code&gt;, &lt;code&gt;/etc/cron.hourly/&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How to debug a cron job not running?&lt;/td&gt;
&lt;td&gt;Check `/var/log/syslog \&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What's the difference between {% raw %}&lt;code&gt;crontab -e&lt;/code&gt; and &lt;code&gt;/etc/crontab&lt;/code&gt;?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;crontab -e&lt;/code&gt; is per-user, &lt;code&gt;/etc/crontab&lt;/code&gt; is system-wide and includes username field&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  1.6 Systemd &amp;amp; Service Management
&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;# Service management&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start nginx              &lt;span class="c"&gt;# Start service&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl stop nginx               &lt;span class="c"&gt;# Stop service&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart nginx             &lt;span class="c"&gt;# Restart service&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reload nginx              &lt;span class="c"&gt;# Reload config without downtime&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status nginx              &lt;span class="c"&gt;# Check status&lt;/span&gt;
&lt;span class="nb"&gt;sudo &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;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl disable nginx             &lt;span class="c"&gt;# Don't start on boot&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl is-active nginx           &lt;span class="c"&gt;# Check if running&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl is-enabled nginx          &lt;span class="c"&gt;# Check if enabled on boot&lt;/span&gt;

&lt;span class="c"&gt;# List all services&lt;/span&gt;
systemctl list-units &lt;span class="nt"&gt;--type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;service
systemctl list-units &lt;span class="nt"&gt;--type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;service &lt;span class="nt"&gt;--state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;running

&lt;span class="c"&gt;# View service logs&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; nginx                &lt;span class="c"&gt;# All logs for nginx&lt;/span&gt;
&lt;span class="nb"&gt;sudo &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 logs live&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&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;"1 hour ago"&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&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;"2024-01-01"&lt;/span&gt; &lt;span class="nt"&gt;--until&lt;/span&gt; &lt;span class="s2"&gt;"2024-01-02"&lt;/span&gt;

&lt;span class="c"&gt;# Custom service file example (/etc/systemd/system/myapp.service)&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;Unit]
&lt;span class="nv"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;My Python Application
&lt;span class="nv"&gt;After&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;network.target

&lt;span class="o"&gt;[&lt;/span&gt;Service]
&lt;span class="nv"&gt;User&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;www-data
&lt;span class="nv"&gt;Group&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;www-data
&lt;span class="nv"&gt;WorkingDirectory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/var/www/myapp
&lt;span class="nv"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/var/www/myapp/venv/bin/python app.py
&lt;span class="nv"&gt;Restart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;always
&lt;span class="nv"&gt;RestartSec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;5

&lt;span class="o"&gt;[&lt;/span&gt;Install]
&lt;span class="nv"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;multi-user.target

&lt;span class="c"&gt;# After creating/modifying service file:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload            &lt;span class="c"&gt;# Reload systemd&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;myapp             &lt;span class="c"&gt;# Enable on boot&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start myapp              &lt;span class="c"&gt;# Start the service&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Interview Q&amp;amp;A: Services
&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 &lt;code&gt;restart&lt;/code&gt; and &lt;code&gt;reload&lt;/code&gt;?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;restart&lt;/code&gt; stops and starts (brief downtime). &lt;code&gt;reload&lt;/code&gt; reloads config without stopping (no downtime, preferred)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How to make a service start on boot?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;systemctl enable servicename&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How to check why a service failed?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;systemctl status servicename&lt;/code&gt; and &lt;code&gt;journalctl -u servicename&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is systemd?&lt;/td&gt;
&lt;td&gt;Init system and service manager for Linux. Manages services, boot process, logging&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  1.7 Process Management
&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;# View processes&lt;/span&gt;
top                                  &lt;span class="c"&gt;# Real-time process viewer&lt;/span&gt;
htop                                 &lt;span class="c"&gt;# Better interactive viewer (install: apt install htop)&lt;/span&gt;
ps aux                               &lt;span class="c"&gt;# Snapshot of all processes&lt;/span&gt;
ps aux | &lt;span class="nb"&gt;grep &lt;/span&gt;nginx                  &lt;span class="c"&gt;# Find specific process&lt;/span&gt;
pgrep &lt;span class="nt"&gt;-a&lt;/span&gt; nginx                       &lt;span class="c"&gt;# Find process by name&lt;/span&gt;

&lt;span class="c"&gt;# Kill processes&lt;/span&gt;
&lt;span class="nb"&gt;kill &lt;/span&gt;PID                             &lt;span class="c"&gt;# Graceful termination (SIGTERM)&lt;/span&gt;
&lt;span class="nb"&gt;kill&lt;/span&gt; &lt;span class="nt"&gt;-9&lt;/span&gt; PID                          &lt;span class="c"&gt;# Force kill (SIGKILL)&lt;/span&gt;
killall nginx                        &lt;span class="c"&gt;# Kill all processes by name&lt;/span&gt;
pkill &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"python app.py"&lt;/span&gt;             &lt;span class="c"&gt;# Kill by full command match&lt;/span&gt;

&lt;span class="c"&gt;# Background processes&lt;/span&gt;
&lt;span class="nb"&gt;command&lt;/span&gt; &amp;amp;                            &lt;span class="c"&gt;# Run in background&lt;/span&gt;
&lt;span class="nb"&gt;nohup command&lt;/span&gt; &amp;amp;                      &lt;span class="c"&gt;# Run in background, survive logout&lt;/span&gt;
screen &lt;span class="nt"&gt;-S&lt;/span&gt; session_name               &lt;span class="c"&gt;# Create named screen session&lt;/span&gt;
screen &lt;span class="nt"&gt;-r&lt;/span&gt; session_name               &lt;span class="c"&gt;# Reattach to session&lt;/span&gt;
tmux new &lt;span class="nt"&gt;-s&lt;/span&gt; session_name             &lt;span class="c"&gt;# Create named tmux session&lt;/span&gt;
tmux attach &lt;span class="nt"&gt;-t&lt;/span&gt; session_name          &lt;span class="c"&gt;# Reattach to session&lt;/span&gt;

&lt;span class="c"&gt;# Check what's using a port&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;lsof &lt;span class="nt"&gt;-i&lt;/span&gt; :80                     &lt;span class="c"&gt;# What's on port 80?&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;lsof &lt;span class="nt"&gt;-i&lt;/span&gt; :443                    &lt;span class="c"&gt;# What's on port 443?&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;# All listening ports&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;netstat &lt;span class="nt"&gt;-tlnp&lt;/span&gt;                   &lt;span class="c"&gt;# All listening ports (legacy)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>linux</category>
      <category>cloud</category>
      <category>devops</category>
      <category>security</category>
    </item>
    <item>
      <title>No Canvas. No SVG. No JavaScript. Just CSS and a Pressure Cooker Full of Pasta.</title>
      <dc:creator>Yashvi Kothari</dc:creator>
      <pubDate>Thu, 06 Aug 2026 14:04:33 +0000</pubDate>
      <link>https://dev.to/yashvikothari/no-canvas-no-svg-no-javascript-just-css-and-a-pressure-cooker-full-of-pasta-1obb</link>
      <guid>https://dev.to/yashvikothari/no-canvas-no-svg-no-javascript-just-css-and-a-pressure-cooker-full-of-pasta-1obb</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/frontend-2026-07-29"&gt;Frontend Challenge - Comfort Food Edition, CSS Art&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspiration
&lt;/h2&gt;

&lt;p&gt;You've never looked at a pressure cooker and thought, "I should code that."&lt;/p&gt;

&lt;p&gt;I did. And the result taught me more about creativity than any design tool ever has.&lt;/p&gt;

&lt;p&gt;Let me show you what I built — and more importantly, why you should care even if you never write a line of CSS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/yashvikothari/yashvikothari.github.io/tree/master/lovepastaincss" rel="noopener noreferrer"&gt;https://github.com/yashvikothari/yashvikothari.github.io/tree/master/lovepastaincss&lt;/a&gt;&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://yashvikothari.github.io/lovepastaincss/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;yashvikothari.github.io&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&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%2Fukzfmstn0hwj7fl8819a.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%2Fukzfmstn0hwj7fl8819a.png" alt=" " width="800" height="401"&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%2F4jhd6bx62qbiiuxotzfn.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%2F4jhd6bx62qbiiuxotzfn.png" alt=" " width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Journey
&lt;/h2&gt;

&lt;p&gt;Challenge&lt;br&gt;
A frontend community challenge landed in my feed: "CSS Art: Comfort Food Edition."&lt;/p&gt;

&lt;p&gt;The rules were simple:&lt;/p&gt;

&lt;p&gt;Pure HTML and CSS only.&lt;br&gt;
No JavaScript.&lt;br&gt;
No SVG.&lt;br&gt;
No images.&lt;br&gt;
Let food be your inspiration.&lt;br&gt;
Most people reached for cupcakes. Pizza slices. Maybe a donut.&lt;/p&gt;

&lt;p&gt;I reached for the dish I grew up eating: Elbow Pasta Masala cooked in a pressure cooker. Indian-style. Spicy tomato gravy. Butter. Cheese. The works.&lt;/p&gt;

&lt;p&gt;Not because it was easy. Because constraints are where creativity lives.&lt;/p&gt;

&lt;p&gt;The Elbow Macaroni Problem&lt;br&gt;
Here's the thing about elbow pasta — it's a curve.&lt;/p&gt;

&lt;p&gt;CSS doesn't do curves the way you'd think. There's no draw-macaroni() function. No arc tool. No pen path.&lt;/p&gt;

&lt;p&gt;So I had to think differently.&lt;/p&gt;

&lt;p&gt;The solution was embarrassingly elegant:&lt;/p&gt;

&lt;p&gt;Take a square div. Give it border-radius: 50% — now it's a circle. But here's the trick: only paint two adjacent borders (top and right). Set the other two to transparent.&lt;/p&gt;

&lt;p&gt;What's left? A thick, curved arc. A perfect elbow macaroni.&lt;/p&gt;

&lt;p&gt;css&lt;/p&gt;

&lt;p&gt;.elbow {&lt;br&gt;
  width: 28px;&lt;br&gt;
  height: 28px;&lt;br&gt;
  border-radius: 50%;&lt;br&gt;
  border: 8px solid #f0c060;       /* pasta gold */&lt;br&gt;
  border-bottom-color: transparent;&lt;br&gt;
  border-left-color: transparent;&lt;br&gt;
}&lt;br&gt;
Four lines. That's the whole pasta.&lt;/p&gt;

&lt;p&gt;Then I added a ::before for the specular light ridge and a ::after for the tomato sauce tint. Rotate each piece differently. Scatter 14 of them across a gravy pool.&lt;/p&gt;

&lt;p&gt;Suddenly, it looked like food.&lt;/p&gt;

&lt;p&gt;The Bigger Lesson: Constraints Create Leverage&lt;br&gt;
Naval says: "Specific knowledge is found by pursuing your genuine curiosity."&lt;/p&gt;

&lt;p&gt;Here's what I'd add: Specific creativity is found by embracing genuine constraints.&lt;/p&gt;

&lt;p&gt;When you can't use images, you learn gradients. When you can't use JavaScript, you discover the :checked pseudo-class hack. When you can't use SVG, you learn that clip-path and border-radius can build almost anything.&lt;/p&gt;

&lt;p&gt;Every limitation I hit became a forcing function for a better idea:&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%2F8z3gw4fs45jkn7wf6m51.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%2F8z3gw4fs45jkn7wf6m51.png" alt=" " width="798" height="219"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The cooker isn't just art. It's a state machine. You can:&lt;/p&gt;

&lt;p&gt;Open and close the pressure cooker lid&lt;br&gt;
Trigger a whistling steam explosion&lt;br&gt;
Adjust the gas stove flame (high, simmer, off)&lt;br&gt;
Toggle cheese, herbs, and garlic toast garnishes&lt;br&gt;
Switch to a cozy night-kitchen mode&lt;br&gt;
All without a single line of JavaScript.&lt;/p&gt;

&lt;p&gt;Why This Matters Beyond Code&lt;br&gt;
This isn't a CSS tutorial. This is a lesson about creative leverage.&lt;br&gt;
The tool doesn't make the art. The limitation does.&lt;/p&gt;

&lt;p&gt;The Takeaway (in one line)&lt;br&gt;
Don't ask for more tools. Ask for fewer. Then watch what your brain invents.&lt;/p&gt;

&lt;p&gt;Try It Yourself&lt;br&gt;
The full source is two files. index.html and styles.css. No build step. No dependencies. No npm install. Open it in a browser and click "Open Lid."&lt;/p&gt;

&lt;p&gt;If a pressure cooker full of elbow pasta can be beautiful, so can whatever you're building today — even inside your constraints.&lt;/p&gt;

&lt;p&gt;Especially inside your constraints.&lt;/p&gt;

</description>
      <category>frontendchallenge</category>
      <category>devchallenge</category>
      <category>css</category>
    </item>
  </channel>
</rss>
