You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx启动报错:map指令不允许在此位置,网站返回500状态码

Nginx配置修改后500错误与server_name冲突问题解决

问题现象

修改Nginx配置中的server_name后,网站返回500状态码;Nginx错误日志显示:

2024/04/16 15:22:21 [emerg] 3741#3741: "map" directive is not allowed here in /etc/nginx/sites-enabled/default:1

执行sudo nginx -t时语法检测通过,但存在server_name冲突警告。

问题原因

  1. map指令上下文错误:Nginx的map指令仅允许在http块级别定义,虽然/etc/nginx/sites-enabled/default被include到http块中,但部分环境下解析会出现异常,触发启动报错。
  2. server_name重复定义:配置文件中多个server块使用了相同的api.example.in和admin.example.in,引发路由冲突警告,可能导致请求处理异常。

解决步骤

1. 调整map指令位置

将/etc/nginx/sites-enabled/default文件开头的map块,移动到/etc/nginx/nginx.conf的http块内部(推荐放在压缩配置之后、虚拟主机配置之前):

修改后的nginx.conf相关片段:

http {
    # ... 原有基础配置、SSL配置、日志配置 ...

    # Gzip压缩配置
    gzip on;
    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 application/xml+rss text/javascript;

    # 移到此处的map配置
    map $sent_http_content_type $expires {
        default                    off;
        text/html                  epoch;
        text/css                   30d;
        application/javascript     30d;
        ~image/                    max;
    }

    # 虚拟主机配置引入
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

完成后删除/etc/nginx/sites-enabled/default文件开头的map块。

2. 清理重复的server块

整理/etc/nginx/sites-enabled/default中的server配置,消除server_name重复:

  • 删除原有的80端口业务server块,保留HTTP跳转HTTPS的server块,确保所有HTTP请求都重定向到HTTPS。
  • 启用HTTPS业务server块的监听配置(若已部署SSL证书),确保仅一个server块使用api.example.in和admin.example.in作为域名。

修改后的/etc/nginx/sites-enabled/default核心配置:

# HTTPS业务服务块
server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;

    expires $expires;
    client_max_body_size 10M;
    root /home/ubuntu/ask-local-django;

    server_name api.example.in admin.example.in; # managed by Certbot

    # SSL证书配置(取消注释并确认路径正确)
    ssl_certificate /etc/letsencrypt/live/api.asklokal.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/api.asklokal.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    location /media {
        autoindex on;
        alias /home/ubuntu/ask-local-django/media;
    }
    location /favicon.ico { access_log off; log_not_found off; }
    location /static {
        alias /home/ubuntu/ask-local-django/static;
    }
    location /.well-known {
        alias /home/ubuntu/ask-local-django/well-known;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }

    access_log /home/ubuntu/logs/ask_local_access.log;
    error_log /home/ubuntu/logs/ask_local_error.log;
}

# HTTP跳转HTTPS服务块
server {
    listen 80;
    listen [::]:80;

    if ($host = admin.example.in) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    if ($host = api.example.in) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    return 404; # managed by Certbot
}

3. 验证并重启Nginx

执行配置语法检测:

sudo nginx -t

若检测无报错和警告,重启Nginx服务:

sudo systemctl restart nginx

内容的提问来源于stack exchange,提问作者pradeep reddy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 16:45:55