Probleme mit der Bucket Size unter Nginx

Als ich meinen Nginx-Server neustarten wollte, wurde dies vom System mit einem Fehler quittiert. In der entsprechenden Logdatei (/var/log/nginx/error.log) fand sich folgende Meldung:

could not build the server_names_hash, you should increase server_names_hash_bucket_size: 32

Die Größe die im Parameter server_names_hash_bucket_size definiert ist, beträgt im Standardfall 32 oder 64. Um den Fehler zu beseitigen muss die Konfigurationsdatei von Nginx geöffnet werden:

nano /etc/nginx/nginx.conf

Dort sollte man den Wert auf 64 oder 128 stellen und Nginx anschließend neustarten. Damit ist der Fehler behoben. Benötigt wird diese Option für die Größe der Hashtabellen in welchen die Servernamen gespeichert werden.

Weitere Informationen gibt es unter:
http://nginx.org/en/docs/http/server_names.html
http://nginx.org/en/docs/http/ngx_http_core_module.html#server_names_hash_bucket_size

Upload Limit für PHP-FPM in Verbindung mit Nginx erhöhen

Standardmäßig liegt das Uploadlimit für Dateien einer Nginx Installation mit der entsprechenden PHP-Installation bei 2 MiB. Damit stößt man natürlich bei vielen Anwendungen sehr schnell an die Grenze, so z.B. beim Upload von größeren Bildern. Möchte man dies ändern, müssen sowohl die Nginx-Konfiguration als auch die PHP-Konfiguration angepasst werden. Im ersten Schritt wird die Nginx-Konfuration bearbeitet:

nano /etc/nginx/nginx.conf

Dort wird im „http“-Block die Zeile:

client_max_body_size 1024m;

hinzugefügt. Unter Umständen muss hier auch die „client_body_timeout“-Option mit einem höheren Timeout versehen werden. Dies sollte man allerdings durch eigene Tests herausfinden. Nachdem Nginx konfiguriert ist, geht es an die „php.ini“-Datei:

nano /etc/php5/fpm/php.ini

Dort müssen folgende Parameter gesetzt werden:

post_max_size = 1024M
upload_max_filesize = 1024M

Nachdem das erledigt ist, können Nginx und der PHP Service neugestartet werden:

service nginx restart
service php5-fpm restart

Anschließend verfügt man in diesem Fall über ein neues Upload Limit von 1024 MiB.

Selbstsigniertes Zertifikat erstellen und bei Nginx einbinden

Für verschlüsselte HTTP Verbindungen benötigt man ein Zertifikat. Dieses kann man sich von einer Zertifizierungsstelle (Certificate Authority, CA) ausstellen lassen. Der Haken an der Sache ist das dies Geld kostet (CACert und StartCom mal außen vor gelassen). Eine Alternative hierzu wäre es das Zertifikat selbst zu erstellen. Bei Diensten die man nur für einen kleinen Nutzerkreis z.B. für die Familie hostet, ist es auch vertretbar die Zertifikatswarnung im Browser über sich ergehen zu lassen. Für die Zertifikate wird ein Ordner erstellt und in diesen gewechselt:

mkdir /etc/nginx/ssl
cd /etc/nginx/ssl

Nun werden das Zertifikat und der Certificate Signing Request erstellt:

openssl genrsa -out example.key 2048
openssl req -new -key example.key -out example.csr

Bei der Erstellung des Certificate Signing Request müssen einige Daten angegeben werden:

Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:Mecklenburg-Vorpommern
Locality Name (eg, city) []:Neubrandenburg 
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Inc
Organizational Unit Name (eg, section) []:Skunk works
Common Name (e.g. server FQDN or YOUR name) []:example.org
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Nun muss das Zertifikat noch signiert werden, bevor wir es verwenden können:

openssl x509 -req -days 730 -in example.csr -signkey example.key -out example.crt

In diesem Fall ist das Zertifikat 730 Tage, also zwei Jahre gültig. Da die Signierung nun abgeschlossen ist, kann das Zertifikat in Nginx eingebunden werden. Dazu öffnen wir die Datei „/etc/nginx/sites-available/example“, wobei „example“ hier natürlich für die entsprechende Konfigurationsdatei steht. Dort sollte die SSL Konfiguration vorgenommen werden:

server {
        listen 443 ssl;

        root /var/www/example/root;
        index index.html index.htm;
 
        server_name .example.org;

        ssl_certificate /etc/nginx/ssl/example.crt;
        ssl_certificate_key /etc/nginx/ssl/example.key;
}

Nach dem Aktualisieren der Konfiguration mittels:

service nginx restart

ist die verschlüsselte Verbindung für die eingerichtete Seite aktiv und kann genutzt werden.

Weitere Informationen gibt es unter:
http://nginx.org/en/docs/http/configuring_https_servers.html

Nginx Server mit PHP und MySQL unter Ubuntu aufsetzen

Mittels Nginx ist ein Webserver mit PHP und MySQL in ein paar Minuten eingerichtet. Dazu installiert man unter Ubuntu folgende Pakete:

sudo apt-get install mysql-server nginx php5-fpm php5-curl php5-gd php5-imap php5-mysql

Nach der Installation der nötigen Pakete geht es an die grundlegende Konfiguration des Webserver:

mkdir -p /var/www/example.org/root
mkdir -p /var/www/example.org/test
cd /var/www
chown -R www-data:www-data . 
usermod -a -G www-data nutzername

In diesem Beispiel soll die Domain „example.org“ sowie die Subdomain „test.example.org“ eingerichtet werden. Deshalb legen wir zwei Ordner an. Anschließend teilen wir Nginx mit, welche Domains und Subdomains der Webserver verwalten soll. Dazu legen wir die Datei „/etc/nginx/sites-available/example“ an und füllen diese mit folgendem Inhalt:

server {
        listen   80;
        listen [::]:80;

        root /var/www/example.org/root;
        index index.php index.html index.htm;
 
        server_name .example.org;

        location ~ \.php$ {
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }
}

server {
        listen   80;
        listen [::]:80;

        root /var/www/example.org/test;
        index index.php index.html index.htm index.php; 

        server_name test.example.org;

        location / {
            auth_basic "Access denied";
            auth_basic_user_file /var/www/example.org/root/.htpasswd;

            autoindex on;
        }

        location ~ \.php$ {
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }
}

Im ersten Block wird die Domain „example.org“ definiert und konfiguriert. Durch die Notation „.example.org“ wird Nginx angewiesen, jede Subdomain welche nicht definiert ist, auf die Hauptseite umzuleiten. Für die Domain „test.example.org“ wurde außerdem ein Passwortschutz angelegt und die Verzeichnisansicht aktiviert. Damit die Konfiguration auch aktiv werden kann, muss eine symbolische Verknüpfung in das Verzeichnis „/etc/nginx/sites-enabled“ angelegt werden:

ln -s /etc/nginx/sites-available/example /etc/nginx/sites-enabled/example

Die bestehende „default“-Datei im „sites-enabled“ Ordner enthält eine Beispielkonfiguration. Diese kann entwerder entfernt werden oder konfiguriert werden:

server {
        listen   80 default_server;
        listen [::]:80 default_server ipv6only=on;

        root /var/www/default/root;
        index index.php index.html index.htm;
 
        server_name _;
}

Mit dieser Konfiguration wird jede Seite auf Default umgeleitet, welche nicht in anderen Konfigurationen auftaucht. Nun muss nur noch der Webserver (und des PHPs Moduls) neugestartet werden:

service nginx restart
service php5-fpm restart

Ist der Server bereits online, reicht es auch die Konfiguration neuzuladen:

service nginx reload

Sollten während der Konfiguration Fehler auftreten, so hilft ein Blick in das entsprechende Log:

cat /var/log/nginx/error.log

Benötigt man eine Datenbank für die gewünschte Webanwendung, so muss diese in die SQL Datenbank eingespielt werden. Ist alles richtig konfiguriert worden, läuft der Webserver auf Port 80 und wartet auf erste Anfragen.

Directory Listing unter Nginx

Im Apache wird das Directory Listing in der „.htaccess“-Datei mit der Direktive:

Options +Indexes

aktiviert. Damit wird beim Aufruf eines Verzeichnisses ohne Indexdatei die Verzeichnisstruktur angezeigt. Auch der freie Webserver Nginx unterstützt dieses Verfahren. Bei ihm nennt sich die passende Direktive „autoindex“ und wird in der Seitenkonfiguration eingetragen:

server {
    location / {
       autoindex on;        
    }
}

Damit werden dann Verzeichnisse und Dateien im Browser angezeigt. Das Feature sollte natürlich nur bei Seiten eingeschaltet werden, wo dieses gewünscht ist.