nginx反向代理配置和工作原理

nginx反向代理配置和工作原理

nginx是一款面向性能设计的http服务器,其性能相对于其他服务器表现优异。内部使用异步的事件处理模型,比如linux平台的epoll事件模型,unix平台的kqueue事件模型等。在Nginx源码的src/event/modules目录下,其对各个平台不同的异步模型进行了二次封装。此外,Nginx在代码实现的时候,会考虑到众多细节优化。比如:根据CPU亲缘性来分配进程和事件,避免CPU级的缓存失效;比如字符串比较时,四字节转换为整数来进行快速指令级比较,等等。

nginx反向代理配置说明

反向代理指以代理服务器来接受internet上的连接请求,它是一种通过在繁忙的web服务器和外部网络之间增加的一个高速web缓冲服务器,用来降低实际的web服务器的负载的一种技术。反向代理是针对web服务提高加速功能,所有外部网络要访问服务器时所有请求都要通过它,这样反向代理服务器负责接收客户端的请求,然后到源服务器上获取内容,把内容返回给用户,已减少后端web服务器的压力,提高响应速度。因此nginx还具有缓存功能。

nginx反向代理的设置:

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
upstream cc_001 {
server 192.168.1.101:80;
server 192.168.1.102:80;

healthcheck_enabled;
healthcheck_delay 3000;
healthcheck_timeout 1000;
healthcheck_failcount 2;
healthcheck_send 'GET /healthcheck.html HTTP/1.0' 'Host: local.com' 'Connection: close';
}

server {

listen 192.168.1.100:80;
server_name cc.local.com;

proxy_buffers 64 4k;

location = / {
proxy_pass http://cc_001/bm/index.htm;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

location / {
proxy_pass http://cc_001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

upstream配置块

其中upstream是一个非常重要的配置。nginx所有对于动态请求的处理,基本上都需要用upstream配置模块。nginx的两个重要功能,反向代理和负载均衡,都需要通过配置对应的upstream来完成。

在nginx中,有一个基础模块叫handler,这个模块可以接受来自客户端/用户端的请求,然后处理并产生对应的响应内容返回过去。因此,我们那些静态资源,前端页面什么的,都是使用handler模块来完成响应的。但是,众所知周,一般的核心服务都是后台动态产生的,这些资源就不可以方便使用handler去完成内容的生成和响应动作(当然也是可以使用开发自定义handler来完成的,比如各种xxxcgi之流,但是一般还是用来处理静态资源)。

那么,upstream就出现了。其接收到用户的请求,然后转发到后端服务器拿到对应的响应资源,再返回给请求端。在整个处理过程中,其本身不会产生自己的响应内容,这是和handler模块唯一的区别。

upstream的特性,决定了在其配置块中,设置一些后端服务器的地址和端口,就ok了。

配置项说明:

upstream中的server项:表明后台的一台服务器和端口。当客户端有请求到nginx服务器的时候,upstream模块根据这里配置的server,该对应的请求转发到这些server服务上,由这些server来处理请求,然后把响应结果告知upstream模块。

healthcheck_enabled项:healthcheck健康监控功能,并不是原生nginx自带的。所以如果使用这个功能,必须要安装第三方插件:ngx_http_healthcheck_module。healthcheck_enabled表示启动健康检查模块功能。

healthcheck_delay项:对同一台后端服务器两次检测之间的时间间隔,单位毫秒,默认为1000。

healthcheck_timeout项:进行一次健康检测的超时时间,单位为毫秒,默认值2000。

healthcheck_failcount项:对一台后端服务器检测成功或失败多少次之后方才确定其为成功或失败,并实现启用或禁用此服务器。

healthcheck_send项:为了检测后端服务器的健康状态所发送的检测请求。然后根据各个服务器的响应情况来判断服务器是否存活。上面的配置表面,各个后台服务器上都存在healthcheck.html静态页面,然后nginx会get这个页面,根据是否status为200来判断是否服务器存活。

server配置块

在nginx中,不管怎么样的配置,都会有一个server配置块。http服务上支持若干虚拟主机。每个虚拟主机会有一个对应的server配置项,配置项里面包含该虚拟主机相关的配置。在提供mail服务的代理时,也可以建立若干server.每个server通过监听的地址来区分。

Server其实就是一个虚拟主机。因为在nginx中可以配置多个server,这样就使得nginx可以在一台服务器上配置多个域名

在nginx的Server虚拟主机中,它只会处理与之对应的域名请求。并且,如果在listen中设置了ip地址,则该虚拟主机只会处理从该服务器的指定ip端口进来的请求,才会去处理。

配置项说明:

listen项:监听ip和端口。当nginx服务器的该ip端口有请求访问,则调用该server的配置来处理该请求。

server_name:域名。nginx对进入该虚拟主机的请求,检查其请求host头是否匹配设置的server_name,如果是,则继续处理该请求。

location块选项:location在nginx中是一个非常重要的指令。对于http请求,其被用来详细匹配uri和设置的location path。一般这个uri path会是字符串或者正则表达式形式。

1
2
3
4
5
6
7
location匹配,语法规则:
location [=|~|~*|^~|@] /uri/ { ... }
=:表示精确匹配,如果找到,立即停止搜索并立即处理此请求。
~:表示区分大小写匹配。
~*:表示不区分大小写匹配。
^~:表示只匹配字符串不查询正则表达式。
@:指定一个命名的location,一般只用于内部重定向请求。

location中proxy_pass项:代理转发。配置了该项,当匹配location path请求进来后,会根据upstream设置,请求后台服务器上的proxy_pass的请求。例如,上面的配置,当有请求cc.local.com时,由于精确匹配=/,则根据proxy_pass配置,则会反向代理,请求192.168.1.101:80/bm/index.htm.

location中的proxy_set_header项:设置代理请求头。由于经过了反向代理服务器,所以后台服务器不能获取真正的客户端请求地址信息,这样,就需要把这些ip地址,设置回请求头部中。然后,我们在后台服务上,可以使用request.get(“X-Real-IP”)或者request.get(“X-Forwarded-For”)获取真实的请求ip地址。获取host也是如此。