nginx: [emerg] "server" 指令在这里不允许
Posted
技术标签:
【中文标题】nginx: [emerg] "server" 指令在这里不允许【英文标题】:nginx: [emerg] "server" directive is not allowed here 【发布时间】:2017-06-05 14:13:22 【问题描述】:我已经重新配置了 nginx,但我无法使用以下配置重新启动它:
配置:
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
【问题讨论】:
【参考方案1】:这不是nginx
配置文件。它是nginx
配置文件的一部分。
nginx
配置文件(通常称为nginx.conf
)如下所示:
events
...
http
...
server
...
server
块包含在 http
块中。
配置通常分布在多个文件中,通过使用include
指令拉入额外的片段(例如来自sites-enabled
目录)。
使用sudo nginx -t
测试完整的配置文件,该文件从nginx.conf
开始,并使用include
指令引入其他片段。请参阅this document 了解更多信息。
【讨论】:
这个答案是正确的,并且得到了正确的支持 - 我试图进一步澄清,可能会帮助像我这样的其他菜鸟。因此在下面回答了这个问题。【参考方案2】:用于反向代理的有效 nginx.conf 示例;万一有人像我一样被卡住了。
其中10.x.x.x
是您正在运行 nginx 代理服务器并使用浏览器连接到的服务器,10.y.y.y
是您真正的 Web 服务器正在运行的位置
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;
如果你想进行 SSL 传递,这里是 sn-p。也就是说,10.y.y.y
正在运行 HTTPS 网络服务器。这里10.x.x.x
,或者 nignx 运行的地方正在监听 443 端口,所有到 443 的流量都被定向到你的目标 web 服务器
events
worker_connections 4096; ## Default: 1024
stream
server
listen 443;
proxy_pass 10.y.y.y:443;
你也可以在 docker 中提供它
docker run --name nginx-container --rm --net=host -v /home/core/nginx/nginx.conf:/etc/nginx/nginx.conf nginx
【讨论】:
【参考方案3】:nginx.conf
文件的路径是 Nginx 的主要配置文件 - 该文件也是在需要时应包含其他 Nginx 配置文件的路径的文件是 /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。
还请注意,如果您在位于路径 /etc/nginx/conf.d
的文件中定义一个不将其直接包含在 HTTP 或 HTTPS 块中的 SERVER BLOCK ,则它是可以的。此外,为了完成这项工作,您需要在 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/
中保留任何配置文件,也不需要将它们符号链接到/etc/nginx/sites-enabled/
,请注意这对我有用 - 以防有人认为它不适合他们或这种配置是非法的等等,请留下评论,以便我纠正自己-谢谢。
编辑:- 根据官方 Nginx CookBook 的最新版本,我们不需要在 -/etc/nginx/sites-enabled/
中创建任何配置,这是较旧的做法,现在已弃用。
因此不需要包含指令include /etc/nginx/sites-available/some_file.conf;
。
引自 Nginx CookBook 页面 - 5 。
"在某些软件包存储库中,此文件夹被命名为启用站点,并且 配置文件从名为 site-available 的文件夹链接; 该约定已被弃用。”
【讨论】:
【参考方案4】:配置导入的文件中的任何地方可能只是一个错字。例如,我在我的配置文件深处打了一个错字:
loccation /sense/movies/
mp4;
(位置而不是位置),这会导致错误:
nginx: [emerg] "server" directive is not allowed here in /etc/nginx/sites-enabled/xxx.xx:1
【讨论】:
以上是关于nginx: [emerg] "server" 指令在这里不允许的主要内容,如果未能解决你的问题,请参考以下文章
nginx: [emerg] "server" 指令在这里不允许
nginx:[emerg]unknown directive "ssl"
nginx: [emerg] "upstream" directive is not allowed
nginx: [emerg] getpwnam("www") failed
django- nginx: [emerg] open() "/etc/nginx/proxy_params" 在 /etc/nginx/sites-enabled/myproje