Was die Rechte betrifft, kannst Du hier sehr gut ableiten, welche Rechte die Verzeichnisse haben müssen.
Zudem ist es ein funktionierendes HowTo zur Einrichtung von SFTP, auf Deinem Server. In jedem Fall sollte man sich in der heutigen Zeit mit SFTP beschäftigen, eine sichere FTP-Variante gibt es zur Zeit nicht.
Kommen wir nun zu einer Grundkonfiguration für nginx mit Contao 4!
Mit dieser Grundkonfiguration solltest Du zunächst mal einen funktionierenden Webserver erstellen können!
Adressen für Webseiten und Pfade müssen gegebenenfalls an Deine Struktur angepasst werden.
Ein paar Optionen zur Absicherung des Webservers habe ich mit rein gepackt. Es gibt noch mehr Möglichkeiten, die hier aber zu weit führen würden und Dir gegebenenfalls selber aneignen solltest.
Warum es zu Deiner Fehlermeldung kommt, habe ich markiert.
/etc/nging/nginx.conf
Code:
# Benutzer unter dem nginx läuft, meistens www-data
user www-data;
# hier die Anzahl der CPU-Kerne eintragen
worker_processes 4;
# wohin mit den Fehlermeldungen von nginx?
error_log /var/log/nginx/error.log info;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
types_hash_max_size 2048;
# logging ein wenig pimpen
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
# ein paar grundsätzliche Definitionen
#
# fehlerhafte Header einfach mal ignorieren
ignore_invalid_headers on;
# wenn man keine Daten von Server zu Server transferieren möchte, kann man es auch abstellen
sendfile off;
# nginx-Version verstecken, geht keinen etwas an
server_tokens off;
# auf dem gesamten System Symlinks aktivieren
# kann man machen, muss man nicht
disable_symlinks off;
# Kompression aktivieren und ein klein wenig Finetuning
gzip on;
gzip_static on;
gzip_buffers 256 8k;
gzip_comp_level 9;
gzip_http_version 1.0;
gzip_min_length 0;
gzip_types text/css text/javascript text/mathml text/plain text/xml application/x-javascript application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml;
gzip_vary on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
# allgemein gültige SSL-Konfiguration
# wenn benötigt auskommentieren
#ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
#ssl_prefer_server_ciphers on;
# Wo sind die Konfigurationsdateien für vHosts zu finden?
#include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
#mail {
# # See sample authentication script at:
# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
# # auth_http localhost/auth.php;
# # pop3_capabilities "TOP" "USER";
# # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
# server {
# listen localhost:110;
# protocol pop3;
# proxy on;
# }
#
# server {
# listen localhost:143;
# protocol imap;
# proxy on;
# }
#}
/etc/nginx/sites-anabled/domain.ltd.conf
Code:
# duplicate Content verhindern, in dem man domain.ltd nach www.domain.ltd direkt umleitet
# wenn benötigt auskommentieren
#server {
# listen 80;
# server_name domain.ltd;
# return 301 http://www.domain.ltd$request_uri;
#}
# wird benötigt, wenn man php5-fpm verwenden möchte
# Sockets erkläre ich an der Stelle nicht, ist aber performanter als über einen Port zu gehen
# taucht in der PHP-Aktivierung später wieder auf
# wenn benötigt auskommentieren
upstream fastcgi_backend {
# php5-fpm über Socket
# server unix:/var/run/domain.ltd.sock;
# php5-fpm über Ports
server 127.0.0.1:9000;
keepalive 64;
}
server {
# Port auf dem nginx lauscht
listen 80;
# Festlegung der Adresse unter der der vHost erreichbar sein soll
server_name www.domain.ltd;
# root-Verzeichnis festlegen
root /var/www/html/domain.ltd/web;
# index-Zuweisung
# für Contao 4 zwingend app.php angeben
index app.php index.php index.html index.htm;
# Pfade müssen gegebenenfalls angepasst und Verzeichnisse erstellt werden
# Rechte für FTP-Benutzer vergeben, damit man später auch löschen kann
# oder man lässt das von logrotate erledigen
access_log /var/www/html/www.domain.ltd/logs/access.log;
error_log /var/www/html/www.domain.ltd/logs/error.log;
# nginx mitteilen, dass er Symlinks folgen soll
disable_symlinks off;
# Falls SSL verwendet wird, sollte man diesen Header setzen, damit der Browser beim erneuten Eintippen automatisch
# auf die geischerte Variante springt.
#add_header Strict-Transport-Security "max-age=31536000;";
# https://developer.mozilla.org/en-US/docs/HTTP/X-Frame-Options
# Verhindert Click Jacking Angriffe
add_header X-Frame-Options SAMEORIGIN;
# Verbietet Content Sniffing
add_header X-Content-Type-Options nosniff;
# Falls ein User aus Versehen, den Schutz bei sich deaktiviert hat, kann man ihn hiermit wieder erzwingen
add_header X-XSS-Protection "1; mode=block";
# andere Header machen bei Contao keinen Sinn
if ( $request_method !~ ^(GET|HEAD|POST)$ ) {
return 404;
}
location / {
try_files $uri $uri/ /app.php?$args;
# ein wenig caching
if (-f $request_filename) {
expires 30d;
break;
}
if (!-e $request_filename) {
rewrite ^(.*)\.html$ /app.php ;
expires 7d;
}
}
# verhindert, dass bestimmte Dateien im Browser aufgerufen werden können
# diese Dateien können Informationen enthalten, die keinen etwas angehen
# ohne diese Deklaration würde ein Browser die Dateien im Klartext ausliefern
location ~* \.(tpl|html5|xhtml)$ {
deny all;
}
# PHP aktivieren und über php5-fpm schicken
# hier findet man die upstream-Deklaration auch wieder
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
fastcgi_pass fastcgi_backend;
fastcgi_index app.php;
include fastcgi_params;
# ein wenig Finetuning, sollte an eigene Bedürfnisse angepasst werden
fastcgi_keep_conn on;
fastcgi_buffer_size 128k;
fastcgi_buffers 256 4k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
}
location ~* .(gif|jpg|jpeg|png|ico|wmv|3gp|avi|mpg|mpeg|mp4|flv|mp3|mid|js|css|wml|swf)$ {
access_log off;
log_not_found off;
expires max;
add_header Pragma public;
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
}
# Können sensible Daten enthalten, nginx verwertet sie nicht
location ~ /\.ht {
deny all;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
# nicht unbedingt notwendig, schaden kann es aber auch nicht
location = /robots.txt {
deny all;
log_not_found off;
access_log off;
}
}
Damit hast Du zumindest erst mal eine Konfiguration, die grundsätzlich mit der aktuellen nginx-Version 1.8.x funktionieren sollte!
Gegebenenfalls muss sie hier und da an Dein System angepasst werden, auch das solltest Du Dir erarbeiten. An einigen Stellen habe ich von Finetuning gesprochen, auch hier muss Du gegebenenfalls anpassen.
Zu gegebener Zeit solltest Du Dich in jedem Fall mit der Absicherung von nginx beschäftigen. Durch kleine Kniffe und Erweiterungen kann man den bösen Buben das Leben viel schwerer machen. Nginx ist da glücklicher Weise einfacher zu administrieren, als der große Häuptling.