nginx 配置实战
本章节将结合理论与实战,如果迫切需要实战的话,可以跳过前面的部分,直接从1.2.3基于域名的虚拟主机开始阅读。如果过程有不懂的地方,请参考本文参考链接。
1. 虚拟主机配置
1.1 虚拟主机定义
虚拟主机是指在网络服务器上分出一定的磁盘空间,用户可以租用此部分空间,以供用户放置站点及应用组件,提供必要的数据存放和传输功能。
1.2 nginx虚拟主机配置
nginx的虚拟主机就是通过nginx.conf中server节点指定的,想要设置多个虚拟主机,配置多个server节点即可。有三类虚拟主机的设置方法,分别是基于域名的虚拟主机、基于IP的虚拟主机和基于端口的虚拟主机。
1.2.1 分析nginx配置文件
# 配置虚拟主机段
server {
#监听端口 80
listen 80;
#监听域名
server_name localhost;
# 定位,把特殊的路径或文件再次定位。
location / {
# 相对路径,相对nginx根目录。以/开头就是绝对路径。
root html;
# 默认跳转到index.html页面
index index.html index.htm;
}
}
这里的意思是:定义了一个server对外提供服务,它监听的端口是80,名称是localhost。当我们访问http://localhost:80 的时候,就可以匹配到这个server下的”/”location节点。这个nginx 就会去root 路径下寻找index文件。
1.2.2 虚拟主机名
虚拟主机名使用server_name指令定义,用于决定由某台虚拟主机来处理请求。具体请参考《nginx如何处理一个请求》。虚拟主机名可以使用确切的名字,通配符,或者是正则表达式来定义:
server {
listen 80;
server_name example.org www.example.org;
...
}
server {
listen 80;
server_name *.example.org;
...
}
server {
listen 80;
server_name mail.*;
...
}
server {
listen 80;
server_name ~^(?<user>.+)\.example\.net$;
...
}
nginx以名字查找虚拟主机时,如果名字可以匹配多于一个主机名定义,比如同时匹配了通配符的名字和正则表达式的名字,那么nginx按照下面的优先级别进行查找,并选中第一个匹配的虚拟主机:
- 确切的名字;
- 最长的以星号起始的通配符名字:*.example.org;
- 最长的以星号结束的通配符名字:mail.*;
- 第一个匹配的正则表达式名字(按在配置文件中出现的顺序)。
通配符名字
通配符名字只可以在名字的起始处或结尾处包含一个星号,并且星号与其他字符之间用点分隔。所以,“www..example.org”和“w.example.org”都是非法的。不过,上面的两个名字可以使用正则表达式描述,即“~^www..+.example.org ”和“ w.∗\.example\.org ”。星号可以匹配名字的多个节(各节都是以点号分隔的)。“*.example.org”不仅匹配www.example.org,也匹配www.sub.example.org。
有一种形如“.example.org”的特殊通配符,它可以既匹配确切的名字“example.org”,又可以匹配一般的通配符名字“*.example.org”。
正则表达式名字
nginx使用的正则表达式兼容PCRE。为了使用正则表达式,虚拟主机名必须以波浪线“~”起始:
server_name ~^www\d+\.example\.net$;
否则该名字会被认为是个确切的名字,如果表达式含星号,则会被认为是个通配符名字(而且很可能是一个非法的通配符名字)。不要忘记设置“^”和“$”锚点,语法上它们不是必须的,但是逻辑上是的。同时需要注意的是,域名中的点“.”需要用反斜线“\”转义。含有“{”和“}”的正则表达式需要被引用,如:
server_name "~^(?<name>\w\d{1,3}+)\.example\.net$";
否则nginx就不能启动,错误提示是:
directive "server_name" is not terminated by ";" in ...
命名的正则表达式捕获组在后面可以作为变量使用:
server {
server_name ~^(www\.)?(?<domain>.+)$;
location / {
root /sites/$domain;
}
}
PCRE使用下面语法支持命名捕获组:
- ? 从PCRE-7.0开始支持,兼容Perl 5.10语法
- ?’name’ 从PCRE-7.0开始支持,兼容Perl 5.10语法
- ?P 从PCRE-4.0开始支持,兼容Python语法
如果nginx不能启动,并显示错误信息:
pcre_compile() failed: unrecognized character after (?< in ...
说明PCRE版本太旧,应该尝试使用?P。捕获组也可以以数字方式引用:
server {
server_name ~^(www\.)?(.+)$;
location / {
root /sites/$2;
}
}
不过,这种用法只限于简单的情况(比如上面的例子),因为数字引用很容易被覆盖。
其他类型的名字
有一些主机名会被特别对待。
如果需要用一个非默认的虚拟主机处理请求头中不含“Host”字段的请求,需要指定一个空名字:
server {
listen 80;
server_name example.org www.example.org "";
...
}
如果server块中没有定义server_name,nginx使用空名字作为虚拟主机名。
nginx 0.8.48版本以下(含)在同样的情况下会使用机器名作为虚拟主机名。
如果以“$hostname”(nginx 0.9.4及以上版本)定义虚拟主机名,机器名将被使用。
如果使用IP地址而不是主机名来请求服务器,那么请求头的“Host”字段包含的将是IP地址。可以将IP地址作为虚拟主机名来处理这种请求:
server {
listen 80;
server_name nginx.org
www.nginx.org
""
192.168.1.1
;
...
}
在匹配所有的服务器的例子中,可以见到一个奇怪的名字“_”:
server {
listen 80 default_server;
server_name _;
return 444;
}
这没什么特别的,它只不过是成千上万的与真实的名字绝无冲突的非法域名中的一个而已。当然,也可以使用“–”和“!@#”等等。
nginx直到0.6.25版本还支持一个特殊的名字“”,这个名字一直被错误地理解成是一个匹配所有的名字。但它从来没有像匹配所有的名字,或者通配符那样工作过,而是用来支持一种功能,此功能现在已经改由server_name_in_redirect指令提供支持了。所以,现在这个特殊的名字“”已经过时了,应该使用server_name_in_redirect指令取代它。需要注意的是,使用server_name指令无法描述匹配所有的名字或者默认服务器。这是listen指令的属性,而不是server_name指令的属性。具体请参考《nginx如何处理一个请求》。可以定义两个服务器都监听:80和:8080端口,然后指定一个作为端口:8080的默认服务器,另一个作为端口:80的默认服务器:
server {
listen 80;
listen 8080 default_server;
server_name example.net;
...
}
server {
listen 80 default_server;
listen 8080;
server_name example.org;
...
}
优化建议
(1)尽可能使用确切的名字。
确切名字和通配符名字存储在哈希表中。nginx首先搜索确切名字的哈希表,如果没有找到,搜索以星号起始的通配符名字的哈希表,如果还是没有找到,继续搜索以星号结束的通配符名字的哈希表。正则表达式是一个一个串行的测试,所以是最慢的,而且不可扩展。
如果定义了大量名字,或者定义了非常长的名字,那可能需要在http配置块中使用server_names_hash_max_size和server_names_hash_bucket_size指令进行调整。
如果只为一个监听端口配置了唯一的主机,那么nginx就完全不会测试虚拟主机名了(也不会为监听端口建立哈希表)。不过,有一个例外,如果定义的虚拟主机名是一个含有捕获组的正则表达式,这时nginx就不得不执行这个表达式以得到捕获组。
(2)防止处理未定义主机名的请求
如果不允许请求中缺少“Host”头,可以定义如下主机,丢弃这些请求:
server {
listen 80;
server_name "";
return 444;
}
在这里,我们设置主机名为空字符串以匹配未定义“Host”头的请求,而且返回了一个nginx特有的,非http标准的返回码444,它可以用来关闭连接。
1.2.3 基于域名的虚拟主机
Nginx首先选定由哪一个虚拟主机来处理请求。跟着我的步伐,创建第一个虚拟主机
步骤1 修改nginx.conf文件
server {
listen 80 default_server;
server_name www.test.com;
location / {
index index.html;
root /home/www/test/;
}
}
在这个配置中,nginx仅仅检查请求的“Host”头以决定该请求应由哪个虚拟主机来处理。如果Host头没有匹配任意一个虚拟主机,或者请求中根本没有包含Host头,那nginx会将请求分发到定义在此端口上的默认虚拟主机。在以上配置中,第一个被列出的虚拟主机即nginx的默认虚拟主机——这是nginx的默认行为。而且,可以显式地设置某个主机为默认虚拟主机,即在”listen”指令中设置”default_server”参数。
步骤2 创建root目录
创建root 指定的文件夹。这里是/home/www/test/
步骤3 新建index文件
创建index 指定的文件。这里是/home/www/test/index.html文件
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h2>HTML别写太复杂,这样就可以了</h2>
</body>
</html>
步骤4 重启nginx
service nginx restart
步骤5 访问
http://www.test.com:80
也就是说,用户访问www.test.com时,就由这个虚机主机进行处理。root 可以配置相对地址和绝对地址,此时是绝对地址。
注意:下文实例也使用这5个步骤
其实上面的例子就是基于域名的虚拟机。
这里还有另一个例子:
http {
#忽略这些
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#第1个server
server {
listen 80;
server_name blog.test.com;
location / {
index index.html;
root /home/www/test/blog/;
}
}
#第2个server
server {
listen 80;
server_name bbs.test.com;
location / {
index index.html;
root /home/www/test/bbs/;
}
}
#第3个server
server {
listen 80;
server_name bbs.learn.com;
location / {
index index.html;
root /home/www/learn/bbs/;
}
}
}
例子中有三个虚拟主机。第一个server,只要我们访问blog.test.com的时候,就会访问到/home/www/test/blog/index.html文件,其它两个server以此类推。
注意>如果你的nginx 是搭建VMware上的系统(centos等)上,那如果希望你的宿主电脑可以访问VM中的nginx 虚拟机,必须配置HOSTS文件。host文件中的格式是:
IP地址 域名;
1. windows 修改host。
(1)打开:C:\Windows\System32\drivers\etc\hosts。
(2)添加:192.168.110.180 blog.test.com;192.168.110.180 bbs.test.com;192.168.110.180 bbs.learn.com;
(3)完成。192.168.110.180是我VM的服务器IP地址。这样做母的是让我的宿主主机可以打开浏览器访问blog.test.com。
2. centos 修改host。与模仿上面。
(1)vi /etc/hosts
(2)添加:127.0.0.1 blog.test.com等
(3)/etc/rc.d/init.d/network restart
(4)完成。
1.2.4 基于IP的虚拟主机
http {
#忽略
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name 192.168.110.201;
location / {
index index.html;
root /home/www/201/;
}
}
server {
listen 80;
server_name 192.168.110.202 192.168.110.203;
location / {
index index.html;
root /home/www/202/;
}
}
}
快尝试以上例子,用IP访问吧。例如curl 192.168.110.201
1.2.5 基于端口的虚拟主机
http {
#忽略
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8081;
server_name localhost;
location / {
index index.html;
root /home/www/8081/;
}
}
server {
listen 8082;
server_name localhost;
location / {
index index.html;
root /home/www/8082/;
}
}
}
快尝试以上例子,改用不同端口访问吧。例如curl localhost:8081
2. 访问限制
2.1 基于客户端IP地址的访问控制
模块 ngx_http_access_module 允许限制某些IP地址的客户端访问。
也可以通过密码来限制访问。 使用 satisfy 指令就能同时通过IP地址和密码来限制访问。
2.1.1 配置范例
(1)
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}
规则按照顺序依次检测,直到匹配到第一条规则。
在上面这个例子里,IPv4的网络中只有 10.1.1.0/16 和 192.168.1.0/24允许访问,但 192.168.1.1除外, 对于IPv6的网络,只有2001:0db8::/32允许访问。 在规则很多的情况下,使用 ngx_http_geo_module 模块变量更合适。
(2)
如果要禁止使用IP访问网站
样例:
server {
listen 80;
server_name "";
return 444;
}
2.1.2 指令解析
语法: allow address | CIDR | all;
默认值: —
上下文: http, server, location, limit_except
允许指定的网络地址访问。
语法: deny address | CIDR | all;
默认值: —
上下文: http, server, location, limit_except
2.2 HTTP基本认证机制的访问控制
模块ngx_http_auth_basic_module 允许使用“HTTP基本认证”协议验证用户名和密码来限制对资源的访问。
也可以通过地址来限制访问。 使用satisfy 指令就能同时通过地址和密码来限制访问。
也就是说,当你要打开被限制的地址,需要验证账号和密码方可。
配置范例
location / {
auth_basic "closed site";
auth_basic_user_file conf/htpasswd;
}
指令解析
语法: auth_basic string | off;
默认值:
auth_basic off;
上下文: http, server, location, limit_except
开启使用“HTTP基本认证”协议的用户名密码验证。 指定的参数被用作 域。 参数off可以取消继承自上一个配置等级 auth_basic 指令的影响。
语法: auth_basic_user_file file;
默认值: —
上下文: http, server, location, limit_except
指定保存用户名和密码的文件,格式如下:
# comment
name1:password1
name2:password2:comment
name3:password3
密码应该使用crypt()函数加密。 可以用Apache发行包中的htpasswd命令来创建此类文件。
如果自己没有尝试过,那就根据步骤指引:(1)安装httpd,使用命令htpasswd才创建文件和密码。(2)配置nginx.conf,重启。(3)访问路径,测试,完成。
3. 状态监控
3.1 nginx访问状态监控
该模块太简洁了,不推荐。
(1)nginx.conf配置
location /basic_status {
stub_status on;
}
(2)URL访问路径
server_name/basic_status
例如:访问localhost:8081/basic_status,就可以看到nginx访问状态监控
3.2 tengine的状态监控
这里演示一个健康检查模块功能。
(1)配置一个status的location
location /status {
check_status;
}
(2)配置upstream
在upstream配置如下
check interval=3000 rise=2 fall=5 timeout=1000 type=http;
check_http_send "HEAD / HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
(3)实例
upstream backend {
dynamic_resolve fallback=stale fail_timeout=30s;
server 192.168.110.201;
server 192.168.110.202;
check interval=3000 rise=2 fall=5 timeout=1000 type=http;
check_http_send "HEAD / HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
server {
...
location / {
index index.html;
root /home/www/html/;
}
location /status {
check_status;
}
}
4. 反向代理与负载均衡
定义
代理其实就是一个中介。有正向代理和反向代理。
正向代理,架设在客户机与目标主机之间,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。
反向代理服务器架设在服务器端,通过缓冲经常被请求的页面来缓解服务器的工作量,将客户机请求转发给内部网络上的目标服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器与目标主机一起对外表现为一个服务器。
区别
正向代理代理的对象是客户端,反向代理代理的对象是服务端。
正向代理隐藏真实客户端,反向代理隐藏真实服务端。
正向代理服务于特定用户(比如说一个公司内 / 一个局域网内的客户)以访问非特定的服务;反向代理服务于非特定用户(对于公开互联网服务而言,通常是所有用户)以访问特定的服务。
其实这三条都是同样的意思,罗列出来是希望读者能明白其中一条就可以了。
反向代理主要应用
反向代理在服务器机房这一端,替服务器收发请求,也就是说请求和响应都先经过反向代理。除了可以防止外网对内网服务器的恶性攻击、缓存以减少服务器的压力和访问安全控制之外,还可以进行负载均衡,将用户请求分配给多个服务器。
方向代理实现简单负载均衡实例
配置例子
配置反向代理和upstream
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3;
server backup1.example.com:8080 backup;
server backup2.example.com:8080 backup;
}
server {
location / {
proxy_pass http://backend;
}
}
实例
首先有两台服务器分别配置并启动tomcat,修改tomcat首页为tomcat1和tomcat2。还要有一台服务器有nginx。地址信息:
nginx 192.168.110.180:80
tomcat1 192.168.110.201:8080
tomcat2 192.168.110.202:8080
(0)安装配置nginx和tomcat服务器
(1)nginx 配置文件修改:
upstream abc {
server 192.168.110.201:8080 weight=1;
server 192.168.110.202:8080 weight=2;
}
server {
location / {
proxy_pass http://abc;
}
}
重启nginx tomcat
(2)
访问http://abc,
刷新几次,发现显示的页面会切换在tomcat1和tomcat2之间。
完成。
指令解析
(1)upstream指令
定义一组服务器。 这些服务器可以监听不同的端口。而且,监听在TCP和UNIX域套接字的服务器可以混用。
例子:
upstream backend {
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
}
默认情况下,nginx按加权轮转的方式将请求分发到各服务器。 在上面的例子中,每7个请求会通过以下方式分发: 5个请求分到backend1.example.com, 一个请求分到第二个服务器,一个请求分到第三个服务器。 与服务器通信的时候,如果出现错误,请求会被传给下一个服务器,直到所有可用的服务器都被尝试过。 如果所有服务器都返回失败,客户端将会得到最后通信的那个服务器的(失败)响应结果。
(2)server指令
定义服务器的地址address和其他参数parameters。 地址可以是域名或者IP地址,端口是可选的,或者是指定“unix:”前缀的UNIX域套接字的路径。如果没有指定端口,就使用80端口。 如果一个域名解析到多个IP,本质上是定义了多个server。
可添加参数:
- weight=number 设定服务器的权重,默认是1。
- max_fails=number 设定Nginx与服务器通信的尝试失败的次数。
- fail_timeout=time 统计失败尝试次数的时间段。在这段时间中,服务器失败次数达到指定的尝试次数,服务器就被认为不可用。默认情况下,该超时时间是10秒。
- backup 标记为备用服务器。当主服务器不可用以后,请求会被传给这些服务器。
- down 标记服务器永久不可用,可以跟ip_hash指令一起使用。
例子:
upstream backend {
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
server backup1.example.com:8080 backup;
}
(3)ip_hash指令
指定服务器组的负载均衡方法,请求基于客户端的IP地址在服务器间进行分发。指定服务器组的负载均衡方法,请求基于客户端的IP地址在服务器间进行分发。 IPv4地址的前三个字节或者IPv6的整个地址,会被用来作为一个散列key。 这种方法可以确保从同一个客户端过来的请求,会被传给同一台服务器。除了当服务器被认为不可用的时候,这些客户端的请求会被传给其他服务器,而且很有可能也是同一台服务器。
如果其中一个服务器想暂时移除,应该加上down参数。这样可以保留当前客户端IP地址散列分布。
例子:
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com down;
server backend4.example.com;
}
(3)keepalive指令
语法: keepalive connections;
默认值: —
上下文: upstream
激活对上游服务器的连接进行缓存。
connections参数设置每个worker进程与后端服务器保持连接的最大数量。这些保持的连接会被放入缓存。 如果连接数大于这个值时,最久未使用的连接会被关闭。
配置memcached上游服务器连接keepalive的例子:
upstream memcached_backend {
server 127.0.0.1:11211;
server 10.0.0.2:11211;
keepalive 32;
}
server {
...
location /memcached/ {
set $memcached_key $uri;
memcached_pass memcached_backend;
}
}
6. seesion一致性
问题需求
当用户发送请求的时候,经过nginx服务器,nginx使用负载均衡把请求分发到不同的机器tomcat1或者tomcat2里,这个时候会话id 在客户端是没有问题的,但是如果用户的两次请求到了两台不同的机器,而它的session数据可能存在其中一台机器,这个时候就会出现取不到session数据的情况。
而如果我们可以保证tomcat1 和tomcat2 使用的session 是一致的,那问题也就解决了。
保证session一致性的架构设计常见方法:
- session同步法:多台web-server相互同步数据
- 客户端存储法:一个用户只存储自己的数据
- 反向代理hash一致性:四层hash和七层hash都可以做,保证一个用户的请求落在一台web-server上
- 后端统一存储:web-server重启和扩容,session也不会丢失。
这里我们分别在后端以memcached和redis来保存session的例子展开。
6.1 利用memcached配置session一致性
1.安装memcached缓存数据库
[root@node1 ~]# yum install memcached
[root@node1 ~]# yum -y install telnet
[root@node1 ~]# service memcached start
memcached默认端口是11211,通过telnet测试memcached数据库:
[root@node1 ~]telnet localhost 11211
Set abc 0 0 5
12345
get abc
quit
2.tomcat配置名称和session一致性配置
(1)将jar包上传到tomcat的lib包中
asm-3.2.jar
kryo-1.04.jar
kryo-serializers-0.11.jar
memcached-session-manager-1.7.0.jar
memcached-session-manager-tc7-1.8.1.jar
minlog-1.2.jar
msm-kryo-serializer-1.7.0.jar
reflectasm-1.01.jar
spymemcached-2.7.3.jar
(2)修改tomcat配置文件server.xml
打开server.xml。属性jvmRoute可用区分该tomcat的身份。所以在tomcat的server.xml中配置jvmRoute=”名字”,用来区分tomcat1和tomcat2。
例如
原来是:<Engine name="Catalina" defaultHost="localhost" >
修改为:<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
(3)修改tomcat配置文件context.xml
在context.xml的Context配置Manager:
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.110.180:11211"
sticky="false"
lockingMode="auto"
sessionBackupAsync="false"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
sessionBackupTimeout="1000" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
(4)配置nginx负载均衡
编辑nginx.conf文件
[root@node1 conf]# vi nginx.conf
upstream sparsematrix {
server 192.168.110.201:8080 weight=1;
server 192.168.110.202:8080 weight=1;
}
server {
listen 80;
server_name localhost 192.168.110.180;
location / {
proxy_pass http://sparsematrix;
}
(5)重启nginx tomcat 服务。
3.测试
访问192.168.110.180,刷新几次,发现页面在tomcat1和tomcat2中切换。成功。
6.2 利用redis实现session共享
1.安装redis缓存数据库
[root@node1 conf]# yum –y install redis
2.修改配置文件redis.conf
安装redis缓存数据库,修改配置文件vi /etc/redis.conf
将bind的127.0.0.1修改为本机地址
3.导包
将jar包上传到tomcat的lib包中:
commons-pool2-2.4.2.jar
jedis-2.8.0.jar
tomcat-redis-session-manager1.2.jar
4.修改tomcat content.xml
在tomcat**添加**配置
总结
nginx 知识挺多的,也不难上手。一次性编写这么多问题,还是比较累。所以没来得及画图,这里的图来源于网络,如有版权问题,私信我立即删除,各位作者多多包涵呀。
以后有空的话再补上高可用性、缓存、ssl、日志等知识点。
如果想要学习其中的知识。我认为必须要看的资料是:
其中Admin’s Guide 确实入门nginx 的不二之选。建议大家一遍看着Admin’s Guide文档,再对对tenginx项目。不会英文?网页翻译呀!
参考附录
虚拟主机
http://www.cnblogs.com/jun1019/p/6260674.html
http://blog.csdn.net/u012486840/article/details/52786884
http://blog.csdn.net/yuan_xw/article/details/51254674
虚拟主机名http://tengine.taobao.org/nginx_docs/cn/docs/http/server_names.html
nginx如何处理一个请求http://tengine.taobao.org/nginx_docs/cn/docs/http/request_processing.html
访问限制
htpasswd命令http://man.linuxde.net/htpasswd
反向代理和负载均衡
使用缓存加速反向代理http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_proxy_module.html
简单负载均衡以及容错http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_upstream_module.html#upstream
反向代理为何叫反向代理?https://www.zhihu.com/question/24723688
nginx反向代理原理和配置讲解http://www.cnblogs.com/anruy/p/4989161.html
使用Nginx实现反向代理http://blog.csdn.net/lishaojun0115/article/details/53200629
Nginx+Tomcat搭建高性能负载均衡集群http://blog.csdn.net/wang379275614/article/details/47778201
nginx反向代理配置及优化http://liuyu.blog.51cto.com/183345/166381/
session一致性
Nginx的session一致性问题http://blog.csdn.net/qq_25371579/article/details/50786749
集群session一致性和同步问题 http://blog.csdn.net/kk936321732/article/details/45484121
日志管理
http://blog.csdn.net/yuan_xw/article/details/51278623
Host
centos7 host修改http://www.cnblogs.com/hujichen/p/5414785.html
hosts.allow和hosts.deny文件http://www.cnblogs.com/hujichen/p/5373171.html