<?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: Sarthak</title>
    <description>The latest articles on DEV Community by Sarthak (@sarthug).</description>
    <link>https://dev.to/sarthug</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3282585%2F7fa2859c-db49-47b7-96eb-6a82f63c1709.webp</url>
      <title>DEV Community: Sarthak</title>
      <link>https://dev.to/sarthug</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sarthug"/>
    <language>en</language>
    <item>
      <title>Some Basic React Concepts!!</title>
      <dc:creator>Sarthak</dc:creator>
      <pubDate>Thu, 12 Feb 2026 12:44:48 +0000</pubDate>
      <link>https://dev.to/sarthug/some-basic-react-concepts-29gf</link>
      <guid>https://dev.to/sarthug/some-basic-react-concepts-29gf</guid>
      <description>&lt;p&gt;Lets Start with Whyyy React??&lt;br&gt;
First of all React is a &lt;strong&gt;"LIBRARY"&lt;/strong&gt;...as &lt;u&gt;JS library&lt;/u&gt; to maintain frontend efficiently.&lt;/p&gt;

&lt;p&gt;Before modern UI libraries, updating a webpage could feel messy. Even small UI changes often required manual DOM manipulation — tedious, error-prone, and hard to scale. As applications grew, keeping everything in sync became a real challenge.&lt;/p&gt;

&lt;p&gt;Whenever any state is changed(think of state as a component's memory)...React compares the old virtual DOM and the new one and renders only the required changes...&lt;br&gt;
This update process is called &lt;strong&gt;Reconciliation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Lets Start from scratch...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Components:&lt;/strong&gt;Reusable code segment or a function that returns JSX.Yeah just simple as that...&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;JSX:&lt;/strong&gt;Markup Syntax Extension for Javascript that lets you write HTML like syntax inside a Javascript file.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note:A component can't return multiple JSX tags - instead wrap them in a single &lt;/p&gt; container.

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Props:&lt;/strong&gt;React components use props to interact with each other. Similar to passing parameters to a function just a little less stricter.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;State:&lt;/strong&gt;Components often need to change what's on screen as a result of interaction.To make changes to interactions it needs a memory to remember the state of a variable before interaction...Thats is...&lt;strong&gt;State is a component's memory&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hooks:&lt;/strong&gt;We add a state variable by&lt;br&gt;
&lt;code&gt;const [index, setIndex] = useState(0);&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here, &lt;code&gt;index&lt;/code&gt; represents the current state value, while &lt;code&gt;setIndex&lt;/code&gt; is the function used to update that state. Both are returned by React’s &lt;code&gt;useState&lt;/code&gt; Hook, which allows functional components to store and manage state.&lt;/p&gt;

&lt;p&gt;Some commonly used hooks-&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;u&gt;useState()-&lt;/u&gt;State hook , manages states&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;u&gt;useContext()-&lt;/u&gt;Context hooks , use data passed through context.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;u&gt;useRef()-&lt;/u&gt;Reference hooks , Used to reference objects..&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;You can even implement your own hooks..&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Exports:&lt;/strong&gt;Whenever you build a component you need to export it so  that it can be imported and used in other pages/files.But exporting follows two methods-&lt;br&gt;
1)Default:Only 1 function per object can be exported by this method.&lt;br&gt;
2)Named:Multiple functions can be exported but with different names.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Effects:&lt;/strong&gt;Rendering is React’s main job: state changes → UI updates. Simple.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But real apps don’t just render stuff. They fetch data, start timers, listen for events, or update the page title. These actions are called side effects — work that happens outside the UI itself.&lt;/p&gt;

&lt;p&gt;That’s where the useEffect Hook comes in.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;useEffect(() =&amp;gt; {&lt;br&gt;
  console.log("Component updated!");&lt;br&gt;
}, []);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The function inside useEffect runs after React finishes rendering. This keeps your UI logic clean while still letting your component do real-world work.&lt;/p&gt;

&lt;p&gt;The dependency array controls when the effect runs:&lt;/p&gt;

&lt;p&gt;[] → run once after the first render&lt;/p&gt;

&lt;p&gt;[value] → run when that value changes&lt;/p&gt;

&lt;p&gt;no array → run after every render&lt;/p&gt;

&lt;p&gt;Think of useEffect as React saying:&lt;br&gt;
“Render first… then handle everything else.”&lt;/p&gt;

&lt;p&gt;That's some basic intro to React library...but ofcourse you need to deepdive more...&lt;br&gt;
&lt;a href="https://react.dev/learn" rel="noopener noreferrer"&gt;https://react.dev/learn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Refer to this and keep learning...&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>development</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>What other platforms do devs use for tech blogs???</title>
      <dc:creator>Sarthak</dc:creator>
      <pubDate>Tue, 23 Dec 2025 06:11:52 +0000</pubDate>
      <link>https://dev.to/sarthug/what-other-platforms-do-devs-use-for-tech-blogs-129b</link>
      <guid>https://dev.to/sarthug/what-other-platforms-do-devs-use-for-tech-blogs-129b</guid>
      <description></description>
    </item>
    <item>
      <title>OS and Hardware Interaction( Kernel and Drivers )</title>
      <dc:creator>Sarthak</dc:creator>
      <pubDate>Thu, 11 Dec 2025 18:06:44 +0000</pubDate>
      <link>https://dev.to/sarthug/os-and-hardware-interaction-hb9</link>
      <guid>https://dev.to/sarthug/os-and-hardware-interaction-hb9</guid>
      <description>&lt;p&gt;Ever wondered how your operating system is interacting with bluetooth or wifi card!!!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let's begin with a simple scenario:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Assume you want to connect your bluetooth headphones to your PC,you click on connect button and get message like "Connected" or "Unable to connected"....&lt;/p&gt;

&lt;p&gt;What happened in between your click and message is:&lt;br&gt;
UserActions --&amp;gt; UI Framework --&amp;gt; UserSubsystem makes Systemcalls --&amp;gt; Kernel Mode --&amp;gt; Kernel calls respective drivers --&amp;gt; Hardware&lt;/p&gt;

&lt;p&gt;Seems easy???Nahh its not!&lt;br&gt;
Your user subsytem makes a system call to access the hardware which is passed to kernel.Thats when the main part kicks in.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Lets deep dive into &lt;strong&gt;kernel&lt;/strong&gt; first:&lt;br&gt;
&lt;/u&gt;&lt;br&gt;
Kernel is usually not a layered structure....its a mixture of modular,monolithic as well as layered structure....but layered approach help us understand the working of kernel easily.&lt;br&gt;
On receiving a system call:&lt;/p&gt;

&lt;p&gt;&lt;u&gt;1. Kernel Syscall Dispatcher gets control:&lt;br&gt;
&lt;/u&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Validates system call number and details.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pointer lookup-Can be said that this maps syscalls to C functions..(Ofcourse its all code that works underneath)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;u&gt;2. Syscall Handler Invoked:&lt;br&gt;
&lt;/u&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Kernel Subsystem takes over which has different layers like VFS(virtual file system),Network Stack,Memory Subsystem,Process Scheduler,Device Management&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Depending on the system call , it enters a layer&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;u&gt;3.Driver Call&lt;br&gt;
&lt;/u&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Drivers dont directly recieve a systemcall.&lt;/li&gt;
&lt;li&gt;They receive instructions from kernel subsystem(VFSops,netdevops etc)
Ex:To access hardwares Device Management layer is accessed in kernel which usually creates an ioctlops which is passed to suitable drivers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the job doesn't end here....Kernels interact with drivers which then interact with hardware.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Lets deep dive into &lt;strong&gt;drivers&lt;/strong&gt; too:&lt;br&gt;
&lt;/u&gt;Drivers don't have any specific structure,it depends on the hardware that the driver deals with.&lt;br&gt;
But flow of operations usually remains same in all drivers-&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Register itself with kernel
That function basically walks up to the kernel like:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;“Heyy kernel, I'm a driver for this kind of device.&lt;br&gt;
If you ever see hardware with this ID, call me.”&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create ops Table (Collection of function pointers that driver gives to kernel)
Think of it like the driver saying:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;“Hey kernel, if you want me to do X, call this function.&lt;br&gt;
If you want Y, call that one.&lt;br&gt;
If you ask for Z, here’s the address of the function.”&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Initialize Hardware (Inside probe() function)
Once the kernel matches driver ↔ hardware, it calls the driver’s probe().
This is where the driver:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;1) maps MMIO registers&lt;/p&gt;

&lt;p&gt;2) requests interrupts (request_irq())&lt;/p&gt;

&lt;p&gt;3) allocates kernel memory&lt;/p&gt;

&lt;p&gt;4) resets/initializes the hardware&lt;/p&gt;

&lt;p&gt;5) registers itself into kernel subsystems (netdev, blockdev, char device, etc.)&lt;/p&gt;

&lt;p&gt;Think of probe() like the driver moving into its apartment and setting up the furniture.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Handle Interrupts
Hardware doesn’t politely send emails. It screams at the CPU.
So the driver registers an interrupt handler:
request_irq(irq_number, my_handler, ...)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When hardware finishes something (packet received, DMA complete, buffer empty):&lt;br&gt;
→ CPU triggers interrupt&lt;br&gt;
→ Kernel interrupt manager dispatches&lt;br&gt;
→ Driver’s interrupt handler runs&lt;br&gt;
→ Driver processes event&lt;br&gt;
→ Notifies the proper kernel subsystem&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data Transfer (MMIO / DMA)
Drivers use:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MMIO → read/write registers directly&lt;/p&gt;

&lt;p&gt;DMA → tell hardware to perform large data transfers without CPU babysitting&lt;/p&gt;

&lt;p&gt;Driver sets these up, kernel keeps everything safe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens when the Linux subsystem sends an ioctl (or any ops-table call) to the driver?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;User calls ioctl() → enters kernel through the syscall interface.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Kernel checks the file descriptor → finds which device/driver it belongs to.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Kernel looks up the driver’s ops table (like .unlocked_ioctl).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Kernel calls the driver function via the ops pointer (no direct linking, just a function pointer jump).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Driver processes the command (configure hardware, read/write registers, trigger DMA, etc.).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Driver returns output/status back to the kernel.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Kernel returns the result to the user application.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And thats how you interact with hardwares...&lt;br&gt;
&lt;strong&gt;Some references for further exploring:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://elixir.bootlin.com/linux/v6.18/source/drivers/usb/core/usb.c" rel="noopener noreferrer"&gt;https://elixir.bootlin.com/linux/v6.18/source/drivers/usb/core/usb.c&lt;/a&gt;&lt;br&gt;
&lt;a href="https://eng.libretexts.org/Bookshelves/Computer_Science/Operating_Systems/Linux_-_The_Penguin_Marches_On_(McClanahan)/06:_Kernel_Module_Management/1.03:_Linux_Kernel_Subsystem" rel="noopener noreferrer"&gt;https://eng.libretexts.org/Bookshelves/Computer_Science/Operating_Systems/Linux_-_The_Penguin_Marches_On_(McClanahan)/06:_Kernel_Module_Management/1.03:_Linux_Kernel_Subsystem&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kernel</category>
      <category>lowlevelprogramming</category>
      <category>linux</category>
      <category>devicedrivers</category>
    </item>
    <item>
      <title>Deploying My WebApp on Cloud using Nginx</title>
      <dc:creator>Sarthak</dc:creator>
      <pubDate>Sat, 21 Jun 2025 18:07:57 +0000</pubDate>
      <link>https://dev.to/sarthug/deploying-my-webapp-on-cloud-using-nginx-4jdd</link>
      <guid>https://dev.to/sarthug/deploying-my-webapp-on-cloud-using-nginx-4jdd</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;During my first internship, I was asked to deploy my project to the cloud. What seemed like a straightforward task quickly turned into a maze — I had to go through 10 different resources, and each one only answered some part of the puzzle.&lt;/p&gt;

&lt;p&gt;In this post, I’ll walk you through the complete deployment process I followed — including the problems I faced and how I solved them — so you don’t have to go through the same hassle.&lt;/p&gt;

&lt;h4&gt;
  
  
  Where I Started
&lt;/h4&gt;

&lt;p&gt;After lots of debugging and testing, both my backend and frontend were working perfectly on my local machine. The next step was deployment — and that’s where things got interesting.&lt;/p&gt;

&lt;h2&gt;
  
  
  1)Dockerisation:
&lt;/h2&gt;

&lt;p&gt;I was asked to follow best practices for deployment, so instead of cloning the entire app directly onto the server, I decided to dockerize it.&lt;/p&gt;

&lt;p&gt;Create a Dockerfile:&lt;br&gt;
Your Dockerfile will depend on your codebase. Since I was working with Node.js, here’s a basic structure for a Node.js Dockerfile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 1. Base image
FROM node:18

# 2. Set working directory
WORKDIR /app

# 3. Copy package files and install dependencies
COPY package*.json ./
RUN npm install

# 4. Copy the rest of the app
COPY . .

# 5. Expose a port
EXPOSE 3000

# 6. Start the app
CMD ["npm", "start"]

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

&lt;/div&gt;



&lt;p&gt;One interesting thing I learned was copying package.json before running npm install, and copying the rest of the code later. This allows Docker to cache the dependencies layer, speeding up builds — a best practice in Dockerfile design.&lt;/p&gt;

&lt;p&gt;Now I needed to build this docker .Assuming you have docker already installed in your local machines , here's a basic command to build and run an image .&lt;/p&gt;

&lt;p&gt;Build the image (name it whatever you want)&lt;br&gt;
&lt;code&gt;&lt;br&gt;
docker build -t my-app .&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Run the app&lt;br&gt;
&lt;code&gt;&lt;br&gt;
docker run -p 3000:3000 my-app&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
If your container is running fine, you can push the image to Docker Hub and then pull it on your server. (Think of Docker–Docker Hub like Git–GitHub.)&lt;/p&gt;

&lt;p&gt;Once your image is on your server...&lt;br&gt;
🎉 CONGRATS! You’ve completed Phase 1.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Some problems you may face while dockerisation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Frontend builds can be tricky — different libraries and versions may cause conflicts or build errors.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Environment variables need to be handled carefully. You can pass them using flags like:&lt;br&gt;
&lt;code&gt;docker run --env-file .env my-app&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2)Reverse Proxy:
&lt;/h2&gt;

&lt;p&gt;Once your image is running on lets assume port 3000 of your server system (lets assume ubuntu),You can try to access the server with its public ip , but wait wait wait.......We can only access the port on which the app is running, in our case its 3000.&lt;br&gt;
Here's where reverse proxy comes to play,forwarding requests to the required port.&lt;/p&gt;

&lt;p&gt;I used Nginx (pronounced as engineX)for that,&lt;strong&gt;but capabilities of nginx does'nt stop here,its also a&lt;/strong&gt;&lt;br&gt;
🖥️ Web server&lt;br&gt;
🔁 Reverse proxy (passes requests to another server)&lt;br&gt;
⚖️ Load balancer (shares traffic across multiple servers)&lt;br&gt;
🔐 SSL handler (helps secure your website)&lt;br&gt;
📦 Cache (speeds things up by storing responses)&lt;br&gt;
It’s lightweight, fast, and used by companies like Netflix, Dropbox, and WordPress. Pretty cool for something I hadn’t heard of before this task!&lt;/p&gt;

&lt;h2&gt;
  
  
  3)Setting Up Nginx
&lt;/h2&gt;

&lt;p&gt;Let’s set up Nginx for reverse proxy only for now — I’ll cover Load Balancing and SSH handling in future blogs.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Install Nginx&lt;br&gt;
&lt;code&gt;sudo apt install nginx&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Start and Enable Nginx&lt;br&gt;
&lt;code&gt;sudo systemctl start nginx&lt;br&gt;
sudo systemctl enable nginx&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check its status by&lt;br&gt;
&lt;code&gt;sudo systemctl status nginx&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;If the output is something like this 🎉 CONGRATS your nginx is up and running.&lt;/p&gt;

&lt;h2&gt;
  
  
  4)Setting up Reverse Proxy
&lt;/h2&gt;

&lt;p&gt;Just a little more and it will be done...&lt;br&gt;
-lets open the Nginx default config file&lt;br&gt;
&lt;code&gt;sudo nano /etc/nginx/sites-available/default&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;-Replace or edit the server block similar to this&lt;br&gt;
`server {&lt;br&gt;
    listen 80;&lt;br&gt;
    server_name &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;location / {
    proxy_pass http://localhost:3000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
`&lt;br&gt;
Note that we have not setup the SSL certificate yet and only HTTP requests are working...and HTTP requests are received at port 80 so thats why we have mentioned listen 80 there.&lt;/p&gt;

&lt;p&gt;Press &lt;strong&gt;ctrl+O&lt;/strong&gt; then &lt;strong&gt;Enter&lt;/strong&gt; then &lt;strong&gt;ctrl+X&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;-Test the config to check for any errors&lt;br&gt;
&lt;code&gt;sudo nginx -t&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fad4r95cmcik63087sw0c.png" class="article-body-image-wrapper"&gt;&lt;img 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%2Fad4r95cmcik63087sw0c.png" alt=" " width="623" height="147"&gt;&lt;/a&gt;&lt;br&gt;
If your output is like this....Good going&lt;/p&gt;

&lt;p&gt;-&lt;strong&gt;Last Step&lt;/strong&gt;&lt;br&gt;
Restart the nginx server&lt;br&gt;
&lt;code&gt;sudo systemctl reload nginx&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now test it out on a browser&lt;br&gt;
&lt;code&gt;http://&amp;lt;your-public-ip&amp;gt;/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Enjoy your app from any device, anywhere in the world! 📱💻🖥️&lt;/p&gt;

&lt;h2&gt;
  
  
  NOTE:
&lt;/h2&gt;

&lt;p&gt;We've only served your app using the server's public IP for now.&lt;br&gt;
In upcoming blogs, I’ll show you how to:&lt;/p&gt;

&lt;p&gt;Add a custom domain &lt;/p&gt;

&lt;p&gt;Enable HTTPS requests with SSL &lt;/p&gt;

&lt;p&gt;Set up load balancing &lt;/p&gt;

&lt;p&gt;And much more...&lt;/p&gt;

&lt;p&gt;Till then — all the best! 🚀👨‍💻&lt;/p&gt;

</description>
      <category>devops</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>cloudcomputing</category>
    </item>
  </channel>
</rss>
