map directive is not allowed here

33,878

Solution 1

Try adding this to your nginx.conf in the http {}:

    user www-data;
    worker_processes auto;
    pid /run/nginx.pid;
    events {
            worker_connections 768;
            # multi_accept on;
    }
    http {
            # this section is needed to proxy web-socket connections
            map $http_upgrade $connection_upgrade {
                    default upgrade;
                      ''      close;
            }
            ##
            # Basic Settings
            ##
            sendfile on;
            tcp_nopush on;
            tcp_nodelay on;
            keepalive_timeout 65;
            types_hash_max_size 2048;
            # server_tokens off;
            # server_names_hash_bucket_size 64;
            # server_name_in_redirect off;
            include /etc/nginx/mime.types;
            default_type application/octet-stream;
            ##
            # SSL Settings
            ##
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
            ssl_prefer_server_ciphers on;
            ##
            # Logging Settings
            ##
            access_log /var/log/nginx/access.log;
            error_log /var/log/nginx/error.log;
            ##
            # Gzip Settings
            ##
            include /etc/nginx/mime.types;
            gzip on;
            gzip_disable "msie6";
            # gzip_vary on;
            # gzip_proxied any;
            # gzip_comp_level 6;
            # gzip_buffers 16 8k;
            # gzip_http_version 1.1;
            # gzip_types text/plain text/css application/json application/javascript text/xml application/xml applicatio
    n/xml+rss text/javascript;
            ##
            # Virtual Host Configs
            ##
            include /etc/nginx/conf.d/*.conf;
            include /etc/nginx/sites-enabled/*;
    }
    #mail {
    #       # See sample authentication script at:
    #       # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
    # 
    #       # auth_http localhost/auth.php;
    #       # pop3_capabilities "TOP" "USER";
    #       # imap_capabilities "IMAP4rev1" "UIDPLUS";
    # 
    #       server {
    #               listen     localhost:110;
    #               protocol   pop3;
    #               proxy      on;
    #       }
    # 
    #       server {
    #               listen     localhost:143;
    #               protocol   imap;
    #               proxy      on;
    #       }
    #}
    include /etc/nginx/sites-enabled/*;

The reason why this is not working is because, your not adding the map module within an http block. Per Nginx documentation, the map module can only be used wrapped inside an http context. Please see Nginx's documentation:

http://nginx.org/en/docs/http/ngx_http_map_module.html#map

Solution 2

Why sites-enabled is included in your nginx.conf file twice?

include /etc/nginx/sites-enabled/*;

The above line is present in two places of the conf file:

  • inside http block
  • As the last line of the file, outside the http block

May be the second one causes the problem as it will add the map directive from the app file outside the http block.

If there is no specific purpose of adding this include line twice, you can remove the second line, and it may solve the issue.

Solution 3

The instructions you were following, assumed you didn't have this line include /etc/nginx/sites-enabled/*; in your nginx.conf. Some packages come with this included in the default nginx.conf file. You have this here in your file, which is perfectly ok.

        # Virtual Host Configs
        ##
        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;

Remove the include /etc/nginx/sites-enabled/*; from the very bottom of the file, as you already have the line in the nginx.conf and it (the one at the bottom of the file) is in the wrong place anyway as its out side the http { } block.

Solution 4

In 2021, you can update nginx to latest version to fix it. I had this error with version 1.10 in Debian 9, after I updated nginx to 1.18 it was fixed.

Share:
33,878

Related videos on Youtube

Hayk Safaryan
Author by

Hayk Safaryan

Updated on September 18, 2022

Comments

  • Hayk Safaryan
    Hayk Safaryan 8 months

    I am following this tutorial https://medium.com/startup-founder-panel/deploying-a-meteor-app-with-nginx-from-scratch-1332b32e99a5 When I do sudo nginx -t I get

    nginx: [emerg] "map" directive is not allowed here in /etc/nginx/sites-enabled/app:2
    nginx: configuration file /etc/nginx/nginx.conf test failed
    

    Here is the app file

    # this section is needed to proxy web-socket connections
    map $http_upgrade $connection_upgrade {
            default upgrade;
            ''      close;
    }
    # HTTP
    server {
            listen 80 default_server;
            listen [::]:80 default_server ipv6only=on;
            location = /favicon.ico {
              root /home/USERNAME/portal/programs/web.browser/app;
              access_log off;
            }
            location ~* "^/[a-z0-9]{40}\.(css|js)$" {
              gzip_static on;
              root /home/USERNAME/portal/programs/web.browser;
              access_log off;
            }
            location ~ "^/packages" {
              root /home/USERNAME/portal/programs/web.browser;
              access_log off;
            }
            # pass requests to Meteor
            location / {
                proxy_pass http://127.0.0.1:8080;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade; #for websockets
                proxy_set_header Connection $connection_upgrade;
                proxy_set_header X-Forwarded-For $remote_addr;
                proxy_set_header Host $host;
            }
    }
    

    And here is the nginx.conf

    user www-data;
    worker_processes auto;
    pid /run/nginx.pid;
    events {
            worker_connections 768;
            # multi_accept on;
    }
    http {
            ##
            # Basic Settings
            ##
            sendfile on;
            tcp_nopush on;
            tcp_nodelay on;
            keepalive_timeout 65;
            types_hash_max_size 2048;
            # server_tokens off;
            # server_names_hash_bucket_size 64;
            # server_name_in_redirect off;
            include /etc/nginx/mime.types;
            default_type application/octet-stream;
            ##
            # SSL Settings
            ##
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
            ssl_prefer_server_ciphers on;
            ##
            # Logging Settings
            ##
            access_log /var/log/nginx/access.log;
            error_log /var/log/nginx/error.log;
            ##
            # Gzip Settings
            ##
            include /etc/nginx/mime.types;
            gzip on;
            gzip_disable "msie6";
            # gzip_vary on;
            # gzip_proxied any;
            # gzip_comp_level 6;
            # gzip_buffers 16 8k;
            # gzip_http_version 1.1;
            # gzip_types text/plain text/css application/json application/javascript text/xml application/xml applicatio
    n/xml+rss text/javascript;
            ##
            # Virtual Host Configs
            ##
            include /etc/nginx/conf.d/*.conf;
            include /etc/nginx/sites-enabled/*;
    }
    #mail {
    #       # See sample authentication script at:
    #       # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
    # 
    #       # auth_http localhost/auth.php;
    #       # pop3_capabilities "TOP" "USER";
    #       # imap_capabilities "IMAP4rev1" "UIDPLUS";
    # 
    #       server {
    #               listen     localhost:110;
    #               protocol   pop3;
    #               proxy      on;
    #       }
    # 
    #       server {
    #               listen     localhost:143;
    #               protocol   imap;
    #               proxy      on;
    #       }
    #}
    include /etc/nginx/sites-enabled/*;
    

    So what's the problem?

    • ryekayo
      ryekayo about 6 years
      Have you tried just creating a new conf file with the map directive in it, then importing that conf in your default configuration or main configuration file?
    • Hayk Safaryan
      Hayk Safaryan about 6 years
      @Drifter104 I added the file, please take a look
    • ryekayo
      ryekayo about 6 years
      @HaykSafaryan i see that you have already done so actually. But can you confirm that your map module is wrapped in the http {}? Per Nginx documentation, the map directive can only be used within an http {} context. See here: nginx.org/en/docs/http/ngx_http_map_module.html#map
  • Hayk Safaryan
    Hayk Safaryan about 6 years
    I also moved the server part to the config file and got nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful, however if I go to my vm by ip I still get this site can't be reached
  • ryekayo
    ryekayo about 6 years
    What are the logs saying?
  • Drifter104
    Drifter104 about 6 years
    @HaykSafaryan did you then run service nginx restart?
  • Hayk Safaryan
    Hayk Safaryan about 6 years
    Should I do another sudo nginx -t after doing it?
  • Drifter104
    Drifter104 about 6 years
    @HaykSafaryan sudo nginx -t only tests the format of the config, it doesn't do anything functionally. If your config pointed to a directory that contained no webfiles but the config was constructed correctly nginx -t would be quite happy. If nginx -t is not reporting any errors and you have done service nginx restart the "problem" is elsewhere. Meteor might not be configured correctly for example
  • Hayk Safaryan
    Hayk Safaryan about 6 years
    Here are the logs i67.tinypic.com/acr22h.png
  • ryekayo
    ryekayo about 6 years
    Try checking the logs on the server.. That looks like it is coming from developer tools..
  • Hayk Safaryan
    Hayk Safaryan about 6 years
    got it thanks. But shouldn't I see some nginx welcome page as is in the guide, without any meteor configuration?
  • Drifter104
    Drifter104 about 6 years
    @HaykSafaryan No because your location / block in the configuration says pass everything that isn't .css, .js, /favicon.ico or in /packages to the meteor app.
  • Sandra
    Sandra over 1 year
    updating from nginx 1.14 to 1.18 fixed the problem, thanks.