Nginx unter einem Bitnami-AWS-Lightsail-Image betreiben

Vor Kurzem habe ich ganz stolz einen produktiven Nginx-Ubuntu-Server bei Amazon AWS Lightsail installiert und konfiguriert. Sogar mit Let’s Encrypt.

Nachfolgend ein paar Ressourcen und Tipps dazu, die mir geholfen haben.


Beispielhafte NGINX-Konfigurationsdatei

Datei „/opt/bitnami/apps/ereignisanzeige.de/conf/nginx-vhosts.conf“:

server {
    listen    80;
    root   "/opt/bitnami/apps/ereignisanzeige.de/htdocs";
    server_name ereignisanzeige.de www.ereignisanzeige.de;

    return 301 https://ereignisanzeige.de$request_uri;

    include "/opt/bitnami/apps/ereignisanzeige.de/conf/nginx-app.conf";
}

server {
    listen    443 ssl;
    root   "/opt/bitnami/apps/ereignisanzeige.de/htdocs";
    server_name  ereignisanzeige.de www.ereignisanzeige.de;

    if ($request_uri ~* "^(.*/)index\.html$") {
        return 301 $1;
    }

    #rewrite ^index.html$ / permanent;

    ssl_certificate      "/etc/letsencrypt/live/ereignisanzeige.de/fullchain.pem";
    ssl_certificate_key  "/etc/letsencrypt/live/ereignisanzeige.de/privkey.pem";

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

    ssl_prefer_server_ciphers  on;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS;

    include "/opt/bitnami/apps/ereignisanzeige.de/conf/nginx-app.conf";
    include "/opt/bitnami/nginx/conf/bitnami/uwekeim-caching.conf";
}

Let’s-Encrypt-Zertifikat erneuern

Um das SSL-Zertifikat regelmäßig zu erneuern, ist eigentlich ein Cronjob mit folgender Zeile nötig:

/opt/bitnami/letsencrypt/certbot-auto renew

Leider funktioniert das bei mir nicht, wenn NGINX läuft.

Die Lösung ist, dass ich ein komplettes Bash-Skript geschrieben habe („renew-certs.sh“) mit folgendem Inhalt:

#!/bin/sh

/opt/bitnami/ctlscript.sh stop
/opt/bitnami/letsencrypt/certbot-auto renew
/opt/bitnami/ctlscript.sh start

Dieses trage ich dann als cronjob ein (sudo crontab -e):

24  0 * * * /usr/bin/sudo /home/zeta/renew-certs.sh > /home/zeta/renew-certs.log 2>&1

Was ich mit dem lego-Client noch gemacht habe, ist, in die Datei „/etc/lego/renew-certificate.sh“ je SSL-Zertifikat eine Zeile eingetragen habe.

Beispielhafte Datei:

#!/bin/bash

sudo /opt/bitnami/ctlscript.sh stop.

sudo /usr/local/bin/lego --email="uwe.keim@gmail.com" --domains="domain1.com" --path="/etc/lego" renew
sudo /usr/local/bin/lego --email="uwe.keim@gmail.com" --domains="domain2.com" --path="/etc/lego" renew
sudo /usr/local/bin/lego --email="uwe.keim@gmail.com" --domains="domain3.com" --path="/etc/lego" renew
sudo /usr/local/bin/lego --email="uwe.keim@gmail.com" --domains="domain4.com" --path="/etc/lego" renew

sudo /opt/bitnami/ctlscript.sh start

Inzwischen habe ich meine zweite Bitnami-AWS-Instanz auf EC2 aufgesetzt (also nicht mehr Lightsail).

Jetzt habe ich mich (fast) komplett an die Anleitung von Bitnami gehalten, also auch den „lego“-Client für die Zertifikate benommen. Nur das via ln beschriebene symbolische Verlinken der Zertifikate habe ich weg gelassen (weil ich mehrere Websites habe) und in meinen conf-Dateien habe ich direkt auf die Zertifikate verlinkt.


Beispielhafte NGINX-Konfigurationsdatei

Datei „/opt/bitnami/apps/ereignisanzeige.de/conf/nginx-vhosts.conf“:

server {
    listen    80;
    root   "/opt/bitnami/apps/ereignisanzeige.de/htdocs";
    server_name ereignisanzeige.de www.ereignisanzeige.de;

    return 301 https://ereignisanzeige.de$request_uri;

    include "/opt/bitnami/apps/ereignisanzeige.de/conf/nginx-app.conf";

    access_log off;
    error_log off;
}

server {
    listen    443 ssl;
    root   "/opt/bitnami/apps/ereignisanzeige.de/htdocs";
    server_name  ereignisanzeige.de www.ereignisanzeige.de;

    if ($request_uri ~* "^(.*/)index\.html$") {
        return 301 $1;
    }

    #rewrite ^index.html$ / permanent;

    ssl_certificate      "/etc/lego/certificates/ereignisanzeige.de.crt";
    ssl_certificate_key  "/etc/lego/certificates/ereignisanzeige.de.key";

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

    ssl_prefer_server_ciphers  on;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS;

    include "/opt/bitnami/apps/ereignisanzeige.de/conf/nginx-app.conf";
    include "/opt/bitnami/nginx/conf/bitnami/uwekeim-caching.conf";

    access_log off;
    error_log off;
}

Virtueller Host einrichten

In der Anleitung von Bitnami ist das ganz gut beschrieben.

Die Verweise auf die einzelnen Konfigurationsdateien der virtuellen Hosts erfolgt in dieser Konfigurationsdatei:

/opt/bitnami/nginx/conf/bitnami/bitnami-apps-vhosts.conf

Meine sieht z. B. aktuell so aus:

include "/opt/bitnami/apps/docs.zeta-test.com/conf/nginx-vhosts.conf";
include "/opt/bitnami/apps/docs.zeta-uploader.com/conf/nginx-vhosts.conf";
include "/opt/bitnami/apps/ereignisanzeige.de/conf/nginx-vhosts.conf";