25

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?

5
  • 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?
    – ryekayo
    May 3, 2017 at 12:51
  • please post your nginx.conf file
    – Drifter104
    May 3, 2017 at 12:54
  • @Drifter104 I added the file, please take a look May 3, 2017 at 13:19
  • @ryekayo can you please provide an example of such file? May 3, 2017 at 13:21
  • @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
    – ryekayo
    May 3, 2017 at 13:26

4 Answers 4

20

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

4
  • 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 May 3, 2017 at 13:54
  • What are the logs saying?
    – ryekayo
    May 3, 2017 at 13:56
  • Here are the logs i67.tinypic.com/acr22h.png May 3, 2017 at 14:26
  • Try checking the logs on the server.. That looks like it is coming from developer tools..
    – ryekayo
    May 3, 2017 at 14:27
3

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.

2

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.

6
  • Same happens with this. I get 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 May 3, 2017 at 14:14
  • @HaykSafaryan did you then run service nginx restart?
    – Drifter104
    May 3, 2017 at 14:17
  • Should I do another sudo nginx -t after doing it? May 3, 2017 at 14:22
  • @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
    – Drifter104
    May 3, 2017 at 14:26
  • got it thanks. But shouldn't I see some nginx welcome page as is in the guide, without any meteor configuration? May 3, 2017 at 14:33
1

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.

2
  • updating from nginx 1.14 to 1.18 fixed the problem, thanks.
    – Sandra
    Oct 26, 2021 at 21:55
  • Weird, so does that mean that recent versions of nginx will allow the map directive outside the http {} context? How so? I'm running 1.21.6 under Ubuntu 22.04.1 and I nevertheless get the same error as the OP... Sep 3, 2022 at 19:45

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .