nginx 前端需要知道

301 阅读4分钟

最近比较闲,想要学习些新的 东西,发现自己知道的太少了,于是准备入坑。

Nginx是一款轻量级的HTTP服务器,采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的IO性能,时常用于服务端的反向代理和负载均衡。也是一个通用的TCP/UDP代理服务器

nginx前端使用

Nginx的优点

  • 支持海量高并发:采用IO多路复用epoll。官方测试Nginx能够支持5万并发链接,实际生产环境中可以支撑2-4万并发连接数。
  • 内存消耗少:在主流的服务器中Nginx目前是内存消耗最小的了,比如我们用Nginx+PHP,在3万并发链接下,开启10个Nginx进程消耗150M内存。
  • 免费使用可以商业化:Nginx为开源软件,采用的是2-clause BSD-like协议,可以免费使用,并且可以用于商业。
  • 配置文件简单:网络和程序配置通俗易懂,即使非专业运维也能看懂。

nginx 在应用程序的应用

  • 解决跨域
  • 请求过滤
  • 配置gzip
  • 负载均衡
  • 静态资源服务器

反向代理

互联网应用基本都基于CS基本结构,即client端和server端。代理其实就是在client端和真正的server端之前增加一层提供特定服务的服务器,即代理服务器。

正向代理-----翻墙工具其实就是一个正向代理工具。它会把访问墙外服务器server的网页请求,代理到一个可以访问本地该网站的代理服务器proxy,这个代理服务器proxy把墙外服务器server上的网页内容获取,再转发给客户。

反向代理----客户端发送的请求,想要访问server服务器上的内容。但将被发送到一个代理服务器proxy,这个代理服务器将把请求代理到和自己属于同一个LAN下的内部服务器上,而用户真正想获得的内容就储存在这些内部服务器上。proxy服务器代理的并不是客户,而是服务器,即向外部客户端提供了一个统一的代理入口,客户端的请求,都先经过这个proxy服务器

nginx 配置结构

events {
    
}
http
{
    server
    {
     
        location path
        {...}
            location path
        {...}
    }
    server
    {...}
}
  • main:nginx的全局配置,对全局生效。
  • events:配置影响nginx服务器或与用户的网络连接。
  • http:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。
  • server:配置虚拟主机的相关参数,一个http中可以有多个server。
  • location:配置请求的路由,以及各种页面的处理情况。
  • upstream:配置后端服务器具体地址,负载均衡配置不可或缺的部分。

nginx 内置变量

变量名 功能
$host 请求信息中的 Host,如果请求中没有 Host行,则等于设置的服务器名
$request_method 客户端请求类型,如 GET、 POST
$remote_addr 客户端的 IP地址
$args 请求中的参数
$content_length 请求头中的 Content-length字段
$http_user_agent 客户端agent信息
$http_cookie 客户端cookie信息
$remote_addr 客户端的IP地址
$remote_port 客户端的端口
$server_protocol 请求使用的协议,如 HTTP/1.0、·HTTP/1.1`
$server_addr 服务器地址
$server_name 服务器名称
$server_port 服务器的端口号

nginx 解决跨域

解决跨域就是解决同源策略,如果有相同的端口和域名,则两个页面具相同的源, 不同的协议(https和http)| 不同的端口(79 和80 )|不同的域名(server.com 和 localhost)都会产生跨域

eg:a.com.cn 和b.com.cn

我们需要启动一个nginx 服务器,将server_name 设置为a.com.cn,然后设置相应的location以拦截前端需要跨域的请求,最后将请求代理返回到服务器b.com.cn

server{
    listen 80;
    server_name:a.com.cn;
    location  / {
        proxy_pass  b.com.cn;
    }
}

这样可以完美绕过浏览器的同源策略: a.com.cn访问 nginx的 a.com.cn属于同源访问,而 nginx对服务端转发的请求不会触发浏览器的同源策略。

请求过滤

根据状态码过滤

error_page 404 500 503 /50x.html;
  location = /50x.html{
      # 将根路径改为存放html的路径
      root /root/static/html
  }

根据URL名称过滤,精准匹配URL,不匹配的URL全部重定向到主页。

    location / {
        rewrite  ^.*$ /index.html  redirect
    }

根据请求类型过滤。

 if($request_method !~^(GET|POST|HEAD)$ ){
    return 403; 
 }

配置Gzip

GZIP是规定的三种标准HTTP压缩格式之一。目前绝大多数的网站都在使用 GZIP传输 HTML、 CSS、 JavaScript 等资源文件。

启用 gzip同时需要客户端和服务端的支持,如果客户端支持 gzip的解析,那么只要服务端能够返回 gzip的文件就可以启用 gzip了,我们可以通过 nginx的配置来让服务端支持 gzip。下面的 respone中 content-encoding:gzip,指服务端开启了 gzip的压缩方式。

  • gzip :开启或者关闭 gzip模块 默认值为 off 可配置为 on/off
  • gzip_http_version :启用 GZip 所需的 HTTP 最低版本,默认1.1
  • gzip_comp_level: 压缩级别,级别越高压缩率越大,当然压缩时间也就越长(传输快但比较消耗cpu)。默认值为 1,压缩级别取值为 1-9
  • gzip_min_length :设置允许压缩的页面最小字节数, Content-Length小于该值的请求将不会被压缩,默认值: 0,当设置的值较小时,压缩后的长度可能比原文件大,建议设置 1000以上
  • gzip_types 要采用gzip压缩的文件类型( MIME类型),默认值: text/html(默认不压缩 js/ css)

nginx负载均衡

负载均衡就是用来帮助我们将众多的客户端请求合理的分配到各个服务器,以达到服务端资源的充分利用和更少的请求时间。

  • Upstream指定后端服务器地址列表
upstream balanceServer{
    server 192.168.1.1:12
    server 192.168.1.12:123
}

在server中拦截响应请求,并将请求转发到Upstream中配置的服务器列表。

server{
    server_name: a.com.cn;
    listen 80;
    location /api{
        proxy_pass https://ffff;
    }
}
  • 轮询策略
    • 最小连接数策略
      upstream balanceServer{
          least_conn;
          server 192.168.1.1:12
          server 192.168.1.12:123
      }
    
    • 最快响应时间策略
      upstream balanceServer{
          fair;
          server 192.168.1.1:12
          server 192.168.1.12:123
      }
    
    • 客户端ip绑定,同一个ip的请求永远只分配一台服务器,有效解决了动态网页存在的session共享问题
     upstream balanceServer{
         ip_hash;
         server 192.168.1.1:12
         server 192.168.1.12:123
     }