如何更安全的使用 nginx
本帖最后由 非凡云 于 2025-6-11 19:51 编辑一、使用最新版建议使用最新版的 Nginx,对于已经部署的 Nginx,要及时更新到最新版本,以确保所有已知的安全漏洞都已修补。
二、限制连接数量
Nginx 可以通过 limit_conn_zone 和 limit_conn 两个组件来对客户端访问目录和文件的访问频率和次数进行限制,两个模块都能够对客户端访问进行限制,具体如何使用要结合公司业务环境进行配置。http {
limit_conn_zone $binary_remote_addr zone=ops:10m;
# ...
server {
listen 80;
server_namewww.javaboy.org;
location / {
limit_conn ops 1;#这将指定一个地址只能同时存在一个连接。“one” 与上面的对应,也可以自定义命名
limit_rate 300k;
}
}
[*]limit_zone: 是针对每个 IP 定义一个存储 session 状态的容器,这个示例中定义了一个 10m 的容器,假设每个 session 的大小是 32bytes,那么可以处理 327680 个 session。
[*]limit_conn ops 1:限制每个 IP 只能发起一个并发连接。
[*]limit_rate 300k: 对每个连接限速 300k. 注意,这里是对连接限速,而不是对 IP 限速。如果一个 IP 允许两个并发连接,那么这个 IP 就是限速 limit_rate × 2。
三 限制请求频率Nginx 可以通过限制请求频率来防止服务器过载,最常见的场景就是登录请求,可以通过限制请求频率防止账号暴力破解。
Nginx 官方版本限制 IP 的连接和并发分别有两个模块:
[*]limit_req_zone:用来限制单位时间内的请求数,即速率限制,采用的漏桶算法 "leaky bucket"。
[*]limit_req_conn:用来限制同一时间连接数,即并发限制。
http {
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
server {
listen 80;
location / {
limit_req zone=mylimit burst=5 nodelay;;
proxy_pass http://javaboy.org;
}
}
}limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
[*]第一个参数:$binary_remote_addr 表示通过 remote_addr 这个标识来做限制,“binary_” 的目的是缩写内存占用量,是限制同一客户端 ip 地址。
[*]第二个参数:zone=mylimit:10m 表示生成一个大小为 10M,名字为 mylimit 的内存区域,用来存储访问的频次信息。
[*]第三个参数:rate=1r/s 表示允许相同标识的客户端的访问频次,这里限制的是每秒 1 次,还可以有比如 30r/m 的。
limit_req zone=mylimit burst=5 nodelay;
[*]第一个参数:zone=one 设置使用哪个配置区域来做限制,与上面 limit_req_zone 里的 name 对应。
[*]第二个参数:burst=5,重点说明一下这个配置,burst 爆发的意思,这个配置的意思是设置一个大小为 5 的缓冲区,当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内。
[*]第三个参数:nodelay,如果设置,超过访问频次而且缓冲区也满了的时候就会直接返回 503,如果没有设置,则所有请求会等待排队。
四 防止目录遍历
在 Nginx 配置中设置 autoindex off 来防止目录遍历攻击。这个一般是如果你要做文件服务器,根据自己的实际需求,有需要的话这个功能可以打开,否则将之关闭即可。location / {
autoindex off;
}五、设置超时时间设置 Nginx 的超时配置是非常重要的,因为它可以影响服务器的性能和资源的有效利用。比较常见的超时配置有四个:
[*]keepalive_timeout:这个指令设置了与客户端的 keep-alive 连接超时时间。如果连接在指定时间内没有数据传输,Nginx 将关闭该连接。默认值通常是 75 秒。这个设置对于频繁访问的站点尤其重要,因为它减少了连接建立和断开的开销。
[*]client_body_timeout:这个指令指定了客户端与服务端建立连接后发送 request body 的超时时间。如果客户端在指定时间内没有发送任何内容,Nginx 返回 HTTP 408(Request Timed Out)。默认值通常是 60 秒。
[*]client_header_timeout:这个指令指定了客户端向服务端发送一个完整的 request header 的超时时间。如果在指定时间内没有发送一个完整的 request header,Nginx 返回 HTTP 408(Request Timed Out)。默认值通常是 60 秒。
[*]send_timeout:这个指令设置了服务端向客户端传输数据的超时时间。如果在指定时间内客户端没有接收到任何数据,连接将被关闭。默认值通常是 60 秒。
六、错误页面重定向在 Nginx 中配置错误页面重定向,除了安全因素之外,还有很多好处,比如:
[*]提升用户体验:通过提供更友好的错误页面,可以减少用户在遇到错误时的困惑和挫败感。
[*]增强 SEO 效果:自定义错误页面可以帮助搜索引擎更好地理解网站结构,避免因错误页面导致的 SEO 问题。
[*]维护品牌形象:错误页面是网站的一部分,通过自定义错误页面,可以保持品牌一致性,提升专业形象。
[*]提供错误信息:自定义错误页面可以提供有用的错误信息或解决方案,帮助用户理解问题所在。
在 Nginx 配置文件中,可以使用 error_page 指令来定义特定错误代码的重定向页面。例如,将 404 错误重定向到自定义的 404 页面:server {
listen 80;
server_name javaboy.org;
error_page 404 /404.html;
location = /404.html {
root /path/to/error/pages;
internal;
}
}在这个配置中,当 Nginx 返回 404 错误时,它会显示位于 /path/to/error/pages/404.html 的自定义错误页面,而不是默认的错误页面。internal 指令确保这个页面只对 Nginx 内部请求可见,不会被外部直接访问 。
当然,上面这个配置也可以同时枚举多个错误状态码:
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}这个配置会将所有 500 系列错误重定向到 /50x.html,并显示位于 /usr/share/nginx/html/50x.html 的自定义错误页面 。
页:
[1]