nginx: [emerg] la directiva "servidor" no está permitida aquí

100

He reconfigurado nginx pero no puedo reiniciarlo usando la siguiente configuración:

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

después de ejecutar sudo nginx -c conf -tpara probar la configuración, se devuelve el siguiente error, no puedo entender cuál es realmente el problema

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
fuente

Respuestas:

178

Ese no es un nginxarchivo de configuración. Es parte de un nginxarchivo de configuración.

El nginxarchivo de configuración (normalmente llamado nginx.conf) se verá así:

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

El serverbloque está encerrado dentro de un httpbloque.

A menudo, la configuración se distribuye en varios archivos, utilizando las includedirectivas para extraer fragmentos adicionales (por ejemplo, del sites-enableddirectorio).

Úselo sudo nginx -tpara probar el archivo de configuración completo, que comienza en nginx.confy extrae fragmentos adicionales usando la includedirectiva. Consulte este documento para obtener más información.

Richard Smith
fuente
Esta respuesta es correcta y ha sido correctamente votada: estoy tratando de aclarar más, puede ayudar a otros novatos como yo. Por lo tanto, he respondido a esta pregunta a continuación.
Rohit Dhankar
14

Ejemplo nginx.conf válido para proxy inverso; En caso de que alguien esté atrapado como yo

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

y también puedes servirlo en Docker

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

La ruta al nginx.confarchivo que es el archivo de configuración principal para Nginx, que también es el archivo que INCLUIRÁ la ruta para otros archivos de configuración de Nginx cuando sea necesario /etc/nginx/nginx.conf.

Puede acceder y editar este archivo escribiendo esto en la terminal

cd /etc/nginx

/etc/nginx$ sudo nano nginx.conf

Además, en este archivo puede incluir otros archivos, que pueden tener una directiva SERVER como un BLOQUE DE SERVIDOR independiente, que no necesitan estar dentro de los bloques HTTP o HTTPS, como se aclara en la respuesta aceptada anterior.

Repito: si necesita que se defina un BLOQUE DE SERVIDOR dentro del archivo de configuración PRIMARIO en sí, ese BLOQUE DE SERVIDOR deberá definirse dentro de un bloque HTTP o HTTPS adjunto en el /etc/nginx/nginx.confarchivo que es el archivo de configuración principal para Nginx.

También tenga en cuenta que está bien si define un BLOQUE DE SERVIDOR directamente que no lo encierra dentro de un bloque HTTP o HTTPS, en un archivo ubicado en la ruta /etc/nginx/conf.d. Además, para que esto funcione, deberá incluir la ruta de este archivo en el archivo de configuración PRIMARY como se muestra a continuación:

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

Además de esto, puede comentar desde el archivo de configuración PRIMARY, la línea

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

y no es necesario mantener ningún archivo de configuración /etc/nginx/sites-available/y tampoco es necesario vincularlos SIMBÓLICOS /etc/nginx/sites-enabled/, tenga en cuenta que esto funciona para mí, en caso de que alguien piense que no es así para ellos o que este tipo de configuración es ilegal, etc., etc., por favor deje un comentario para que puedo corregirme - gracias.

EDITAR: - De acuerdo con la última versión del Libro de cocina oficial de Nginx, no necesitamos crear ninguna configuración interna /etc/nginx/sites-enabled/, esta era la práctica anterior y ahora está DESPRECIADA.

Por lo tanto, no es necesaria la DIRECTIVA INCLUIR include /etc/nginx/sites-available/some_file.conf;.

Cita de la página de Nginx CookBook - 5.

"En algunos repositorios de paquetes, esta carpeta se llama sitios habilitados y los archivos de configuración están vinculados desde una carpeta llamada sitio disponible; esta convención está obsoleta".

Rohit Dhankar
fuente
0

Puede haber un error tipográfico en cualquier lugar dentro de un archivo importado por la configuración. Por ejemplo, hice un error tipográfico en el fondo de mi archivo de configuración:

loccation /sense/movies/ {
                  mp4;
        }

(ubicación en lugar de ubicación), y esto provoca el error:

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