11

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?

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

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

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

|improve this answer|||||
  • 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 3 '17 at 14:14
  • @HaykSafaryan did you then run service nginx restart? – Drifter104 May 3 '17 at 14:17
  • Should I do another sudo nginx -t after doing it? – Hayk Safaryan May 3 '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 3 '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 3 '17 at 14:33

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.