nginx面试题
nginx
说一下nginx
是一个使用c语言开发的高性能的http服务器及反向代理服务器。
官方测试nginx能够支支撑5万并发链接,并且cpu、内存等资源消耗却非常低,运行非常稳定。
提供的功能:
- 作为静态资源服务器:提供HTML、CSS、JavaScript、图片等静态资源的访问
- 反向代理:代理服务端接收请求,转发给后端服务器,将后端的响应结果转发给客户端
- 负载均衡:提供轮询、加权轮询、IP哈希等负载均衡策略,转发给多个后端服务器
- 访问控制:认证,授权(可以要求用户输入用户名和密码才能访问特定的资源),IP地址、请求方法等条件的访问控制功能。
- 限流:可以对ip限流,整体连接数限流
- 重写和重定向:Nginx支持URL重写和重定向功能,可以根据规则将请求重定向到其他URL或修改请求的URI。
nginx启动,停止,重启
进入nginx的sbin目录,./nginx就可以启动
./nginx -s stop 停止
刷新配置(不会中断服务或重启服务):./nginx -s reload
修改配置文件之后,可以先执行 ./nginx -t 测试配置文件的语法是否正确,之后再执行刷新配置的命令
nginx怎么配置负载均衡
在 http 块中定义一个 upstream 块,并指定一组服务器的地址和端口。
http {
upstream backend {
server backend1.example.com:8080;
server backend2.example.com:8080;
server backend3.example.com:8080;
}
# ... 其他配置 ...
}
在 server 块中使用 proxy_pass 指令将请求转发到 upstream 块中定义的服务器组。
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
执行重新载入配置文件的命令sudo nginx -s reload
自带的负载均衡策略有:
轮询(默认),加权轮询,ip hash
需要第三方模块支持的有:
最少连接,url hash(按请求url的hash结果来负载均衡),fair(按后端服务的响应时间来负载均衡)
默认采用轮询的负载均衡策略,还有加权轮询,ip hash,
配置文件在什么目录
在安装目录下的conf文件夹下的nginx.conf文件
应用场景:
作为http服务器
作为虚拟主机
反向代理,负载均衡
虚拟主机
就是把一台运行在互联网上的服务器划分成多个“虚拟”的服务器,每一个虚拟主机都具有独立的域名和完整的Internet服务器(支持WWW、FTP、E-mail等)功能。
正向代理
客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
反向代理
在服务器端接受客户端的请求,然后把请求分发给具体的服务器进行处理,然后再将服务器的响应结果反馈给客户端
(当在一台主机上部署了多个不同的web服务器,并且需要能在80端口同时访问这些web服务器时,可以使用 nginx 的反向代理功能: 用 nginx 在80端口监听所有请求,并依据转发规则(比较常见的是以 URI 来转发)转发到对应的web服务器上。)
正/反向代理服务器对比
对于正向服务器,客户端必须设置正向代理服务器,要知道正向代理服务器的IP地址,还有代理程序的端口。正向代理是代替客户端获取数据然后返回给客户端
反向代理,对于客户端而言代理服务器就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端。
nginx使用
安装nginx软件,通过nginx.conf配置文件来配置虚拟主机(通过域名或端口划分)及反向代理,需要配合host文件来完成域名与ip的映射
nginx怎么限流
- 基于IP的限流:这种方式通过限制来自单个IP地址的请求频率,防止某个IP的恶意请求。
- 基于连接数的限流:这种方式通过限制某个时间段内的连接数,控制服务器的并发连接数,防止服务器过载。
修改nginx.conf配置文件,之后重新加载配置文件即可
ip限流:
对所有ip进行限流,可以通过rate限制每秒允许的最大请求数;
定义限流规则
http {
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
...
}
$binary_remote_addr:使用二进制格式的客户端IP地址,以减少内存占用。这个变量并不是由我们定义,而是 Nginx 提供的一个预定义变量。当你使用如limit_req_zone或limit_conn_zone指令时,你只需要引用这个变量即可。Nginx 会自动捕获和处理客户端的 IP 地址,并在需要限流时将这个 IP 地址的二进制形式传递给这个变量。如果你需要基于特定的 IP 地址或 IP 地址范围进行更复杂的操作,你可能需要使用map模块或其他 Nginx 模块来创建自定义变量zone=mylimit:10m:定义一个名为mylimit、大小为10MB的共享内存区域,用于存储状态信息。rate=1r/s:限制每个IP地址的请求速率为每秒1个请求。
然后,在server或location块中应用这个限流规则:
server {
...
location / {
limit_req zone=mylimit burst=5 nodelay;
...
}
...
}
zone=mylimit:使用前面定义的mylimit限流区域。burst=5:允许超过速率限制的请求在队列中等待,最多等待5个请求。nodelay:当请求超过速率限制时,立即返回503错误,而不是延迟处理。
对指定ip或ip范围进行限流
http {
map $remote_addr $limit_key {
default mydefault; # 默认限流区域
192.168.1.0/24 myoffice; # 办公室网络限流区域
10.0.0.0/8 myinternal; # 内部网络限流区域
# 可以继续添加其他 IP 地址或范围
}
# 定义默认限流区域
limit_req_zone $limit_key zone=mydefault:10m rate=10r/s;
# 定义办公室网络限流区域(例如,允许更高的请求速率)
limit_req_zone $limit_key zone=myoffice:10m rate=50r/s;
# 定义内部网络限流区域(例如,无限制或非常高的请求速率)
limit_req_zone $limit_key zone=myinternal:10m rate=0r/s; # 无限制,这里设置为0仅作为示例
...
}
server {
...
location / {
limit_req zone=$limit_key burst=10 nodelay;
...
}
...
}
基于连接数限流
定义限制区域
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
...
}
对限制区域进行连接数限流
server {
...
location / {
limit_conn addr 10;
...
}
...
}
addr:使用前面定义的addr连接限制区域。10:限制单个IP地址的并发连接数为10。- 如果并发连接数超过这个限制,Nginx会返回一个503错误给客户端。
nginx认证授权
Nginx提供了多种认证授权机制
- 使用Nginx的内置基本认证模块,要求用户输入用户名和密码才能访问特定的资源。
- 更高级的认证授权机制如OAuth、OpenID Connect等
- 跟后端应用集成,后端应用可以执行自己的认证授权逻辑,并将结果返回给Nginx,Nginx再根据结果进行访问控制。
nginx做负载均衡
Nginx支持多种负载均衡算法,包括轮询、加权轮询、IP哈希等
修改nginx.conf配置文件
http {
# 定义后端服务器组
upstream backend_servers {
#轮询策略
server backend1.example.com;
server backend2.example.com;
# 加权策略,比如某个服务器处理更多请求
# server backend1.example.com weight=2;
# server backend2.example.com weight=1;
# ip哈希策略
#ip_hash;
# server backend1.example.com weight=2;
# server backend2.example.com weight=1;
# 还可以设置其他参数,比如 max_fails 和 fail_timeout
}
# 定义服务器块
server {
listen 80;
server_name example.com;
# 将请求转发到后端服务器组
location / {
proxy_pass http://backend_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
定义一个 upstream 块来指定后端服务器的列表,并在 server 块中使用 proxy_pass 指令将请求转发到这个 upstream。
在微服务架构怎么用
可以用nginx控制域名地址访问请求到前端页面,访问到微服务网关gateway的服务
可以进行初步的限流

浙公网安备 33010602011771号