什么是Nginx

轻量级的Web服务器、反向代理服务器。

正向代理与反向代理

  • 正向代理

    由于防火墙的原因,我们不能直接访问谷歌,可以借助VPN来实现,这是简单的正向代理的例子。
    正向代理“代理”的是客户端,而且客户端是知道目标的,但是目标不知道客户端是通过VPN访问的。

  • 反向代理

    当我们在外网访问百度的时候,其实会进行一个转发,代理到内网去,这就是所谓的反向代理,即反向代理“代理”的是服务器端,而且这一个过程对于客户端而言是透明的。

Nginx的Master-Worker模式


启动Nginx后,其实就是在80端口启动了Socket服务进行监听,如图所示,Nginx涉及Master进程和Worker进程。

Master进程

  • 读取并验证配置文件nginx.conf
  • 管理Worker进程

Worker进程

每一个Worker进程都维护一个线程(避免线程切换),处理连接和请求。Worker进程的个数由配置文件决定,一般和CPU个数有关(利于进程切换)。

Nginx如何做到热部署

Nginx如何做到高并发下的高效处理

Nginx采用了Linux的epoll模型,epoll模型基于事件驱动机制,可以监控多个事件是否准备完毕,如果OK,那么放入epoll队列中,这个过程是异步的。Worker进程只需要从epoll队列循环处理即可。

epoll模型是什么

Nginx挂了怎么办

Keepalived+Nginx实现高可用。
Keepalived是一个高可用解决方案,主要是用来防止服务器单点发生故障,可以通过和Nginx配合来实现Web服务的高可用。(其实,Keepalived不仅仅可以和Nginx配合,还可以和很多其他服务配合)
Keepalived+Nginx实现高可用的思路:

  1. 请求不要直接打到Nginx上,应该先通过Keepalived(这就是所谓虚拟IP,VIP)
  2. Keepalived应该能监控Nginx的生命状态(提供一个用户自定义的脚本,定期检查Nginx进程状态,进行权重变化,,从而实现Nginx故障切换)

nginx.conf

虚拟主机 server

反向代理 proxy_pass

在location这一段配置中的root替换成proxy_pass即可。root说明是静态资源,可以由Nginx进行返回;而proxy_pass说明是动态请求,需要进行转发,比如代理到Tomcat上。

反向代理的过程是透明的,比如说request -> Nginx -> Tomcat,那么对于Tomcat而言,请求的IP地址就是Nginx的地址,而非真实的request地址,这一点需要注意。不过好在Nginx不仅仅可以反向代理请求,还可以由用户自定义设置HTTP HEADER。

负载均衡 upstream

上面的反向代理中,我们通过proxy_pass来指定Tomcat的地址,很显然我们只能指定一台Tomcat地址,那么我们如果想指定多台来达到负载均衡呢?

  1. 通过upstream来定义一组Tomcat,并指定负载策略(IPHASH、加权论调、最少连接),健康检查策略(Nginx可以监控这一组Tomcat的状态)等。
  2. 将proxy_pass替换成upstream指定的值即可。

缓存

缓存,是Nginx提供的,可以加快访问速度的机制,说白了,在配置上就是一个开启,同时指定目录,让缓存可以存储到磁盘上。

  1. 定义缓存存储目录并指定共享内存空间
  2. 在location里指定共享内存空间
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
user www;
worker_processes auto;
events {
worker_connections 4096;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
gzip on;
keepalive_timeout 65;

# 以下是缓存相关配置
proxy_cache_path /data/nginx/cache2 levels=1:2 keys_zone=mycache:1024m max_size=2048m inactive=1d ;

server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location /apis/test/img {
proxy_pass http://192.168.1.2/;

# 以下三行是缓存相关配置
proxy_cache mycache;
proxy_cache_valid 200 1d;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_503 http_404;
}

error_page 500 502 503 504 /50x.html;
}
  • proxy_cache_path:定义缓存目录,需要手动创建此目录;缓存数据存放至此。
  • /data/nginx/cache2:自定义的缓存目录,缓存中的文件名称是应用MD5的结果;另外,首先是将缓存响应写入临时文件,然后文件才被重命名;
  • levels=1:2:定义缓存的层次结构级别;这里表示缓存目录的第一级目录是1个字符,第二级目录是2个字符;
  • keys_zone=mycache:1024m:内核中建立的用于缓存数据原数据的共享内存空间;这里存放缓存数据的原数据;查找缓存的时候,先从这个内核空间中找到,缓存数据的原数据,然后再到对应目录中查找缓存;我这里定义的zone名称为‘mycache’;
  • max_size=2048m:设置缓存空间的最大值;
  • inactive=1d: 设置缓存的数据保留时间,这里自定义1天内没有被访问过就删除;
  • proxy_cache:在location里设置内存缓存源数据空间名字,对应我们前面的设定’mycache’;
  • proxy_cache_valid: 可以为不同的响应状态码设置不同的缓存时间,比如这里200状态码,设置为1天;
  • proxy_cache_use_stale:指定后端服务器出现状况时,nginx可以使用的过期缓存
  • 另外可以设置proxy_cache_key:用来指定缓存所使用的key的组合字符串,然后用md5进行加密。如不指定默认使用:$scheme$proxy_host$request_uri;