Kreirajte virtualne hostove, direktorije sa zaštitom lozinkom i SSL certifikate koristeći "Nginx Web Server" u Arch Linuxu


Prethodni članak Arch Linux ‘LEMP’ pokrivao je samo osnovne stvari, od instaliranja mrežnih usluga (Nginx, MySQL baza podataka i PhpMyAdmin) i konfiguracije minimalne sigurnosti potrebne za MySQL poslužitelj i PhpMyadmin.

Ova tema je strogo povezana s prethodnom instalacijom LEMP-a na Arch Linuxu i vodit će vas kroz postavljanje složenijih konfiguracija za LEMP stog, posebno Nginx konfiguracija web poslužitelja, poput stvaranja Virtualnih hostova , koristite Imenike zaštićene lozinkom, kreirajte i konfigurirajte HTTP Secure Sockets Layer, HTTP nesigurna preusmjeravanja na HTTPS i također će vam predstaviti neke korisne Bash skripte koje će olakšati posao na aktiviranju virtualnih hostova i generirati SSL certifikat i ključeve.

Zahtjevi

Instalirajte LEMP s bazom podataka MariaDB u Arch Linuxu

Korak 1: Omogućite virtualne hostove na Nginxu

Jedna od najjednostavnijih metoda za omogućavanje Virtualnih hostova je korištenje naredbi include na glavnoj Nginx konfiguracijskoj datoteci, što posao daljnjih konfiguracija čini jednostavnijim i učinkovitijim jer možete stvoriti jednostavne datoteke za svaki novi host i neka glavna konfiguracijska datoteka bude čišća.

Ovaj pristup funkcionira na isti način kao na Apache web poslužitelju, prva stvar koju trebate učiniti je navesti novi URI put gdje bi Nginx trebao čitati direktive datoteke.

1. Dakle, otvorite glavnu datoteku nginx.conf koja se nalazi na /etc/nginx/ sistemskoj stazi i na dnu, prije zadnje vitičaste zagrade “ }” dodajte stazu na kojoj će se nalaziti buduće konfiguracijske datoteke virtualnog hosta.

sudo nano /etc/nginx/nginx.conf

Na dnu dodajte sljedeću izjavu.

include /etc/nginx/sites-enabled/*.conf;

Ova direktiva govori Nginxu da treba čitati sve datoteke koje se nalaze u /etc/nginx/sites-enabled/ koje završavaju ekstenzijom .conf.

2. Sljedeći korak je stvaranje direktorija sites-enabled i još jednog, pod nazivom sites-available, gdje pohranjujete svu svoju konfiguraciju virtualnih hostova datoteke.

sudo mkdir /etc/nginx/sites-available /etc/nginx/sites-enabled

3. Sada je vrijeme za stvaranje novog virtualnog domaćina. Ovaj primjer će koristiti IP adresu sustava kao Virtualni naziv glavnog računala, stoga kreirajte novu datoteku pod nazivom name-ip.conf.

sudo nano /etc/nginx/sites-available/name-ip.conf

Dodajte sljedeći sadržaj.

## File content ##

server {
    listen 80;
    server_name 192.168.1.33;

    access_log /var/log/nginx/192.168.1.33.access.log;
    error_log /var/log/nginx/192.168.1.33.error.log;

    root /srv/http;
    location / {
    index index.html index.htm index.php;
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
 }
    location /phpmyadmin {
        rewrite ^/* /phpMyAdmin last;
    }

    location ~ \.php$ {
        #fastcgi_pass 127.0.0.1:9000; (depending on your php-fpm socket configuration)
        fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
    }
}

Direktiva koja aktivira virtualni host je server_name izjava pod portom za slušanje. Također, još jedna važna direktiva ovdje je root izjava koja upućuje Nginx Virtual Host da poslužuje sadržaj datoteke sa /srv/http/ sistemske staze.

4. Posljednji korak je stvaranje direktorija /srv/http/ i postavljanje konfiguracije datoteke name-ip.conf dostupnom za Nginx čitanje (koristeći simbolička veza), zatim ponovno pokrenite demon kako bi nove konfiguracije bile vidljive.

sudo mkdir /srv/http/
sudo ln -s /etc/nginx/sites-available/name-ip.conf /etc/nginx/sites-enabled/
sudo systemctl restart nginx

5. Da to provjerite, usmjerite svoj preglednik na IP adresu Arch sustava i trebali biste vidjeti da se web sadržaj razlikuje od http://localhost. Ovdje sam dodao malu php skriptu koja također provjerava FastCGI PHP konfiguracije kao na slici ispod.

sudo nano /srv/http/info.php
## File content ##

<?php
phpinfo();
?>

6. Druga metoda koju sam sam razvio za omogućavanje ili onemogućavanje virtualnih domaćina na Nginxu je elegantnija i inspirirana je Apache a2eniste skriptom.

Za korištenje ove metode otvorite uređivač datoteka i kreirajte novu datoteku, nazvanu n2ensite, na vašoj $HOME stazi sa sadržajem ispod, učinite je izvršnom, pokrenite je s root privilegijama i proslijedite kao opciju svom novom imenu virtualnog računala bez završetka .conf (ispunite slobodno da biste ga izmijenili prema svojim potrebama).

sudo nano n2ensite
## File content ##

#!/bin/bash
if test -d /etc/nginx/sites-available && test -d /etc/nginx/sites-enabled  ; then
echo "-----------------------------------------------"
else
mkdir /etc/nginx/sites-available
mkdir /etc/nginx/sites-enabled
fi

avail=/etc/nginx/sites-available/$1.conf
enabled=/etc/nginx/sites-enabled/
site=`ls /etc/nginx/sites-available/`

if [ "$#" != "1" ]; then
                echo "Use script: n2ensite virtual_site"
                echo -e "\nAvailable virtual hosts:\n$site"
                exit 0
else

if test -e $avail; then
sudo ln -s $avail $enabled
else
echo -e "$avail virtual host does not exist! Please create one!\n$site"
exit 0
fi
if test -e $enabled/$1.conf; then
echo "Success!! Now restart nginx server: sudo systemctl restart nginx"
else
echo  -e "Virtual host $avail does not exist!\nPlease see available virtual hosts:\n$site"
exit 0
fi
fi

Učinite ga izvršnim i pokrenite ga kao prikaz.

sudo chmod +x n2ensite
sudo ./n2ensite your_virtual_host

7. Da biste onemogućili virtualne hostove, kreirajte novu datoteku n2dissite sa sljedećim sadržajem i primijenite iste postavke kao gore.

sudo nano n2dissite
## File content ##

#!/bin/bash
avail=/etc/nginx/sites-enabled/$1.conf
enabled=/etc/nginx/sites-enabled
site=`ls /etc/nginx/sites-enabled/`

if [ "$#" != "1" ]; then
                echo "Use script: n2dissite virtual_site"
                echo -e "\nAvailable virtual hosts: \n$site"
                exit 0
else
if test -e $avail; then
sudo rm  $avail
else
echo -e "$avail virtual host does not exist! Exiting!"
exit 0
fi
if test -e $enabled/$1.conf; then
echo "Error!! Could not remove $avail virtual host!"
else
echo  -e "Success! $avail has been removed!\nPlease restart Nginx: sudo systemctl restart nginx"
exit 0
fi
fi

8. Sada možete koristiti ove dvije skripte da omogućite ili onemogućite bilo koji virtualni host, ali ako ih želite primijeniti kao naredbe za cijeli sustav jednostavno kopirajte obje skripte u /usr/local/bin/ i tada ga možete koristiti bez navođenja staze.

sudo cp n2ensite n2dissite /usr/local/bin/

Korak 2: Omogućite SSL s virtualnim hostovima na Nginxu

SSL (Secure Sockets Layer) je protokol dizajniran za šifriranje HTTP veza preko mreža ili interneta, što omogućuje prijenos podataka putem sigurnog kanala pomoću simetričnih/asimetričnih kriptografskih ključeva i dostupan je u Arch Linuxu OpenSSL paketom.

sudo pacman -S openssl

9. Da biste omogućili HTTPS veze s Nginxom, prvo što trebate učiniti je generirati ključeve virtualnih hostova. Također, kako bih pojednostavio stvari, razvio sam male skripte koje automatski generiraju kriptografske ključeve na putanji direktorija /etc/nginx/ssl, koristeći imenovanje virtualnog hosta kao imena ključeva.

Napravite datoteku pod nazivom nginx_gen_ssl i dodajte sljedeći sadržaj.

sudo nano nginx_gen_ssl
## File content ##

#!/bin/bash
mkdir /etc/nginx/ssl
cd /etc/nginx/ssl

echo -e "Enter your virtual host FQDN: \nThis will generate the default name for Nginx  SSL certificate!"
read cert

openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out $cert.key
chmod 600 $cert.key
openssl req -new -key $cert.key -out $cert.csr
openssl x509 -req -days 365 -in $cert.csr -signkey $cert.key -out $cert.crt

echo -e " The certificate $cert has been generated!\nPlease link it to nginx ssl available website!"
ls -all /etc/nginx/ssl
exit 0

10. Nakon što je skripta stvorena, dodajte dopuštenja za izvršenje, pokrenite je i navedite svoje opcije certifikata, a najvažnija je polje Common Name (ovdje dodajte službeni naziv domene) i ostavite polja Password i Optional Company prazna.

sudo chmod +x nginx_gen_ssl
sudo ./nginx_gen_ssl

Na kraju zadatka generiranja ključeva, prikazat će se popis sa svim dostupnim ključevima u Nginx ssl direktoriju.

Također, ako želite da se ova skripta koristi kao sistemska naredba, kopirajte je ili premjestite u /usr/local/bin/.

sudo mv nginx_gen_ssl  /usr/local/bin

11. Nakon što smo generirali ključeve potrebne za Nginx SSL Virtual Host, vrijeme je da zapravo stvorimo konfiguracijsku datoteku SSL Virtual Host. Koristite istu IP adresu sustava za Virtual Host kao gore na direktivi server_name ali malo promijenite naziv datoteke Virtual Host dodavanjem ssl ispred .conf, da vas podsjeti da ova datoteka stoji za name-ip SSL Virtual Host.

sudo nano /etc/nginx/sites-availabe/name-ip-ssl.conf

Na ovoj datoteci promijenite listen iskaz porta u 443 ssl i navedite staze datoteka ključeva SSL-a i certifikata s onima stvorenim ranije da izgledaju kao u odlomku ispod.

## File content ##

server {
    listen 443 ssl;
    server_name 192.168.1.33;

       ssl_certificate     /etc/nginx/ssl/192.168.1.33.crt;
       ssl_certificate_key  /etc/nginx/ssl/192.168.1.33.key;

       ssl_session_cache    shared:SSL:1m;
       ssl_session_timeout  5m;

       ssl_ciphers  HIGH:!aNULL:!MD5;
       ssl_prefer_server_ciphers  on;

    access_log /var/log/nginx/192.168.1.33-ssl.access.log;
    error_log /var/log/nginx/192.168.1.33-ssl.error.log;
    root /srv/http;
    location / {
    index index.html index.htm index.php;
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
 }
    location /phpmyadmin {
        rewrite ^/* /phpMyAdmin last;
    }
    location ~ \.php$ {
        #fastcgi_pass 127.0.0.1:9000; (depending on your php-fpm socket configuration)
        fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
    }
}

12. Nakon što je datoteka stvorena, koristite n2ensite skriptu ili ln naredbeni redak da je aktivirate (stvara simboličku vezu datoteke u sites -enabled direktorij), zatim ponovno pokrenite Nginx demon za primjenu postavki.

sudo ./n2ensite name-ip-ssl
OR
sudo ln -s /etc/nginx/sites-available/name-ip-ssl.conf /etc/nginx/sites-enabled/
sudo systemctl restart nginx

13. Ponovno usmjerite svoj preglednik na Arch IP URL, ali ovaj put koristeći HTTPS protokol – https://192.168.1.33 na mom sustavu- i trebala bi se pojaviti sigurnosna pogreška Nepouzdana veza ( Dodajte i potvrdite sigurnosnu iznimku da idete dalje na stranici).

Kao što sada možete vidjeti, vaš Nginx Virtual Host poslužuje isti sadržaj kao prethodni name-ip host, ali ovaj put koristi HTTP sigurnu vezu.

Korak 3: Pristupite PhpMyAdmin-u putem Virtualnog hosta

Ako je Virtual Host omogućen na Nginxu, više nemamo pristup sadržaju staze http://localhost (localhost obično poslužuje sadržaj koristeći povratnu IP adresu ili IP adresu sustava ako nije drugačije konfigurirana) jer imamo koristio IP Arch sustava kao naziv_poslužitelja tako da se naš put sadržaja promijenio.

14. Najjednostavnija metoda za pristup PhpMyAdmin putem weba je stvaranje simboličke veze između /usr/share/webapps/phpMyAdmin/ staze i naš novi definirani virtualni host staza (/srv/http).

sudo ln -s /usr/share/webapps/phpMyAdmin/ /srv/http/

15. Nakon što ste izvršili gornju naredbu, osvježite svoju stranicu i vidjet ćete da se pojavljuje nova mapa phpMyAdmin, ako je izjava autoindex omogućena na Nginx Virtual Host ili usmjerite svoj URL izravno na PhpMyAdmin mapa https://arch_IP/phpMyAdmin.

16. Ako želite dezinficirati phpMyAdmin niz u pregledniku, uredite svoje datoteke Virtual Hosts i dodajte sljedeći sadržaj pod blok poslužitelja.

location /phpmyadmin {
       rewrite ^/* /phpMyAdmin last;
    }

Korak 4: Omogućite imenik zaštićen lozinkom na Nginxu

Za razliku od Apachea, Nginx koristi HttpAuthBasic modul za omogućavanje Imenika zaštićenih lozinkom, ali ne pruža nikakve alate za stvaranje šifrirane .htpasswd datoteke.

17. Za postizanje zaštite imenika lozinkom s Nginxom na Arch Linuxu instalirajte Apache web poslužitelj i koristite njegove alate za generiranje šifrirane .htaccess datoteke.

sudo pacman -S apache

18. Nakon što ste instalirali Apache kreirajte novi direktorij pod /etc/nginx/ intuitivno nazvan passwd gdje će se datoteka .htpasswd pohraniti i koristiti Naredba htpasswd s –c uključite prvog dodanog korisnika za generiranje datoteke, zatim ako želite dodati više korisnika koristite htpasswd bez – c prekidač.

sudo mkdir /etc/nginx/passwd

sudo htpasswd -c /etc/nginx/passwd/.htpasswd first_user
sudo htpasswd /etc/nginx/passwd/.htpasswd second_user
sudo htpasswd /etc/nginx/passwd/.htpasswd third_user

19. Kako bi zaštitili name-ip-ssl Virtual Host root /srv/http/ poslužuje stazu sa svim svojim podmapama i datotekama ispod dodaje sljedeće upute unutar vašeg bloka poslužitelja virtualnog hosta pod root direktivom i usmjerava ga na apsolutnu putanju datoteke .htpasswd.

auth_basic "Restricted Website";
auth_basic_user_file /etc/nginx/passwd/.htpasswd;

20. Nakon što ponovno pokrenete uslugu Nginx, osvježite stranicu i pojavit će se skočni prozor Potrebna je provjera autentičnosti koji zahtijeva vaše vjerodajnice.

Sada ste uspješno omogućili Nginx Direktorije zaštićene lozinkom, ali imajte na umu da je u isto vrijeme Apache web poslužitelj instaliran u vašem sustavu, stoga pazite da ostane onemogućen i ni na koji način ga nemojte pokretati jer može dovesti do portovi u sukobu s Nginxom.

Korak 5: Preusmjerite HTTP na HTTPS na Nginxu

21. Ako želite da preglednici automatski preusmjeravaju sve nesigurne HTTP zahtjeve na HTTPS protokol, otvorite i uredite da ste ne-ssl virtualni host i dodajte sljedeće upute pod ime_poslužitelja direktiva.

rewrite        ^ https://$server_name$request_uri? permanent;

Sve postavke predstavljene u ovom članku napravljene su pod Arch Linux sustavom koji djeluje kao poslužitelj, ali većina njih, posebno one koje se odnose na Nginx konfiguracijske datoteke, dostupne su na većini Linux sustava uz male razlike.