<?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: HimanshuTamoli</title>
    <description>The latest articles on DEV Community by HimanshuTamoli (@himanshutamoli).</description>
    <link>https://dev.to/himanshutamoli</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%2F1319842%2Fae230eb1-d015-4728-8496-4613836da0f8.jpeg</url>
      <title>DEV Community: HimanshuTamoli</title>
      <link>https://dev.to/himanshutamoli</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/himanshutamoli"/>
    <language>en</language>
    <item>
      <title>Network Ports Explained: How Servers Know Which Application Should Handle a Request</title>
      <dc:creator>HimanshuTamoli</dc:creator>
      <pubDate>Tue, 06 Oct 2026 19:51:47 +0000</pubDate>
      <link>https://dev.to/himanshutamoli/network-ports-explained-how-servers-know-which-application-should-handle-a-request-112f</link>
      <guid>https://dev.to/himanshutamoli/network-ports-explained-how-servers-know-which-application-should-handle-a-request-112f</guid>
      <description>&lt;p&gt;If you're learning backend development, you've probably seen things like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;localhost:3000
localhost:5000
:80
:443
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At first, the port number can seem like just another configuration value.&lt;/p&gt;

&lt;p&gt;But why does a server need a port when it already has an IP address?&lt;/p&gt;

&lt;p&gt;If one server is running a Node.js API, PostgreSQL, Redis, and NGINX at the same time, how does the operating system know which application should receive an incoming request?&lt;/p&gt;

&lt;p&gt;That's the problem &lt;strong&gt;ports&lt;/strong&gt; solve.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is a Port?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;network port is a logical endpoint used to identify a network service or application on a device.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A simple mental model is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IP Address → Which machine?
Port       → Which service?
&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;192.168.1.10:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;192.168.1.10&lt;/code&gt; is the IP address.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;3000&lt;/code&gt; is the port.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The IP address gets the traffic to the correct machine.&lt;/p&gt;

&lt;p&gt;The port helps the operating system determine which application should receive that traffic.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Isn't an IP Address Enough?
&lt;/h2&gt;

&lt;p&gt;This is the key question.&lt;/p&gt;

&lt;p&gt;Imagine a server with this IP address:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;That server could be running:&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 API
PostgreSQL
Redis
SSH
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All of these services are running on the &lt;strong&gt;same machine&lt;/strong&gt;, so they share the machine's network interfaces and IP addresses.&lt;/p&gt;

&lt;p&gt;If a packet arrives for:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;the operating system knows:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This traffic belongs to this machine.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But it still needs to determine:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which application should receive it?&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;The services can listen on different ports:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;203.0.113.10:22    → SSH
203.0.113.10:80    → HTTP
203.0.113.10:443   → HTTPS
203.0.113.10:3000  → Node.js
203.0.113.10:5432  → PostgreSQL
203.0.113.10:6379  → Redis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the operating system has a way to distinguish between the services.&lt;/p&gt;




&lt;h1&gt;
  
  
  Think of It Like a Building
&lt;/h1&gt;

&lt;p&gt;A useful analogy is an apartment building.&lt;/p&gt;

&lt;p&gt;Suppose the building has this address:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;221B Example Street
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's similar to an IP address.&lt;/p&gt;

&lt;p&gt;Inside the building:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Apartment 101
Apartment 102
Apartment 103
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;are different destinations.&lt;/p&gt;

&lt;p&gt;The building address tells you &lt;strong&gt;which building&lt;/strong&gt; to visit.&lt;/p&gt;

&lt;p&gt;The apartment number tells you &lt;strong&gt;where inside the building&lt;/strong&gt; to go.&lt;/p&gt;

&lt;p&gt;Networking works similarly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IP Address → Building
Port       → Service/endpoint
&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 plaintext"&gt;&lt;code&gt;203.0.113.10:443
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;can be thought of as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;203.0.113.10 → Which machine?
443           → Which network service?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is an analogy, not a literal description of how networking works, but it's a useful mental model.&lt;/p&gt;




&lt;h1&gt;
  
  
  IP Address vs Port
&lt;/h1&gt;

&lt;p&gt;Let's separate the two concepts.&lt;/p&gt;

&lt;h3&gt;
  
  
  IP address
&lt;/h3&gt;

&lt;p&gt;An IP address identifies a network destination.&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;203.0.113.10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Port
&lt;/h3&gt;

&lt;p&gt;A port identifies a logical network endpoint associated with a service.&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;443
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

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

&lt;/div&gt;



&lt;p&gt;You can think of this as:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;This is why developers frequently write endpoints as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IP:PORT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  What Does It Mean When an Application "Listens" on a Port?
&lt;/h1&gt;

&lt;p&gt;You'll often hear:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"My Node.js server is listening on port 3000."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This means the application has created a network socket and is waiting for incoming connections on that port.&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 javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;Node.js Application
        │
        ↓
   Listen on :3000
        │
        ↓
Operating System
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The operating system can now associate incoming traffic for that listening endpoint with the appropriate process.&lt;/p&gt;




&lt;h1&gt;
  
  
  A Simple Node.js Example
&lt;/h1&gt;

&lt;p&gt;Consider this Express application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello from the server!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Server running on port 3000&lt;/span&gt;&lt;span class="dl"&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;p&gt;When you run it, the application starts listening on:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;You can then open:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The simplified flow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser
   │
   │ HTTP request
   ↓
localhost:3000
   │
   ↓
Operating System
   │
   ↓
Node.js Process
   │
   ↓
GET /
   │
   ↓
HTTP Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The port &lt;code&gt;3000&lt;/code&gt; is what allows the operating system to identify the network endpoint associated with your Node.js application.&lt;/p&gt;




&lt;h1&gt;
  
  
  What Is &lt;code&gt;localhost&lt;/code&gt;?
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;localhost&lt;/code&gt; refers to the local machine.&lt;/p&gt;

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

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

&lt;/div&gt;



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

&lt;blockquote&gt;
&lt;p&gt;Connect to port 3000 on this computer.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is extremely common during development.&lt;/p&gt;

&lt;p&gt;You might run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and your application may start at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The browser and application are communicating through the local machine's networking stack.&lt;/p&gt;




&lt;h1&gt;
  
  
  One Server Can Have Many Ports
&lt;/h1&gt;

&lt;p&gt;A server doesn't have just one port.&lt;/p&gt;

&lt;p&gt;A single machine can have many applications listening on different ports.&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;                 SERVER
              203.0.113.10
                    │
       ┌────────────┼────────────┐
       ↓            ↓            ↓
     :80          :443         :3000
     HTTP         HTTPS        Node.js
                                  │
                              :5432
                             PostgreSQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The IP address identifies the machine.&lt;/p&gt;

&lt;p&gt;The ports distinguish the network services.&lt;/p&gt;




&lt;h1&gt;
  
  
  Common Ports
&lt;/h1&gt;

&lt;p&gt;Some port numbers are commonly associated with specific services.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Port&lt;/th&gt;
&lt;th&gt;Common use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;22&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SSH&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;53&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;DNS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;80&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;HTTP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;443&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;HTTPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;3000&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Common development port&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;5432&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;PostgreSQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;6379&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Redis&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are &lt;strong&gt;conventions&lt;/strong&gt;, not permanent rules.&lt;/p&gt;

&lt;p&gt;For example, Node.js does not require port &lt;code&gt;3000&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You could write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and your application would listen on:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;






&lt;h1&gt;
  
  
  Ports Are Logical, Not Physical
&lt;/h1&gt;

&lt;p&gt;A network port is not a physical connector.&lt;/p&gt;

&lt;p&gt;It's different from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;USB port&lt;/li&gt;
&lt;li&gt;Ethernet port&lt;/li&gt;
&lt;li&gt;HDMI port&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A network port is a &lt;strong&gt;logical number used by networking protocols and the operating system&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For TCP and UDP, port numbers range from:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;






&lt;h1&gt;
  
  
  TCP and UDP Ports
&lt;/h1&gt;

&lt;p&gt;Ports are used with transport protocols such as &lt;strong&gt;TCP&lt;/strong&gt; and &lt;strong&gt;UDP&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;TCP + 443
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is commonly used for HTTPS.&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 plaintext"&gt;&lt;code&gt;UDP + 53
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is commonly used for DNS.&lt;/p&gt;

&lt;p&gt;This is important because a port number alone isn't the complete identity of a network endpoint.&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;Protocol + IP + Port
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;forms part of the information used to identify network communication.&lt;/p&gt;




&lt;h1&gt;
  
  
  Source Port vs Destination Port
&lt;/h1&gt;

&lt;p&gt;When a client connects to a server, there is usually both a &lt;strong&gt;source port&lt;/strong&gt; and a &lt;strong&gt;destination port&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;Client
192.168.1.20:52000
       │
       │
       ↓
Server
203.0.113.10:443
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Source IP:        192.168.1.20
Source Port:      52000

Destination IP:   203.0.113.10
Destination Port: 443
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The server is listening on port &lt;code&gt;443&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The client's operating system typically selects an ephemeral source port for the connection.&lt;/p&gt;




&lt;h1&gt;
  
  
  How Can Thousands of Users Connect to Port 443?
&lt;/h1&gt;

&lt;p&gt;A common beginner question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If a server has only one port 443, how can thousands of users connect to it?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Because the destination port isn't the only thing that identifies a connection.&lt;/p&gt;

&lt;p&gt;For TCP, the connection is associated with information such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Source IP
Source Port
Destination IP
Destination Port
Protocol
&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;Client A
10.0.0.5:51001
      ↓
Server
10.0.0.10:443
&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;Client B
10.0.0.6:51002
      ↓
Server
10.0.0.10:443
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both clients can connect to the same server port.&lt;/p&gt;

&lt;p&gt;Their connection information is different, so the operating system can keep track of them independently.&lt;/p&gt;




&lt;h1&gt;
  
  
  What Happens If Two Applications Use the Same Port?
&lt;/h1&gt;

&lt;p&gt;Suppose you already have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application A → :3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you start another application configured for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application B → :3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will generally get an error because the address/port combination is already in use.&lt;/p&gt;

&lt;p&gt;In Node.js, you may see:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Address already in use
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The solution is usually to stop the existing process or use another port:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application A → :3000
Application B → :4000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Open, Closed, and Blocked Ports
&lt;/h1&gt;

&lt;p&gt;These terms are often confused.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Port
&lt;/h2&gt;

&lt;p&gt;A service is listening and accepting connections.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Port 443
   ↓
HTTPS service
   ↓
Listening
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Closed Port
&lt;/h2&gt;

&lt;p&gt;Nothing is listening on the port.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Port 3000
   ↓
No service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Blocked Port
&lt;/h2&gt;

&lt;p&gt;A firewall or network security rule prevents traffic from reaching the 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 plaintext"&gt;&lt;code&gt;Internet
   │
   ↓
Firewall
   │
   ├── 443   ✓ Allowed
   └── 3000  ✗ Blocked
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A service can be listening on a port but still be unreachable from outside the machine if a firewall blocks the traffic.&lt;/p&gt;




&lt;h1&gt;
  
  
  Ports and Firewalls
&lt;/h1&gt;

&lt;p&gt;Ports become especially important when deploying applications to a server.&lt;/p&gt;

&lt;p&gt;Suppose your server has:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;22    → SSH
80    → HTTP
443   → HTTPS
3000  → Node.js
5432  → PostgreSQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You probably don't want every port publicly accessible.&lt;/p&gt;

&lt;p&gt;A typical setup might allow:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;while restricting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;22   → Restricted
3000 → Internal
5432 → Internal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A firewall controls which traffic can reach which ports.&lt;/p&gt;

&lt;p&gt;This reduces the server's attack surface.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why Keep Databases Behind the Firewall?
&lt;/h1&gt;

&lt;p&gt;Suppose PostgreSQL is running on:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;You usually don't want random internet clients connecting directly to it.&lt;/p&gt;

&lt;p&gt;A better architecture is often:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                  INTERNET
                      │
                      ↓
                    :443
                      │
                      ↓
                    NGINX
                      │
                      ↓
                Node.js :3000
                      │
                      ↓
              PostgreSQL :5432
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;443&lt;/code&gt; is publicly accessible.&lt;/li&gt;
&lt;li&gt;Node.js can communicate with PostgreSQL internally.&lt;/li&gt;
&lt;li&gt;PostgreSQL doesn't need to be exposed directly to the internet.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a common production architecture.&lt;/p&gt;




&lt;h1&gt;
  
  
  What Happens When You Visit a Website?
&lt;/h1&gt;

&lt;p&gt;Consider:&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;There are several steps involved.&lt;/p&gt;

&lt;p&gt;First, the domain needs to resolve to an IP address through DNS.&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;example.com
     ↓
    DNS
     ↓
203.0.113.10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The browser then connects to the server using HTTPS.&lt;/p&gt;

&lt;p&gt;HTTPS normally uses:&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;So the simplified flow is:&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
        ↓
203.0.113.10:443
        ↓
      Server
        ↓
   HTTPS service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The request is then processed by the server's networking and application layers.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why Don't We Write &lt;code&gt;:443&lt;/code&gt;?
&lt;/h1&gt;

&lt;p&gt;You may have noticed that we normally write:&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;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;https://example.com:443
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's because &lt;code&gt;443&lt;/code&gt; is the standard port for HTTPS.&lt;/p&gt;

&lt;p&gt;The browser knows the default port associated with the protocol.&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;normally uses port:&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;p&gt;But when you're developing locally, you often see:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;because &lt;code&gt;3000&lt;/code&gt; isn't the default HTTP port.&lt;/p&gt;




&lt;h1&gt;
  
  
  A Real Production Example
&lt;/h1&gt;

&lt;p&gt;Let's look at a common Node.js deployment.&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;                       INTERNET
                           │
                           │ HTTPS :443
                           ↓
                    ┌─────────────┐
                    │    NGINX    │
                    └─────────────┘
                           │
                           │ proxy
                           ↓
                    localhost:3000
                           │
                           ↓
                    ┌─────────────┐
                    │   Node.js   │
                    │     API     │
                    └─────────────┘
                           │
                           ↓
                    PostgreSQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The user visits:&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;The request reaches the server through port &lt;code&gt;443&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;NGINX receives it and can forward it internally to:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;where the Node.js application is running.&lt;/p&gt;

&lt;p&gt;The user doesn't need to know that Node.js is using port &lt;code&gt;3000&lt;/code&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why Is Port 3000 So Common?
&lt;/h1&gt;

&lt;p&gt;You may see this constantly in JavaScript development:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;That's simply a common convention.&lt;/p&gt;

&lt;p&gt;There is nothing inherently special about &lt;code&gt;3000&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Your application could use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;3001
4000
5000
8000
8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or another available port.&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 javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;means the application listens on:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;






&lt;h1&gt;
  
  
  Port Ranges
&lt;/h1&gt;

&lt;p&gt;Port numbers range from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0 → 65535
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;They are commonly divided into three broad categories:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0–1023
Well-known ports

1024–49151
Registered ports

49152–65535
Dynamic/private ports
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This classification is useful as a general mental model, although the exact rules and allocations are more nuanced.&lt;/p&gt;




&lt;h1&gt;
  
  
  Well-Known Ports
&lt;/h1&gt;

&lt;p&gt;Ports &lt;code&gt;0–1023&lt;/code&gt; are commonly referred to as &lt;strong&gt;well-known ports&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;22  → SSH
53  → DNS
80  → HTTP
443 → HTTPS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These ports are associated with widely used protocols and services.&lt;/p&gt;




&lt;h1&gt;
  
  
  Registered Ports
&lt;/h1&gt;

&lt;p&gt;The range:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1024–49151
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;contains registered ports associated with various applications and services.&lt;/p&gt;

&lt;p&gt;Again, registration does not mean an application is forced to use that port.&lt;/p&gt;

&lt;p&gt;Applications can often be configured to use another available port.&lt;/p&gt;




&lt;h1&gt;
  
  
  Dynamic or Ephemeral Ports
&lt;/h1&gt;

&lt;p&gt;When a client makes an outgoing connection, the operating system typically chooses a temporary source port.&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;Client
192.168.1.20:53124
       │
       ↓
Server
203.0.113.10:443
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

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

&lt;/div&gt;



&lt;p&gt;could be an ephemeral source port.&lt;/p&gt;

&lt;p&gt;The exact ephemeral port range depends on the operating system and its configuration.&lt;/p&gt;




&lt;h1&gt;
  
  
  A Complete Request Flow
&lt;/h1&gt;

&lt;p&gt;Let's combine everything.&lt;/p&gt;

&lt;p&gt;Suppose a browser wants to access:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://api.example.com/users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A simplified flow looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser
   │
   │ DNS lookup
   ↓
api.example.com
   │
   ↓
Server IP
   │
   │ TCP connection
   ↓
Server:443
   │
   ↓
HTTPS server / NGINX
   │
   │ reverse proxy
   ↓
Node.js:3000
   │
   ↓
/users route
   │
   ↓
Database
   │
   ↓
Response
   │
   ↓
Browser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice how the port appears at different stages.&lt;/p&gt;

&lt;p&gt;The public service may be available 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;while the internal Node.js application may be listening on:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;The port doesn't represent the entire application architecture. It identifies a network endpoint at a particular layer of the system.&lt;/p&gt;




&lt;h1&gt;
  
  
  Ports Are About Routing Traffic to Processes
&lt;/h1&gt;

&lt;p&gt;At the application level, it is tempting to think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Port 3000 belongs to Node.js."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's not quite correct.&lt;/p&gt;

&lt;p&gt;Port &lt;code&gt;3000&lt;/code&gt; doesn't inherently belong to Node.js.&lt;/p&gt;

&lt;p&gt;Instead, a process binds to a network endpoint.&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;Node.js → 0.0.0.0:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The operating system maintains the relationship between the network endpoint and the process.&lt;/p&gt;

&lt;p&gt;Another application could use port &lt;code&gt;3000&lt;/code&gt; after the Node.js process stops and releases it.&lt;/p&gt;

&lt;p&gt;So ports are &lt;strong&gt;not permanently assigned to applications&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  A Few Important Things to Remember
&lt;/h1&gt;

&lt;h3&gt;
  
  
  1. A port is not an IP address
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IP   → Machine/network destination
Port → Network service/endpoint
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. A server can use many ports
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;:22
:80
:443
:3000
:5432
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;can all exist on the same machine.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Port numbers are configurable
&lt;/h3&gt;

&lt;p&gt;Node.js doesn't require &lt;code&gt;3000&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Open doesn't always mean publicly reachable
&lt;/h3&gt;

&lt;p&gt;A firewall can block traffic even when a service is listening.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Ports are logical
&lt;/h3&gt;

&lt;p&gt;They're not physical connectors.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. TCP and UDP have separate port spaces
&lt;/h3&gt;

&lt;p&gt;A TCP port and a UDP port with the same number aren't the same endpoint.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Mental Model You Should Remember
&lt;/h1&gt;

&lt;p&gt;If you're learning backend development, don't memorize hundreds of port numbers.&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;                    REQUEST
                       │
                       ↓
                IP ADDRESS
                       │
                       ↓
                    SERVER
                       │
                       ↓
                     PORT
                       │
                       ↓
                   SERVICE
                       │
                       ↓
                  APPLICATION
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or even simpler:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IP Address → Which machine?
Port       → Which service?
&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;203.0.113.10:443
&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;203.0.113.10 → destination machine
443           → destination port
&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;localhost:3000
&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;localhost → this machine
3000      → service listening on port 3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Ports are one of those networking concepts that look complicated at first but become straightforward once you understand the problem they're solving.&lt;/p&gt;

&lt;p&gt;A server can run many network services at the same time. The &lt;strong&gt;IP address helps identify the machine&lt;/strong&gt;, while the &lt;strong&gt;port identifies the network endpoint associated with a particular service&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A typical server might look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 SERVER
             203.0.113.10
                    │
       ┌────────────┼────────────┐
       ↓            ↓            ↓
     :22          :443         :3000
     SSH          HTTPS        Node.js
                                  │
                                :5432
                              PostgreSQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So when you see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IP:PORT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;don't think of the port as just a random number.&lt;/p&gt;

&lt;p&gt;Think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"I know which machine I want. Now I need to specify which network service I want to communicate with."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the fundamental purpose of network ports.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Deploy a Node.js Server on AWS EC2 with NGINX</title>
      <dc:creator>HimanshuTamoli</dc:creator>
      <pubDate>Sat, 03 Oct 2026 21:53:10 +0000</pubDate>
      <link>https://dev.to/himanshutamoli/deploy-a-nodejs-server-on-aws-ec2-with-nginx-50jf</link>
      <guid>https://dev.to/himanshutamoli/deploy-a-nodejs-server-on-aws-ec2-with-nginx-50jf</guid>
      <description>&lt;p&gt;If you have a Node.js application running locally, you can deploy it on an AWS EC2 server and make it accessible through the internet.&lt;/p&gt;

&lt;p&gt;In this guide, we will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create an AWS EC2 instance&lt;/li&gt;
&lt;li&gt;Connect to the server using SSH&lt;/li&gt;
&lt;li&gt;Install Node.js&lt;/li&gt;
&lt;li&gt;Run a Node.js application&lt;/li&gt;
&lt;li&gt;Use PM2 to keep the application running&lt;/li&gt;
&lt;li&gt;Install NGINX&lt;/li&gt;
&lt;li&gt;Configure NGINX as a reverse proxy&lt;/li&gt;
&lt;li&gt;Configure the AWS firewall&lt;/li&gt;
&lt;li&gt;Access the Node.js application using the EC2 public IP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the end, the architecture will 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;User
  |
  | HTTP Request
  ↓
NGINX :80
  |
  | Proxy
  ↓
Node.js :3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  1. Create an EC2 Instance
&lt;/h2&gt;

&lt;p&gt;Go to the AWS Console and open &lt;strong&gt;EC2&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Create a new instance.&lt;/p&gt;

&lt;p&gt;For this tutorial, you can use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AMI: Ubuntu
Instance type: t2.micro or t3.micro
Storage: 8 GB or more
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When creating the instance, make sure you create or select an SSH key pair.&lt;/p&gt;

&lt;p&gt;Download the &lt;code&gt;.pem&lt;/code&gt; file and keep it safe.&lt;/p&gt;

&lt;p&gt;You will need it to connect to the server.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Configure the Security Group
&lt;/h2&gt;

&lt;p&gt;The EC2 security group works like a firewall.&lt;/p&gt;

&lt;p&gt;Add these inbound rules:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Port&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SSH&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;My IP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTP&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;Anywhere&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTPS&lt;/td&gt;
&lt;td&gt;443&lt;/td&gt;
&lt;td&gt;Anywhere&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For testing, you can use &lt;code&gt;0.0.0.0/0&lt;/code&gt; for HTTP.&lt;/p&gt;

&lt;p&gt;For SSH, it is better to allow only your own IP instead of opening port 22 to everyone.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Connect to EC2 Using SSH
&lt;/h2&gt;

&lt;p&gt;After the instance starts, copy its public IPv4 address.&lt;/p&gt;

&lt;p&gt;It will look 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;13.234.XX.XX
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open your terminal and move to the directory containing your &lt;code&gt;.pem&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;On Linux or macOS:&lt;br&gt;
&lt;/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;400 my-key.pem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then connect:&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; my-key.pem ubuntu@YOUR_EC2_PUBLIC_IP
&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 shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-i&lt;/span&gt; my-key.pem ubuntu@13.234.XX.XX
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If everything works, you are now inside your EC2 server.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Update the Server
&lt;/h2&gt;

&lt;p&gt;First update the package list:&lt;br&gt;
&lt;/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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then upgrade existing packages:&lt;br&gt;
&lt;/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 upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Install Node.js
&lt;/h2&gt;

&lt;p&gt;The easiest way is to use NodeSource.&lt;/p&gt;

&lt;p&gt;First install curl:&lt;br&gt;
&lt;/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;curl &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then install Node.js.&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;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://deb.nodesource.com/setup_22.x | &lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; bash -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install Node.js:&lt;br&gt;
&lt;/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;nodejs &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check 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;node &lt;span class="nt"&gt;-v&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;npm &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see the installed Node.js and npm versions.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Get Your Node.js Application
&lt;/h2&gt;

&lt;p&gt;There are several ways to put your application on the EC2 server.&lt;/p&gt;

&lt;p&gt;For example, if your project is on GitHub:&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 https://github.com/USERNAME/REPOSITORY.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enter the project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;REPOSITORY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your application requires environment variables, create your &lt;code&gt;.env&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add your environment variables and save the file.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Run the Node.js Server
&lt;/h2&gt;

&lt;p&gt;Suppose your Node.js application contains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello from AWS EC2!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Server running on port 3000&lt;/span&gt;&lt;span class="dl"&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;p&gt;Start it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Server running on port 3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your application is now running on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://YOUR_EC2_PUBLIC_IP:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, we don't want users to access the application using port &lt;code&gt;3000&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is where NGINX comes in.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Why Do We Need NGINX?
&lt;/h2&gt;

&lt;p&gt;Instead of exposing your Node.js application directly, we can put NGINX in front of it.&lt;/p&gt;

&lt;p&gt;The user sends a request to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://YOUR_EC2_PUBLIC_IP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;NGINX receives the request on port &lt;code&gt;80&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;NGINX then forwards the request internally to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The flow becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser
   |
   | :80
   ↓
NGINX
   |
   | :3000
   ↓
Node.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is called a &lt;strong&gt;reverse proxy&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Install NGINX
&lt;/h2&gt;

&lt;p&gt;Install 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 &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;nginx &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check its 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;systemctl status nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it is running, you should see something similar to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Active: active (running)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also enable NGINX to start automatically when the server boots:&lt;br&gt;
&lt;/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 &lt;span class="nb"&gt;enable &lt;/span&gt;nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  10. Configure NGINX as a Reverse Proxy
&lt;/h2&gt;

&lt;p&gt;NGINX configuration files are usually stored in:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;For our application, create a new 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;nano /etc/nginx/sites-available/nodeapp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add:&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;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;_&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://localhost:3000&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;p&gt;Save the file.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Enable the Configuration
&lt;/h2&gt;

&lt;p&gt;Create a symbolic link:&lt;br&gt;
&lt;/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 ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /etc/nginx/sites-available/nodeapp /etc/nginx/sites-enabled/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The default NGINX configuration can cause conflicts, so remove 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 rm&lt;/span&gt; /etc/nginx/sites-enabled/default
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before restarting NGINX, test the 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;nginx &lt;span class="nt"&gt;-t&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;syntax is ok
test is successful
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now restart 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 &lt;/span&gt;systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  12. Keep Node.js Running with PM2
&lt;/h2&gt;

&lt;p&gt;There is one problem.&lt;/p&gt;

&lt;p&gt;If you run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and close your SSH connection, the application can stop.&lt;/p&gt;

&lt;p&gt;We need a process manager.&lt;/p&gt;

&lt;p&gt;Install PM2:&lt;br&gt;
&lt;/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;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; pm2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start your application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pm2 start server.js &lt;span class="nt"&gt;--name&lt;/span&gt; nodeapp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check the process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pm2 status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Save the PM2 process list:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pm2 save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configure PM2 to start automatically after a server reboot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pm2 startup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PM2 will give you a command.&lt;/p&gt;

&lt;p&gt;Copy and run that command.&lt;/p&gt;

&lt;p&gt;Then run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pm2 save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now your Node.js application can automatically restart after a server reboot.&lt;/p&gt;

&lt;h2&gt;
  
  
  13. Access Your Application
&lt;/h2&gt;

&lt;p&gt;Open your browser and visit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://YOUR_EC2_PUBLIC_IP
&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;http://13.234.XX.XX
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The request flow is now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Internet
    |
    ↓
AWS EC2
    |
    ↓
NGINX :80
    |
    ↓
Node.js :3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You don't need to expose port &lt;code&gt;3000&lt;/code&gt; publicly.&lt;/p&gt;

&lt;p&gt;NGINX communicates with Node.js internally through:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  14. Important AWS Security Group Configuration
&lt;/h2&gt;

&lt;p&gt;At this point, your EC2 security group should have something similar to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SSH     22     Your IP
HTTP    80     0.0.0.0/0
HTTPS   443    0.0.0.0/0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You do &lt;strong&gt;not&lt;/strong&gt; need to expose port &lt;code&gt;3000&lt;/code&gt; to the internet.&lt;/p&gt;

&lt;p&gt;This is an important difference:&lt;br&gt;
&lt;/p&gt;

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

Internet → NGINX :80

Private:

NGINX → Node.js :3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  15. Useful NGINX Commands
&lt;/h2&gt;

&lt;p&gt;Check NGINX 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;systemctl status nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start 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 &lt;/span&gt;systemctl start nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Stop 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 &lt;/span&gt;systemctl stop nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart 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 &lt;/span&gt;systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test 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;nginx &lt;span class="nt"&gt;-t&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  16. Useful PM2 Commands
&lt;/h2&gt;

&lt;p&gt;Check applications:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pm2 status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;View logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pm2 logs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pm2 restart nodeapp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Stop application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pm2 stop nodeapp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Delete application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pm2 delete nodeapp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  17. Common Problems
&lt;/h2&gt;

&lt;h3&gt;
  
  
  NGINX shows 502 Bad Gateway
&lt;/h3&gt;

&lt;p&gt;A &lt;code&gt;502 Bad Gateway&lt;/code&gt; usually means NGINX cannot reach your Node.js application.&lt;/p&gt;

&lt;p&gt;Check whether Node.js 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;pm2 status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also test the application directly from the EC2 server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If this doesn't return your application response, fix the Node.js application first.&lt;/p&gt;

&lt;h3&gt;
  
  
  NGINX configuration error
&lt;/h3&gt;

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

&lt;/div&gt;



&lt;p&gt;It will tell you where the configuration problem is.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cannot access the EC2 IP
&lt;/h3&gt;

&lt;p&gt;Check your AWS security group.&lt;/p&gt;

&lt;p&gt;Make sure port &lt;code&gt;80&lt;/code&gt; is allowed.&lt;/p&gt;

&lt;p&gt;Also check 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 &lt;/span&gt;systemctl status nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Node.js application stopped
&lt;/h3&gt;

&lt;p&gt;Check PM2:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pm2 status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then 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;pm2 logs nodeapp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  18. Final Architecture
&lt;/h2&gt;

&lt;p&gt;After completing everything, your deployment 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;                   INTERNET
                       |
                       |
                 Public IP :80
                       |
                       ↓
                  ┌─────────┐
                  │  NGINX  │
                  │  :80    │
                  └────┬────┘
                       |
                       | Reverse Proxy
                       ↓
                  ┌─────────┐
                  │ Node.js │
                  │  :3000  │
                  └─────────┘
                       |
                       ↓
                    Your App
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;&lt;strong&gt;NGINX handles incoming HTTP requests, while Node.js handles your application logic.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can later add a domain name and HTTPS on top of this setup using Let's Encrypt and Certbot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;You now have a Node.js application running on an AWS EC2 server with NGINX acting as a reverse proxy.&lt;/p&gt;

&lt;p&gt;The basic production flow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User
 ↓
Domain / Public IP
 ↓
NGINX
 ↓
Node.js
 ↓
Database / External Services
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This setup is a good foundation for learning real-world server deployment before moving to more advanced tools such as Docker, load balancers, CI/CD, and Kubernetes.&lt;/p&gt;

&lt;p&gt;Want the Video Walkthrough?&lt;/p&gt;

&lt;p&gt;If you prefer following the process visually, I have also explained the deployment in more detail in this &lt;br&gt;
video: &lt;a href="https://www.youtube.com/watch?v=4cgvi_uCKiA" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=4cgvi_uCKiA&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Watch the detailed AWS EC2 + NGINX + Node.js deployment video&lt;/p&gt;

&lt;p&gt;You can follow this article alongside the video and execute each command directly on your EC2 instance.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>learning</category>
    </item>
    <item>
      <title>Public vs Private Keys: What’s the Difference?</title>
      <dc:creator>HimanshuTamoli</dc:creator>
      <pubDate>Sat, 26 Sep 2026 13:36:27 +0000</pubDate>
      <link>https://dev.to/himanshutamoli/public-vs-private-keys-whats-the-difference-4n4h</link>
      <guid>https://dev.to/himanshutamoli/public-vs-private-keys-whats-the-difference-4n4h</guid>
      <description>&lt;p&gt;Cryptography uses keys to protect information and verify identities. One of the most important concepts is the difference between public-key cryptography and private-key (symmetric) cryptography.&lt;/p&gt;

&lt;p&gt;Public-Key Cryptography&lt;/p&gt;

&lt;p&gt;Public-key cryptography uses two mathematically related keys:&lt;/p&gt;

&lt;p&gt;Public key — can be shared with anyone.&lt;br&gt;
Private key — must be kept secret.&lt;/p&gt;

&lt;p&gt;For example, if someone wants to send you encrypted information, they can use your public key to encrypt it. The corresponding private key can then be used to decrypt it.&lt;/p&gt;

&lt;p&gt;Where is it used?&lt;/p&gt;

&lt;p&gt;Public-key cryptography is commonly associated with:&lt;/p&gt;

&lt;p&gt;Digital signatures — a private key creates a signature, while the public key verifies it.&lt;br&gt;
HTTPS — public-key cryptography is involved in establishing secure web connections.&lt;br&gt;
Secure email and messaging — systems such as PGP and S/MIME use public-key cryptography.&lt;br&gt;
Advantages&lt;br&gt;
The public key can be distributed openly.&lt;br&gt;
It avoids needing to secretly exchange the same key beforehand.&lt;br&gt;
It supports digital signatures and authentication.&lt;br&gt;
Disadvantages&lt;/p&gt;

&lt;p&gt;Public-key operations are generally more computationally expensive than symmetric encryption, and managing keys and trust can become complex.&lt;/p&gt;

&lt;p&gt;Private-Key / Symmetric Cryptography&lt;/p&gt;

&lt;p&gt;Symmetric cryptography uses one shared secret key.&lt;/p&gt;

&lt;p&gt;Both the sender and receiver use the same key:&lt;/p&gt;

&lt;p&gt;Sender&lt;br&gt;
   │&lt;br&gt;
   │ Encrypt with secret key&lt;br&gt;
   ▼&lt;br&gt;
Encrypted Data&lt;br&gt;
   │&lt;br&gt;
   │ Decrypt with same key&lt;br&gt;
   ▼&lt;br&gt;
Receiver&lt;/p&gt;

&lt;p&gt;The key must be kept secret by everyone who has access to it.&lt;/p&gt;

&lt;p&gt;Examples&lt;/p&gt;

&lt;p&gt;Common examples include:&lt;/p&gt;

&lt;p&gt;AES — widely used for modern data encryption.&lt;br&gt;
DES — an older encryption standard that has largely been replaced by AES.&lt;br&gt;
File encryption — symmetric encryption is commonly used to protect files and stored data.&lt;br&gt;
Advantages&lt;br&gt;
Very fast compared with public-key operations.&lt;br&gt;
Well suited for encrypting large amounts of data.&lt;br&gt;
Efficient for applications that require high-speed encryption.&lt;br&gt;
Disadvantages&lt;/p&gt;

&lt;p&gt;The biggest challenge is securely sharing the secret key. If the key is compromised, data protected with that key can also be compromised.&lt;/p&gt;

&lt;p&gt;Public Key vs Private Key&lt;br&gt;
Feature Public-Key Cryptography Symmetric Cryptography&lt;br&gt;
Keys    Public + private key pair   One shared secret key&lt;br&gt;
Key sharing Public key can be shared    Secret key must remain private&lt;br&gt;
Speed   Generally slower    Generally faster&lt;br&gt;
Digital signatures  Supported   Not the same mechanism&lt;br&gt;
Main challenge  Key/trust management    Secure key exchange&lt;br&gt;
Common uses HTTPS, digital signatures, secure email AES, file/data encryption&lt;/p&gt;

&lt;p&gt;The source distinguishes the two approaches primarily by their key structure, performance, key management, and applications.&lt;/p&gt;

&lt;p&gt;The Simple Way to Remember&lt;/p&gt;

&lt;p&gt;Think of public-key cryptography as having two different keys:&lt;/p&gt;

&lt;p&gt;Public key → share it&lt;br&gt;
Private key → keep it secret&lt;/p&gt;

&lt;p&gt;With symmetric cryptography:&lt;/p&gt;

&lt;p&gt;One secret key → both sides use it&lt;/p&gt;

&lt;p&gt;Understanding this distinction is important when learning technologies such as SSH, HTTPS, TLS, digital signatures, and encryption systems.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>infosec</category>
      <category>security</category>
    </item>
  </channel>
</rss>
