Enter your domain name like ( yourdomainname.com) and then click on create a new record button
Now again visit hosted zone home page and there you will see your domain. Click on it and then create a new record
Add your ec2 ipaddress in the box and save it ( by clicking on the new record button )
After creating the record, select nameserver and change the name server of your domain ( explained in more detail below. Check it there )
Done
Detail Explanation to assign domain name to the ec2 instance
Go to the AWS Route53 service
2. Select a hosted zone
3. Create a new hosted zone
4. Enter your domain name like ( yourdomainname.com )
5. Now again visit hosted zone home page and there you will see your domain. Click on it and then create a new record
2 images attached
6. Add your ec2 ipaddress in the box
7. After creating the record, select nameserver and change the name server of your domain ( explained in more detail below. Check it there )
Your name server ( don’t put (dot . ) at the end of the domain and if the dot is present then remove it
On AWS dot is present at the end of the domain like
ns-1100.awsdns-09.org(.)
remove that dot and your original nameserver name is
ns-1100.awsdns-09.org
Now go to your domain provider and click on manage DNS after it click on change nameserver and pastes all of the nameserver URL in the fields
8. Done After following all the steps, you can wait 2-3 minutes, and then you can open your URL. Your website will be live now. If you don’t see the updated website then wait 1-2 hours because your cache is causing the problem
Optional
You can also add www CNAME in your domain name
steps
Select your domain present in hosted zone and then you will see lots of records
Click on a new record
In the subdomain section, write www, and in the route type select CNAME
Enter your domain name in the big section and then save it.
How to assign SSL to the domain name on Route53
Steps to generate a certificate in AWS
1- Visit the Certificate Manager page by searching it
2- Steps to issue a certificate
Before creating the certificate please make sure you are using the N-virginia server instead of Global or any another location
Click on the request certificate button
request a public certificate
Enter your domain name like yourdomainname.com and one more record for all subdomains like *.yourdomainname.com
3- Domain verification to issue a certificate
Steps
Next, to verify your domain, open route53, open hosted zones, select domain and then create new record
In the subdomain section enter the CNAME name value, select CNAME in the dropdown, and then enter the CNAME value in the big text
Again create a new record and in the subdomain write ( * ), select CNAME in the dropdown, and then enter the CNAME value in the big text
Steps to assign Certificate to the domain name in AWS
In order to assign a certificate to the domain name, we will use CloudFront.
Steps
Visit CloudFront
Create new distribution
In the origin domain, enter your ec2 public address which you can get (picture is attached
to get public ipv4 address
In protocol section, select only HTTP
In Viewer section, select on redirect HTTP to HTTPS
In Allow HTTP methods, select GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE
Enter the alternate domain name ( yourdomainname.com and *.yourdomainname.com )
enter domain name in cloudFront
In Custom SSL, select your custom certificate
if your certificate is not visible, create a new one and select location N-Virginia – us-east-1 during certificate creation
Now our CloudFront part is completed. Only the last step is required in route53 to complete the encryption setup
Before visiting the route53, make sure your new distribution status will not be deploying
Visit route53 and edit the record which is pointing toward the IP of your ec2 instance
allow alias
Search Cloud front and select it
In choose distribution field, choose your distribution which was created specifically to encrypt the particular domain
and then update the record.
Wait 3-5 mins to setup everything up. After it, you will see encryption on your website.
If you still facing the problem, you can reach out to me, I will help you to solve your problem. Thanks
Open ec2 service and on the left side there is an instances section, click on it
aws ec2 instances block
Step-2
Click on the launch instance button
to create new instance in aws
Step-3
Enter name, select amazon Linux, key pair ( make sure your key-pair name should be the same name as your username otherwise you would face a problem), and then allow traffic from all sources ( SSH, HTTP, HTTPS ).
allow traffic from all sources during creation of the ec2 instance
Step-4
launch the instance and wait 2-5 minutes for proper completion
How to connect with ec2 instance by ssh
First select instance and then click on connect button at the top of the table
ec2 instance connect button to go into the connection page
After redirecting to the connection page, select the ssh tab and follow all the steps which are mentioned. (step-3 and the example are important to connect your terminal with the instance ) but if you are using Windows you can connect with the ec2 instance by putty.
Environment setup to run MERN application on AWS ( ec2 instance )
in order to check whether Nginx is working or not, do the following steps
When the Nginx service is stopped, you will get the following message:
curl localhost:80
if your nginx is not working then you will see the following error
[root@ip-ADDRESS ec2-user]# curl localhost:80
curl: (7) Failed to connect to localhost port 80 after 0 ms: Connection refused
So, let’s start the Nginx service:
sudo service nginx start
and then type
curl localhost:80
You will get an HTML page
You can also see the HTML page by visiting the public ipaddress of your ec2 instance
If you are not seeing the html page then you need to allow port 80 in your security group.
-> visit ec2 -> select instance -> on the bottom -> select security -> scroll down -> click on group name -> scroll and then click on edit inbound rule -> allow http and https both
Still, if you are facing the problem, recreate your instance with the following settings
create a new security group -> allow HTTP, HTTPS, and ssh
Steps to change the default Nginx config file to deploy the MERN application
First, open the config file by entering the following command
sudo nano /etc/nginx/nginx.conf
and paste the following code in the config file and change the port number according to your used port number. I am using 3000 for frontend and 8000 for the backend
complete Nginx config code to deploy the MERN application
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
server {
listen 80;
listen [::]:80;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location /api {
rewrite /api/(.*) /$1 break;
proxy_pass http://localhost:8000;
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;
}
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;
}
error_page 404 /404.html;
#location = /404.html {
#}
error_page 500 502 503 504 /50x.html;
#location = /50x.html {
#}##
}
# Settings for a TLS enabled server.
#
# server {
# listen 443 ssl http2;
# listen [::]:443 ssl http2;
# server_name _;
# root /usr/share/nginx/html;
#
# ssl_certificate "/etc/pki/nginx/server.crt";
# ssl_certificate_key "/etc/pki/nginx/private/server.key";
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 10m;
# ssl_ciphers PROFILE=SYSTEM;
# ssl_prefer_server_ciphers on;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# error_page 404 /404.html;
# location = /40x.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }
}
reload your Nginx
sudo systemctl reload nginx
after it, when you will visit your public ip address then you will see 502 bad gateway error, it’s mean everything is ready now we need to run our frontend and backend application
Procedure to clone project repo
sudo yum install git
if your repo is public then you only need to run the git clone command but if your repo is private do the following steps
generate ssh key
ssh-keygen -t ed25519 -C "your_email@example.com"
go to your .ssh folder
cd ~/.ssh
now copy your id_ed25519.pub by running the following command
cat id_ed25519.pub
add this to your github account
visit your github profile -> go to settings by clicking on the top right corner of your profile -> select ssh and GPG keys -> click on new ssh key button -> paste the public key on the description box and you can add any name
Now clone your repo by ssh URL
go to your frontend and install all the packages but if you find an error in installing the packages then do the following steps
after it adds the following config in your frontend folder, push it to your GitHub repo and then run the git pull origin master command so you can pull the latest changes in your ec2 server
after pulling the latest changes in your ec2 server then run the following command to run your frontend but before this make sure your react app knows your latest backend URL and your latest backend URL will be like /api
npm run start:production
for this, I will suggest your code must get the URL from the env file and you only need to update your env file to update the backend URL
you can create an env file in your frontend folder or backend folder like
nano .env
paste your .env variables in your env file and then press
control X
press y
press enter
it will create your .env file
npm run start:production
if you want to check whether your react app is working or not then run the following commands
pm2 logs
Similarly, we will run the node app
First, copy the following app.config.json code in your node project and push the latest changes in your github repo and then pull it in your ec2 instance
if you want to check whether your node app is working or not then run the following commands
pm2 logs
Running Demo
now you can visit the public ipaddress again and you will see your website
In the next upcoming lecture, I will show you how you can assign a domain and encrypt your domain properly. I will also write an article on how you can create a pipeline so you don’t need to do these steps again and again instead of it you only need to push the code into your repo and everything will occur automatically.
if you like my article, connect me on LinkedIn and share it with your friends😊