概念

Nginx是一个高性能的反向代理服务

基本操作

  • 启动:sudo nginx -s start
  • 停止:sudo nginx -s stop 或./nginx -s stop
  • 重启:sudo nginx -s reload

配置说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
        user www-data; # 配置用户或组
worker_processes auto; # 设置允许生成的进程数
pid /run/nginx.pid; # 设置pid文件存放路径
include /etc/nginx/modules-enabled/*.conf; # 全局块

# events块
events {
worker_connections 768; # 设置最大连接数
# multi_accept on; # 设置一个进程能否接收多个网络连接
# accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
# use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
}

# http块,可以嵌套多个server块
http {

##
# Basic Settings
##

sendfile on; #允许sendfile方式传输文件
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65; #连接超时时间
types_hash_max_size 2048;
# server_tokens off;

# server_names_hash_bucket_size 64;
# server_name_in_redirect off;

include /etc/nginx/mime.types;
default_type application/octet-stream;

##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;

##
# Logging Settings
## 日志存放路径,分为用户访问日志和错误日志
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

##
# Gzip Settings
##


# 配置压缩信息,可以对静态资源进行压缩
gzip on;

# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

##
# Virtual Host Configs
## 引用存放在其他路径的配置文件,例如server

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}

http属性下有这样一行include /etc/nginx/sites-enabled/*,表示是引入了外部另一个配置文件,实际上我们也是这样做的,将相关的代理配置单独存放到另一个文件上,现在我们来看看这个文件中的内容是什么?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
      # server块  
server {
# 监听端口与地址
listen 80 default_server;
listen [::]:80 default_server;

root /var/www/html;

server_name _;
# 配置请求的路由
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}

try_files $uri $uri/ =404;
}

}

在该配置文件中,我们可以设置被代理的服务器,通过location路由匹配则转发到被代理服务器,例如如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
upstream tomcat {   
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #热备
}
error_page 404 https://www.baidu.com; #错误页
server {
keepalive_requests 120; #单连接请求上限次数。
listen 4545; #监听端口
server_name 127.0.0.1; #监听地址
location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
#root path; #根目录
#index vv.txt; #设置默认页
proxy_pass tomcat: #请求转向tomcat,即upstream定义的服务器
deny 127.0.0.1; #拒绝的ip
allow 172.18.5.54; #允许的ip
}
}

location配置语法

  • location=/uri 精确匹配
  • localhost^~/uri前缀匹配
  • location / 通用匹配

参考配置项

  • 1.$remote_addr 与 $http_x_forwarded_for 用以记录客户端的ip地址;
  • 2.$remote_user :用来记录客户端用户名称;
  • 3.$time_local : 用来记录访问时间与时区;
  • 4.$request : 用来记录请求的url与http协议;
  • 5.$status : 用来记录请求状态;成功是200;
  • 6.$body_bytes_s ent :记录发送给客户端文件主体内容大小;
  • 7.$http_referer :用来记录从那个页面链接访问过来的;
  • 8.$http_user_agent :记录客户端浏览器的相关信息;

第三方模块

安装方法:

./configure –prefix=/安装目录 –add-module = /第三方模块的目录

负载均衡

负载均衡的大致原理是利用一定的分配策略将网络负载平衡地分摊到网络集群的各个操作单元上,使得单个重负载任务能够分担到多个单元上并行处理,使得大量并发访问或数据流量分担到多个单元上分别处理,从而减少用户的等待响应时间

负载均衡器可以分为软件负载和硬件负载:

  • 软件负载:NGINX、LVS、HAProxy
  • 硬件负载:F5、

NGINX的负载均衡

负载均衡算法

  • 轮询
  • 加权轮询
  • IP hash:可以解决session不共享的问题

配置实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
upstream tomcat {   
server 192.168.11.161:8080 max_fails=2 fail_timeout=60s; # max_fails最大失败次数;fail_timeout超#时时间
server 192.168.11.159:8080;
}

server {  
listen 80;  
server_name localhost;  
location / {      
proxy_pass http://tomcat;      
proxy_set_header Host $host;    
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
proxy_next_upstream error timeout http_500 http_503;    
proxy_connect_timeout 60s;    
proxy_send_timeout 60s;    
proxy_read_timeout 60s;    
add_header 'Access-Control-Allow-Origin' '*';    
add_header 'Access-Control-Allow-Methods' 'GET,POST,DELETE';    
add_header 'Aceess-Control-Allow-Header' 'Content-Type,*';  
}  
location ~ .*\.(js|css|png|svg|ico|jpg)$ {  
# 防盗链设置
valid_referers none blocked 192.168.11.160 https://wubc.me;  
if ($invalid_referer) {  
return 404;    
}    
root static-resource;    
expires 1d;  
}
}

几个配置的说明:

  • proxy_next_upstream:向一台服务器转发请求出现错误,换一台来处理请求获取直接返回错误状态码
  • proxy_connect_timeout:连接超时时间
  • proxy_send_timeout:发送数据超时时间
  • proxy_read_timeout:读取数据超时时间

动静分离

意思是将服务器的静态文件资源直接存放到NGINX上,当客户端访问时直接返回静态资源,不用再一次转发请求到应用服务器上获取,以提高网站性能为目的

实例,参照前面实例:

1
2
3
4
5
location ~ .*\.(js|css|png|svg|ico|jpg)$ {       
root static-resource;    
expires 1d;  
}
}

缓存

将静态资源等设置缓存时间,并告诉游览器

实例:

1
2
3
4
5
location ~ .*\.(js|css|png|svg|ico|jpg)$ {       
root static-resource;    
expires 1d;  
}
}

压缩

压缩传输的文件,以提高网站响应速度,可以使用Gzip来进行压缩

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
http {    
include       mime.types;  
default_type application/octet-stream;    
sendfile       on;   
keepalive_timeout 60;      
##
# Gzip Settings
##    
gzip on;  
gzip_min_length 5k;
gzip_comp_level 3;  
gzip_types application/javascript image/jpeg image/svg+xml;
gzip_buffers 4 32k;  
gzip_vary on;
include /etc/nginx/sites-enabled/*;
  • gzip on:开启压缩
  • gzip_min_length:开始压缩的最小长度
  • gzip_comp_level,压缩级别
  • gzip_types:需要压缩的文件类型
  • gzip_buffers:申请的内存大小,后面跟两个数字,分别代表倍数和申请空间单元,实例表示的是申请4倍的32k内存空间
  • gzip_vary:是否传输gzip压缩标识

跨域

解决方法,可以通过location下的add_header来配置,例如:

1
add_header 'Access-Control-Allow-Origin' '*';

设置允许的访问IP为所有

处理一个请求的流程

  • nginx在启动时,会解析配置文件,得到需要监听的端口与ip地址

  • nginx的master进程里面,先初始化好这个监控的(创建socket–设置addrreuse等选项–绑定到指定的ip地址端口–在listen),然后再fork出多个子进程出来,然后子进程会竞争accept新的连接。

  • 此时,客户端就可以向nginx发起连接了。

  • 客户端向Nginx发起连接

  • 当客户端与nginx进行三次握手,与nginx建立好一个连接后,此时,某一个子进程会accept成功,得到这个建立好的socket,然后创建nginx对连接的封装,即ngx_connection_t结构体。

  • 设置读写事件处理并添加读写事件来与客户端进行数据的交互。

  • nginx或客户端来主动关掉连接

NGINX多进程模型

NGINX使用的是多进程模型,一个master进行下有多个worker进程,可以接受多个客户端连接,在全局块中可以使用worker_processes来设置worker进程数

高可用方案KeepAlived

Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障。一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候, 备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。Keepalived是VRRP的完美实现。作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。

参考:Keepalived 工作原理和配置说明

示例图:

keepalived.png
keepalived.png

Openresty

Nginx+Lua实现的高性能可伸缩的web平台

基本使用

待补充

库文件使用

openresty提供了丰富的模块,例如可以使用redis.lua操作Redis数据库

网关

对服务进行安全校验、流量控制、服务越来越多,那么服务本身不应该关心这些,而是将这些交由网关来处理,统一控制。

灰度发布