【Java面试系列】Nginx

news2024/11/17 4:41:48

在这里插入图片描述

目录

  • 为什么要用Nginx?
  • 为什么Nginx性能这么高?
    • Nginx 是如何实现高并发的?
  • Nginx怎么处理请求的?
    • Nginx的工作流程
  • 给 favicon.ico 和 robots.txt 设置过期时间; 这里为 favicon.ico 为 99 天,robots.txt 为 7 天并不记录 404 错误日志
  • 如何限制特定IP地址或IP地址段的访问?
  • Nginx可以缓存静态文件吗?如何配置缓存?
  • Nginx可以进行内容压缩吗?如何配置?
  • 设定某个文件的浏览器缓存过期时间;这里为 600 秒,并不记录访问日志
  • 只充许固定 ip 访问网站,并加上密码,设定账号是 admin,密码是 123456
  • 如果访问服务器的 ip 地址是 223.40.97.124 的话,给他展现的主页是/home.html,其他人就展现 index.html。
  • 什么是正向代理和反向代理?
    • 反向代理的用途
    • 正向代理和反向代理的区别
  • Nginx负载均衡的算法怎么实现的?策略有哪些?
  • 在Nginx中,如何使用未定义的服务器名称来阻止处理请求?
  • 如何防止DDoS攻击
  • 如何查看Nginx的日志文件?
  • 如何限制同时连接到Nginx的客户端数量?
  • 如何限制某个URL的访问速率?
  • 如何实现HTTP重定向?
  • Nginx如何通过IP获取所在国家及地理位置?
  • 系列文章
  • 版本记录

在这里插入图片描述


为什么要用Nginx?

因为跨平台,配置简单,支持高并发,耗费内存少。

为什么Nginx性能这么高?

因为nginx是异步非阻塞事件处理机制:运用了epoll模型,提供了一个队列,排队解决

Nginx 是如何实现高并发的?

nginx启动

service nginx start 

然后输入

#ps -ef|grep nginx

在这里插入图片描述

会发现 Nginx 有一个 master 进程和若干个 worker 进程,
Master进程:读取及评估配置和维持
Worker进程:处理请求

这些 worker 进程是平等的,都是被 master fork 过来的。
在 master 里面,先建立需要 listen 的 socket(listenfd),然后再 fork 出多个 worker 进程。
当用户进入 nginx 服务的时候,每个 worker 的 listenfd 变的可读,并且这些 worker 会抢一个叫 accept_mutex 的东西,accept_mutex 是互斥的,一个 worker 得到了,其他的worker 就歇菜了。而抢到这个 accept_mutex 的 worker 就开始“读取请求–解析请求–处理请求”,数据彻底返回客户端之后(目标网页出现在电脑屏幕上),这个事件就算彻底结束。
nginx 用这个方法是底下的 worker 进程抢注用户的要求,同时搭配“异步非阻塞”的方式,实现高并发量。

【评析】在 nginx.conf 里第二行就是 work_process,有默认是 4 的,也可以更改成 auto,这个值不是越大越好,要可实际服务器 CPU 的情况而定,一般是 CPU 有几个,工作进程就有几个。

Nginx怎么处理请求的?

nginx接受一个请求后,首先由listen和server_name 匹配server模块,
在匹配的server模块里location,location就是实际地址

Nginx的工作流程

  1. Nginx通过 listen 监听指定的端口来接收客户端请求。

  2. 当接收到请求后,Nginx使用配置文件中定义的server_name 虚拟主机来确定请求应该被转发到哪个后端服务器。

  3. Nginx使用内部的事件驱动模型来处理请求,而不是为每个连接创建一个新的线程或进程。这使得Nginx能够处理大量并发连接而不耗费过多的系统资源。

  4. Nginx根据配置文件中定义的规则将请求转发给后端服务器。这可以是静态文件的直接传输,也可以是动态请求的转发到后端应用程序服务器。

  5. Nginx还提供了一些额外的功能,如负载均衡、缓存、SSL/TLS协议支持等,以提高性能和安全性。

给 favicon.ico 和 robots.txt 设置过期时间; 这里为 favicon.ico 为 99 天,robots.txt 为 7 天并不记录 404 错误日志

location ~(favicon.ico) { 
	log_not_found off; expires 99d;
	break;
}
location ~(robots.txt) { 
	log_not_found off; expires 7d;
	break;
}

如何限制特定IP地址或IP地址段的访问?

要限制特定IP地址或IP地址段的访问,可以使用Nginx的ngx_http_access_module模块提供的allow和deny指令。下面是一个具体配置的示例:

location / {
    # 允许特定IP地址范围的访问
    allow 192.168.1.0/24;
    allow 10.0.0.0/16;

    # 拒绝其他IP地址的访问
    deny all;
}

在上述配置中,allow指令用于允许特定的IP地址或IP地址段的访问,而deny指令用于拒绝其他IP地址的访问。

192.168.1.0/24表示允许以192.168.1.开头并且子网掩码为255.255.255.0的IP地址范围的访问。

10.0.0.0/16表示允许以10.0.开头并且子网掩码为255.255.0.0的IP地址范围的访问。

deny all;表示拒绝所有其他IP地址的访问。

注意:配置的顺序很重要。allow和deny指令按顺序进行匹配,所以必须将allow指令放在deny指令之前,以确保规则正确应用。

【评析】防火墙是层层深入的,可以从硬件上用 acl(访问控制列表)实现,如果没有钱买一个防火墙,那么还可以在 linux 上设置 iptables,如果 iptables 不设置,还可以在 nginx 上设置。

Nginx可以缓存静态文件吗?如何配置缓存?

  1. 打开Nginx配置文件,一般位于/etc/nginx/nginx.conf或/etc/nginx/conf.d/default.conf。
  2. 在http块中添加以下配置:
http {
    # ... 其他配置 ...

    # 定义缓存路径和缓存时间
    proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m inactive=60m;
    proxy_temp_path /path/to/temp;

    server {
        # ... 其他配置 ...

        location / {
            # 检查缓存,如有则直接返回
            proxy_cache my_cache;
            proxy_cache_valid 200 302 10m;
            proxy_cache_valid 404 1m;
            proxy_cache_key $uri$is_args$args;

            # 如果没有缓存,则从后端服务器获取文件并缓存
            proxy_pass http://backend_server;
            proxy_cache_bypass $http_cache_control;
            proxy_no_cache $http_pragma $http_authorization;
        }
    }
}

在上述示例中,

/path/to/cache是指定缓存存储路径,
levels=1:2表示使用两级目录结构进行存储,
keys_zone=my_cache:10m定义了缓存区域的名称和大小,
inactive=60m表示在60分钟内未被访问的缓存将被清理。
proxy_cache_valid指令定义了特定HTTP状态码的缓存有效时间。
在上面的示例中,
对于200和302的响应,缓存将保持10分钟有效,
对于404的响应,缓存将在1分钟后失效。
proxy_cache_key用于定义缓存的键名,这里使用了URI、请求参数和请求参数。
proxy_cache_bypassproxy_no_cache指令用于控制是否绕过或禁用缓存。
最后,proxy_pass指令用于将请求转发到后端服务器。

Nginx可以进行内容压缩吗?如何配置?

Nginx可以进行内容压缩。
主要通过gzip实现,要配置Nginx以启用内容压缩,需要进行以下步骤:
1. 修改Nginx配置文件nginx.conf或虚拟主机配置文件。
2. 找到http块,并添加以下配置项:

http {
  gzip on;
  gzip_types text/plain text/css application/json application/javascript text/javascript;
  gzip_min_length 1000;
  gzip_comp_level 2;
  gzip_proxied any;
  gzip_vary on;
  gzip_disable "MSIE [1-6]\.(?!.*SV1)";
  gzip_buffers 16 8k;
  gzip_http_version 1.1;
  gzip_static on;
}

上述配置项的含义:

  • gzip on:启用gzip压缩
  • gzip_types:指定要压缩的文件类型
  • gzip_min_length:指定压缩文件的最小长度
  • gzip_comp_level:指定压缩级别,范围从1到9(1表示压缩比较低,但速度快,9表示压缩比较高,但速度慢)
  • gzip_proxied:指定在代理服务器上启用压缩
  • gzip_vary:启用Vary头部,用于根据Accept-Encoding请求头选择正确的压缩版本
  • gzip_disable:禁用压缩的用户代理列表
  • gzip_buffers:指定压缩缓冲区的数量和大小
  • gzip_http_version:指定支持gzip的HTTP版本
  • gzip_static:启用预压缩文件的发送
  1. 保存配置文件并重新启动Nginx服务器。

设定某个文件的浏览器缓存过期时间;这里为 600 秒,并不记录访问日志

location ^~ /html/scripts/loadhead_1.js {
   access_log off; 
   expires 600; 
   break;
}

只充许固定 ip 访问网站,并加上密码,设定账号是 admin,密码是 123456

printf "admin:$(openssl passwd -crypt 123456)\n" >>/usr/local/nginx/conf/passwd 
location \ {
    allow 22.27.164.25; #允许的 ipd 
    deny all;
    auth_basic “KEY”; #登陆该网页的时候,会有这个“KEY”的提示,提示只能是英文,中文不识别。
    auth_basic_user_file /conf/htpasswd;
}

如果访问服务器的 ip 地址是 223.40.97.124 的话,给他展现的主页是/home.html,其他人就展现 index.html。

location / {
         if ($remote_addr = 223.40.97.124 ) { rewrite ^.*$ /home.html;
}
         root /usr/local/nginx/html;
         index index.html;
}

什么是正向代理和反向代理?

正向代理:客户端向代理服务器发送一个请求并指定目标,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端(访问国外网站)

反向代理:代理服务器来接受请求,然后将请求转发给内网服务器,再将获得的内容返回给客户端。

反向代理的用途

隐藏服务器真实IP
负载均衡

正向代理和反向代理的区别

正向代理代理的是客户端,反向代理代理的是服务器

正向代理解决访问限制问题,反向代理解决了高并发问题

Nginx负载均衡的算法怎么实现的?策略有哪些?

轮询:如果有服务器宕机,能够自动剔除

权重:将服务器性能高的权值设置大点。

ip绑定:使同一ip的访客固定访问一台服务器

在Nginx中,如何使用未定义的服务器名称来阻止处理请求?

只需将请求删除的服务器就可以定义为:

Server {
	listen 80;
	server_name “ “ ;
	return 444;

}

如何防止DDoS攻击

要防止DDoS(分布式拒绝服务)攻击,Nginx可以采取以下措施。

配置反向代理服务器:使用Nginx作为反向代理服务器,将请求转发给后端真实服务器进行处理。这样可以隐藏真实服务器的IP地址,使其难以被攻击者直接攻击。

配置HTTP限制:使用Nginx的模块,如limit_req和limit_conn,对每个客户端的请求数量和连接数进行限制,防止攻击者通过发送大量请求来耗尽服务器资源。

配置访问限制:使用Nginx的模块,如GeoIP和IP黑名单等,对恶意IP进行拦截或限制访问。可以基于地理位置、IP地址段、用户代理字符串等进行限制。

加载均衡和泛洪限制:通过Nginx的负载均衡功能,将请求分散到多个后端服务器上,从而分摊DDoS攻击的压力。同时,配置Nginx的模块,如 ngx_http_limit_req_module和ngx_http_limit_conn_module,限制每个请求的速率,防止泛洪攻击。

使用Nginx的缓存功能:将动态页面转换为静态页面,并使用Nginx的缓存功能,将结果缓存在内存中,减轻后端服务器的负载。

配置防火墙:结合Nginx与防火墙工具(如iptables),对网络流量进行过滤和限制。可以设置特定规则,只允许合法的请求通过,阻止恶意流量。

监控和日志分析:通过监控Nginx的访问日志和网络流量,及时发现异常流量和攻击行为,并采取相应的应对措施。

以上是一些基本的防止DDoS攻击的方法,但需要根据实际情况进行调整和优化。同时,还可以考虑使用专业的DDoS防护设备或服务来提高安全性。

如何查看Nginx的日志文件?

要查看Nginx的日志文件,可以按照以下步骤操作:

  1. 打开终端或命令提示符,登录到服务器上,确保具有足够的权限。
  1. Nginx的日志文件通常位于/var/log/nginx目录下。使用cd /var/log/nginx命令进入该目录。

3.查看日志文件可以使用cat、less或tail等命令。例如,使用less access.log命令查看access.log文件内容。

4.如果想实时查看日志文件的变化,可以使用tail -f access.log命令。这将持续显示新的日志内容。

要定义Nginx的日志格式,可以按照以下步骤操作:

1.打开Nginx配置文件。通常位于/etc/nginx/nginx.conf或/etc/nginx/conf.d/default.conf。

2.在http块中找到log_format指令。这条指令用于定义日志的格式。它通常位于http块内的其他指令之前。

3.使用以下语法定义日志格式:

log_format format_name '$variable1 $variable2 ...';

其中,format_name是你给日志格式起的名称,$variable1$variable2是可用的变量。变量的选择根据你希望包含的信息而定。

4.示例:定义一个名为mylog的日志格式,包含时间、客户端IP、请求方法和URL。

log_format mylog ‘$time_local $remote_addr $request_method $request_uri’;

5.定义好日志格式后,可以在access_log指令中使用该格式。例如,在server块中的access_log指令中添加以下内容:

access_log /var/log/nginx/access.log mylog;
  1. 保存配置文件并重新加载Nginx:sudo nginx -s reload。

现在,Nginx将按照你定义的日志格式记录访问日志。

如何限制同时连接到Nginx的客户端数量?

在Nginx配置文件中设置limit_conn指令来限制同时连接到Nginx的客户端数量。

以下是设置的步骤:

  1. 打开Nginx的配置文件。默认位置是/etc/nginx/nginx.conf。
  1. 在http块中添加以下代码:
http {
    # ...
    limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m; # 定义IP地址的连接限制区域
    # ...
}

这里的10m表示分配给连接限制区域的内存大小,可以根据需要进行调整。

  1. 在需要限制连接数量的http、server或location块中使用limit_conn指令来设置限制。例如:
http {
    # ...
    server {
        # ...
        limit_conn conn_limit_per_ip 10; # 设置每个IP地址最大连接数为10
        # ...
    }
}

这里的conn_limit_per_ip是刚刚定义的连接限制区域名字,10表示每个IP地址允许的最大连接数。

4.保存配置文件并重新加载Nginx。

sudo nginx -t # 检查配置文件语法是否正确
sudo systemctl reload nginx # 重新加载Nginx配置

现在,您已经成功限制了同时连接到Nginx的客户端数量。超过设定的连接数时,Nginx会返回503 Service Unavailable错误给客户端。

如何限制某个URL的访问速率?

可以使用Nginx的ngx_http_limit_req_module模块。该模块提供了一种基于令牌桶算法的限速机制。

以下是如何在Nginx中配置限制某个URL的访问速率的步骤:

1.在Nginx的配置文件中找到对应的Server块,例如/etc/nginx/nginx.conf或/etc/nginx/conf.d/default.conf。

2.在Server块中添加一个location指令,用于匹配特定的URL。例如,要限制/api/slow的访问速率,可以添加如下的location指令:

location /api/slow {
    limit_req zone=api_rate_limit burst=5 nodelay;
    proxy_pass http://backend;
}

3.在location指令内部使用limit_req指令来定义限速规则。limit_req指令有以下常用参数:

  • zone: 定义限速区域名称,多个限速指令可以共享相同的限速区域。
  • burst: 定义允许的最大并发请求数。
  • nodelay: 指定是否立即处理超过限速阈值的请求,默认为等待处理。
    保存配置文件并重新加载Nginx配置。

以上配置将会限制/api/slow的访问速率。你可以根据需要自定义burst和nodelay参数的值,以满足你的需求。

如何实现HTTP重定向?

使用rewrite指令来实现HTTP重定向。
rewrite指令用于修改URL或执行重定向操作。

下面是一个示例配置,演示了如何实现HTTP重定向:

server {
    listen 80;
    server_name demoxxx.com;

    # 重定向到指定URL
    location /old-url {
        rewrite ^/old-url$ http://demoxxx.com/new-url permanent;
    }

    # 重定向到HTTPS
    location /secure {
        rewrite ^ https://demoxxx.com$request_uri? permanent;
    }

    # 正则表达式匹配并重定向
    location ~ ^/redirect/(.*)$ {
        return 301 http://demoxxx.com/new-location/$1;
    }
}

上述示例中,通过rewrite指令实现了以下几种重定向操作:

将http://demoxxx.com/old-url重定向到http://demoxxx.com/new-url,采用永久重定向。
将http://demoxxx.com/secure重定向到https://demoxxx.com/secure,采用永久重定向。
使用正则表达式匹配http://demoxxx.com/redirect/{任意内容},将其重定向到http://demoxxx.com/new-location/{匹配内容},采用永久重定向。
需要注意的是,rewrite指令支持正则表达式匹配和重定向,并且支持使用变量来进行动态重定向。

Nginx如何通过IP获取所在国家及地理位置?

这个面试题主要查考对Nginx的应用经验,有很多种方法,我下面这一篇文章详细讲解了用GeoLite2-Country实现这个功能

系列文章


内容地址 链接
JAVA介绍Linux (实战)常用命令
nginx记录自己使用nginx 的所用知识点(包含 安装、查看地址、配置文件、卸载、重启、各种类型配置文件(更新中)、文件大小限制、session共享等)
Mysql【电商】mysql 建表的一些规则 和注意事项
=========================================================================
👊如果你对该系列文章有兴趣的话,欢迎持续关注博主动态,博主会持续输出优质内容👊

👊 博主很需要大家的支持,你的支持是我创作的不竭动力👊

👊 ~ 点赞收藏+关注 ~👊
=========================================================================

版本记录


  • 2023-10-18 第一版

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1462790.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

牛B了,GitHub用户免费领空投: TOP 5k 项目的贡献者可领取价值 $200空投。

StarkNet 公链项目为了激励开发者参与其平台建设,启动了空投活动。 如果曾向 GitHub 上获得较多 Star 的项目提交过 PR ,就有资格领取 111.1 STRK 的空投奖励。 只需要使用 OAuth 2.0 登录,就可以直接领取。 领取规则 截止到 2023 年 11 月 …

【图片公式识别】图片公式转Word与LaTeX文档:智能识别与转换

前言 嘿,大家好呀!👋 谁都知道,写 Word 文档里的公式可不是一件简单的事情!你辛辛苦苦在键盘上敲出的数学公式,结果随着 Word 版本的更新,竟然变成了一张图片!😤 这简直就…

客户端web开发工具

文章目录 安全网络Linter-->捕获代码错误-->eslint源代码控制-->Git代码格式化-->Prettier打包工具--Parcel--Webpack 转换--Babel开发后阶段测试工具配置工具其他 node,npm、yarnnode.js包管理器npmyarn https://developer.mozilla.org/zh-CN/docs/Lea…

http和https的区别(简述)

HTTP(HyperText Transfer Protocol)和HTTPS(HTTP Secure)都是用于在客户端和服务器之间传输数据的协议,但它们在安全性方面有重要的区别。 1.HTTP: 概述: HTTP是一种用于传输超文本的协议(超文…

洗选中心智能化运维工是做什么的?智能化运维工程师是干什么的

洗选中心智能化运维工程师的职责和工作内容?同时,描述智能化运维工程师在信息技术行业中的具体角色和他们的主要任务。  洗选中心智能运维工程师的职责和工作内容主要包括:  设备监控管理:重点对洗涤中心机器进行实时监控管理…

新书速览|细说PyTorch深度学习:理论、算法、模型与编程实现

超详细的PyTorch深度学习入门书,100余个编程示例6大热点案例,大咖带路,边学边实践。 本书特点: 1. 专家编撰:由资深专家精心编撰,通俗易懂,娓娓道来 2.范例丰富:100余个…

ChatGPT在数据分析OKR计划中的应用

ChatGPT在数据分析OKR计划中的应用 ​ 现在大多数公司引入了OKR(objective & key result)计划,数据分析师也需要定期制定和检查自己的OKR计划。我们不仅可以利用ChatGPT辅助制定OKR计划,也可以让其对OKR计划内容进行调整、优…

C++笔记:OOP三大特性之多态

前言 本博客中的代码和解释都是在VS2019下的x86程序中进行的,涉及的指针都是 4 字节,如果要其他平台下测试,部分代码需要改动。比如:如果是x64程序,则需要考虑指针是8bytes问题等等。 文章目录 前言一、多态的概念二、…

前端基础自学整理|HTML + JavaScript + DOM事件

目录 一、HTML 1、Html标签 2、Html元素 3、基本的HTML标签 二、CSS 样式 层叠样式表 三、JavaScript 使用示例 四、HTML DOM 通过可编程的对象模型,javaScript可以: window document 1、查找HTML元素 2、操作HTML元素 获取元素的属性 四…

现货白银投资指南 主打一个真实

一说到现货白银投资指南,投资者可能就想到那些怎么教投资者赚钱,而且是赚大钱的技巧。老实说,老看这些大路货很没意思,下面我们就来讨论一些真实的现货白银投资指南。 首先在这个现货白银投资指南开篇我们就需要知道,作…

Retrofit2原理分析

Retrofit官网 GitHub上的Retrofit 使用Retrofit进行网络请求的主要步骤 创建一个接口 用于描述HTTP请求。接口里的方法使用注解来标记请求方式、API路径、请求参数等信息。使用Retrofit.Builder().build();配置和创建一个Retrofit实例;调用retrofit.create()方法获…

四、分类算法 - 随机森林

目录 1、集成学习方法 2、随机森林 3、随机森林原理 4、API 5、总结 sklearn转换器和估算器KNN算法模型选择和调优朴素贝叶斯算法决策树随机森林 1、集成学习方法 2、随机森林 3、随机森林原理 4、API 5、总结

开源 - 一款可自定义的在线免杀平台|过x60、wd等

免责声明:本工具仅供安全研究和教学目的使用,用户须自行承担因使用该工具而引起的一切法律及相关责任。作者概不对任何法律责任承担责任,且保留随时中止、修改或终止本工具的权利。使用者应当遵循当地法律法规,并理解并同意本声明…

智慧项目管理平台安全系统开发,实现智慧化、精细化、智能化管理

场景建设需求 1.建设内容:智慧项目管理平台以工程项目为载体,着眼交通运输铁路施工、道路施工、建筑施工相关行业,以标准化、统一化、动态管理为抓手,以互联网、大数据云计算、5G应用、数字孪生、趋势分析、安全预警、视频监控等…

MKS薄膜规622/626/627/628/629说明接口定义等说明

MKS薄膜规622/626/627/628/629说明接口定义等说明

Python 进阶语法:JSON

1 什么是 JSON? 1.1 JSON 的定义 JSON 是 JavaScript Object Notation 的简写,字面上的意思是 JavaScript 对象标记。本质上,JSON 是轻量级的文本数据交换格式。轻量级,是拿它与另一种数据交换格式XML进行比较,相当轻…

突破亚马逊智能检测,全自动化运营的新利器:亚马逊鲲鹏系统

在亚马逊运营的道路上一般最为棘手的问题之一就是账号关联和安全性。而亚马逊鲲鹏系统它不仅拥有最新的防指纹技术,还能够完全模拟真实的人类行为,让每个账号都拥有独立环境运行,从而保证账号的安全性,让用户摆脱了账号关联的困扰…

使用贪婪算法解决作业调度问题

对于贪婪算法的基本思想是,在给定判断条件下,如果每次选择当下能够得到的最佳回报的选项,在很多情况下,这么做使无法实现最优解的,但是贪婪算法要能产生最优解,那他所对应的问题必须是具有特定的递归结构的。 而在某种条件的判断下选取出来最优方案之后,问题的规模就会…

IP地址定位能精确到哪里?——技术限制与定位精度

随着互联网的发展,IP地址定位技术被广泛运用于网络管理、个性化服务等领域。然而,IP地址定位的精确度受到技术限制,无法达到完全精准的地理位置定位。IP数据云将探讨IP地址定位能精确到哪里的技术限制,以及如何在实际应用中克服这…

The Captainz NFT 概览与数据分析

作者:stellafootprint.network 编译:cicifootprint.network 数据源:The Captainz NFT Collection Dashboard The Captainz 是 Memeland 的旗舰系列,由 9,999 个实用性极强的 PFP 组成。持有者在 Memeland 宇宙中展开了一场神…