Nginx 是一个高性能、轻量级的 Web 和反向代理服务器, 其特点是占有内存及资源少、抗并发能力强。
Nginx 安装简单、配置简洁、启动疾速便捷、反对热部署、反对 SSL、领有高度模块化的设计。
Nginx 的次要性能有:
- Web 服务器
- 反向代理
- 负载平衡
- 什么是 Nginx
Nginx (engine x) 是一个高性能的 HTTP 和反向代理 web 服务器。
Nginx 以事件驱动的形式编写,所以有十分好的性能,同时也是一个十分高效的反向代理、负载平衡服务器。在性能上,Nginx 占用很少的系统资源,能反对更多的并发连贯,达到更高的拜访效率;在性能上,Nginx 是优良的代理服务器和负载平衡服务器;在装置配置上,Nginx 安装简单、配置灵便。
Nginx 反对热部署,启动速度特地快,还能够在不间断服务的状况下对软件版本或配置进行降级,即便运行数月也无需重新启动。
在微服务的体系之下,Nginx 正在被越来越多的我的项目采纳作为网关来应用,配合 Lua 做限流、熔断等管制。
这里提到了反向代理,什么是反向代理?
Nginx 依据接管到的申请的端口,域名,url,将申请转发给不同的机器,不同的端口(或间接返回后果),而后将返回的数据返回给客户端, 在 Java 设计模式中,代理模式是这样定义的:给某个对象提供一个代理对象,并由代理对象管制原对象的援用。
当咱们有一个服务器集群,并且服务器集群中的每台服务器的内容一样的时候,同样咱们要间接从个人电脑拜访到服务器集群服务器的时候无法访问,必须通过第三方服务器能力拜访集群
这个时候,咱们通过第三方服务器拜访服务器集群的内容,然而咱们并不知道是哪一台服务器提供的内容,这种代理形式称为反向代理
反向代理: 客户端 一 > 代理 < 一 > 服务端
反向代理用一个租房的例子:
A(客户端)想租一个房子,B(代理)就把这个房子租给了他。
这时候实际上 C(服务端)才是房东。
B(代理)是中介把这个房子租给了 A(客户端)。
这个过程中 A(客户端)并不知道这个房子到底谁才是房东
他都有可能认为这个房子就是 B(代理)的
反向代理特点
- Nginx 没有本人的地址,它的地址就是服务器的地址,如 www.baidu.com,对外部来讲,它就是数据的生产者。
- Ngxin 明确的晓得应该去哪个服务器获取数据(在未接管到申请之前,曾经确定应该连贯哪台服务器)
有反向就应该有正向。
所谓正向代理就是顺着申请的方向进行的代理,即代理服务器他是由你配置为你服务,去申请指标服务器地址。正向代理最大的特点是客户端十分明确要拜访的服务器地址;服务器只分明申请来自哪个代理服务器,而不分明来自哪个具体的客户端;正向代理模式屏蔽或者暗藏了实在客户端信息
正向代理: 客户端 < 一 > 代理 一 > 服务端
正向代理也简略地打个租房的比如:
A(客户端)想租 C(服务端)的房子, 然而 A(客户端)并不意识 C(服务端)租不到。
B(代理)意识 C(服务端)能租这个房子所以你找了 B(代理)帮忙租到了这个房子。
这个过程中 C(服务端)不意识 A(客户端)只意识 B(代理)
C(服务端)并不知道 A(客户端)租了房子,只晓得房子租给了 B(代理)。
2. Nginx 利用场景
1、http 服务器。Nginx 是一个 http 服务能够独立提供 http 服务。能够做网页动态服务器。
2、虚拟主机。能够实现在一台服务器虚构出多个网站。例如集体网站应用的虚拟主机。
- 基于端口的,不同的端口
- 基于域名的,不同域名
3、反向代理,负载平衡。当网站的访问量达到肯定水平后,单台服务器不能满足用户的申请时,须要用多台服务器集群能够应用 nginx 做反向代理。并且多台服务器能够均匀分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的状况。
- 装置 Nginx
- 命令
–
nginx -s reopen #重启 Nginx
nginx -s reload #从新加载 Nginx 配置文件,而后以优雅的形式重启 Nginx
nginx -s stop #强制进行 Nginx 服务
nginx -s quit #优雅地进行 Nginx 服务(即解决完所有申请后再进行服务)nginx -?,-h #关上帮忙信息
nginx -v #显示版本信息并退出
nginx -V #显示版本和配置选项信息,而后退出
nginx -t #检测配置文件是否有语法错误,而后退出
nginx -T #检测配置文件是否有语法错误,转储并退出
nginx -q #在检测配置文件期间屏蔽非错误信息
nginx -p prefix #设置前缀门路(默认是:/usr/share/nginx/)nginx -c filename #设置配置文件(默认是:/etc/nginx/nginx.conf)
nginx -g directives #设置配置文件外的全局指令
killall nginx #杀死所有 nginx 过程
复制代码
转储: 在内存、CPU、I/ O 等设施上的数据都是动静的(或者说是易失的),也就是说数据应用完或者产生异样就会丢掉。如果我想得到某些时刻的数据(有可能是调试程序 Bug 或者收集某些信息),就要把他转储(dump)为动态(如文件)的模式。否则,这些数据你永远都拿不到。
- Nginx 配置
Nginx 的主配置文件是:nginx.conf。
外面的配置次要是这样:
# 全局区 有一个工作子过程,个别设置为 CPU 数 * 核数
worker_processes 1;
events {
# 个别是配置 nginx 过程与连贯的个性
# 如 1 个 word 能同时容许多少连贯,一个子过程最大容许连贯 1024 个连贯
worker_connections 1024;
}
# 配置 HTTP 服务器配置段
http {
# 配置虚拟主机段
server {
# 定位,把非凡的门路或文件再次定位。location {}}
server {...}
}
复制代码
咱们能够很显著的将 nginx.conf 配置文件分为三局部:
全局块: 从配置文件开始到 events 块之间的内容,次要会设置一些影响 nginx 服务器整体运行的配置指令,次要包含配置运行 Nginx 服务器的用户(组)、容许生成的 worker process 数,过程 PID 寄存门路、日志寄存门路和类型以及配置文件的引入等。
比方下面第一行配置的:
worker_processes 1;
复制代码
这是 Nginx 服务器并发解决服务的要害配置,worker_processes 值越大,能够反对的并发处理量也越多,然而会受到硬件、软件等设施的制约。
events 块:波及的指令次要影响 Nginx 服务器与用户的网络连接,罕用的设置包含是否开启对多 work process 下的网络连接进行序列化,是否容许同时接管多个网络连接,选取哪种事件驱动模型来解决连贯申请,每个 word process 能够同时反对的最大连接数等。
http 块: Nginx 服务器配置中最频繁的局部,代理、缓存和日志定义等绝大多数性能和第三方模块的配置都在这里。
- 反向代理
下面曾经解释过反向代理了,咱们当初来写一个。当我在公司配置反向代理的时候,我会在 http 中增加一个 server:
server {
listen 80;
server_name dev-customer.sdyxmall.com ;
gzip off;
gzip_buffers 4 16k;
gzip_comp_level 5;
gzip_http_version 1.0;
gzip_min_length 1k;
gzip_types text/plain text/css application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript image/x-icon image/bmp;
gzip_vary on;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
}
}
复制代码
而后 hosts 中配置:
10.3.100.13 dev-customer.sdyxmall.com
复制代码
接下来咱们梳理一下语法:
1 listen *:80 | *:8080 #监听所有 80 端口和 8080 端口
2 listen IP_address:port #监听指定的地址和端口号
3 listen IP_address #监听指定 ip 地址所有端口
4 listen port #监听该端口的所有 IP 连贯
复制代码
server_name 指令次要用于配置基于名称虚拟主机
gzip 的作用是是否须要开启压缩传输
location 指令用于匹配 URL
proxy_pass 指令用于设置被代理服务器的地址
proxy_set_header 用来设定被代理服务器接管到的 header 信息(申请头)
基本上咱们理解 server_name,location,proxy_pass 就能够配置反向代理
7.Nginx 治理虚拟主机
这部分我工作中没有接触过,然而查找材料的时候名字看起来很高大上,就特意钻研了一下。当咱们想在一台服务器虚构出多个网站,咱们就能够用虚拟主机来实现。
虚拟主机应用的是非凡的软硬件技术,它把一台运行在因特网上的服务器主机分成一台台“虚构”的主机,每台虚拟主机都能够是一个独立的网站,能够具备独立的域名,具备残缺的 Intemet 服务器性能(WWW、FTP、Email 等),同一台主机上的虚拟主机之间是齐全独立的。从网站访问者来看,每一台虚拟主机和一台独立的主机齐全一样。
7.1 基于域名的虚拟主机
1、在 http 大括号中增加如下代码段:
server {
#监听端口 80
listen 80;
#监听域名 feng.com;
server_name feng.com;
location / {
# 相对路径,绝对 nginx 根目录。也可写成绝对路径
root feng;
# 默认跳转到 index.html 页面
index index.html;
}
}
复制代码
2、切换装置目录:cd/usr/local/software/nginx
3、创立目录:mkdir feng
4、新建 index.html 文件:vi /usr/local/software/nginx/feng/index.html,文件内容:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h2> 枫 </h2>
</body>
</html>
复制代码
5、从新读取配置文件:
/usr/local/software/nginx/sbin/nginx-s reload
kill -HUP 过程号
6、配置 windows 本机 host:
192.168.197.142 feng.com #Linux 服务器 IP 地址
7、拜访:http://feng.com:80/
7.2 基于端口的虚拟主机配置
server {
listen 2022;
server_name feng.com;
location / {
root /home;
index index.html;
}
}
复制代码
7.3 基于 IP 地址虚拟主机配置
server {
listen 80;
server_name 192.168.197.142;
location / {
root ip;
index index.html;
}
}
复制代码
- 负载平衡
咱们应用 Nginx 听到的最多的就是负载平衡,那么什么是负载平衡呢?
负载平衡:因为目前现有网络的各个外围局部随着业务量的进步,访问量和数据流量的快速增长,其解决能力和计算强度也相应地增大,使得繁多的服务器设施根本无法承当。
针对此状况而衍生进去的一种便宜无效通明的办法以扩大现有网络设备和服务器的带宽、减少吞吐量、增强网络数据处理能力、进步网络的灵活性和可用性的技术就是负载平衡(Load Balance)。
Nginx 实现负载平衡有几种计划。
8.1 轮询
轮询即 Round Robin,依据 Nginx 配置文件中的程序,顺次把客户端的 Web 申请散发到不同的后端服务器。
upstream backserver {
server 192.168.0.14;
server 192.168.0.15;
}
复制代码
8.2 weight
基于权重的负载平衡即 Weighted Load Balancing,这种形式下,咱们能够配置 Nginx 把申请更多地散发到高配置的后端服务器上,把绝对较少的申请散发到低配服务器。
upstream backserver {
server 192.168.0.14 weight=3;
server 192.168.0.15 weight=7;
}
复制代码
权重越高,在被拜访的概率越大,如上例,别离是 30%,70%。
8.3 ip_hash
前述的两种负载平衡计划中,同一客户端间断的 Web 申请可能会被散发到不同的后端服务器进行解决,因而如果波及到会话 Session,那么会话会比较复杂。常见的是基于数据库的会话长久化。要克服下面的难题,能够应用基于 IP 地址哈希的负载平衡计划。这样的话,同一客户端间断的 Web 申请都会被散发到同一服务器进行解决。
upstream backserver {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}
复制代码
8.4 fair
按后端服务器的响应工夫来调配申请,响应工夫短的优先调配。
upstream backserver {
server server1;
server server2;
fair;
}
复制代码
8.5 url_hash
按拜访 url 的 hash 后果来调配申请,使每个 url 定向到同一个(对应的)后端服务器,后端服务器为缓存时比拟无效。
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
复制代码
在须要应用负载平衡的 server 中减少
proxy_pass http://backserver/;
upstream backserver{
ip_hash;
server 127.0.0.1:9090 down; (down 示意单前的 server 临时不参加负载)
server 127.0.0.1:8080 weight=2; (weight 默认为 1.weight 越大,负载的权重就越大)
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup; (其它所有的非 backup 机器 down 或者忙的时候,申请 backup 机器)
}
复制代码
max_fails:容许申请失败的次数默认为 1. 当超过最大次数时,返回 proxy_next_upstream 模块定义的谬误。
fail_timeout:max_fails 次失败后,暂停的工夫。
配置实例:
#user nobody;
worker_processes 4;
events {
# 最大并发数
worker_connections 1024;
}
http{
# 待选服务器列表
upstream myproject{
# ip_hash 指令,将同一用户引入同一服务器。ip_hash;
server 125.219.42.4 fail_timeout=60s;
server 172.31.2.183;
}
server{
# 监听端口
listen 80;
# 根目录下
location / {
# 抉择哪个服务器列表
proxy_pass http://myproject;
}
}
}
复制代码
8.6 深刻实际
下面写的都是负载平衡的计划,具体实现我看到知乎大佬写的很不错,而且看起来帅的腾飞。
- 总结
Nginx 真的很弱小,而且应用的越来越宽泛,尽管我目前在公司应用的不多,然而学到了 Nginx 很多常识,对我的项目的构建,优化,心里有了更多的想法。或者不肯定要理解的很深刻,满足咱们的日常须要就能够了,理解它,当咱们在做我的项目或者解决问题,可能作为咱们的一种解决方案,就很 Nice 了。
作者:彩色的枫