前端应该了解的 Nginx 知识

230 阅读4分钟

概述

  • Nginx 是一款轻量级的 Web 服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。
  • 实际上,他并不是一台真正意义上的物理机服务器,并不是主观上真实存在的实体,它是运行在某一台服务器(电脑)上的软件

应用场景

反向代理

image.png

  • 是指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,
  • 并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

正向代理

image.png

  • 位于客户端和目标服务器之间的服务器(代理服务器),

  • 为了从目标服务器取得内容,客户端向代理服务器发送一个请求并指定目标,

  • 然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端

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

    • 正向代理用户一般是用户的主管需求, 比如 外网访问, 内网访问等
    • 反向代理, 一般是服务提供者为了提供服务而使用的.

负载均衡

  • 负载均衡其意思就是分摊到多个操作单元上进行执行处理.
  • 当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理
  • 负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡

HTTP服务器(包含动静分离)

  • Nginx 本身也是一个静态资源的服务器

  • 当只有静态资源的时候,就可以使用 Nginx 来做服务器

  • 同时现在也很流行动静分离,就可以通过 Nginx 来实现

    • 动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,
    • 动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路

常用配置

# 以下是全局段配置
#user administrator administrators;  #配置用户或者组,默认为nobody nobody。
#worker_processes 2;  #设置进程数,默认为1
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
error_log log/error.log debug;  #制定日志路径,级别:debug|info|notice|warn|error|crit|alert|emerg
# events段配置信息
events {
    accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on
    multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off
    #use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    #最大连接数,默认为512
}
# http、配置请求信息
http {
    include       mime.types;   #文件扩展名与文件类型映射表
    default_type  application/octet-stream; #默认文件类型,默认为text/plain
    #access_log off; #取消服务日志    
    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
    access_log log/access.log myFormat;  #combined为日志格式的默认值
    sendfile on;   #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
    sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
    keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。
    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #热备
    }
    error_page 404 https://www.baidu.com; #错误页
    # 第一个Server区块开始,表示一个独立的虚拟主机站点
    server {
        keepalive_requests 120; #单连接请求上限次数。
        listen       4545;   #监听端口
        server_name  127.0.0.1;   #监听地址       
        location  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
           #root path;  #根目录
           #index vv.txt;  #设置默认页
           proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
           deny 127.0.0.1;  #拒绝的ip
           allow 172.18.5.54; #允许的ip           
        } 
    }
}

反向代理

server {
    listen       80;
    server_name  localhost;
    location / {
         proxy_pass http://localhost:8081;
         proxy_set_header Host $host:$server_port;#为请求头添加Host字段,用于指定请求服务器的域名/IP地址和端口号。  
         # 设置用户ip地址
         proxy_set_header X-Forwarded-For $remote_addr;#为请求头添加XFF字段,值为客户端的IP地址。
         # 当请求服务器出错去寻找其他服务器
         proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
    }
}
  • 当我们访问 localhost 的时候,ngnix 就将我们的请求转到 localhost:8081 了

动静分离示

server {
    listen       80;
    server_name  localhost;
    set $doc_root /usr/local/var/www;
    location ~* .(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$ {
       root $doc_root/img;
    }
    location / {
        proxy_pass http://web_servers;
        proxy_set_header Host $host:$server_port;
    }
 }
  • 访问 http://localhost/test.jpg 时直接返回 /usr/local/var/www/img 路径下的图片
  • 访问 http://localhost/index.html 时就会访问到另外的服务

页面缓存

server {
    location ~* .(html)$ {
        access_log off;
        add_header  Cache-Control  no-cache, no-store;
    }
    location ~* .(css|js|png|jpg|jpeg|gif|gz|svg|mp4|ogg|ogv|webm|htc|xml|woff)$ {
        # 同上,通配所有以.css/.js/...结尾的请求
        access_log off;
        add_header    Cache-Control  max-age=31536000;
    }
}
  • 对 html 设置不缓存, 其他静态资源设置 1年的缓存

gzip 压缩

http {
  gzip on; # 开始 gzip
  gzip_comp_level 5; # 压缩级别: 1-9
  gzip_min_length 1k; # gzip 压缩文件体积的最小值
  # ... 
}

return 指令

# 204(No Content)
# 400(Bad Request)
# 402(Payment Required)
# 403(Forbidden) 
# 404(Not Found)
# 405(Method Not Allowed)
# 406(Not Acceptable)
# 408(Request Timeout)
# 410(Gone)
# 411(Length Required)
# 413(Request Entity Too Large)
# 416(Requested Range Not Satisfiable)
# 500(Internal Server Error)
# 501(Not Implemented)
# 502(Bad Gateway)
# 503(Service Unavailable)
# 504(Gateway Timeout)
location ~ .*.(sh|bash)?$ {
    return 404 "您访问的资源不存在";
}
location / { 
   return 302 /main.html; 
}
  • 当用户请求的资源是我们服务器上的配置文件时, 我们可以返回 404 状态码并告诉用户资源不存在.

小结

  • Nginx 是一个高性能的 HTTP 和 反向代理服务器; 它的内存占用少,启动极快,高并发能力强
  • 除了本文介绍的配置, 还有很多使用的配置, 感兴趣的同学可以单独学习

相关文档

浅谈浏览器缓存
Cache-Control 使用

参考文档

juejin.cn/post/721734…

www.yiibai.com/nginx/nginx…

xie.infoq.cn/article/bea…