Website-Suche

Erstellen Sie virtuelle Hosts, passwortgeschützte Verzeichnisse und SSL-Zertifikate mit „Nginx Web Server“ in Arch Linux


Der vorherige Arch Linux-Artikel „LEMP“ behandelte nur grundlegende Dinge, von der Installation von Netzwerkdiensten (Nginx, MySQL-Datenbank und PhpMyAdmin) bis hin zur Konfiguration der minimalen Sicherheit, die für MySQL-Server und PhpMyadmin erforderlich ist.

Dieses Thema bezieht sich eng auf die frühere Installation von LEMP unter Arch Linux und führt Sie durch die Einrichtung komplexerer Konfigurationen für den LEMP-Stack, insbesondere Nginx-Webserverkonfigurationen, wie das Erstellen virtueller Hosts , verwenden Sie Passwortgeschützte Verzeichnisse, erstellen und konfigurieren Sie HTTP Secure Sockets Layer, HTTP-unsichere Weiterleitungen zu HTTPS und stellen Ihnen auch einige nützliche Bash-Skripte vor erleichtert die Aktivierung virtueller Hosts und die Generierung von SSL-Zertifikaten und -Schlüsseln.

Anforderungen

Installieren Sie LEMP mit der MariaDB-Datenbank in Arch Linux

Schritt 1: Aktivieren Sie virtuelle Hosts auf Nginx

Eine der einfachsten Methoden zum Aktivieren von Virtual Hosts ist die Verwendung von include-Anweisungen in der Hauptkonfigurationsdatei von Nginx, was die Arbeit weiterer Konfigurationen einfacher und effizienter macht, da Sie einfache Dateien erstellen können für jeden neuen Host und halten Sie die Hauptkonfigurationsdatei sauberer.

Dieser Ansatz funktioniert auf die gleiche Weise wie auf dem Apache-Webserver. Als Erstes müssen Sie den neuen URI-Pfad angeben, in dem Nginx Dateianweisungen lesen soll.

1. Öffnen Sie also die Hauptdatei nginx.conf, die sich im Systempfad /etc/nginx/ und unten vor der letzten geschweiften Klammer befindet. }“ fügen Sie den Pfad hinzu, in dem zukünftige Virtual Host-Konfigurationsdateien gespeichert werden.

sudo nano /etc/nginx/nginx.conf

Fügen Sie unten die folgende Anweisung hinzu.

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

Diese Anweisung teilt Nginx mit, dass es alle Dateien lesen soll, die in /etc/nginx/sites-enabled/ gefunden werden, die mit der Erweiterung .conf enden.

2. Der nächste Schritt besteht darin, ein Verzeichnis sites-enabled und ein weiteres Verzeichnis namens sites-available zu erstellen, in dem Sie Ihre gesamte Konfiguration für virtuelle Hosts speichern Dateien.

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

3. Jetzt ist es an der Zeit, einen neuen virtuellen Host zu erstellen. In diesem Beispiel wird die System-IP-Adresse als virtueller Hostname verwendet. Erstellen Sie daher eine neue Datei mit dem Namen name-ip.conf.

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

Fügen Sie den folgenden Inhalt hinzu.

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

Die Anweisung, die den virtuellen Host aktiviert, ist die Anweisung server_name unter dem Überwachungsport. Eine weitere wichtige Anweisung hier ist außerdem die root-Anweisung, die Nginx Virtual Host darauf hinweist, Dateiinhalte vom Systempfad /srv/http/ bereitzustellen.

4. Der letzte Schritt besteht darin, das Verzeichnis /srv/http/ zu erstellen und die Dateikonfiguration name-ip.conf für das Nginx-Lesen verfügbar zu machen (mithilfe von symbolischer Link), dann starten Sie den Daemon neu, um neue Konfigurationen sichtbar zu machen.

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

5. Um dies zu überprüfen, richten Sie Ihren Browser auf die IP-Adresse des Arch-Systems und Sie sollten sehen, dass sich der Webinhalt von http://localhost unterscheidet. Hier habe ich ein kleines PHP-Skript hinzugefügt, das auch FastCGI PHP-Konfigurationen überprüft, wie im Screenshot unten.

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

<?php
phpinfo();
?>

6. Eine andere Methode, die ich selbst entwickelt habe, um virtuelle Hosts auf Nginx zu aktivieren oder zu deaktivieren, ist eleganter und vom Apache-Skript a2eniste inspiriert.

Um diese Methode zu verwenden, öffnen Sie einen Dateieditor und erstellen Sie eine neue Datei mit dem Namen n2ensite in Ihrem $HOME-Pfad mit dem folgenden Inhalt, machen Sie sie ausführbar und führen Sie sie mit Root-Rechten aus und übergeben Sie es als Option an Ihren neuen virtuellen Hostnamen ohne die Endung .conf (füllen Sie es frei aus, um es entsprechend Ihren Anforderungen zu ändern).

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

Machen Sie es ausführbar und führen Sie es als Show aus.

sudo chmod +x n2ensite
sudo ./n2ensite your_virtual_host

7. Um virtuelle Hosts zu deaktivieren, erstellen Sie eine neue n2dissite-Datei mit dem folgenden Inhalt und wenden Sie dieselben Einstellungen wie oben an.

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. Jetzt können Sie diese beiden Skripte verwenden, um jeden virtuellen Host zu aktivieren oder zu deaktivieren. Wenn Sie sie jedoch als systemweite Befehle anwenden möchten, kopieren Sie einfach beide Skripte nach /usr/local/bin/ und dann können Sie es verwenden, ohne den Pfad anzugeben.

sudo cp n2ensite n2dissite /usr/local/bin/

Schritt 2: Aktivieren Sie SSL mit virtuellen Hosts auf Nginx

SSL (Secure Sockets Layer) ist ein Protokoll zur Verschlüsselung von HTTP-Verbindungen über Netzwerke oder das Internet, wodurch der Datenfluss mithilfe symmetrischer/asymmetrischer Kryptografieschlüssel über einen sicheren Kanal übertragen wird und wird in Arch Linux durch das OpenSSL-Paket bereitgestellt.

sudo pacman -S openssl

9. Um HTTPS-Verbindungen mit Nginx zu ermöglichen, müssen Sie zunächst virtuelle Hostschlüssel generieren. Zur Vereinfachung habe ich außerdem ein kleines Skript entwickelt, das automatisch kryptografische Schlüssel im Verzeichnispfad /etc/nginx/ssl generiert und dabei die Benennung des virtuellen Hosts als Schlüsselnamen verwendet.

Erstellen Sie eine Datei mit dem Namen nginx_gen_ssl und fügen Sie den folgenden Inhalt hinzu.

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. Nachdem das Skript erstellt wurde, fügen Sie Ausführungsberechtigungen hinzu, führen Sie es aus und geben Sie Ihre Zertifikatsoptionen an. Das wichtigste ist das Feld Common Name (fügen Sie hier den offiziellen Domänennamen hinzu) und Lassen Sie die Felder „Passwort“ und „Optionale Firma“ leer.

sudo chmod +x nginx_gen_ssl
sudo ./nginx_gen_ssl

Am Ende der Schlüsselgenerierungsaufgabe wird eine Liste mit allen verfügbaren Schlüsseln im Nginx-SSL-Verzeichnis angezeigt.

Wenn Sie möchten, dass dieses Skript auch als Systembefehl verwendet wird, kopieren oder verschieben Sie es nach /usr/local/bin/.

sudo mv nginx_gen_ssl  /usr/local/bin

11. Nachdem wir die für den Nginx SSL Virtual Host erforderlichen Schlüssel generiert haben, ist es an der Zeit, tatsächlich die SSL Virtual Host-Konfigurationsdatei zu erstellen. Verwenden Sie für den virtuellen Host dieselbe System-IP-Adresse wie oben in der Anweisung server_name, ändern Sie jedoch den Dateinamen des virtuellen Hosts geringfügig, indem Sie vor .conf ssl anhängen, um Sie daran zu erinnern, dass es sich um diese Datei handelt steht für name-ip SSL Virtual Host.

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

Ändern Sie in dieser Datei die Portanweisung listen in 443 ssl und stellen Sie die Pfade für SSL- und Zertifikatsschlüsseldateien mit den zuvor erstellten bereit, damit sie wie im folgenden Auszug aussehen.

## 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. Nachdem die Datei erstellt wurde, verwenden Sie das n2ensite-Skript oder die ln-Befehlszeile, um sie zu aktivieren (erstellt einen symbolischen Dateilink in sites). -enabled-Verzeichnis) und starten Sie dann den Nginx-Daemon neu, um die Einstellungen zu übernehmen.

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. Richten Sie Ihren Browser erneut auf Arch IP URL, verwenden Sie dieses Mal jedoch das HTTPS-Protokoll – https://192.168.1.33 auf meinem System – und Es sollte ein Sicherheitsfehler Verbindung nicht vertrauenswürdig angezeigt werden (Sicherheitsausnahme hinzufügen und bestätigen, um weiter auf der Seite zu gehen).

Wie Sie jetzt sehen können, stellt Ihr virtueller Nginx-Host denselben Inhalt wie der vorherige name-ip-Host bereit, diesmal jedoch über eine sichere HTTP-Verbindung.

Schritt 3: Greifen Sie über Virtual Host auf PHPMyAdmin zu

Wenn Virtual Host auf Nginx aktiviert ist, haben wir keinen Zugriff mehr auf die Pfadinhalte von http://localhost (localhost stellt Inhalte normalerweise über die Loopback-IP-Adresse oder die System-IP-Adresse bereit, sofern nicht anders konfiguriert), da dies der Fall ist hat die Arch-System-IP als Servername verwendet, daher hat sich unser Inhaltspfad geändert.

14. Die einfachste Methode, über das Web auf PhpMyAdmin zuzugreifen, besteht darin, einen symbolischen Link zwischen dem Pfad /usr/share/webapps/phpMyAdmin/ zu erstellen und unser neu definierter virtueller Hostpfad (/srv/http).

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

15. Nachdem Sie den obigen Befehl ausgeführt haben, aktualisieren Sie Ihre Seite und Sie werden einen neuen Ordner phpMyAdmin sehen, wenn die autoindex-Anweisung auf Nginx Virtual Host aktiviert ist oder Ihre URL direkt darauf verweist PHPMyAdmin-Ordner https://arch_IP/phpMyAdmin.

16. Wenn Sie die phpMyAdmin-Zeichenfolge im Browser bereinigen möchten, bearbeiten Sie Ihre Virtual Hosts-Dateien und fügen Sie den folgenden Inhalt unter Serverblock hinzu.

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

Schritt 4: Aktivieren Sie das passwortgeschützte Verzeichnis auf Nginx

Im Gegensatz zu Apache verwendet Nginx das Modul HttpAuthBasic, um passwortgeschützte Verzeichnisse zu aktivieren, stellt jedoch keine Tools zum Erstellen einer verschlüsselten .htpasswd-Datei bereit.

17. Um mit Nginx unter Arch Linux einen Verzeichniskennwortschutz zu erreichen, installieren Sie den Apache-Webserver und verwenden Sie seine Tools, um eine verschlüsselte .htaccess-Datei zu generieren.

sudo pacman -S apache

18. Nachdem Sie Apache installiert haben, erstellen Sie unter /etc/nginx/ ein neues Verzeichnis mit dem Namen „intuitiv passwd“, in dem die Datei „.htpasswd“ gespeichert und verwendet wird htpasswd-Befehl mit –c Schalten Sie den ersten hinzugefügten Benutzer ein, um eine Datei zu generieren. Wenn Sie dann weitere Benutzer hinzufügen möchten, verwenden Sie htpasswd ohne – c Schalter.

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. Zum Schutz des name-ip-ssl-Stammverzeichnisses des virtuellen Hosts /srv/http/ wird der Pfad mit allen Unterordnern und Dateien darunter bereitgestellt Es fügt die folgenden Anweisungen in Ihren Virtual Host-Serverblock unter der Root-Direktive ein und verweist auf den absoluten Dateipfad .htpasswd.

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

20. Nachdem Sie den Nginx-Dienst neu gestartet haben, aktualisieren Sie die Seite und es sollte ein Popup-Fenster Authentifizierung erforderlich angezeigt werden, in dem Sie nach Ihren Anmeldeinformationen gefragt werden.

Jetzt haben Sie Nginx Passwortgeschützte Verzeichnisse erfolgreich aktiviert. Beachten Sie jedoch, dass gleichzeitig der Apache-Webserver in Ihrem System installiert wird. Stellen Sie daher sicher, dass er deaktiviert bleibt, und starten Sie ihn auf keinen Fall, da dies zu Problemen führen kann Ports, die mit Nginx in Konflikt stehen.

Schritt 5: Leiten Sie HTTP auf Nginx zu HTTPS um

21. Wenn Sie möchten, dass Browser alle unsicheren HTTP-Anfragen automatisch auf das HTTPS-Protokoll umleiten, öffnen und bearbeiten Sie den nicht-ssl virtuellen Host und fügen Sie die folgende Anweisung unter server_name-Direktive.

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

Alle in diesem Artikel vorgestellten Einstellungen wurden unter einem Arch Linux-System vorgenommen, das als Server fungiert. Die meisten davon, insbesondere diejenigen in Bezug auf Nginx-Konfigurationsdateien, sind jedoch mit geringfügigen Unterschieden auf den meisten Linux-Systemen verfügbar.