核心是精简监听端口和全局配置server_tokens off:在http块中添加该指令,注释/删除未用的listen行(含ipv6),nginx -t测试后nginx -s reload生效,并用curl -i和ss -tlnp验证。

新手修改 Nginx 配置关闭未使用端口并隐藏版本号,核心就两件事:精简监听端口、关闭 server_tokens。操作简单,但细节容易出错,下面分步说清楚。
只监听实际需要的端口
Nginx 默认常监听 80(HTTP)和 443(HTTPS),但如果你只用 HTTPS,80 端口就该关掉;或者你用反向代理只走内网,公网端口一个都不该开。关键看 listen 指令是否多余。
- 打开主配置文件(通常是
/etc/nginx/nginx.conf)或站点配置(如/etc/nginx/sites-enabled/default) - 查找所有
listen行,例如:listen 80;、listen [::]:80;、listen 443 ssl; - 确认每个端口是否真被业务使用:没网页访问?没健康检查?没监控探针?那就注释或删掉对应行
- 特别注意 IPv6 的
[::]:80,常被忽略,和 IPv4 的80是两个独立监听项
全局关闭 server_tokens 隐藏版本号
Nginx 默认响应头里带 Server: nginx/1.18.0 这类信息,暴露版本可能被针对性攻击。关掉它不难,但必须在正确位置加配置。
- 在
http块(不是server或location)里添加一行:server_tokens off; - 如果配置里已有该指令但写在某个
server块里,把它剪出来,放到http大括号内最外层 - 改完后用
nginx -t测试语法,通过再执行nginx -s reload生效 - 验证方法:用
curl -I http://your-domain查看响应头,确认Server字段只剩nginx或完全不显示(取决于系统是否启用了其他模块)
顺手检查是否启用不必要的模块
虽然不算“改配置”,但新手容易忽略:Nginx 编译时若带了 ngx_http_autoindex_module 或 ngx_http_status_module,又没配好权限,可能意外暴露目录或状态页。建议:
- 运行
nginx -V 2>&1 | grep -o with-http.*_module查看启用的模块 - 对照业务需求,确认有没有开启无用模块(比如你不用自动索引列表,就别留
--with-http_autoindex_module) - 真正要禁用模块只能重编译,日常更推荐:在配置中明确关闭相关功能,例如在
location /里加autoindex off;
改完务必验证和重启
改配置最怕漏测,尤其端口关闭后前端连不上,自己先卡住。
- 每次修改后都执行
nginx -t,看到successful才继续 - 用
ss -tlnp | grep :80(或对应端口号)确认端口是否真的没在监听 - 从外部用
telnet your-ip 80或nc -zv your-ip 443实测连通性 - 浏览器或 curl 访问页面,检查响应头
Server是否已隐藏











