Nginx 与 Docker : nginx: [emerg] 未知指令“启用”在 /etc/nginx/nginx.conf

Posted

技术标签:

【中文标题】Nginx 与 Docker : nginx: [emerg] 未知指令“启用”在 /etc/nginx/nginx.conf【英文标题】:Nginx with Docker : nginx: [emerg] unknown directive "enable" in /etc/nginx/nginx.conf 【发布时间】:2021-08-30 19:25:55 【问题描述】:

我有两台服务器,一台在数字海洋上,另一台在其他地方。我有一个项目,它与该服务器上的所有应用程序都运行良好。但是,我想创建一个水滴并将其移动到数字海洋,所以我通过sudo scp 命令将所有文件复制到新服务器(数字海洋)。除了 nginx 返回退出代码 1 外,所有服务都运行良好,如下图所示。整个代码都是一样的,所以我很困惑为什么它不能像另一个一样工作。

我可以知道我可能缺少什么吗?

这是我的 nginx.conf 文件:

worker_processes 4;
    
    events 
      worker_connections 4096;
    
    
    http 
    
      server 
        listen 80 default_server;
        server_name "";
        return 444;
      
    
      server 
        server_name game-dev.myappapp.com;
    
        location / 
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host $http_host;
          proxy_set_header X-NginX-Proxy true;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection "upgrade";
    
          proxy_pass http://game_nodes;
          proxy_redirect off;
        
      
      server 
        if ($host = game-dev.myappapp.com) 
          return 301 https://$host$request_uri;
        
    
    
        listen 80;
        listen [::]:80;
        server_name game-dev.myappapp.com;
        return 404;
      
    
      upstream game_nodes 
        # enable sticky session
        #ip_hash;
        server game-alpha:3000;
        keepalive 8;
      
    
      server 
        server_name api-dev.myappapp.com;
    
        location / 
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host $http_host;
          proxy_set_header X-NginX-Proxy true;
    
          proxy_pass http://main_nodes;
          proxy_redirect off;
    
        
      
    
      server 
        if ($host = api-dev.myappapp.com) 
          return 301 https://$host$request_uri;
        
    
        listen 80;
        listen [::]:80;
        server_name api-dev.myappapp.com;
        return 404;
      
    
      upstream main_nodes 
        server main-alpha:8000;
        server main-beta:8000;
        keepalive 8;
      
    

这是我的 Dockerfile :

FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf

从下面的截图中可以看到(左边的服务器是我的Droplet,右边的是我的另一台服务器)我的Droplet没有正常监听80端口,它应该监听另一台服务器的80端口。

这是我来自 DigitalOcean droplet 的 Nginx 日志。

root@knowin-project-dev:/home/cihat/app# docker logs nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2021/06/13 20:22:46 [emerg] 1#1: unknown directive "enable" in /etc/nginx/nginx.conf:45
nginx: [emerg] unknown directive "enable" in /etc/nginx/nginx.conf:45

它是来自 DigitalOcean droplet 的 nginx.co.conf:

    root@knowin-project-dev:/home/cihat/app# docker run -it nginx /bin/bash 
    root@1c54013ff2c8:/# cat etc/nginx/nginx.conf 
    user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events 
    worker_connections  1024;



http 
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;

注意:ufw 的状态是非活动的。所以所有端口都可用。

【问题讨论】:

那么第 45 行是哪一行? May I know what might I am missing?unknown directive "enable" in /etc/nginx/nginx.conf:45? 请使用您部署的 NGINX Container 的 container-id。您的命令将创建一个“默认”NGINX 容器。做docker run -it CONTAINER-ID /bin/bash @KamilCuk,我是 docker 新手,你能告诉我具体应该怎么做吗?谢谢 @TimoStark 输出为:docker: Error response from daemon: No such image: sha256:1c54013ff2c8d627e2b5e65fa4b1be70e2442973498e862d2cf3505e3b704e68. See 'docker run --help'. 在 nginx.conf 中找到45 行并检查错误。 I am new to docker 学习吧,网上有无尽的教程。甚至视频youtube.com/watch?v=fqMOX6JJhGo 【参考方案1】:

阅读错误信息:

2021/06/13 20:22:46 [emerg] 1#1: unknown directive "enable" in /etc/nginx/nginx.conf:45
nginx: [emerg] unknown directive "enable" in /etc/nginx/nginx.conf:45

您的配置文件 #45 中有语法错误 您共享的配置文件在第 45 行看起来不错,因为您的“启用粘性会话”已用 # 符号注释掉。

通过键入确保正在运行的容器中的配置文件相同

docker exec nginx /bin/bash -c "cat /etc/nginx/nginx.conf" | tee nginx.co.conf

在您的数字海洋服务器上。请分享 nginx.co.conf 文件的输出并确保第 45 行也被注释掉。

您是如何部署 docker-container 的?您是否将它们导出为 tar 并将它们上传到新服务器?听起来您的本地容器和数字海洋上的容器之间存在一些差异。

【讨论】:

当我运行该命令时 docker exec nginx /bin/bash -c "cat /etc/nginx/nginx.conf" | tee nginx.co.conf 输出是:来自守护进程的错误响应:容器 31bcf20a1ac8e72f810c71ec4e41647c30a85eff10f5afa82d428da9ea12b300 未运行。我将在我的问题中分享我的服务器的输出。 哦,是的,抱歉刚刚意识到容器已退出...所以尝试使用docker run -it nginx (OR CONTAINERID) /bin/bash 运行容器。然后你也可以 cat 配置文件。 哦,好吧,我刚刚更新了我的问题。如果你愿意,你也可以重新编辑我的问题。因为,我不希望它看起来凌乱。谢谢。 我使用的旧图像仍然具有启用指令并且没有被注释掉。我重建了映像并运行了容器,之后运行良好。

以上是关于Nginx 与 Docker : nginx: [emerg] 未知指令“启用”在 /etc/nginx/nginx.conf的主要内容,如果未能解决你的问题,请参考以下文章

Nginx 与 docker:反向代理不起作用

docker 运行jenkins及vue项目与springboot项目(四.docker运行nginx)

Docker:与其他容器处于同一级别的nginx容器 - 是否足够?

Docker系列文-----Docker三大核心概念以及实战(nginx与MySQL)

代理套接字 io 无法与 nginx、docker 上的节点连接

docker使用与nginx搭建