<?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>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>
    <item>
      <title>AWS Storage Gateway(Hybrid Storage Solution)</title>
      <dc:creator>Yashvi Kothari</dc:creator>
      <pubDate>Sun, 04 Jan 2026 04:59:22 +0000</pubDate>
      <link>https://dev.to/aws-builders/aws-storage-gatewayhybrid-storage-solution-4c2k</link>
      <guid>https://dev.to/aws-builders/aws-storage-gatewayhybrid-storage-solution-4c2k</guid>
      <description>&lt;p&gt;AWS Storage Gateway and its architecture&lt;/p&gt;

&lt;p&gt;Which type of storage gateway to use for your use case, and &lt;/p&gt;

&lt;p&gt;How to create a storage gateway using the EC2 platform &lt;/p&gt;

&lt;h2&gt;
  
  
  Using AWS Storage Gateway(Hybrid Storage Solution)
&lt;/h2&gt;

&lt;p&gt;AWS Storage Gateway is a powerful service that enables hybrid cloud storage by seamlessly connecting on-premises environments with AWS cloud storage. In this blog, we’ll explore AWS Storage Gateway and its architecture, helping you understand how it works and how it fits into modern cloud and hybrid infrastructures.&lt;/p&gt;

&lt;p&gt;We’ll also break down the different types of AWS Storage Gateway—File Gateway, Volume Gateway, and Tape Gateway—and discuss which gateway type to choose based on your specific use case.&lt;/p&gt;

&lt;p&gt;To make things practical, the blog will walk you through creating and deploying an AWS Storage Gateway using the Amazon EC2 platform, demonstrating how to set up and configure the gateway step by step.&lt;/p&gt;

&lt;p&gt;Prerequisites&lt;/p&gt;

&lt;p&gt;To get the most out of this guide, you should have a solid understanding of AWS storage services, including:&lt;/p&gt;

&lt;p&gt;Amazon S3&lt;/p&gt;

&lt;p&gt;Amazon FSx&lt;/p&gt;

&lt;p&gt;Amazon EBS&lt;/p&gt;

&lt;p&gt;Amazon Glacier&lt;/p&gt;

&lt;p&gt;Basic familiarity with Amazon EC2 is also recommended, as it will help you better understand the deployment and configuration steps covered in the hands-on sections.&lt;/p&gt;




&lt;h1&gt;
  
  
  &lt;strong&gt;The AWS Storage Gateway: The Missing Bridge Between On‑Prem and Cloud Fluency&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Every hybrid cloud story begins at the same line: “We still have data on‑prem.”&lt;br&gt;&lt;br&gt;
But the real question AWS architects ask isn’t &lt;em&gt;why&lt;/em&gt; — it’s &lt;em&gt;how cleanly can we bridge that world to S3, FSx, or Glacier?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;There’s a reason the &lt;strong&gt;AWS Well‑Architected Framework&lt;/strong&gt; flags data movement and hybrid storage patterns in almost every cost and operations review. When on‑prem systems start talking to AWS, you either build a bridge — or a bottleneck.&lt;/p&gt;




&lt;h3&gt;
  
  
  What the Storage Gateway Really Is
&lt;/h3&gt;

&lt;p&gt;Storage Gateway isn’t just a connector. It’s a &lt;strong&gt;translator layer&lt;/strong&gt; that turns your local protocols — NFS, SMB, iSCSI — into native AWS storage semantics.&lt;/p&gt;

&lt;p&gt;At its core, it’s a lightweight virtual machine or a hardware appliance that establishes a &lt;em&gt;secure, encrypted data path&lt;/em&gt; to AWS. You can deploy it in three ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;As a VM&lt;/strong&gt; on VMware ESXi, Microsoft Hyper‑V, or Linux KVM — ideal for existing datacenter setups.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;As a hardware appliance&lt;/strong&gt;, pre‑configured and shipped by AWS for plug‑and‑play deployment.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;As an EC2 instance&lt;/strong&gt; inside your VPC or within VMware Cloud on AWS — perfect for hybrid use cases with cloud‑resident workloads.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once deployed, the gateway allocates ~150 MB of local disk space for caching. This cache doesn’t just stage uploads — it works as a low‑latency read buffer, shaving milliseconds off retrieval time for your most frequently accessed objects.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Four Personalities of Storage Gateway
&lt;/h3&gt;

&lt;p&gt;Each gateway type reflects a &lt;strong&gt;different file access pattern&lt;/strong&gt;, not a marketing SKU.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;S3 File Gateway&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Talk SMB or NFS. Store natively in S3. Perfect for backup workloads, shared datasets, or applications that don’t speak API‑native S3.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;FSx File Gateway&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Serve SMB workloads that demand &lt;em&gt;Windows‑native semantics&lt;/em&gt; — think ACLs, DFS namespaces, and domain integration — backed by FSx for Windows File Server.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tape Gateway&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The quiet killer of legacy tape libraries. It abstracts your physical tape system into &lt;strong&gt;iSCSI‑based virtual tapes&lt;/strong&gt;, with automatic tiering into Amazon S3 Glacier Flexible Retrieval or Deep Archive.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Volume Gateway&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The bridge for block‑based applications. It exports iSCSI block volumes backed by EBS snapshots or S3. Great for backup targets or lift‑and‑shift migrations.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ask yourself: which protocol do your on‑prem workloads truly speak — files, blocks, or tapes?&lt;br&gt;&lt;br&gt;
That one question reveals your gateway type.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Economics That Actually Matter
&lt;/h3&gt;

&lt;p&gt;AWS pricing psychology: you’re not paying for the box. You’re paying for &lt;strong&gt;where your bits live and how they move&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Three line items drive your AWS Storage Gateway cost model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Storage pricing&lt;/strong&gt; — Mirrors the backing service (S3, FSx, etc.).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Request pricing&lt;/strong&gt; — Matches the standard S3 or FSx operation costs.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data transfer pricing&lt;/strong&gt; — Free inbound to AWS, but outbound traffic &lt;em&gt;to on‑prem&lt;/em&gt; is billed per terabyte transferred.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pro tip: moving data out of AWS through the Storage Gateway has the same economics as any AWS data egress — so architect for &lt;strong&gt;data gravity&lt;/strong&gt;, not convenience.&lt;/p&gt;




&lt;h3&gt;
  
  
  When to Use It — and When to Rethink It
&lt;/h3&gt;

&lt;p&gt;If your workload can’t or won’t move fully to the cloud (yet), the Storage Gateway gives you hybrid leverage without rearchitecting everything overnight.&lt;br&gt;&lt;br&gt;
But if every request ends up bouncing between S3 and on‑prem, you may need to rethink &lt;em&gt;placement&lt;/em&gt;, not performance.&lt;/p&gt;

&lt;p&gt;The best use cases we see in the wild:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Archival storage for compliance-heavy workloads.
&lt;/li&gt;
&lt;li&gt;Hybrid file shares across geographies.
&lt;/li&gt;
&lt;li&gt;Tape backup elimination projects.
&lt;/li&gt;
&lt;li&gt;Gradual cloud adoption: data first, compute later.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Thought
&lt;/h3&gt;

&lt;p&gt;Every cloud architect eventually realizes this truth: &lt;strong&gt;hybrid isn’t transitional — it’s strategic&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The AWS Storage Gateway exists not to extend your datacenter, but to &lt;strong&gt;teach it cloud fluency&lt;/strong&gt; — one NFS mount, one SMB share, one iSCSI target at a time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Choosing the Right AWS Storage Gateway — A Principal Engineer’s Take
&lt;/h2&gt;

&lt;p&gt;Most hybrid storage decisions don’t fail in architecture. They fail in clarity.&lt;br&gt;
The AWS console gives you four gateway types — S3 File, FSx File, Tape, and Volume. But behind each type lies a philosophy of data motion: how your workloads talk to AWS, how latency collapses, and how cost behaves over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Storage Gateway Exists
&lt;/h2&gt;

&lt;p&gt;AWS built Storage Gateway for one quiet but urgent reason: most enterprises aren't cloud‑only — they're latency‑bound.&lt;br&gt;
They need to keep data gravity close to compute without giving up cloud durability or cost efficiency.&lt;/p&gt;

&lt;p&gt;Storage Gateway bridges that gap. It speaks on‑premises languages (NFS, SMB, iSCSI) while translating natively to AWS storage APIs (S3, FSx, EBS, Glacier).&lt;br&gt;
Think of it as a bilingual edge device — fluent in both legacy infrastructure and cloud semantics.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scenario 1: Backups and Archives That Refuse to Die On‑Prem
&lt;/h2&gt;

&lt;p&gt;You’ve got Hadoop clusters and SQL databases sitting in your datacenter.&lt;br&gt;
You want backups in the cloud. You don’t want to rebuild your entire pipeline.&lt;/p&gt;

&lt;p&gt;Here’s your moment of clarity:&lt;/p&gt;

&lt;p&gt;Use S3 File Gateway when you want object control. Use FSx File Gateway when you want Windows consistency. Use Volume Gateway when you want disaster recovery agility.&lt;/p&gt;

&lt;p&gt;The trade‑offs are architectural, not cosmetic.&lt;/p&gt;

&lt;p&gt;S3 File Gateway:&lt;/p&gt;

&lt;p&gt;Stores data natively in S3, with direct access to S3 Object Lock, versioning, and lifecycle management.&lt;br&gt;
Ideal for large files, logs, and database backups that can benefit from cost tiering into Glacier.&lt;br&gt;
Local cache (up to 64 TB) keeps active data hot — ideal for low‑latency reads in analytics or backup workloads.&lt;br&gt;
FSx File Gateway:&lt;/p&gt;

&lt;p&gt;Joins your Microsoft Active Directory and feels like any other SMB file system.&lt;br&gt;
Optimized for multi‑user, mixed file workloads — project shares, home directories, or Exchange backups.&lt;br&gt;
Plays well when your org runs Windows clients or third‑party tools expecting full NTFS parity (shadow copies, permissions, DFS).&lt;br&gt;
Volume Gateway:&lt;/p&gt;

&lt;p&gt;Perfect for structured data in block storage form.&lt;br&gt;
Lets you back up volumes as EBS snapshots, which you can later restore to EC2 for cloud migration or disaster recovery.&lt;br&gt;
Comes in two flavors:&lt;br&gt;
Cached volumes: Primary data in AWS, frequent reads cached locally.&lt;br&gt;
Stored volumes: Primary data on‑prem, async backups to AWS. (Think “DR‑first architecture.”)&lt;br&gt;
You can decide which to deploy based on one question:&lt;br&gt;
Do you need object features, file semantics, or block storage integration?&lt;/p&gt;

&lt;h2&gt;
  
  
  Scenario 2: The Tape Archive Nobody Wants to Touch
&lt;/h2&gt;

&lt;p&gt;Here’s the truth every sysadmin quietly knows: tapes die faster than budgets get renewed.&lt;/p&gt;

&lt;p&gt;Tape Gateway solves this elegantly. Not with buzzwords — with compatibility.&lt;/p&gt;

&lt;p&gt;It creates a virtual tape library (VTL) that plugs directly into your existing backup software (CommVault, NetBackup, IBM, etc.) over iSCSI. For the backup tool, nothing changes. But instead of shipping tapes to dusty warehouses, you’re sending them to Amazon S3 and auto‑archiving to S3 Glacier.&lt;/p&gt;

&lt;p&gt;This is hybrid done right: zero cultural resistance, immediate operational gain.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to Choose Each
&lt;/h2&gt;

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

&lt;h2&gt;
  
  
  The Hidden “Why Now”
&lt;/h2&gt;

&lt;p&gt;Once your backup data lives in AWS, you’ve quietly unlocked optionality.&lt;br&gt;
Today, it’s backup. Tomorrow, it’s pipeline input for analytics or ML.&lt;br&gt;
That’s the real value — AWS turns what used to be retained data into active data.&lt;/p&gt;

&lt;p&gt;If your hybrid architecture still treats storage as passive, you’re leaving compounding value on the table.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;Each gateway type reflects a philosophy of transition — from legacy to leverage.&lt;br&gt;
The best AWS builders know that hybrid isn't a stopgap; it’s a design state.&lt;br&gt;
Storage Gateway doesn’t replace your infrastructure. It teaches it to speak cloud fluently.&lt;/p&gt;

&lt;h2&gt;
  
  
  To Do: Hands-On
&lt;/h2&gt;

&lt;p&gt;Configure an AWS S3 File Storage Gateway to test end to end.&lt;/p&gt;

&lt;p&gt;Connect an EC2-based NFS file system to an Amazon S3 bucket and verify that files created on EC2 are automatically stored in S3.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Storage Gateway Configuration&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Opened AWS Storage Gateway from the AWS Console&lt;/p&gt;

&lt;p&gt;Created a new gateway named sgw-demo&lt;/p&gt;

&lt;p&gt;Selected S3 File Gateway&lt;/p&gt;

&lt;p&gt;Chose Amazon EC2 as the hosting platform&lt;/p&gt;

&lt;p&gt;Selected the appropriate time zone&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Gateway Deployment on EC2&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Launched an EC2 instance for the gateway:&lt;/p&gt;

&lt;p&gt;Instance name: sgw-demo-instance&lt;/p&gt;

&lt;p&gt;Instance type: m5.xlarge (as recommended)&lt;/p&gt;

&lt;p&gt;Public IP enabled&lt;/p&gt;

&lt;p&gt;Configured a security group with required ports:&lt;/p&gt;

&lt;p&gt;22 (SSH)&lt;/p&gt;

&lt;p&gt;80 (Gateway activation)&lt;/p&gt;

&lt;p&gt;2049, 111, 20048 (NFS)&lt;/p&gt;

&lt;p&gt;Added an extra EBS volume (150 GiB+) for cache storage&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Gateway Activation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Used the public IP address of the EC2 instance to activate the gateway&lt;/p&gt;

&lt;p&gt;Selected public internet connectivity&lt;/p&gt;

&lt;p&gt;Disabled CloudWatch logs and alarms to reduce cost&lt;/p&gt;

&lt;p&gt;Allocated cache storage successfully&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;NFS File Share Creation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Created a new NFS file share&lt;/p&gt;

&lt;p&gt;Linked it to an existing S3 bucket (sgw-bucket-99)&lt;/p&gt;

&lt;p&gt;Selected S3 Standard as the storage class&lt;/p&gt;

&lt;p&gt;Left cache and permission settings as default&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Mounting the File Share&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Connected to a separate EC2 instance (application server)&lt;/p&gt;

&lt;p&gt;Created a mount directory: /web-files&lt;/p&gt;

&lt;p&gt;Mounted the NFS file share using the provided Linux mount command&lt;/p&gt;

&lt;p&gt;Verified the mount using df -h&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Testing the Setup&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Created a file index.html inside /web-files&lt;/p&gt;

&lt;p&gt;Added sample content to the file&lt;/p&gt;

&lt;p&gt;Checked the S3 bucket and confirmed the file appeared there&lt;/p&gt;

&lt;p&gt;Downloaded the file from S3 to verify the content&lt;/p&gt;

&lt;p&gt;✅ Final Outcome&lt;/p&gt;

&lt;p&gt;The NFS file share and S3 bucket were successfully linked&lt;/p&gt;

&lt;p&gt;Any file created on the EC2-mounted file system was automatically stored in Amazon S3&lt;/p&gt;

&lt;p&gt;This confirms a 1:1 mapping between the NFS file system and the S3 bucket&lt;/p&gt;

&lt;p&gt;In simple terms:&lt;br&gt;
Files written on EC2 using NFS were transparently backed up to Amazon S3 using AWS Storage Gateway.&lt;/p&gt;

&lt;p&gt;Flow:&lt;/p&gt;

&lt;p&gt;On‑prem data (files, volumes, or backups) flows to the Storage Gateway.&lt;/p&gt;

&lt;p&gt;The gateway caches frequently accessed data locally for low‑latency access.&lt;/p&gt;

&lt;p&gt;Data is securely transferred to AWS storage services (S3, FSx, Glacier, or EBS).&lt;/p&gt;

&lt;p&gt;AWS maintains scalable, durable storage and offers lifecycle management, versioning, or snapshotting depending on gateway type.&lt;/p&gt;

&lt;p&gt;Administrators monitor and control the entire setup through the AWS Management Console or APIs.&lt;/p&gt;

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

&lt;p&gt;Image Credits Alana Layton&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzqasjoec7608f0gltu9i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzqasjoec7608f0gltu9i.png" alt=" " width="520" height="396"&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.amazonaws.com%2Fuploads%2Farticles%2Ffcy59ue2fu8pbntm937i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffcy59ue2fu8pbntm937i.png" alt=" " width="792" height="519"&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.amazonaws.com%2Fuploads%2Farticles%2Fq7k3ktjhgn4653ddd535.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq7k3ktjhgn4653ddd535.png" alt=" " width="800" height="525"&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.amazonaws.com%2Fuploads%2Farticles%2Fmzbrutfj4gh7b1ncfik2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmzbrutfj4gh7b1ncfik2.png" alt=" " width="560" height="521"&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.amazonaws.com%2Fuploads%2Farticles%2Fewvxet5k08q267701upk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fewvxet5k08q267701upk.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.amazonaws.com%2Fuploads%2Farticles%2Fxvvh30dm7zz99hlwh1np.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxvvh30dm7zz99hlwh1np.png" alt=" " width="800" height="391"&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.amazonaws.com%2Fuploads%2Farticles%2Fd2x8x2jpy01xyja27db3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd2x8x2jpy01xyja27db3.png" alt=" " width="578" height="400"&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.amazonaws.com%2Fuploads%2Farticles%2Fv037m67mem4a37aj6zcj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv037m67mem4a37aj6zcj.png" alt=" " width="540" height="431"&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.amazonaws.com%2Fuploads%2Farticles%2Fpvzt247wxx4nl8fvs7he.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpvzt247wxx4nl8fvs7he.png" alt=" " width="614" height="417"&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.amazonaws.com%2Fuploads%2Farticles%2Fkdrnlfd7lixqfc7mjg0q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkdrnlfd7lixqfc7mjg0q.png" alt=" " width="547" height="352"&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.amazonaws.com%2Fuploads%2Farticles%2Fvuw13uv25un5aynutrhv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvuw13uv25un5aynutrhv.png" alt=" " width="530" height="241"&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.amazonaws.com%2Fuploads%2Farticles%2F4iglavdtgykesi4izygo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4iglavdtgykesi4izygo.png" alt=" " width="534" height="286"&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.amazonaws.com%2Fuploads%2Farticles%2Fdo5s8gzgj04u5wqnawpj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdo5s8gzgj04u5wqnawpj.png" alt=" " width="544" height="169"&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.amazonaws.com%2Fuploads%2Farticles%2F9ps74n24qkou6q0b1pau.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ps74n24qkou6q0b1pau.png" alt=" " width="525" height="226"&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.amazonaws.com%2Fuploads%2Farticles%2F2f0o0p2oa6mp5a4uk2gk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2f0o0p2oa6mp5a4uk2gk.png" alt=" " width="800" height="166"&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.amazonaws.com%2Fuploads%2Farticles%2Fr0ccainp4xupdstg6n5i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr0ccainp4xupdstg6n5i.png" alt=" " width="800" height="377"&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.amazonaws.com%2Fuploads%2Farticles%2F6a729i2dm59x6ce140h7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6a729i2dm59x6ce140h7.png" alt=" " width="672" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;enable FIPS&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4pf9svkwkwh57xajxqfl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4pf9svkwkwh57xajxqfl.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.amazonaws.com%2Fuploads%2Farticles%2Fugm097b52qxl7uvm1gft.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fugm097b52qxl7uvm1gft.png" alt=" " width="631" height="342"&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.amazonaws.com%2Fuploads%2Farticles%2Fj4t952ofofyq0mm8p2yi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj4t952ofofyq0mm8p2yi.png" alt=" " width="504" height="394"&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.amazonaws.com%2Fuploads%2Farticles%2F4ipjfmznplg21adfqaj0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ipjfmznplg21adfqaj0.png" alt=" " width="621" height="185"&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.amazonaws.com%2Fuploads%2Farticles%2Fjr5u1p5gd1qu8tsu1ky6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjr5u1p5gd1qu8tsu1ky6.png" alt=" " width="793" height="356"&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.amazonaws.com%2Fuploads%2Farticles%2Feudn9x3kt74ojl6fb0x1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feudn9x3kt74ojl6fb0x1.png" alt=" " width="576" height="253"&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.amazonaws.com%2Fuploads%2Farticles%2Fuyw6qe439olrkhzorj77.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuyw6qe439olrkhzorj77.png" alt=" " width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;connect ssh and copy that example command&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1b4rm4dr30irjcm1fhmj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1b4rm4dr30irjcm1fhmj.png" alt=" " width="800" 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%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjsvqykx5jlnj8xdn23h4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjsvqykx5jlnj8xdn23h4.png" alt=" " width="138" height="31"&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.amazonaws.com%2Fuploads%2Farticles%2F7kdkv071zc1cy2464425.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7kdkv071zc1cy2464425.png" alt=" " width="552" height="25"&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.amazonaws.com%2Fuploads%2Farticles%2Fyt9exers4b1hgklr6z64.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyt9exers4b1hgklr6z64.png" alt=" " width="82" height="16"&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.amazonaws.com%2Fuploads%2Farticles%2Fvydm2em25xo136kqwk3b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvydm2em25xo136kqwk3b.png" alt=" " width="735" height="139"&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.amazonaws.com%2Fuploads%2Farticles%2F0efq3tf9uccieyhat6t8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0efq3tf9uccieyhat6t8.png" alt=" " width="696" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>storage</category>
      <category>aws</category>
      <category>gateway</category>
      <category>onprem</category>
    </item>
    <item>
      <title>Secure Identity and Access Management with AWS IAM</title>
      <dc:creator>Yashvi Kothari</dc:creator>
      <pubDate>Thu, 25 Dec 2025 14:11:14 +0000</pubDate>
      <link>https://dev.to/aws-builders/secure-identity-and-access-management-with-aws-iam-2c8g</link>
      <guid>https://dev.to/aws-builders/secure-identity-and-access-management-with-aws-iam-2c8g</guid>
      <description>&lt;p&gt;Understand what is meant identity and access management and the difference between authentication, authorization, and access control&lt;/p&gt;

&lt;p&gt;Learn the components of IAM as well as its reporting features&lt;/p&gt;

&lt;p&gt;Intended Audience&lt;br&gt;
AWS Administrators&lt;br&gt;
Security Engineers&lt;br&gt;
Security Architects&lt;br&gt;
Anyone who is looking to increase their knowledge of the IAM service in preparation for an AWS certification&lt;/p&gt;

&lt;h2&gt;
  
  
  The First Rule of Infrastructure: Identity is the Perimeter
&lt;/h2&gt;

&lt;p&gt;Most teams treat &lt;strong&gt;AWS Identity and Access Management (IAM)&lt;/strong&gt; as a configuration hurdle. They see it as a series of checkboxes to get a service running.&lt;/p&gt;

&lt;p&gt;They are wrong.&lt;/p&gt;

&lt;p&gt;In a cloud-native world, the network perimeter is a ghost. Your real firewall isn't an IP range; it’s your IAM policy. If you haven't mastered the distinction between &lt;strong&gt;who&lt;/strong&gt; a user is and &lt;strong&gt;what&lt;/strong&gt; they can do, you aren't managing an environment—you're managing a liability.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Two Pillars: Authentication vs. Authorization
&lt;/h3&gt;

&lt;p&gt;Confusion here is the root of most "Access Denied" loops. Let’s strip the jargon.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Identity Management (The "Who")
&lt;/h4&gt;

&lt;p&gt;Authentication is the process of proving you exist.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Claim:&lt;/strong&gt; You provide a unique identifier (a username). IAM ensures this is a singleton within your account; there is no room for ambiguity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Proof:&lt;/strong&gt; You verify that claim. Usually, this is a password. In high-trust environments, it’s a password plus &lt;strong&gt;MFA&lt;/strong&gt;. If you aren't using MFA, you don't have a security policy; you have a suggestion.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. Access Management (The "What")
&lt;/h4&gt;

&lt;p&gt;Once we know who you are, authorization determines your reach.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Permission:&lt;/strong&gt; This is the logic that lives in your JSON policies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Scope:&lt;/strong&gt; Does this identity need &lt;code&gt;FullAccess&lt;/code&gt; to EC2, or just &lt;code&gt;ReadOnly&lt;/code&gt; to a specific RDS instance?&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Status Signal:&lt;/strong&gt; Principal Engineers don’t grant permissions to "make it work." They grant permissions to make it &lt;em&gt;secure&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  The Mechanics of Control
&lt;/h3&gt;

&lt;p&gt;Access control is the delivery vehicle for your security logic. It’s how the "Who" meets the "What." You have three primary levers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Standard Credentials:&lt;/strong&gt; The basic handshake of username and password.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Factor Authentication (MFA):&lt;/strong&gt; The second layer that turns a stolen password from a catastrophe into a non-event.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Federation:&lt;/strong&gt; The hallmark of a mature enterprise. Why manage 500 IAM users when you can delegate trust to an external Identity Provider (IdP)? You don't want more identities; you want better ones.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Why This Matters for the Long Game
&lt;/h3&gt;

&lt;p&gt;IAM is the nervous system of your AWS account. It governs, manages, and audits every heartbeat of your infrastructure.&lt;/p&gt;

&lt;p&gt;What if your scaling issues aren’t about capacity, but about throttled IAM calls or misconfigured roles? What if your biggest security risk isn't an external hacker, but an internal developer with &lt;code&gt;AdministratorAccess&lt;/code&gt; and a leaked API key?&lt;/p&gt;

&lt;p&gt;There’s a reason the &lt;strong&gt;AWS Well-Architected Framework&lt;/strong&gt; starts with Identity. If you get the foundation wrong, the rest of the house is just waiting for a reason to fall.&lt;/p&gt;

&lt;p&gt;Build for the identity you need, not the convenience you want.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architect’s Burden: Why IAM is Your Only Real Firewall
&lt;/h2&gt;

&lt;p&gt;In the cloud, distance is an illusion. Your resources aren't "somewhere else"—they are behind an API.&lt;/p&gt;

&lt;p&gt;If you aren't managing your &lt;strong&gt;Identity and Access Management (IAM)&lt;/strong&gt; with surgical precision, you aren't running an infrastructure; you’re running a risk. Without IAM, your AWS account is an open room in a crowded city. With it, it’s a vault. But here is the truth: &lt;strong&gt;AWS provides the vault; you provide the combination.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There’s a reason the &lt;strong&gt;AWS Well-Architected Framework&lt;/strong&gt; treats Security as its second pillar. The responsibility for "tight" security is yours alone. It’s the difference between a system that scales and a system that leaks.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. The Dashboard: Your Command Center
&lt;/h3&gt;

&lt;p&gt;When you step into the IAM Console, you aren't just looking at settings; you're looking at your security posture in a single pane of glass.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Sign-In URL:&lt;/strong&gt; This is your front door. Customizing it isn't just about branding—it’s about operational clarity. In a multi-account environment, knowing exactly which door you’re standing at prevents the kind of "oops" that ends up on the morning news.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Resource Summary:&lt;/strong&gt; A lean, high-level heartbeat. How many users? How many roles? If these numbers are climbing without a known project, you have an &lt;strong&gt;IAM sprawl&lt;/strong&gt; problem.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  2. The Identity Stack: Users, Groups, and Roles
&lt;/h3&gt;

&lt;p&gt;Most engineers confuse these three. Principals do not.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Users (The Permanent):&lt;/strong&gt; Objects representing a person or an application. They have long-term credentials. Use them sparingly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Groups (The Logical):&lt;/strong&gt; You don't give permissions to people; you give permissions to &lt;em&gt;functions&lt;/em&gt;. Put the user in the "SRE" group, and let the group hold the policy. It’s cleaner, it’s faster, it’s more of simplicity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Roles (The Temporal):&lt;/strong&gt; This is the gold standard. Roles use &lt;strong&gt;STS (Security Token Service)&lt;/strong&gt; to grant temporary, rotating credentials. Why manage a password that can be stolen when you can use a token that expires in an hour?&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. Policies: The Logic of Permission
&lt;/h3&gt;

&lt;p&gt;IAM policies are written in JSON. They are the "code" in "Infrastructure as Code."&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Managed Policies:&lt;/strong&gt; Your library. Use &lt;strong&gt;AWS Managed Policies&lt;/strong&gt; for speed, but pivot to &lt;strong&gt;Customer Managed Policies&lt;/strong&gt; for the Principle of Least Privilege.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inline Policies:&lt;/strong&gt; The "strictly local" option. Harder to manage, harder to audit. Ask yourself: if this policy is so special it only applies to one user, is your architecture too complex?&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  4. Advanced Guardrails: SCPs and Access Analysis
&lt;/h3&gt;

&lt;p&gt;As your organization grows, manual reviews become impossible. You need automated governance.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Service Control Policies (SCPs):&lt;/strong&gt; These are the "Maximum Permissions." Think of them as a fence. If the SCP says "No S3," it doesn't matter if an IAM user has &lt;code&gt;AdministratorAccess&lt;/code&gt;—they are blocked. &lt;strong&gt;SCPs don't grant; they restrict.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access Analyzer:&lt;/strong&gt; Your silent auditor. It flags resources—like S3 buckets or IAM roles—that are accessible from outside your "Zone of Trust."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Credential Report:&lt;/strong&gt; A simple CSV that tells a story. When was the last time &lt;code&gt;Dev-Account-1&lt;/code&gt; was used? If it’s been 90 days, why does it still exist?&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  The Mastery Shift
&lt;/h3&gt;

&lt;p&gt;What if your security bottlenecks aren't caused by "too much security," but by an outdated understanding of how IAM flows?&lt;/p&gt;

&lt;p&gt;Once those &lt;strong&gt;IAM roles&lt;/strong&gt; are assumed, misconfigured trust relationships become silent attack vectors. It’s not about having &lt;em&gt;more&lt;/em&gt; rules; it’s about having the &lt;em&gt;right&lt;/em&gt; ones.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>aws</category>
      <category>security</category>
    </item>
  </channel>
</rss>
