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怎么限流

  1. 基于IP的限流:这种方式通过限制来自单个IP地址的请求频率,防止某个IP的恶意请求。
  2. 基于连接数的限流:这种方式通过限制某个时间段内的连接数,控制服务器的并发连接数,防止服务器过载。

修改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个请求。

然后,在serverlocation块中应用这个限流规则:

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的服务

可以进行初步的限流

posted @ 2023-02-02 09:36  星光闪闪  阅读(122)  评论(0)    收藏  举报