nginx: [emerg] "Server" -Richtlinie ist hier nicht erlaubt

99

Ich habe nginx neu konfiguriert, kann es jedoch nicht mit der folgenden Konfiguration neu starten:

conf:

server {
listen 80;
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}


server {
listen 80;
server_name example.com;

access_log /var/log/nginx/access.log;
error_log  /var/log/nginx/error.log;

location /robots.txt {
    alias /path/to/robots.txt;
    access_log off;
    log_not_found off;
}

location = /favicon.ico { access_log off; log_not_found off; }

location / {
    proxy_pass_header Server;
    proxy_set_header Host $http_host;
    proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Scheme $scheme;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_connect_timeout 30;
    proxy_read_timeout 30;
    proxy_pass http://127.0.0.1:8000;
}

location /static {
    expires 1M;
    alias  /path/to/staticfiles;
}
}

Nach dem Ausführen sudo nginx -c conf -tzum Testen der Konfiguration wird der folgende Fehler zurückgegeben. Ich kann nicht herausfinden, was wirklich das Problem ist

nginx: [emerg] "server" directive is not allowed here in    /etc/nginx/sites-available/config:1
nginx: configuration file /etc/nginx/sites-available/config test failed
samix73
quelle

Antworten:

175

Das ist keine nginxKonfigurationsdatei. Es ist Teil einer nginxKonfigurationsdatei.

Die nginxKonfigurationsdatei (normalerweise aufgerufen nginx.conf) sieht folgendermaßen aus:

events {
    ...
}
http {
    ...
    server {
        ...
    }
}

Der serverBlock ist in einem httpBlock eingeschlossen.

Häufig wird die Konfiguration auf mehrere Dateien verteilt, indem mithilfe der includeAnweisungen zusätzliche Fragmente (z. B. aus dem sites-enabledVerzeichnis) abgerufen werden.

Verwenden Sie sudo nginx -tdiese Option , um die vollständige Konfigurationsdatei zu testen, die nginx.confmit der includeAnweisung beginnt und zusätzliche Fragmente abruft. Weitere Informationen finden Sie in diesem Dokument .

Richard Smith
quelle
Diese Antwort ist korrekt und wurde zu Recht positiv bewertet - ich versuche weiter zu klären, kann anderen Noobs wie mir helfen. Habe also diese Frage unten beantwortet.
Rohit Dhankar
13

Beispiel gültige nginx.conf für Reverse Proxy; Für den Fall, dass jemand wie ich feststeckt

events {
  worker_connections  4096;  ## Default: 1024
}
http {
 server {
   listen 80;
   listen [::]:80;

   server_name 10.x.x.x;

   location / {
       proxy_pass http://10.y.y.y:80/;
       proxy_set_header Host $host;
   }
 }
}

und Sie können es auch im Docker servieren

 docker run --name nginx-container --rm --net=host   -v /home/core/nginx/nginx.conf:/etc/nginx/nginx.conf nginx
Alex Punnen
quelle
2

Der Pfad zu der nginx.confDatei, die die primäre Konfigurationsdatei für Nginx ist - dies ist auch die Datei, die bei Bedarf den Pfad für andere Nginx-Konfigurationsdateien enthalten soll /etc/nginx/nginx.conf.

Sie können auf diese Datei zugreifen und sie bearbeiten, indem Sie sie am Terminal eingeben

cd /etc/nginx

/etc/nginx$ sudo nano nginx.conf

Weiter können Sie in diese Datei andere Dateien aufnehmen - die eine SERVER-Direktive als unabhängigen SERVER-BLOCK haben können -, die sich nicht in den HTTP- oder HTTPS-Blöcken befinden müssen, wie in der oben akzeptierten Antwort erläutert.

Ich wiederhole: Wenn Sie einen SERVER BLOCK benötigen, der in der PRIMARY Config-Datei selbst definiert werden soll, muss dieser SERVER BLOCK in einem umschließenden HTTP- oder HTTPS-Block in der /etc/nginx/nginx.confDatei definiert werden, die die primäre Konfigurationsdatei für Nginx ist.

Beachten Sie auch, dass es in Ordnung ist, wenn Sie definieren, dass ein SERVER-BLOCK ihn direkt nicht in einen HTTP- oder HTTPS-Block in einer Datei im Pfad einschließt /etc/nginx/conf.d. Damit dies funktioniert, müssen Sie den Pfad dieser Datei in die PRIMARY Config-Datei aufnehmen, wie unten dargestellt: -

http{
    include /etc/nginx/conf.d/*.conf; #includes all files of file type.conf
}

Darüber hinaus können Sie aus der PRIMARY Config-Datei die Zeile auskommentieren

http{
    #include /etc/nginx/sites-available/some_file.conf; # Comment Out 
    include /etc/nginx/conf.d/*.conf; #includes all files of file type.conf
}

und muss keine /etc/nginx/sites-available/Konfigurationsdateien behalten und muss auch nicht SYMBOLISCH verknüpft werden. Bitte /etc/nginx/sites-enabled/beachten Sie, dass dies für mich funktioniert - falls jemand der Meinung ist, dass dies für ihn nicht der Fall ist oder diese Art der Konfiguration illegal ist usw. usw., hinterlassen Sie bitte einen Kommentar, damit Ich kann mich korrigieren - danke.

BEARBEITEN: - Gemäß der neuesten Version des offiziellen Nginx-Kochbuchs müssen wir keine Konfigurationen innerhalb erstellen - /etc/nginx/sites-enabled/dies war die ältere Praxis und ist jetzt VERRINGERT.

Somit ist die INCLUDE DIRECTIVE nicht erforderlich include /etc/nginx/sites-available/some_file.conf;.

Zitat aus Nginx CookBook Seite - 5.

"In einigen Paket-Repositorys wird dieser Ordner als sites-enabled bezeichnet, und Konfigurationsdateien werden aus einem Ordner mit dem Namen site-available verknüpft. Diese Konvention ist abweichend."

Rohit Dhankar
quelle
0

In einer von der Konfiguration importierten Datei befindet sich möglicherweise nur ein Tippfehler. Zum Beispiel habe ich einen Tippfehler tief in meiner Konfigurationsdatei gemacht:

loccation /sense/movies/ {
                  mp4;
        }

(Ort anstelle von Ort), und dies verursacht den Fehler:

nginx: [emerg] "server" directive is not allowed here in /etc/nginx/sites-enabled/xxx.xx:1
Bojan
quelle