disable_symlinks on 并非禁止符号链接,而是限制 open() 解析路径时跨越挂载点或用户目录,仅对 alias 和 root 生效,且仅在 linux 上通过 openat()+at_symlink_nofollow 实现。

nginx 配置中 disable_symlinks on 的真实作用和坑
它不是禁止符号链接,而是限制 open() 系统调用在解析路径时跨越挂载点或用户目录——仅对 alias 和 root 指令生效,且只在 Linux 上通过 openat() + AT_SYMLINK_NOFOLLOW 实现。很多运维以为开了就高枕无忧,结果静态文件仍能被 ../ 绕过。
- 必须配合
alias使用才有效;root下若路径拼接含用户输入(如root /var/www/$arg_path),disable_symlinks on完全不触发 - 在 ext4 上需确保挂载时未启用
user_xattr或noatime外的特殊选项,否则可能静默失效 - 错误日志里不会报错,只会返回
403 Forbidden,但原因常被误判为权限问题 - 替代方案更可靠:用
chroot或unshare -r隔离 worker 进程,或直接用try_files $uri =403拦截非法路径
systemd 服务中 LimitNOFILE 设为 65536 为什么没生效
因为 nginx 主进程启动后会 fork 出 worker 进程,而 LimitNOFILE 只影响主进程的 ulimit,worker 继承的是启动时 shell 的限制,不是 systemd 的配置值。
- 必须在
[Service]段显式加LimitNOFILE=65536,且确认该 service 文件未被systemctl edit覆盖 - 检查是否启用了
PrivateTmp=yes或ProtectSystem=strict,它们会重置资源限制 - 验证方式不是
cat /proc/$(pidof nginx)/limits,而是cat /proc/$(pgrep -f 'nginx: worker')/limits | grep "Max open files" - CentOS 7 默认使用
sysctl.conf中的fs.file-max,若该值低于 65536,systemd 会静默降级
curl 测试 TLS 1.3 时提示 “SSL routines:tls_process_server_hello:wrong version number”
这不是服务端不支持 TLS 1.3,而是客户端(curl)底层 OpenSSL 版本太老,或服务端强制降级到了 TLS 1.2 但握手被中间设备干扰。
瑞宝通B2B系统使用当前流行的JAVA语言开发,以MySQL为数据库,采用B/S J2EE架构。融入了模型化、模板、缓存、AJAX、SEO等前沿技术。与同类产品相比,系统功能更加强大、使用更加简单、运行更加稳 定、安全性更强,效率更高,用户体验更好。系统开源发布,便于二次开发、功能整合、个性修改。 由于使用了JAVA开发语言,无论是在Linux/Unix,还是在Windows服务器上,均能良好运行
- 先确认 openssl 版本:
openssl version—— 必须 ≥ 1.1.1 才默认启用 TLS 1.3 - 用
curl -v --tlsv1.3 https://yoursite.com强制指定版本,若失败再试--tlsv1.2对比 - nginx 需在
ssl_protocols中显式写TLSv1.3 TLSv1.2,只写TLSv1.3会导致旧 client 直接断连 - 某些 CDN 或 WAF(如 Cloudflare)会在 TLS 层做终止,实际到 origin 是 HTTP,此时 curl 测的是 CDN 的 TLS 能力,不是你服务器的真实配置
fail2ban 的 nginx-bad-request 规则总漏掉真实攻击流量
因为默认正则只匹配 400 Bad Request,但扫描器大量使用 HTTP/1.0、超长 URL、畸形 Host 头,这些往往返回 404 或 499(client closed request),根本进不了 fail2ban 的日志模式。
- 修改
/etc/fail2ban/filter.d/nginx-bad-request.conf,在failregex中追加:^<host> -.*"(GET|POST|HEAD).*HTTP\/1\.0" 4[0-9][0-9]</host> - 把
ignoreregex中的健康检查路径(如/healthz)写全,否则正常探活也会被封 - 注意
maxretry和findtime要匹配业务节奏:API 服务建议maxretry = 5/findtime = 600,静态站可收紧到3/300 - 务必开启
backend = systemd并确认 journal 日志级别 ≥info,否则 nginx 的 error_log 不进 journald,fail2ban 就读不到原始连接信息
Web 服务安全没有银弹,每个加固点都依赖上下文:同一行 ssl_ciphers 配置,在金融系统是基线,在 IoT 设备上可能直接让旧固件失联。别迷信 checklist,盯住你的日志、监控和真实流量模式。









