Zoeken op website

Creëer virtuele hosts, wachtwoordbeveiligde mappen en SSL-certificaten met behulp van "Nginx Web Server" in Arch Linux


Het vorige Arch Linux ‘LEMP’-artikel behandelde alleen de basiszaken, van het installeren van netwerkdiensten (Nginx, MySQL-database en PhpMyAdmin) en het configureren van de minimale beveiliging die vereist is voor de MySQL-server en PhpMyadmin.

Dit onderwerp is strikt gerelateerd aan de eerdere installatie van LEMP op Arch Linux en begeleidt u bij het instellen van complexere configuraties voor de LEMP-stack, met name Nginx webserverconfiguraties, zoals het maken van Virtuele hosts , gebruik Wachtwoordbeveiligde mappen, maak en configureer HTTP Secure Sockets Layer, HTTP-onveilige omleidingen naar HTTPS en zal u ook enkele nuttige Bash-scripts presenteren die vereenvoudigt het activeren van virtuele hosts en het genereren van SSL-certificaten en sleutels.

Vereisten

Installeer LEMP met MariaDB Database in Arch Linux

Stap 1: Schakel virtuele hosts in op Nginx

Een van de eenvoudigste methoden om Virtuele Hosts in te schakelen, is het gebruik van include-instructies in het hoofdconfiguratiebestand van Nginx, waardoor het uitvoeren van verdere configuraties eenvoudiger en efficiënter wordt omdat u eenvoudige bestanden kunt maken voor elke nieuwe host en houd het hoofdconfiguratiebestand schoner.

Deze aanpak werkt op dezelfde manier als op Apache Web Server. Het eerste dat u hoeft te doen is het nieuwe URI-pad opgeven waar Nginx bestandsrichtlijnen moet lezen.

1. Open dus het hoofdbestand nginx.conf dat zich bevindt op het /etc/nginx/ systeempad en onderaan, vóór de laatste accolade “ }” voeg het pad toe waar toekomstige Virtual Host-configuratiebestanden zich zullen bevinden.

sudo nano /etc/nginx/nginx.conf

Voeg onderaan de volgende verklaring toe.

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

Deze richtlijn vertelt Nginx dat het alle bestanden moet lezen die gevonden worden in /etc/nginx/sites-enabled/ die eindigen op de extensie .conf.

2. De volgende stap is het maken van een sites-enabled map en een andere, genaamd sites-available, waarin u al uw Virtual Hosts-configuratie opslaat bestanden.

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

3. Nu is het tijd om een nieuwe virtuele host te maken. In dit voorbeeld wordt het IP-adres van het systeem gebruikt als virtuele hostnaam, dus maak een nieuw bestand met de naam naam-ip.conf.

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

Voeg de volgende inhoud toe.

## 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;
    }
}

De instructie die Virtual Host activeert is de servernaam-instructie onder de luisterpoort. Een andere belangrijke richtlijn hier is de root-instructie die Nginx Virtual Host verwijst naar bestandsinhoud vanaf het /srv/http/ systeempad.

4. De laatste stap is het maken van de map /srv/http/ en het maken van de bestandsconfiguratie name-ip.conf beschikbaar voor lezen in Nginx (met behulp van symbolische link), start dan de daemon opnieuw op om nieuwe configuraties zichtbaar te maken.

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

5. Om dit te verifiëren, richt u uw browser naar het IP-adres van het Arch-systeem. U zou moeten zien dat de webinhoud verschilt van http://localhost. Hier heb ik een klein php-script toegevoegd dat ook FastCGI PHP-configuraties controleert, zoals in de onderstaande schermafbeelding.

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

<?php
phpinfo();
?>

6. Een andere methode die ik zelf heb ontwikkeld om virtuele hosts op Nginx in of uit te schakelen is eleganter en is geïnspireerd op het Apache a2eniste-script.

Om deze methode te gebruiken, opent u een bestandseditor en maakt u een nieuw bestand, genaamd n2ensite, op uw $HOME pad met de onderstaande inhoud, maakt u het uitvoerbaar en voert u het uit met rootrechten en geef als optie uw nieuwe virtuele hostnaam door zonder .conf einde (vul gratis in om het aan uw behoeften aan te passen).

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

Maak het uitvoerbaar en voer het uit zoals getoond.

sudo chmod +x n2ensite
sudo ./n2ensite your_virtual_host

7. Om virtuele hosts uit te schakelen, maakt u een nieuw n2dissite-bestand met de volgende inhoud en past u dezelfde instellingen toe als hierboven.

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. Nu kunt u deze twee scripts gebruiken om elke virtuele host in of uit te schakelen, maar als u het als systeembrede opdrachten wilt toepassen, kopieert u beide scripts naar /usr/local/bin/ en dan kun je het gebruiken zonder het pad op te geven.

sudo cp n2ensite n2dissite /usr/local/bin/

Stap 2: Schakel SSL in met virtuele hosts op Nginx

SSL (Secure Sockets Layer) is een protocol dat is ontworpen om HTTP-verbindingen via netwerken of internet te coderen, waardoor gegevensstromen via een beveiligd kanaal kunnen worden verzonden met behulp van symmetrische/asymmetrische cryptografiesleutels en wordt geleverd in Arch Linux door het OpenSSL-pakket.

sudo pacman -S openssl

9. Om HTTPS-verbindingen met Nginx mogelijk te maken, moet u eerst denken aan het genereren van virtuele hosts-sleutels. Om de zaken te vereenvoudigen heb ik een klein script ontwikkeld dat automatisch cryptografische sleutels genereert op het mappad /etc/nginx/ssl, waarbij de namen van virtuele hosts als sleutelnamen worden gebruikt.

Maak een bestand met de naam nginx_gen_ssl en voeg de volgende inhoud toe.

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. Nadat het script is gemaakt, voegt u uitvoeringsrechten toe, voert u het uit en geeft u uw certificaatopties op, waarvan de belangrijkste het veld Common Name is (voeg hier de officiële domeinnaam toe) en laat de velden Wachtwoord en Optioneel Bedrijf leeg.

sudo chmod +x nginx_gen_ssl
sudo ./nginx_gen_ssl

Aan het einde van de taak voor het genereren van sleutels wordt een lijst met alle beschikbare sleutels onder de Nginx SSL-map weergegeven.

Als u wilt dat dit script als systeemopdracht wordt gebruikt, kopieert of verplaatst u het naar /usr/local/bin/.

sudo mv nginx_gen_ssl  /usr/local/bin

11. Nadat we de sleutels hebben gegenereerd die nodig zijn voor Nginx SSL Virtual Host, is het tijd om daadwerkelijk een SSL Virtual Host-configuratiebestand te maken. Gebruik hetzelfde systeem-IP-adres voor Virtual Host als hierboven bij de servernaam-richtlijn, maar wijzig de bestandsnaam van de Virtual Host enigszins door ssl toe te voegen vóór .conf, om u eraan te herinneren dat dit bestand staat voor naam-ip SSL Virtual Host.

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

Wijzig in dit bestand de listen poortinstructie in 443 ssl en geef SSL- en certificaatsleutelbestandspaden op, zoals de paden die eerder zijn gemaakt, zoals in onderstaand fragment.

## 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. Nadat het bestand is gemaakt, gebruikt u het n2ensite-script of de ln-opdrachtregel om het te activeren (creëert een symbolische bestandslink in sites -enabled map), start vervolgens de Nginx-daemon opnieuw op om de instellingen toe te passen.

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. Wijs uw browser opnieuw naar Arch IP URL, maar deze keer met behulp van het HTTPS-protocol – https://192.168.1.33 op mijn systeem- en er zou een beveiligingsfout Verbinding niet vertrouwd moeten verschijnen ( Beveiligingsuitzondering toevoegen en bevestigen om verder te gaan op pagina).

Zoals je nu kunt zien, biedt je Nginx Virtual Host dezelfde inhoud als de vorige name-ip host, maar deze keer met behulp van een beveiligde HTTP-verbinding.

Stap 3: Toegang tot PhpMyAdmin via Virtual Host

Als Virtual Host is ingeschakeld op Nginx, hebben we niet langer toegang tot de inhoud van het http://localhost-pad (localhost levert meestal inhoud met behulp van een loopback-IP-adres of systeem-IP-adres als dit niet anders is geconfigureerd) omdat we gebruikte het Arch-systeem-IP als servernaam, dus ons inhoudspad is veranderd.

14. De eenvoudigste methode om via internet toegang te krijgen tot PhpMyAdmin is door een symbolische link te maken tussen het pad /usr/share/webapps/phpMyAdmin/ en ons nieuw gedefinieerde virtuele hostpad (/srv/http).

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

15. Nadat u de bovenstaande opdracht heeft uitgevoerd, vernieuwt u uw pagina en ziet u een nieuwe map phpMyAdmin verschijnen, als de autoindex-instructie is ingeschakeld op Nginx Virtual Host of als uw URL rechtstreeks naar verwijst PhpMyAdmin-map https://arch_IP/phpMyAdmin.

16. Als je de phpMyAdmin-string in de browser wilt opschonen, bewerk dan je Virtual Hosts-bestanden en voeg de volgende inhoud toe onder serverblok.

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

Stap 4: Schakel een met een wachtwoord beveiligde map in op Nginx

In tegenstelling tot Apache gebruikt Nginx de HttpAuthBasic-module om Wachtwoordbeveiligde mappen in te schakelen, maar biedt geen tools om een gecodeerd .htpasswd-bestand te maken.

17. Om mapwachtwoordbeveiliging te bereiken met Nginx op Arch Linux, installeert u de Apache-webserver en gebruikt u de tools om een gecodeerd .htaccess-bestand te genereren.

sudo pacman -S apache

18. Nadat u Apache hebt geïnstalleerd, maakt u een nieuwe map aan onder /etc/nginx/ met de intuïtieve naam passwd, waar het bestand .htpasswd wordt opgeslagen en gebruikt htpasswd commando met –c schakel de eerste toegevoegde gebruiker in om een bestand te genereren, en als je meer gebruikers wilt toevoegen, gebruik dan htpasswd zonder – c schakelaar.

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. Om naam-ip-ssl te beschermen, wordt het root-pad /srv/http/ van de virtuele host met alle submappen en bestanden daaronder beschermd het voegt de volgende instructies toe aan uw Virtual Host-serverblok onder de root-richtlijn en verwijst naar het absolute .htpasswd bestandspad.

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

20. Nadat u de Nginx-service opnieuw heeft opgestart, vernieuwt u de pagina en verschijnt er een pop-up Authenticatie vereist die om uw inloggegevens vraagt.

Nu hebt u met succes Nginx Wachtwoordbeveiligde mappen ingeschakeld, maar houd er rekening mee dat tegelijkertijd de Apache-webserver op uw systeem wordt geïnstalleerd, dus zorg ervoor dat deze uitgeschakeld blijft en start hem op geen enkele manier, omdat dit kan leiden tot poorten die conflicteren met Nginx.

Stap 5: HTTP omleiden naar HTTPS op Nginx

21. Als je wilt dat browsers automatisch alle onveilige HTTP-verzoeken omleiden naar het HTTPS-protocol, open en bewerk dan, je bent niet-ssl Virtual Host en voeg de volgende instructie toe onder servernaam richtlijn.

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

Alle instellingen die in dit artikel worden gepresenteerd, zijn gemaakt onder een Arch Linux-systeem dat als server fungeert, maar de meeste ervan, vooral die met betrekking tot Nginx-configuratiebestanden, zijn beschikbaar op de meeste Linux-systemen met kleine verschillen.