nginx: [emerg] a diretiva “server” não é permitida aqui

100

Reconfigurei o nginx, mas não consigo fazer com que ele reinicie usando a seguinte configuração:

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

depois de executar sudo nginx -c conf -tpara testar a configuração, o seguinte erro é retornado, eu não consigo descobrir qual é realmente o 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
fonte

Respostas:

179

Este não é um nginxarquivo de configuração. Faz parte de um nginxarquivo de configuração.

O nginxarquivo de configuração (geralmente chamado nginx.conf) será semelhante a:

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

O serverbloco está dentro de um httpbloco.

Freqüentemente, a configuração é distribuída por vários arquivos, usando as includediretivas para extrair fragmentos adicionais (por exemplo, do sites-enableddiretório).

Use sudo nginx -tpara testar o arquivo de configuração completo, que começa em nginx.confe puxa fragmentos adicionais usando a includediretiva. Veja este documento para mais informações.

Richard Smith
fonte
Esta resposta está correta e foi corretamente votada - estou tentando esclarecer mais, pode ajudar outros novatos como eu. Assim, respondi a esta pergunta abaixo.
Rohit Dhankar de
14

Exemplo de nginx.conf válido para proxy reverso; No caso de alguem estar preso como eu

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

e você também pode servir no docker

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

O caminho para o nginx.confarquivo que é o arquivo de configuração principal para Nginx - que também é o arquivo que deve INCLUIR o caminho para outros arquivos de configuração Nginx como e quando necessário /etc/nginx/nginx.conf.

Você pode acessar e editar este arquivo digitando-o no terminal

cd /etc/nginx

/etc/nginx$ sudo nano nginx.conf

Além disso, neste arquivo você pode incluir outros arquivos - que podem ter uma diretiva SERVER como um SERVER BLOCK independente - que não precisam estar dentro dos blocos HTTP ou HTTPS, conforme esclarecido na resposta aceita acima.

Repito - se você precisar que um BLOCO DE SERVIDOR seja definido no próprio arquivo de configuração PRIMARY, então esse BLOCO DE SERVIDOR terá que ser definido em um bloco HTTP ou HTTPS delimitador no /etc/nginx/nginx.confarquivo que é o arquivo de configuração principal para Nginx.

Observe também que está OK se você definir um BLOCO DE SERVIDOR, não envolvendo-o diretamente em um bloco HTTP ou HTTPS, em um arquivo localizado no caminho /etc/nginx/conf.d. Além disso, para fazer isso funcionar, você precisará incluir o caminho desse arquivo no arquivo de configuração PRIMARY, conforme mostrado abaixo: -

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

Além disso, você pode comentar a partir do arquivo de configuração PRIMARY, a linha

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

e não é necessário manter nenhum arquivo de configuração /etc/nginx/sites-available/e também não é necessário vinculá-lo ao SYMBOLIC /etc/nginx/sites-enabled/, observe que isso funciona para mim - no caso de alguém pensar que não é para eles ou este tipo de configuração é ilegal etc etc, por favor, deixe um comentário para que posso me corrigir - obrigado.

EDITAR: - De acordo com a versão mais recente do Livro de Receitas Oficial do Nginx, não precisamos criar nenhum Configs dentro - /etc/nginx/sites-enabled/, esta era a prática mais antiga e está DESCONTINUADA agora.

Portanto, não há necessidade de INCLUIR DIRETIVA include /etc/nginx/sites-available/some_file.conf;.

Citação da página do Nginx CookBook - 5.

"Em alguns repositórios de pacotes, essa pasta é chamada de sites-enabled e os arquivos de configuração são vinculados a uma pasta chamada site-available; essa convenção é obsoleta."

Rohit Dhankar
fonte
0

Pode haver apenas um erro de digitação em qualquer lugar dentro de um arquivo importado pelo config. Por exemplo, cometi um erro de digitação bem no fundo do meu arquivo de configuração:

loccation /sense/movies/ {
                  mp4;
        }

(localização em vez de localização), e isso causa o erro:

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