DEV Community

Cover image for Develop A Website Using Multipass Virtual Machine
Michael Mathews
Michael Mathews

Posted on • Edited on

Develop A Website Using Multipass Virtual Machine

If you read the previous article in this series, Create An Ubuntu Virtual Machine with Multipass, you should now have a fresh Ubuntu instance running as a virtual machine on your Mac. In this article we will set up a quick development environment to allow us to build and test a website.

Install the Web Server

We will use nginx as our web server. We have a new Ubuntu virtual machine to run it on, so let's open a shell connection and run the installation steps.

First decide which VM instance you want to connect to, use multipass ls to get a list of all your instances. Note the name of the instance, and check that it is running. In my case I will connect to my instance named vm-ubuntu20.

Use the multipass sh command to open a shell connection.

% multipass sh vm-ubuntu20
  Welcome to Ubuntu 20.04.5 LTS (GNU/Linux 5.4.0-126-generic aarch64)
  ...
Enter fullscreen mode Exit fullscreen mode

Now run the standard commands to install the nginx software package. (Note that these commands are running in your virtual machine, so no software will be installed on your real machine.)

$ sudo apt update
$ sudo apt install nginx
Enter fullscreen mode Exit fullscreen mode

You should now have an nginx web server running on your virtual machine. Refer back to the output of multipass ls and you will see the IP address of your instance. In my case the IPV4 is 192.168.64.2 so I can now go to http://192.168.64.2 in a web browser on my real machine and see the default "Welcome to nginx!" holding page.

Mount Your Working Folder to Your VM Server

My goal is to use my real machine to build and edit the files used in my website, meaning the work will happen in my MacOS environment, but then to have that folder served from the web server running on the virtual machine. To accomplish this I will share my local working folder with the virtual machine, so that the files there are available to both machines. I will use the multipass mount command to share my working folder, at ~/workspace/vm-ubuntu20/app, with the virtual machine folder at /var/www/app.

% multipass mount ~/workspace/vm-ubuntu20/app vm-ubuntu20:/var/www/app
Enter fullscreen mode Exit fullscreen mode

Add Some App Files

Now whatever files we create in ~/workspace/vm-ubuntu20/app will also be available to the virtual machine instance named "vm-ubuntu20" in the /var/www/app folder. For example, if I create a simple index.html file in ~/workspace/vm-ubuntu20/app and then use multipass sh to connect to my virtual machine instance, I see that same file appears at /var/www/app/index.html.

Configure the Nginx Host

We need to tell nginx about this new website we want it to serve for us from the /var/www/app folder. From a shell connected to the virtual machine instance, we crate a new nginx configuration file.

$ sudo vim /etc/nginx/sites-available/app
Enter fullscreen mode Exit fullscreen mode

The contents of that file are shown below:

server {
    listen 80;
    listen [::]:80;

    server_name app.test;

    root /var/www/app;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}
Enter fullscreen mode Exit fullscreen mode

This means that nginx will serve files from /var/www/app – our mounted folder that is shared in our workspace – for any requests that have the domain name "app.test". Of course app.test is not a real domain, which is the point, we are only using that as a placeholder for our local development version of the site.

We added the new configuration to the sites-available folder but we have to create a link for this new file in the sites-enabled folder too:

$ sudo ln -s /etc/nginx/sites-available/app /etc/nginx/sites-enabled/app
Enter fullscreen mode Exit fullscreen mode

And whenever a configuration is changed in nginx, we must tell it to reload those configuration files.

$ sudo service nginx configtest
  [OK]
$ sudo systemctl reload nginx
Enter fullscreen mode Exit fullscreen mode

Configure Your Domain Name Resolution

We now need to tell our real machine about this new domain name we just invented and configure it to send requests for that domain name to the IP address of our virtual machine (which recall you can find by using multipass ls). This is done by adding a new line to the /etc/hosts file on your real machine. In my case that line looks like this:

192.168.64.2    app.test
Enter fullscreen mode Exit fullscreen mode

Now, when I enter "app.test" into the web browser on my real machine, it directs that request to 192.168.64.2, as specified in my /etc/hosts, which is handled by the nginx server on my virtual machine, which is configured to return files from the virtual machine folder at /var/www/app, which is mounted to a shared folder in my real machine's workspace at ~/workspace/vm-ubuntu20/app.

Whew! That's an admittedly circuitous way to get there but in the end we have created a development environment for building a website using our Mac desktop for editing files whilst serving those files from an Ubuntu virtual server.

Top comments (0)