AI-大数据

【NGINX入门】15.史上最全Nginx面试题

2021-02-04  本文已影响0人  笔名辉哥

什么是Nginx?

为什么要用Nginx?

为什么Nginx性能这么高?

Nginx怎么处理请求的?

    server {                                    # 第一个Server区块开始,表示一个独立的虚拟主机站点
        listen       80;                        # 提供服务的端口,默认80
        server_name  localhost;                 # 提供服务的域名主机名
        location / {                            # 第一个location区块开始
            root   html;                    # 站点的根目录,相当于Nginx的安装目录
            index  index.html index.htm;        # 默认的首页文件,多个用空格分开
        }                                       # 第一个location区块结果

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

  1. 正向代理就是一个人发送一个请求直接就到达了目标的服务器
  2. 反方代理就是请求统一被Nginx接收,nginx反向代理服务器接收到之后,按照一定的规 则分发给了后端的业务处理服务器进行处理了

使用“反向代理服务器的优点是什么?

Nginx的优缺点?

Nginx应用场景?

  1. http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。
  2. 虚拟主机。可以实现在一台服务器虚拟出多个网站,例如个人网站使用的虚拟机。
  3. 反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会应为某台服务器负载高宕机而某台服务器闲置的情况。
  4. nginz 中也可以配置安全管理、比如可以使用Nginx搭建API接口网关,对每个接口服务进行拦截。

Nginx目录结构有哪些?

[root@localhost ~]# tree /usr/local/nginx
/usr/local/nginx
├── client_body_temp
├── conf                             # Nginx所有配置文件的目录
│   ├── fastcgi.conf                 # fastcgi相关参数的配置文件
│   ├── fastcgi.conf.default         # fastcgi.conf的原始备份文件
│   ├── fastcgi_params               # fastcgi的参数文件
│   ├── fastcgi_params.default       
│   ├── koi-utf
│   ├── koi-win
│   ├── mime.types                   # 媒体类型
│   ├── mime.types.default
│   ├── nginx.conf                   # Nginx主配置文件
│   ├── nginx.conf.default
│   ├── scgi_params                  # scgi相关参数文件
│   ├── scgi_params.default  
│   ├── uwsgi_params                 # uwsgi相关参数文件
│   ├── uwsgi_params.default
│   └── win-utf
├── fastcgi_temp                     # fastcgi临时数据目录
├── html                             # Nginx默认站点目录
│   ├── 50x.html                     # 错误页面优雅替代显示文件,例如当出现502错误时会调用此页面
│   └── index.html                   # 默认的首页文件
├── logs                             # Nginx日志目录
│   ├── access.log                   # 访问日志文件
│   ├── error.log                    # 错误日志文件
│   └── nginx.pid                    # pid文件,Nginx进程启动后,会把所有进程的ID号写到此文件
├── proxy_temp                       # 临时目录
├── sbin                             # Nginx命令目录
│   └── nginx                        # Nginx的启动命令
├── scgi_temp                        # 临时目录
└── uwsgi_temp                       # 临时目录

Nginx配置文件nginx.conf有哪些属性模块?

worker_processes  1;                                    # worker进程的数量
events {                                                # 事件区块开始
    worker_connections  1024;                           # 每个worker进程支持的最大连接数
}                                                       # 事件区块结束
http {                                                  # HTTP区块开始
    include       mime.types;                           # Nginx支持的媒体类型库文件
    default_type  application/octet-stream;             # 默认的媒体类型
    sendfile        on;                                 # 开启高效传输模式
    keepalive_timeout  65;                              # 连接超时
    server {                                            # 第一个Server区块开始,表示一个独立的虚拟主机站点
        listen       80;                                # 提供服务的端口,默认80
        server_name  localhost;                         # 提供服务的域名主机名
        location / {                                    # 第一个location区块开始
            root   html;                            # 站点的根目录,相当于Nginx的安装目录
            index  index.html index.htm;                # 默认的首页文件,多个用空格分开
        }                                               # 第一个location区块结果
        error_page   500502503504  /50x.html;           # 出现对应的http状态码时,使用50x.html回应客户
        location = /50x.html {                          # location区块开始,访问50x.html
            root   html;                                # 指定对应的站点目录为html
        }
    }  
    ......

Nginx静态资源?

如何用Nginx解决前端跨域问题?

Nginx虚拟主机怎么配置?

基于虚拟主机配置域名

    #当客户端访问www.lijie.com,监听端口号为80,直接跳转到data/www目录下文件
    server {
        listen       80;
        server_name  www.lijie.com;
        location / {
            root   data/www;
            index  index.html index.htm;
        }
    }

    #当客户端访问www.lijie.com,监听端口号为80,直接跳转到data/bbs目录下文件
     server {
        listen       80;
        server_name  bbs.lijie.com;
        location / {
            root   data/bbs;
            index  index.html index.htm;
        }
    }

基于端口的虚拟主机

    #当客户端访问www.lijie.com,监听端口号为8080,直接跳转到data/www目录下文件
     server {
        listen       8080;
        server_name  8080.lijie.com;
        location / {
            root   data/www;
            index  index.html index.htm;
        }
    }

    #当客户端访问www.lijie.com,监听端口号为80直接跳转到真实ip服务器地址 127.0.0.1:8080
    server {
        listen       80;
        server_name  www.lijie.com;
        location / {
            proxy_pass http://127.0.0.1:8080;
            index  index.html index.htm;
        }
    }

location的作用是什么?

location的语法能说出来吗?

注意:~ 代表自己输入的英文字母

匹配符 匹配规则 优先级
= 精确匹配 1
^~ 以某个字符串开头 2
~ 区分大小写的正则匹配 3
~* 不区分大小写的正则匹配 4
!~ 区分大小写不匹配的正则 5
!~* 不区分大小写不匹配的正则 6
/ 通用匹配,任何请求都会匹配到 7

Location正则案例

    #优先级1,精确匹配,根路径
    location =/ {
        return 400;
    }

    #优先级2,以某个字符串开头,以av开头的,优先匹配这里,区分大小写
    location ^~ /av {
       root /data/av/;
    }

    #优先级3,区分大小写的正则匹配,匹配/media*****路径
    location ~ /media {
          alias /data/static/;
    }

    #优先级4 ,不区分大小写的正则匹配,所有的****.jpg|gif|png 都走这里
    location ~* .*\.(jpg|gif|png|js|css)$ {
       root  /data/av/;
    }

    #优先7,通用匹配
    location / {
        return 403;
    }

限流怎么做的?

实现三种限流算法

1、正常限制访问频率(正常流量):
    #定义限流维度,一个用户一分钟一个请求进来,多余的全部漏掉
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;

    #绑定限流维度
    server{

        location/seckill.html{
            limit_req zone=zone;    
            proxy_pass http://lj_seckill;
        }

    }

2、突发限制访问频率(突发流量):
    #定义限流维度,一个用户一分钟一个请求进来,多余的全部漏掉
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;

    #绑定限流维度
    server{

        location/seckill.html{
            limit_req zone=zone burst=5 nodelay;
            proxy_pass http://lj_seckill;
        }

    }

3、 限制并发连接数
    http {
        limit_conn_zone $binary_remote_addr zone=myip:10m;
        limit_conn_zone $server_name zone=myServerName:10m;
    }

    server {
        location / {
            limit_conn myip 10;
            limit_conn myServerName 100;
            rewrite / http://www.lijie.net permanent;
        }
    }

漏桶流算法和令牌桶算法知道?

漏桶算法

令牌桶算法

在这里插入图片描述

为什么要做动静分离?

Nginx怎么做的动静分离?

        location /image/ {
            root   /usr/local/static/;
            autoindex on;
        }

  1. 创建目录

    mkdir /usr/local/static/image
    
    
  2. 进入目录

    cd  /usr/local/static/image
    
    
  3. 放一张照片上去#

    1.jpg
    
    
  4. 重启 nginx

    sudo nginx -s reload
    
    
  5. 打开浏览器 输入 server_name/image/1.jpg 就可以访问该静态图片了

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

1 轮询(默认)

upstream backserver { 
 server 192.168.0.12; 
 server 192.168.0.13; 
} 

2 权重 weight

upstream backserver { 
 server 192.168.0.12 weight=2; 
 server 192.168.0.13 weight=8; 
} 

3 ip_hash( IP绑定)

upstream backserver { 
 ip_hash; 
 server 192.168.0.12:88; 
 server 192.168.0.13:80; 
} 

4 fair(第三方插件)

upstream backserver { 
 server server1; 
 server server2; 
 fair; 
} 

5、url_hash(第三方插件)

upstream backserver { 
 server squid1:3128; 
 server squid2:3128; 
 hash $request_uri; 
 hash_method crc32; 
} 

Nginx配置高可用性怎么配置?

server {
        listen       80;
        server_name  www.lijie.com;
        location / {
            ### 指定上游服务器负载均衡服务器
            proxy_pass http://backServer;
            ###nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间
            proxy_connect_timeout 1s;
            ###nginx发送给上游服务器(真实访问的服务器)超时时间
            proxy_send_timeout 1s;
            ### nginx接受上游服务器(真实访问的服务器)超时时间
            proxy_read_timeout 1s;
            index  index.html index.htm;
        }
    }

Nginx怎么判断别IP不可访问?

     # 如果访问的ip地址为192.168.9.115,则返回403
     if  ($remote_addr = 192.168.9.115) {  
         return 403;  
     }  

怎么限制浏览器访问?

    ## 不允许谷歌浏览器访问 如果是谷歌浏览器返回500
    if ($http_user_agent ~ Chrome) {   
        return 500;  
    }

Rewrite全局变量是什么?

变量 含义
$args 这个变量等于请求行中的参数,同$query_string
$content length 请求头中的Content-length字段。
$content_type 请求头中的Content-Type字段。
$document_root 当前请求在root指令中指定的值。
$host 请求主机头字段,否则为服务器名称。
$http_user_agent 客户端agent信息
$http_cookie 客户端cookie信息
$limit_rate 这个变量可以限制连接速率。
$request_method 客户端请求的动作,通常为GET或POST。
$remote_addr 客户端的IP地址。
$remote_port 客户端的端口。
$remote_user 已经经过Auth Basic Module验证的用户名。
$request_filename 当前请求的文件路径,由root或alias指令与URI请求生成。
$scheme HTTP方法(如http,https)。
$server_protocol 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr 服务器地址,在完成一次系统调用后可以确定这个值。
$server_name 服务器名称。
$server_port 请求到达服务器的端口号。
$request_uri 包含请求参数的原始URI,不包含主机名,如”/foo/bar.php?arg=baz”。
$uri 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
$document_uri 与$uri相同。

本文转载自《Nginx面试题(总结最全面的面试题!!!)》

上一篇下一篇

猜你喜欢

热点阅读