22

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?

Flimzy
  • 2,375
  • 17
  • 26
Hayk Safaryan
  • 343
  • 2
  • 3
  • 10
  • 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 03 '17 at 12:51
  • please post your nginx.conf file – Drifter104 May 03 '17 at 12:54
  • @Drifter104 I added the file, please take a look – Hayk Safaryan May 03 '17 at 13:19
  • @ryekayo can you please provide an example of such file? – Hayk Safaryan May 03 '17 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: http://nginx.org/en/docs/http/ngx_http_map_module.html#map – ryekayo May 03 '17 at 13:26

4 Answers4

18

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

ryekayo
  • 452
  • 5
  • 14
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.

AnjanaAK
  • 125
  • 4
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.

Drifter104
  • 3,693
  • 2
  • 22
  • 39
  • 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` – Hayk Safaryan May 03 '17 at 14:14
  • @HaykSafaryan did you then run `service nginx restart`? – Drifter104 May 03 '17 at 14:17
  • Should I do another `sudo nginx -t` after doing it? – Hayk Safaryan May 03 '17 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 03 '17 at 14:26
  • got it thanks. But shouldn't I see some nginx welcome page as is in the guide, without any meteor configuration? – Hayk Safaryan May 03 '17 at 14:33
  • @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. – Drifter104 May 03 '17 at 14:38
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.

Gerald Schneider
  • 19,757
  • 8
  • 52
  • 79
leonardosccd
  • 111
  • 2
  • updating from nginx 1.14 to 1.18 fixed the problem, thanks. – Sandra Oct 26 '21 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... – Gwyneth Llewelyn Sep 03 '22 at 19:45