nginx:[emerg]此处不允许使用“服务器”指令


100

我已经重新配置了nginx,但是我无法使用以下配置重新启动它:

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

在运行sudo nginx -c conf -t以测试配置后,返回以下错误,我无法弄清楚到底是什么问题

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

Answers:


178

那不是nginx配置文件。这是部分的的nginx配置文件。

nginx配置文件(通常称为nginx.conf)的样子:

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

server块包含在一个http块内。

通常,通过使用include指令引入其他片段(例如,从sites-enabled目录中),可将配置分布在多个文件中。

使用sudo nginx -t测试完整的配置文件,该文件在开始nginx.conf使用,并拉进更多的碎片include指令。有关更多信息,请参见此文档


这个答案是正确的,并且已经被正确地反对-我试图进一步澄清,可能会帮助像我这样的其他菜鸟。这样就在下面回答了这个问题。
罗希特·唐卡

14

用于反向代理的有效nginx.conf示例;万一有人像我一样被卡住

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

您也可以在docker中提供它

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

2

nginx.conf文件的路径是Nginx的主要配置文件-也是必要时应包含其他Nginx Config文件的路径的文件/etc/nginx/nginx.conf

您可以通过在终端上键入此文件来访问和编辑此文件

cd /etc/nginx

/etc/nginx$ sudo nano nginx.conf

此外,在此文件中,您可以包括其他文件-可以具有SERVER指令作为独立的SERVER BLOCK-不必在HTTP或HTTPS块内,如上面接受的答案所阐明的。

我重复一遍-如果您需要在PRIMARY Config文件本身中定义一个SERVER BLOCK,则该SERVER BLOCK将必须在该/etc/nginx/nginx.conf文件的封闭HTTP或HTTPS块中定义,该文件是Nginx的主要配置文件。

还要注意,如果您定义了服务器块,则直接将其不包含在path的文件中的HTTP或HTTPS块中也可以/etc/nginx/conf.d。同样,要使此工作有效,您需要将该文件的路径包括在PRIMARY Config文件中,如下所示:-

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

除此之外,您可以从PRIMARY Config文件中注释掉该行

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

并且不需要保留任何配置文件,/etc/nginx/sites-available/也不需要将它们链接到SYMBOLIC /etc/nginx/sites-enabled/,请注意,这对我有用-万一有人认为它不适合他们或这种配置是非法的,等等,请务必发表评论,以便我可以纠正自己-谢谢。

编辑:-根据Nginx官方Cookbook的最新版本,我们无需在其中创建任何配置- /etc/nginx/sites-enabled/这是较早的做法,现在已弃用。

因此,不需要INCLUDE DIRECTIVE include /etc/nginx/sites-available/some_file.conf;

引用Nginx CookBook第5页。

“在某些程序包存储库中,此文件夹名为启用了站点的文件夹,并且配置文件是从名为site-available的文件夹链接的;不赞成使用此约定。”


0

在配置导入的文件内的任何地方都可能有错字。例如,我在配置文件中做了一个错字:

loccation /sense/movies/ {
                  mp4;
        }

(定位而不是位置),这会导致错误:

nginx: [emerg] "server" directive is not allowed here in /etc/nginx/sites-enabled/xxx.xx:1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.