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冲突警告。
问题原因
map指令上下文错误:Nginx的map指令仅允许在http块级别定义,虽然/etc/nginx/sites-enabled/default被include到http块中,但部分环境下解析会出现异常,触发启动报错。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
相关产品推荐
相关产品推荐

