前端掌握Nginx(二)

共 9868字,需浏览 20分钟

 ·

2021-09-16 21:42

本文适合觉对nginx感兴趣的小伙伴阅读

欢迎关注前端早茶,与广东靓仔携手共同进阶~

作者:广东靓仔

一、前言

作为一名前端开发,我们除了需要对node进行学习以外,对Nginx进行系统性的学习可以帮助我们定位服务出现问题的、以及快速找到解决方案。学习nginx可以让我们更加清晰前端项目上线的整个流程。
前端掌握nginx以下的知识点,就可以轻松应对日常项目服务需求了。
Nginx知识清单

1、nginx的安装和使用

2、模块和基本配置

3、正反向代理应用场景

4、CDN

5、浏览器缓存

6、跨域

7、防盗链

8、rewrite

9、负载均衡集群

二、Nginx优点

1、可以高并发连接

      官方测试Nginx能够支撑5万并发连接,实际生产环境中可以支撑2~4万并发连接数。原因,主要是Nginx使用了最新的epoll(Linux2.6内核)和kqueue(freeBSD)网路I/O模型,而Apache使用的是传统的Select模型,其比较稳定的Prefork模式为多进程模式,需要经常派生子进程,所以消耗的CPU等服务器资源,要比Nginx高很多。

 2、内存消耗少

      Nginx+PHP(FastCGI)服务器,在3万并发连接下,开启10个Nginx进程消耗150MB内存,15MB*10=150MB,开启的64个PHP-CGI进程消耗1280内存,20MB*64=1280MB,加上系统自身消耗的内存,总共消耗不到2GB的内存。

      如果服务器的内存比较小,完全可以只开启25个PHP-CGI进程,这样PHP-CGI消耗的总内存数才500MB。

 3、成本低廉

      购买F5BIG-IP、NetScaler等硬件负载均衡交换机,需要十多万到几十万人民币,而Nginx为开源软件,采用的是2-clause BSD-like协议,可以免费试用,并且可用于商业用途。

      BSD开源协议是一个给使用者很大自由的协议,协议指出可以自由使用、修改源代码、也可以将修改后的代码作为开源或专用软件再发布。

 4、配置文件非常简单

      网络和程序一样通俗易懂,即使,非专用系统管理员也能看懂。

5、支持Rewrite重写

      能够根据域名、URL的不同,将http请求分到不同的后端服务器群组。

6、内置的健康检查功能

      如果NginxProxy后端的某台Web服务器宕机了,不会影响前端的访问。

7、节省带宽

      支持GZIP压缩,可以添加浏览器本地缓存的Header头。

8、稳定性高

      用于反向代理,宕机的概率微乎其微。

9、支持热部署

      Nginx支持热部署,它的自动特别容易,并且,几乎可以7天*24小时不间断的运行,即使,运行数个月也不需要重新启动,还能够在不间断服务的情况下,对软件版本进行升级。

三、Nginx简单安装和使用、Nginx启动

Linux环境

nginx可以在windows上安装使用,也可以在linux系统上使用。主要是linux,这里们讲讲在linux上安装。

    1、首先我们需要确定使用哪个版本的nginx.tar.gz包,可以从这里下载

http://nginx.org/download/

    2、解压 // 版本号自行切换

tar -zxvf  nginx-1.9.9.tar.gz  

    3、解压后进入目录  

cd nginx-1.9.9

    4、执行以下命令 :

./configure   --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module

    【Tip: --prefix 标识安装目录,默认/usr/local/nginx

    5、继续执行命令 

make && make install    

       编译安装,到这一步,基本我们的nginx已经安装成功


centos

yum -y install nginx  

nginx.conf 文件是nginx总配置文件也是nginx读取配置的入口

四、模块和基本配置

 一般我们在使用nginx部署重启的时候,很多时候用的比较多的文件是nginx.conf,我们一般都是对这个文件进行修改重启,它是nginx的核心配置文件。下面我们来讲讲这个配置文件。

       在这个文件里面我们看到很多配置,我们从大类来看:

1. nginx的进程数,一般我们会设置为CPU总核心数

worker_processes 8

2. nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误

worker_rlimit_nofile 65535;

3.参考事件模型

events

4.设定http服务器,利用它的反向代理功能提供负载均衡支持

里面的配置有许多,upstream jh.w3cschool.cn、server、location /比较常用

http

负载均衡配置

upstream jh.w3cschool.cn

 虚拟主机的配置

server

 一般在配置静态资源会有nginx直接读取

location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$

具体的参数可以移步到:https://www.nginx.cn/doc/


Nginx模块

说到模块,我们一般会将模块分为两种,一种是官方提供的,另外一种是第三方的。

下面我们列举下其中的一些模块: 

具体模块前往查看(https://www.nginx.cn/doc/

模块名称 模块作用
  http_access_module 四层基于IP的访问控制,可以通过匹配客户端源IP地址进行限制
  http_auth_basic_module 状态页,使用basic机制进行用户认证,在编译安装nginx的时候需要添加编译参数--withhttp_stub_status_module,否则配置完成之后监测会是提示语法错误
  http_stub_status_module 状态统计模块
  http_gzip_module 文件的压缩功能
  http_gzip_static_module 静态压缩模块
  http_ssl_module nginx 的https 功能
  http_rewrite_module 重定向模块,解析和处理rewrite请求
  http_referer_module 防盗链功能,基于访问安全考虑
  http_proxy_module 将客户端的请求以http协议转发至指定服务器进行处理
  stream_proxy_module tcp负载,将客户端的请求以tcp协议转发至指定服务器处理
  http_fastcgi_module 将客户端对php的请求以fastcgi协议转发至指定服务器助理
  http_uwsgi_module 将客户端对Python的请求以uwsgi协议转发至指定服务器处理
  http_headers_module 可以实现对头部报文添加指定的key与值
  http_upstream_module 负载均衡模块,提供服务器分组转发、权重分配、状态监测、调度算法等高级功能
  stream_upstream_module 后端服务器分组转发、权重分配、状态监测、调度算法等高级功能
  http_fastcgi_module 实现通过fastcgi协议将指定的客户端请求转发至php-fpm处理
  http_flv_module 为flv伪流媒体服务端提供支持
 

配置文件

conf //nginx所有配置文件目录   
nginx.conf //这个是Nginx的核心配置文件,这个文件非常重要,也是我们即将要学习的重点   
nginx.conf.default //nginx.conf的备份文件 


nginx常用命令

  1. 常见2种启动命令

> nginx //直接nginx启动,前提是配好nginx环境变量
> systemctl start nginx.service //使用systemctl命令启动
  1. 常见的4种停止命令

> nginx  -s stop //立即停止服务
> nginx -s quit // 从容停止服务 需要进程完成当前工作后再停止
> killall nginx //直接杀死nginx进程
> systemctl stop nginx.service //systemctl停止

     3.常见的2种重启命令

> nginx -s reload //重启nginx
> systemctl reload nginx.service //systemctl重启nginx
  1. 验证nginx配置文件是否正确

> nginx -t //输出nginx.conf syntax is ok即表示nginx的配置文件正确

五、nginx反向代理、负载均衡 

正向代理

正向代理,架设在客户机与目标主机之间,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。
正向代理的用途:
  • 访问原来无法访问的资源,如Google
  • 可以做缓存,加速访问资源
  • 对客户端访问授权,上网进行认证
  • 代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息



反向代理

反向代理服务器架设在服务器端,通过缓冲经常被请求的页面来缓解服务器的工作量,将客户机请求转发给内部网络上的目标服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器与目标主机一起对外表现为一个服务器。
主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息 反向代理的作用:
  • 保证内网的安全,通常将反向代理作为公网访问地址,Web服务器是内网

  • 负载均衡,通过反向代理服务器来优化网站的负载



负载均衡

服务器接收不同客户端发送的、Nginx反向代理服务器接收到的请求数量,就是我们说的负载量。这些请求数量按照一定的规则进行分发到不同的服务器处理的规则,就是一种均衡规则。所以,将服务器接收到的请求按照规则分发的过程,称为负载均衡
负载均衡也分硬件负载均衡和软件负载均衡两种,我们来讲的是软件负载均衡,关于硬件负载均衡的有兴趣的靓仔可以去了解下 负载均衡的算法:
  • 轮询(默认、加权轮询、ip_hash)
  • 插件(fair、url_hash),url_hash和ip_hash大同小异,一个基于ip一个基于url,就不过多介绍了

默认轮询

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某个服务器宕机,能自动剔除故障系统。

# constPolling 作为存放负载均衡的变量
upstream constPolling {
    server localhost:10001
    server localhost:10002;
}
server {
    listen 10000;
    server_name localhost;
    location / {
    proxy_pass http://constPolling; #在代理的时候接入constPolling
    proxy_redirect default;
    }
}

加权轮询

通过设置weight,值越大分配率越大 到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。其次是为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。

# constPolling 作为存放负载均衡的变量
upstream constPolling {
    server localhost:10001 weight=1
    server localhost:10002 weight=2;
}
server {
    listen 10000;
    server_name localhost;
    location / {
    proxy_pass http://constPolling; #在代理的时候接入constPolling
    proxy_redirect default;
    }
}

权重越大,被访问的概率越大,比如上面就是33.33%和百分66.66%的访问概率 访问的效果:
localhost:10001、localhost:10002、localhost:10002、localhost:10001、localhost:10002、localhost:10002


ip_hash

每个请求都根据访问ip的hash结果分配,经过这样的处理,每个访客固定访问一个后端服务,如下配置(ip_hash可以和weight配合使用),并且可以有效解决动态网页存在的session共享问题

upstream constPolling {
       ip_hash; 
       server    localhost:10001 weight=1;
       server    localhost:10002 weight=2;
}

fair

个人比较喜欢用的一种负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,响应时间短的优先分配。

  1. 安装upstream_fair模块 附上fair安装教程

  2. 哪个服务器的响应速度快,就将请求分配到那个服务器上

upstream constPolling { 
 server    localhost:10001;
 server    localhost:10002;
 fair; 

nginx错误页面配置

error_page_404 https://www.baidu.com/

Gzip压缩

root /var/www/html/gzip;
# 开启gzip压缩
gzip on;
# http请求版本
gzip_http_version 1.0;
# 设置什么类型的文件需要压缩
gzip_types text/css text/javascript application/javascript image/png image/jpeg image/gif;

六、nginx使用综合场景

1. 同一个域名通过不同目录指定不同项目目录

在开发过程中,有一种场景,比如有项目有多个子系统需要通过同一个域名通过不同目录去访问 在A/B Test 灰度发布等场景也会用上
比如:
访问 a.com/a/*** 访问的是a系统
访问 a.com/b/*** 访问的是b系统

2. 自动适配PC/移动端页面

3. 限制只能通过谷歌浏览器访问


4. 前端单页面应用刷新404问题


七、总结

    在我们阅读完官方文档后,我们一定会进行更深层次的学习,比如看下框架底层是如何运行的,以及源码的阅读。
    这里广东靓仔给下一些小建议:
  • 在看源码前,我们先去官方文档复习下框架设计理念、源码分层设计
  • 阅读下框架官方开发人员写的相关文章
  • 借助框架的调用栈来进行源码的阅读,通过这个执行流程,我们就完整的对源码进行了一个初步的了解
  • 接下来再对源码执行过程中涉及的所有函数逻辑梳理一遍

关注我,一起携手进阶

欢迎关注前端早茶,与广东靓仔携手共同进阶~

参考资料:

.https://blog.csdn.net/lishaojun0115/article/details/53200629

.https://blog.csdn.net/u010098159/article/details/81331522

.https://www.cnblogs.com/caicaizi/p/9566192.html

浏览 8
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报