In Nginx web server, server blocks (similar to the virtual hosts in Apache) can be used to configure and host more than one domain on a single server on Google Cloud
In this guide you are going to learn how to set up server blocks in Nginx on Ubuntu 18.04 server on Google Compute Engine.
Not using Ubuntu 18.04? Choose a different OS:
Prerequisites
- Your Compute Engine Instance running.
- For setting up Compute Engine, see the Setting up Compute Engine Instance.
- For installing Nginx and PHP, see how to install LEMP in Compute Engine Instance.
- Domain name is pointed to your virtual machine.
- For setting up Cloud DNS, see the Setting up Google Cloud DNS for your domain.
- Google Cloud SQL Setup, see Setup Cloud SQL and connect with Compute Engine.
Setup Server Blocks
1. Set Up New Root Directory
By default, Nginx provides a default server block configuration. It is configured to serve documents out of a directory at /var/www/html
.
Now you shall remove the default configuration and setup a new directory as follows.
sudo rm /etc/nginx/sites-available/default
sudo rm /etc/nginx/sites-enabled/default
You can make the new root directory setup as follows.
Replace yourdomainname.com
with your original domain name.
home
-- yourdomainname.com
---- logs
---- public
The public
directory is your website’s root directory and logs
directory for your error logs.
Now we create these directories with the following command.
mkdir -p yourdomainname.com/logs yourdomainname.com/public
2. Set up Correct Permissions
Once the directories are created you can setup correct permissions.
mkdir -p yourdomainname.com/logs yourdomainname.com/public
sudo chmod -R 755 yourdomainname.com
3. Create Server Block
Now create a new Nginx configuration for your website in sites-available
sudo nano /etc/nginx/sites-available/yourdomainname.com
Copy and paste the following configuration, ensure that you change the server_name, error_log and root directives to match your domain name. CTRL+X
Y
server {
listen 80;
listen [::]:80;
server_name yourdomainname.com www.yourdomainname.com;
error_log /home/username/yourdomainname.com/logs/error.log;
root /home/username/yourdomainname.com/public/;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
If you have installed PHP 7.3
you can use this configuration.
server {
listen 80;
listen [::]:80;
server_name yourdomainname.com www.yourdomainname.com;
error_log /home/username/yourdomainname.com/logs/error.log;
root /home/username/yourdomainname.com/public/;
index index.html index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php7.3-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
}
To enable this newly created website configuration, symlink the file that you just created into the sites-enabled
directory.
sudo ln -s /etc/nginx/sites-available/yourdomainname.com /etc/nginx/sites-enabled/yourdomainname.com
Check your configuration and restart Nginx for the changes to take effect.
sudo nginx -t
sudo service nginx restart
4. Create Sample Page
Now you can create a new sample page and test the configuration.
sudo nano /home/username/yourdomainname.com/public/index.html
Paste the below piece of code and hit Ctrl+X
followed by Y
and Enter
to save the file.
<html>
<head>
<title>Welcome to Nginx Test!</title>
</head>
<body>
<h1>Success! Nginx server block is working!</h1>
</body>
</html>
Now visit your domain name in your browser.
http://yourdomainname.com
You should the see the following message.
Success! Nginx server block is working!
Finally delete the sample page with the below command.
sudo rm -f /home/username/yourdomainname.com/public/index.html
Great! Now you have configured Nginx server blocks successfully on Ubuntu 18.04. You can also create additional sites using the above method.
6 Comments
Wonderful tutorial.
Any specific reason to choose ‘/home’ directory for new server blocks?
Why not ‘/var/www/’ ?
In case if you wish to make a setup for multiple websites in same server with chroot jail setup, this kind of setup will be useful by running PHP-FPM with the respective username
PHP did not work for me until I also included the following line in the PHP FPM server block:
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
I put it under ‘ include fastcgi_params;’
Made it wasn’t able to ‘include fastcgi_params;’ for some reason?
PHP 7.3 Ubuntu 18.04.3
Please try adding the line in
/etc/nginx/fastcgi_params
Got this error trying to make server blocks work
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: [emerg] open() “/home/deletedusername/deleteddomain.com/logs/error.log” failed (2: No such file or directory)
nginx: configuration file /etc/nginx/nginx.conf test failed
when i do
ls -l /var/log/nginx/
total 8
-rw-r—– 1 www-data adm 2242 Nov 12 06:03 access.log
-rw-r—– 1 www-data adm 262 Nov 12 06:41 error.log
Very useful thank you very much. Will you have a tutorial to create ftp accounts for each domain using nginx blocks?