Kreiranje novih virtualnih hostova na Nginx

Postavljanje virtualnih hostova na bilo kom web hostingu obično traje najmanje nekoliko minuta i nekoliko naredbi, osim ako ne radite s upravljačke table Cpanel, ZPanel … čak i onda to obično traje dobar broj klikova i provera. Sve to može biti zamarajuće kada morate postaviti nekoliko njih dnevno.

Ovaj jednostavan bash skript brzo postavlja hosting za novi virtual host na Nginx. Uz male korekcije može se koristiti na bilo kom hostingu.

Kako ovaj skript radi:

  • kreira nove stavke sa vhost koristeći osnovni obrazac
  • kreira novi folder za novi vhost i postavlja usera nginx za vlasnika
  • dodaje jednostavnu index.html stranu u novi folder i pokazuje da sajt radi.
  • učitava ponovo Nginx da bi se pokupila nova setovanja i učitao novi vhost

Kako ovo funkcioniše:

Skrit koristi debian stil za setup kao osnovu za setovanje novih vhost-ova na Nginx. To znači da se ispod osnovnog konfig foldera za Nginx (/etc/nginx) nalaze još dva dodatna foldera:

  • sites-available
  • sites-enabled

U sites-available folder se postavljaju pojedinačne konfiguracione datoteke za svaki vhost, svaki novi vhost koristi novu datoteku. Pod sites-enabled ide simbolička veza na konfiguracione datoteke u sites-available, to vam daje mogućnost onemogućavanja rada stranice bez skidanja fajlova ili konfiguracija. Sve to radi dodavanjem sledeće linije do kraja /etc/nginx/nginx.conf fajla (unutar sekcije HTTP):

# Load all vhosts !
include /etc/nginx/sites-enabled/*.conf;

Hosting folder za novu stranicu može se postaviti menjanjem vrednosti za WEB_DIR na vrhu skripte gde je podrazumevana vrednost /var/www . Tako da bi novi folder za sajt primer.com bio:

/var/www/primer_com 

Kako se koristi:

Jednostavno preuzmite skript sa GitHub-a

git clone https://github.com/vladimirkonrad/auto-create-vhost-nginx.git

startujte skript create_nginx_site.sh a kao parametar prosledite ime domena za vhost koji želite da kreirate.

./create_nginx_site.sh primer.com

i trebalo bi da dobijete prikaz sličan ovom:

Creating hosting for: primer.com
Reloading nginx:                                             [  OK  ]
Site Created for primer.com

skript:

#!/bin/bash

NGINX_ALL_VHOSTS='/etc/nginx/sites-available'
NGINX_ENABLED_VHOSTS='/etc/nginx/sites-enabled'
WEB_DIR='/var/www'
SED=`which sed`
NGINX=`sudo which nginx`
CURRENT_DIR=`dirname $0`

if [ -z $1 ]; then
    echo "No domain name given"
    exit 1
fi
DOMAIN=$1

# check the domain is valid!
PATTERN="^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$";
if [[ "$DOMAIN" =~ $PATTERN ]]; then
    DOMAIN=`echo $DOMAIN | tr '[A-Z]' '[a-z]'`
    echo "Creating hosting for:" $DOMAIN
else
    echo "invalid domain name"
    exit 1
fi

# Create a new user!
echo "Please specify the username for this site?"
read USERNAME
sudo adduser -d$WEB_DIR/$USERNAME $USERNAME
echo "Please enter a password for the user: $USERNAME"
read -s PASS
sudo echo $PASS | sudo passwd --stdin $USERNAME

# Now we need to copy the virtual host template
CONFIG=$NGINX_ALL_VHOSTS/$DOMAIN.conf
sudo cp $CURRENT_DIR/virtual_host.template $CONFIG
sudo $SED -i "s/DOMAIN/$DOMAIN/g" $CONFIG
sudo $SED -i "s#ROOT#$WEB_DIR/$HOME_DIR\/public_html#g" $CONFIG

sudo usermod -aG $USERNAME nginx
sudo chmod g+rxs $WEB_DIR/$USERNAME
sudo chmod 600 $CONFIG

sudo $NGINX -t
if [ $? -eq 0 ];then
    # Create symlink
    sudo ln -s $CONFIG $NGINX_ENABLED_VHOSTS/$DOMAIN.conf
else
    echo "Could not create new vhost as there appears to be a problem with the newly created nginx config file: $CONFIG";
    exit 1;
fi

sudo /etc/init.d/nginx reload

# put the template index.html file into the public_html dir!
sudo mkdir /var/www/$HOME_DIR/public_html

sudo cp $CURRENT_DIR/index.html.template $WEB_DIR/$HOME_DIR/public_html/index.html
sudo $SED -i "s/SITE/$DOMAIN/g" $WEB_DIR/$HOME_DIR/public_html/index.html
sudo chown $USERNAME:$USERNAME $WEB_DIR/$HOME_DIR/public_html -R

echo -e "\nSite Created for $DOMAIN"
echo "--------------------------"
echo "Host: "`hostname`
echo "URL: $DOMAIN"
echo "User: $USERNAME"
echo "--------------------------"
exit 0;