前端工程师必备的Nginx知识

历史背景

进程之间切换的成本是非常高的,在这种背景下,Nginx应运而生,可以轻松处理数百万、上千万的连接。

Ngixn的优势

  • 高并发高性能

  • 可扩展性好

  • 高可靠性

  • 热部署

  • 开源许可证

Ngixn的主要应用场景

  • 静态资源服务,通过本地文件系统提供服务

  • 反向代理服务、负载均衡

  • API服务、权限控制,减少应用服务器压力

Nginx 配置文件和目录

通过 rpm -ql nginx 可以查看 Nginx 安装的配置文件和目录。

正向代理 Forward proxy

正向代理的对象是客户端,服务器端看不到真正的客户端。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a2oY8pC8-1635085077561)(https://tcs.teambition.net/storage/311z1cc22cddf5085ca5fe0d1759018689c0?Signature=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBcHBJRCI6IjU5Mzc3MGZmODM5NjMyMDAyZTAzNThmMSIsIl9hcHBJZCI6IjU5Mzc3MGZmODM5NjMyMDAyZTAzNThmMSIsIl9vcmdhbml6YXRpb25JZCI6IiIsImV4cCI6MTYzNTY4OTc3OSwiaWF0IjoxNjM1MDg0OTc5LCJyZXNvdXJjZSI6Ii9zdG9yYWdlLzMxMXoxY2MyMmNkZGY1MDg1Y2E1ZmUwZDE3NTkwMTg2ODljMCJ9.HqJNigbhhTXWl5ZlvItlN7XQtcqPlUiOCQDTYNyjLxA&download=image.png "")]

resolver 8.8.8.8 # 谷歌的域名解析地址
server { 
location / {      
# 当客户端请求我的时候,我会把请求转发给它      
# $http_host 要访问的主机名 $request_uri 请求路径      
proxy_pass http://$http_host$request_uri; 
}
}

反向代理 Reverse proxy

反向代理的对象是服务端,客户端看不到真正的服务端。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pgR32V5Y-1635085077565)(https://tcs.teambition.net/storage/311z50a4a1ba33995eb3be8f96e05027dae4?Signature=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBcHBJRCI6IjU5Mzc3MGZmODM5NjMyMDAyZTAzNThmMSIsIl9hcHBJZCI6IjU5Mzc3MGZmODM5NjMyMDAyZTAzNThmMSIsIl9vcmdhbml6YXRpb25JZCI6IiIsImV4cCI6MTYzNTY4OTc3OSwiaWF0IjoxNjM1MDg0OTc5LCJyZXNvdXJjZSI6Ii9zdG9yYWdlLzMxMXo1MGE0YTFiYTMzOTk1ZWIzYmU4Zjk2ZTA1MDI3ZGFlNCJ9.kOXgHRcIujYtA6qRNd6O9ZSIbtQgaKH0ZSMCgEQIFq8&download=image.png "")]

跨域

跨域是前端工程师都会面临的场景,跨域的解决方案有很多。不过要知道在生产中,要么使用 CORS 、要么使用 Nginx 反向代理来解决跨域。在 Nginx 的配置文件中进行如下配置即可:

server {    listen   80;    server_name   localhost; # 用户访问 localhost,反向代理到 http://webcanteen.com    location / {        proxy_pass http://webcanteen.com    }}

Gzip

Gzip是互联网上非常普遍的一种数据压缩格式,对于纯文本可以压缩袋原大小的40%,可以节省大量的带宽。不过需要注意的是,启用Gzip岁序的HTTP的最低版本是1.1。

location ~ .*\. (jpg|png|gif)$ {    gzip off; #关闭压缩    root /data/www/images;}location ~ .*\. (html|js|css)$ {    gzip on; #启用压缩    gzip_min_length 1k; # 超过1K的文件才压缩    gzip_http_version 1.1; # 启用gzip压缩所需的HTTP最低版本    gzip_comp_level 9; # 压缩级别,压缩比率越高,文件被压缩的体积越小    gzip_types text/css application/javascript; # 进行压缩的文件类型    root /data/www/html;}

请求限制

对于大流量的恶意的访问,会造成带宽的浪费,给服务器增加很多的压力。往往对于同一IP的连接数以及并发数进行限制。

关于请求限制主要有两种类型:

  • limit_conn_module 连接频率限制

  • limit_req_module 请求频率限制

# $binary_remote_addr 远程IP地址 zone 区域名称 10m内存区域大小limit_conn_zone $binary_remote_addr zone=coon_zone:10m;server {    # conn_zone 设置对应的共享内存区域 1是限制的数量 limit_conn conn_zone 1;}

# $binary_remote_addr 远程IP地址 zone 区域名称 10m内存区域大小limit_conn_zone $binary_remote_addr zone=coon_zone:10m;server {    # conn_zone 设置对应的共享内存区域 1是限制的数量 limit_conn conn_zone 1;}

访问控制

关于访问控制主要有两种类型:

  • -http_access_module 基于 IP 的访问控制

  • -http_auth_basic_module 基于用户的信任登陆

以下是基于 IP 的访问控制:

server { location ~ ^/index.html {  # 匹配 index.html 页面 除了 127.0.0.1 以外都可以访问  deny 127.0.0.1;  allow all; }}

ab指令

ab指令的全称为:Apache bench,是Apache自带的压力测试工具,也可以测试Nginx,IIS等其他的Web服务器

  • -n 总共的请求数

  • -c 并发的请求数

ab -n 1000 -c 5000 http://127.0.0.1/

防盗链

防盗链的原理就是根据请求头中referer得到网页来源,从而实现访问控制。这样可以防止网站资源被非法盗用,从而保证信息安全,减少带宽损耗,减轻服务器压力。

location ~ .*\.(jpg|png|gif)$ { # 匹配防盗链资源的文件类型    # 通过 valid_referers 定义合法的地址白名单 $invalid_referer 不合法的返回403      valid_referers none blocked 127.0.0.1;    if ($invalid_referer) {        return 403;    }}

负载均衡 Load Balance

当我们的网站需要解决高并发、海量数据问题时,就需要使用负载均衡来调度服务器。将请求合理的分发到应用服务器集群中的一台台服务器上

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zD356fbO-1635085077572)(https://tcs.teambition.net/storage/311z9d9f1975cf53fb8e30ae100a65abc374?Signature=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBcHBJRCI6IjU5Mzc3MGZmODM5NjMyMDAyZTAzNThmMSIsIl9hcHBJZCI6IjU5Mzc3MGZmODM5NjMyMDAyZTAzNThmMSIsIl9vcmdhbml6YXRpb25JZCI6IiIsImV4cCI6MTYzNTY4OTc3OSwiaWF0IjoxNjM1MDg0OTc5LCJyZXNvdXJjZSI6Ii9zdG9yYWdlLzMxMXo5ZDlmMTk3NWNmNTNmYjhlMzBhZTEwMGE2NWFiYzM3NCJ9.POySRxiWansNTaZ5rMR77vU173FNl99ol4x-RA3MLMo&download=image.png "")]

Nginx 可以为我们提供负载均衡的能力,具体配置如下:

# upstream 指定后端服务器地址# weight 设置权重# server 中会将 http://webcanteen 的请求转发到 upstream 池中upstream webcanteen {    server 127.0.0.1:66 weight=10;    server 127.0.0.1:77 weight=1;    server 127.0.0.1:88 weight=1;}server {    location / {        proxy_pass http://webcanteen    }}

后端服务器状态

后端服务器支持以下的状态配置:

  • down:当前服务器不参与负载均衡

  • backup:当其他节点都无法使用时的备用服务器

  • max_fails:允许请求失败的次数,若到达就会休眠

  • fail_timeout:经过max_fails次失败后,服务器的暂停时间,默认为10s

  • max_conns:限制每个服务器的最大接收连接数

upstream webcanteen { server 127.0.0.1:66 down; server 127.0.0.1:77 backup; server 127.0.0.1:88  max_fails=3 fail_timeout=10s; server 127.0.0.1:99 max_conns=1000;}

分配方式

轮询(默认),每个请求按照时间顺序轮流分配到不同的后端服务器,如果某台后端服务器宕机,Nginx 轮询列表会自动将它去除掉。weight(加权轮询),轮询的加强版,weight 和访问几率成正比,主要用于后端服务器性能不均的场景。ip_hash,每个请求按照访问 IP 的 hash 结果分配,这样每个访问可以固定访问一个后端服务器。url_hash,按照访问 URL 的 hash 结果来分配请求,使得每个URL定向到同一个后端服务器上,主要应用于后端服务器为缓存时的场景。自定义hash,基于任意关键字作为 hash key 实现 hash 算法的负载均衡fair,按照后端服务器的响应时间来分配请求,响应时间短则优先分配。

  • 轮询(默认),每个请求按照时间顺序轮流分配到不同的后端服务器,如果某台后端服务器宕机,Nginx 轮询列表会自动将它去除掉。

  • weight(加权轮询),轮询的加强版,weight 和访问几率成正比,主要用于后端服务器性能不均的场景。

  • ip_hash,每个请求按照访问 IP 的 hash 结果分配,这样每个访问可以固定访问一个后端服务器。

  • url_hash,按照访问 URL 的 hash 结果来分配请求,使得每个URL定向到同一个后端服务器上,主要应用于后端服务器为缓存时的场景。

  • 自定义hash,基于任意关键字作为 hash key 实现 hash 算法的负载均衡

  • fair,按照后端服务器的响应时间来分配请求,响应时间短则优先分配。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值