To find all .ico files in the current directory and sub-directory in recursive manner:-
sudo find . -name "*.ico" -type f
It will display the result on the screen. Then run the following command to delete:
sudo find . -name "*.ico" -type f -delete
To find all .ico files in the current directory and sub-directory in recursive manner:-
sudo find . -name "*.ico" -type f
It will display the result on the screen. Then run the following command to delete:
sudo find . -name "*.ico" -type f -delete
ssh root@192.12.345.67 apt-get update apt-get upgrade dpkg-reconfigure tzdata date hostnamectl set-hostname classic nano /etc/hosts 192.12.345.67 classic 2400:8904::f03c:92ff:fe6a:58cd/64 classic hostname adduser admin adduser admin sudo exit ssh-keygen -b 4096 ssh-copy-id admin@192.12.345.67 ssh admin@192.12.345.67 sudo nano /etc/ssh/sshd_config PermitRootLogin no PasswordAuthentication no sudo service ssh restart sudo ufw app list sudo ufw allow OpenSSH sudo ufw enable sudo ufw status sudo apt install nginx sudo systemctl start nginx sudo systemctl enable nginx sudo nano /etc/nginx/nginx.conf server_names_hash_bucket_size 128; client_max_body_size 100m; server_tokens off; sudo ufw app list sudo ufw allow 'Nginx Full' sudo ufw enable sudo ufw status sudo apt install mariadb-server sudo systemctl start mariadb sudo systemctl enable mariadb sudo mysql_secure_installation sudo apt install php-fpm php-mysql php-curl php-gd php-intl php-soap php-mbstring php-zip php-imagick php-xml php-xmlrpc sudo sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php/7.4/fpm/php.ini sudo nano /etc/php/7.4/fpm/php.ini post_max_size = 100M upload_max_filesize = 100M sudo service php7.4-fpm restart sudo service nginx restart sudo mkdir -p /var/www sudo rm -rf /var/www/html sudo wget https://wordpress.org/latest.zip sudo apt install unzip sudo unzip latest.zip sudo cp -R wordpress/* /var/www/ sudo rm latest.zip sudo rm -rf wordpress sudo mysqldump -u root wbxpress > wbxpress.sql sudo scp -v -r admin@192.46.212.51:/home/admin/wbxpress.sql /home/admin/ sudo scp -v -r admin@192.46.212.51:/var/www/wp-config.php /var/www/ sudo scp -v -r admin@192.46.212.51:/var/www/ads.txt /var/www/ sudo scp -v -r admin@192.46.212.51:/var/www/wp-content/* /var/www/wp-content/ sudo chown -R www-data:www-data /var/www sudo find /var/www -type d -exec chmod 755 {} \; sudo find /var/www -type f -exec chmod 664 {} \; sudo chmod 444 /var/www/wp-config.php sudo chown admin:admin /var/www/wp-config.php sudo nano /etc/nginx/sites-available/default sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/wbxpress.net.conf sudo nano /etc/nginx/sites-available/wbxpress.net.conf location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; } sudo ln -s /etc/nginx/sites-available/wbxpress.net.conf /etc/nginx/sites-enabled/ sudo rm /etc/nginx/sites-enabled/default sudo service nginx restart sudo mysql -u root show databases; CREATE DATABASE wbxpress DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci; GRANT ALL ON wbxpress.* TO 'wbUser1'@'localhost' IDENTIFIED BY 'wbPass2'; flush privileges; sudo mysql -u root wbxpress < wbxpress.sql sudo nano /var/www/wp-config.php sudo apt install certbot python3-certbot-nginx sudo certbot --nginx -d wbxpress.net -d www.wbxpress.net sudo crontab -e 15 3 * * * /usr/bin/certbot renew --quiet
A VPS account which starts from $5 per month from any reputed company. (We prefer Linode)
You can host as many websites you like in this account.
We will show only the commands necessary for hosting website. We will also show how to use https i.e. SSL for the websites. Your website can be of any type. We are showing WordPress installation although the commands are almost same.
OS: Ubuntu 20.04
Web Server: NginX
Database: MariaDB
PHP: PHP FPM 7.4
Application: WordPress
SSL: Lets’ Encrypt
From the dash board of VPS the first thing is to install an operating system. We use Ubuntu 20.04 LTS. Set Root password.
From the dashboard Copy the IP address of your VPS. From your own computer Run Putty to login as root user to the IP address.
Execute:
dpkg-reconfigure tzdata
Check with:
date
It will show you exact current date and time.
Execute:
adduser admin usermod -aG sudo admin
Now logout from root account. Run putty again and login as admin.
sudo apt update sudo apt upgrade
Open puTTYgen from your own computer. Generate a Public/ Private key pair. Save Private key in your PC.
Copy Public key. Login to the VPS using Putty as admin.
mkdir .ssh sudo nano .ssh/authorized_keys
Paste the copied public key into this file.
Save and Exit.
sudo chown -R admin:admin .ssh sudo chmod 700 .ssh sudo chmod 600 .ssh/authorized_keys
sudo nano /etc/ssh/sshd_config
Set:PasswordAuthentication no
PermitRootLogin no
Restart SSH
sudo service ssh restart
Now you can not login with root account or using password. You only need to the private key to login. This is a great way to secure the server.
sudo ufw app list
Output:
Available applications:
OpenSSH
sudo ufw allow OpenSSH sudo ufw enable sudo ufw status
Output:
Status: active
sudo apt install nginx sudo systemctl start nginx sudo systemctl enable nginx sudo nano /etc/nginx/nginx.conf
Set: server_names_hash_bucket_size 128;
Add: client_max_body_size 100m;
Set: server_tokens off;
If you would like to also install SSL, then also add:
ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off;
Save and Exit.
sudo ufw app list sudo ufw allow 'Nginx Full' sudo ufw enable sudo ufw status
sudo apt install mariadb-server sudo systemctl start mariadb sudo systemctl enable mariadb sudo mysql_secure_installation
sudo apt install php-fpm php-mysql php-curl php-gd php-intl php-mbstring php-soap php-xml php-xmlrpc php-zip php-bcmath php-imagick sudo systemctl restart php7.4-fpm sudo nano /etc/php/7.4/fpm/php.ini
Set: post_max_size = 100M
upload_max_filesize = 100M
sudo service php7.4-fpm restart sudo service nginx restart
sudo mkdir -p /var/www/website1 sudo mkdir -p /var/www/website2
etc.
If you are installing a fresh WordPress site then:-
sudo wget https://wordpress.org/latest.zip sudo apt install unzip sudo unzip latest.zip sudo cp -R wordpress/* /var/www/website1/ sudo rm latest.zip sudo rm -rf wordpress
If you are transferring existing website from other host to the new host the:-
sudo scp -v -r admin@172.105.43.12:/var/www/oldhost/* /var/www/website1/
Replace the IP address of your old host. Take similar action for website2.
sudo chown -R www-data:www-data /var/www/website1 sudo find /var/www/website1 -type d -exec chmod 775 {} \; sudo find /var/www/website1 -type f -exec chmod 664 {} \;
Similar action for website2.
sudo rm /etc/nginx/sites-enabled/default sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/website1.com sudo cp /etc/nginx/sites-available/default sudo nano /etc/nginx/sites-available/website1.com
Remove all except the following lines:-
server { root /var/www/website1; index index.php index.html index.htm; server_name website1.com www.website1.com; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; } location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ { expires max; log_not_found off; } }
Similarly, for second website create another virtual host.
sudo cp /etc/nginx/sites-available/website1 /etc/nginx/sites-available/website2.com sudo nano /etc/nginx/sites-available/website2.com
Change to:
server { root /var/www/website2; index index.php index.html index.htm; server_name website2.com www.website2.com; location / { try_files $uri $uri/ /index.php?args; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; } location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ { expires max; log_not_found off; } }
sudo ln -s /etc/nginx/sites-available/website1.com /etc/nginx/sites-enabled sudo ln -s /etc/nginx/sites-available/website2.com /etc/nginx/sites-enabled sudo service nginx restart
CREATE DATABASE website1 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci; GRANT ALL ON website1.* TO 'wp1User'@'localhost' IDENTIFIED BY 'wp1Pass'; CREATE DATABASE website2 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci; GRANT ALL ON website2.* TO 'wp2User'@'localhost' IDENTIFIED BY 'wp2Pass';
If you are transferring your site from old host create a database backup from old host:
sudo mysqldump -u root olddbsite1 > olddbsite1.sql
Then copy the back up file to new host.
sudo scp -v -r admin@172.105.43.12:/home/admin/olddbsite1.sql /home/admin/
Set DNS of all the domains point to the correct IP address. You need to add A/AAAA records pointing to the IP address of the VPS.
Now that your site has both filesystem and database it should be viewable at this point. So try hitting the browser:-
http://website1.com/
Congrats, your website1 is live now. Now, we shall install SSL so that the site can be accessed securely as follows:-
http://website1.com/
sudo apt update sudo apt upgrade sudo apt install certbot python3-certbot-nginx sudo certbot --nginx -d website1.com -d www.website1.com sudo certbot --nginx -d website2.com -d www.website2.com
You can check all existing SSL certificates.
sudo ls /etc/letsencrypt/live
To delete any Execute:
sudo certbot delete
Execute:
sudo crontab -e
Add At the end:
15 3 * * * /usr/bin/certbot renew --quiet
That’s it. Hope you have successfully host websites in your own VPS. If you still have any query, you are free to ask. We surely get back to reply.
WordPress MU is a feature in which we can run multiple wordpress sites using only a single wordpress installation. That means, the users, themes, plugins will be common, but the contents will be different for different sites. Lets consider, we install a wordpress which is accessible from this link:-
http://example.com
Now, if we enable WordPress MU feature then we can create the following different sites:-
Option 1: Sites under Sub-Domain
http://site1.example.com
http://site2.example.com
http://site3.example.com
Option 2: Sites under Sub-Directory
http://example.com/site1
http://example.com/site2
http://example.com/site3
and so on.
We can redirect all of the above links to different domain also using WordPress MU Domain Mapping plugin.
Step 1: To activate this feature in a regular wordpress site, add the following line into wp-config.php at the end.
define( 'WP_ALLOW_MULTISITE', true );
It will add additional entry into “Settings” tab of WordPress dashboard. Click “Network Setup“.
Step 2: From “Network Setup” we will get a piece of code which is to be inserted into wp-config.php
define('MULTISITE', true); define('SUBDOMAIN_INSTALL', false); define('DOMAIN_CURRENT_SITE', 'example.com'); define('PATH_CURRENT_SITE', '/'); define('SITE_ID_CURRENT_SITE', 1); define('BLOG_ID_CURRENT_SITE', 1);
Step 3: In case you are using Apache server, then add the following into .htaccess
RewriteEngine On RewriteBase /wordpress/ RewriteRule ^index\.php$ - [L] # add a trailing slash to /wp-admin RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L] RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L] RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L] RewriteRule . index.php [L]
If you are NginX, then edit /etc/nginx/sites-available/example.com.conf and add the following code into the configuration file:
# Add trailing slash to */wp-admin requests. rewrite /wp-admin$ $scheme://$host$uri/ permanent; if (!-e $request_filename) { rewrite /wp-admin$ $scheme://$host$uri/ permanent; rewrite ^/[_0-9a-zA-Z-]+(/wp-.*) $1 last; rewrite ^/[_0-9a-zA-Z-]+(/.*\.php)$ $1 last; }
Step 4: Now restart Nginx service and access your wordpress site. You can create as many sites you want from “My sites” -> “Network Admin” -> “Sites” -> “Add New”.
Hope the above configuration is useful for installing WordPress MU successfully.
In this tutorial we shall share all the commands necessary to host multiple websites in a VPS server. We used VPS servers from Linode and Digital Ocean. Both are excellent and best value for money.
This is a comprehensive guideline to host following domains:
In the above examples 3, 4, 5 and 6 will use SSL provided by Let’s Encrypt for free.
Proper redirection rules will also be applied. E.g.:
All the above sites will be hosted in high performance secured web server named Nginx.
We will also share WordPress specific configuration and optimization of the performance to achieve a very good score in GTMetrix. In addition to the fresh installation guide, we will also discuss how to transfer your websites from existing host to the newly created host of high performance.
From the dash board of VPS the first thing is to install an operating system. We prefer Ubuntu 18.04LTS because it’s simple and easy to use. Copy the IP address of your VPS. Run Putty to login as root user to the IP address.
Set a hostname for your VPS e.g. “supercomputer”. Execute the following commands:
echo "supercomputer" > /etc/hostname hostname -F /etc/hostname nano /etc/hosts
Add: IP address <space> supercomputer
hostname
will give output “supercomputer”.
Execute:
dpkg-reconfigure tzdata
Check with:
date
It will show you current date and time.
Execute:
adduser admin usermod -aG sudo admin
Now logout from root account. Run putty again and login as admin.
Execute:
sudo apt update sudo apt upgrade
Open puTTYgen from your own Windows PC.
Generate a Public/Private key pair.
Save Private key in your PC.
Copy Public key.
Login to the VPS using Putty as admin.
Execute:
mkdir .ssh sudo nano .ssh/authorized_keys
Paste the copied public key into this file.
Save and Exit.
sudo chown -R admin:admin .ssh sudo chmod 700 .ssh sudo chmod 600 .ssh/authorized_keys sudo nano /etc/ssh/sshd_config
Now disable root login by changing the following value:
PasswordAuthentication no PermitRootLogin no
Restart SSH
sudo service ssh restart
Now you can not login with root account or using password. You only need to the private key to login.
sudo ufw app list
Output:
Available applications:
OpenSSH
sudo ufw allow OpenSSH sudo ufw enable sudo ufw status
Output:
Status: active
sudo apt install nginx sudo nano /etc/nginx/nginx.conf
Add: server_names_hash_bucket_size 128;
sudo ufw app list sudo ufw allow 'Nginx Full' sudo ufw enable sudo ufw status
Execute:
sudo apt install mariadb-server php-mysql sudo mysql_secure_installation sudo mysql -u root -p CREATE DATABASE testdb; CREATE USER 'testuser' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON testdb.* TO 'testuser'; quit;
sudo apt install php-fpm php-mysql php-curl php-gd php-intl php-mbstring php-soap php-xml php-xmlrpc php-zip sudo systemctl restart php7.2-fpm
sudo nano /etc/php/7.2/fpm/php.ini
Change: post_max_size = 200M
upload_max_filesize = 200M
sudo nano /etc/nginx/nginx.conf
Add: client_max_body_size 200m;
sudo service php7.2-fpm restart sudo service nginx restart
Execute:
sudo mkdir -p /var/www/html/domain1 sudo mkdir -p /var/www/html/domain2 sudo mkdir -p /var/www/html/domain3 sudo mkdir -p /var/www/html/domain4 sudo mkdir -p /var/www/html/domain4/subdomain1 sudo mkdir -p /var/www/html/domain4/subdomain2
Execute:
sudo nano /etc/nginx/sites-available/domain1.com.conf
Add:
server { server_name domain1.com www.domain1.com; root /var/www/html/domain1; index index.html index.php; location / { try_files $uri $uri/ /index.php?$args; } location ~* \.php$ { fastcgi_pass unix:/run/php/php7.2-fpm.sock; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; } }
Execute:
sudo nano /etc/nginx/sites-available/domain2.com.conf
Add:
server { server_name www.domain2.com domain2.com; root /var/www/html/domain2; index index.html index.php; location / { try_files $uri $uri/ /index.php?$args; } location ~* \.php$ { fastcgi_pass unix:/run/php/php7.2-fpm.sock; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; } }
Execute:
sudo nano /etc/nginx/sites-available/domain3.com.conf
Add:
server { server_name www.domain3.com domain3.com; root /var/www/html/domain3; index index.html index.php; location / { try_files $uri $uri/ /index.php?$args; } location ~* \.php$ { fastcgi_pass unix:/run/php/php7.2-fpm.sock; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; } }
Execute:
sudo nano /etc/nginx/sites-available/domain4.com.conf
Add:
server { server_name domain4.com www.domain4.com; root /var/www/html/domain4; index index.html index.php; location / { try_files $uri $uri/ /index.php?$args; } location ~* \.php$ { fastcgi_pass unix:/run/php/php7.2-fpm.sock; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; } }
Execute:
sudo nano /etc/nginx/sites-available/subdomain1.domain4.com.conf
Add:
server { server_name subdomain1.domain4.com www.subdomain1.domain4.com; root /var/www/html/domain4/subdomain1; index index.html index.php; location / { try_files $uri $uri/ /index.php?$args; } location ~* \.php$ { fastcgi_pass unix:/run/php/php7.2-fpm.sock; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; } if ($host ~* ^www\.(.*)) { set $host_without_www $1; rewrite ^(.*) http://$host_without_www$1 permanent; } }
Execute:
sudo nano /etc/nginx/sites-available/subdomain2.domain4.com.conf
Add:
server { server_name www.subdomain2.domain4.com subdomain2.domain4.com; root /var/www/html/domain4/subdomain2; index index.html index.php; location / { try_files $uri $uri/ /index.php?$args; } location ~* \.php$ { fastcgi_pass unix:/run/php/php7.2-fpm.sock; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; } }
Execute:
sudo ln -s /etc/nginx/sites-available/domain1.com.conf /etc/nginx/sites-enabled sudo ln -s /etc/nginx/sites-available/domain2.com.conf /etc/nginx/sites-enabled sudo ln -s /etc/nginx/sites-available/domain3.com.conf /etc/nginx/sites-enabled sudo ln -s /etc/nginx/sites-available/domain4.com.conf /etc/nginx/sites-enabled sudo ln -s /etc/nginx/sites-available/subdomain1.domain4.com.conf /etc/nginx/sites-enabled sudo ln -s /etc/nginx/sites-available/subdomain2.domain4.com.conf /etc/nginx/sites-enabled
sudo service nginx restart
Our LEMP system (Linux, Nginx, MySQL, PHP) is now ready to rock. However, we should to cross check whether everything so far is good.
Execute:
sudo nano /var/www/html/domain1/test.php
Add:
You should get, “You have connected successfully.”
Execute:
sudo rm /var/www/html/domain1/test.php sudo mysql -u root -p show databases; use mysql; select user, host from mysql.user; delete from mysql.user where user='testuser'; drop database testdb; exit;
Execute:
sudo ls /etc/nginx/sites-enabled
Check which vhost to delete and execute:
sudo rm -f /etc/nginx/sites-enabled/default sudo rm -f /etc/nginx/sites-available/default sudo service nginx restart
sudo apt update && sudo apt upgrade sudo add-apt-repository ppa:certbot/certbot sudo apt update sudo apt install certbot python-certbot-nginx sudo ufw allow 80 sudo certbot --nginx -d www.domain3.com -d domain3.com sudo certbot --nginx -d domain4.com -d www.domain4.com sudo certbot --nginx -d subdomain1.domain4.com -d www.subdomain1.domain4.com sudo certbot --nginx -d www.subdomain2.domain4.com -d subdomain2.domain4.com
Check all existing SSL certificates.
sudo ls /etc/letsencrypt/live
To delete any of the above, Execute:
sudo certbot delete
Execute:
sudo crontab -e
Add At the end:
15 3 * * * /usr/bin/certbot renew --quiet
Execute:
sudo nano /etc/nginx/sites-available/domain1.com.conf
Inside the Server block, Add:
location ~* \.(jpg|jpeg|png|gif|ico|css|js|pdf)$ { expires 7d; }
Execute:
sudo chown -R www-data:www-data /var/www/html sudo find /var/www/html -type d -exec chmod 775 {} \; sudo find /var/www/html -type f -exec chmod 664 {} \;
Execute:
sudo mysql -u root -p show databases; CREATE DATABASE domain1 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci; GRANT ALL ON domain1.* TO 'd1username'@'localhost' IDENTIFIED BY 'd1password'; CREATE DATABASE domain2 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci; GRANT ALL ON domain2.* TO 'd2username'@'localhost' IDENTIFIED BY 'd2password'; CREATE DATABASE domain3 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci; GRANT ALL ON domain3.* TO 'd3username'@'localhost' IDENTIFIED BY 'd3password'; FLUSH PRIVILEGES; EXIT;
To Export database from Old host, Execute:
mysqldump -u root -p databasename > dbname.sql
To Export selected tables, Execute:
mysqldump -u root -p databasename tablename1 tablename2 tablename3 > dbname.sql
Copy files from Old host to New host:
sudo scp -v -r admin@123.456.78.90:/home/admin/dbname.sql /home/admin/
To Import database in New host, Execute:
sudo mysql -u root -p newdbname < dbname.sql
You may also need to copy old files from old host to new host. Execute:
sudo scp -v -r admin@123.456.78.90:/var/www/domain1/* /var/www/html/domain1/
If old host is secured with SSH key pair, then Execute:
sudo nano /etc/ssh/sshd_config
Change:
PasswordAuthentication yes
Execute:
sudo service ssh restart
Execute:
sudo wget https://wordpress.org/latest.zip sudo apt install unzip sudo unzip latest.zip sudo cp -R wordpress/* /var/www/html/domain1/ sudo rm latest.zip sudo rm -rf wordpress cd /var/www/html chown -R www-data:www-data domain1
Execute:
sudo wget https://resources.mybb.com/downloads/mybb_1817.zip sudo apt install unzip sudo unzip mybb_1817.zip sudo cp -R Upload/* /var/www/html/domain2/ sudo rm mybb_1817.zip sudo rm -rf Upload sudo rm -rf Documentation
Set DNS of all the domains point to the correct IP address. You need to add A/AAAA records pointing to the IP address of the VPS.
That’s it. Hope you have successfully host websites in your own VPS. If you still have any query, you are free to ask. We surely get back to reply.
From the dashboard of your VPS hosting provider, you will find how to install/ deploy operating system. Create Password for root user.
Run Putty to login with the host IP address as shown below:
A security alert will pop up. Click Yes. Login as: root.
Set a hostname for your VPS. hostname is anything you like to name your VPS server. e.g. “hydrogen”.
Execute the following command:
echo "hydrogen" > /etc/hostname hostname -F /etc/hostname nano /etc/hosts
Add: IP address <space> hydrogen
hostname
will give output “yourhostname”
Run the following command to setup your local time.
dpkg-reconfigure tzdata
To check it shows proper date and time run:
date
It will show you current date and time.
Run the following to update your system softwares:
apt-get update apt-get upgrade
During upgrade you need to press y to continue.
adduser admin
usermod -aG sudo admin
Now logout of root account. Run putty again and login as admin.
Now login your VPS as admin
Open puTTYgen in your own Windows PC. Generate a Public/Private key pair.
Save Private key in your PC.
Copy Public key.
Now run the following commands with admin user in your linode terminal.
mkdir .ssh sudo nano .ssh/authorized_keys
Paste the copied public key into this file.
Save and Exit.
sudo chown -R admin:admin .ssh sudo chmod 700 .ssh sudo chmod 600 .ssh/authorized_keys sudo nano /etc/ssh/sshd_config
Now disable root login by changing the following value:
PasswordAuthentication no PermitRootLogin no
Restart SSH
sudo service ssh restart
Now you can not login with root account. Also you can not login with password. admin user can only login with the private key. Open the private key you saved and you can login with admin user.
sudo ufw app list
Output:
Available applications:
OpenSSH
sudo ufw allow OpenSSH sudo ufw enable sudo ufw status
Output:
Status: active
And few lines.
sudo apt-get install apache2 sudo ufw allow "Apache Full" sudo nano /etc/apache2/apache2.conf
KeepAlive On MaxKeepAliveRequests 50 KeepAliveTimeout 5
sudo nano /etc/apache2/mods-available/mpm_prefork.conf
Adjust inside mpm_prefork_module for 2 GB VPS
StartServers 4 MinSpareServers 3 MaxSpareServers 40 MaxRequestWorkers 200 MaxConnectionsPerChild 10000
sudo a2dismod mpm_event sudo a2enmod mpm_prefork
sudo service apache2 restart
sudo mkdir -p /var/www/example1.com/html sudo mkdir /var/www/example1.com/logs
mkdir -p /var/www/example2.com/html mkdir /var/www/example2.com/logs
You may host as many websites as you wish in a single VPS. So, carry on.
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/example1.com.conf sudo nano /etc/apache2/sites-available/example1.com.conf
Set the following:
ServerAdmin admin@example1.com ServerName example1.com ServerAlias www.example1.com DocumentRoot /var/www/example1.com/html/ ErrorLog /var/www/example1.com/logs/error.log CustomLog /var/www/example1.com/logs/access.log combined
sudo nano /etc/apache2/sites-available/example2.com.conf
Set the following:
ServerAdmin admin@example2.com ServerName example2.com ServerAlias www.example2.com DocumentRoot /var/www/example2.com/html/ ErrorLog /var/www/example2.com/logs/error.log CustomLog /var/www/example2.com/logs/access.log combined
sudo a2ensite example1.com.conf sudo a2ensite example2.com.conf
sudo a2dissite 000-default.conf sudo service apache2 restart
Run the following commands one by one.
sudo apt-get install mysql-server sudo mysql_install_db sudo mysql_secure_installation
You will be prompted a series of questions after you enter root password. Just type y or n as required.
Change the root password? [y/n]: n
Remove anonymous users? [y/n]: y
Disallow root login remotely? [y/n]: y
Remove test database and access to it? [y/n]: y
Reload privilege tables now? [y/n]: y
Refer: MySQL Commands for Hosting Websites in Linux VPS
sudo apt-get install php7.0 libapache2-mod-php7.0 php7.0-mysql sudo apt-get install php7.0-curl php7.0-json php7.0-cgi sudo nano /etc/apache2/mods-enabled/dir.conf
Add the following:
DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
sudo apt-get install software-properties-common python-software-properties sudo add-apt-repository ppa:certbot/certbot sudo apt-get update sudo apt-get install python-certbot-apache
Install certificate for first domain.
sudo certbot --apache -d example1.com
Install certificate for second domain.
sudo certbot --apache -d example2.com
sudo crontab -e
At the end of line add:
15 3 * * * /usr/bin/certbot renew --quiet
Check this: Copy Files from Old Host to New Host