1.反向代理
2.负载均衡
3.HTTP服务器(包含动静分离)
4.正向代理
简单来说就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已。
下面贴上一段简单的实现反向代理的代码
server {
listen 80;
server_name localhost;
client_max_body_size 1024M;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host:$server_port;
}
}
保存配置文件后启动Nginx,这样当我们访问localhost的时候,就相当于访问localhost:8080了。
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
简单配置
upstream test {
server localhost:8080;
server localhost:8081;
}
server {
listen 81;
server_name localhost;
client_max_body_size 1024M;
location / {
proxy_pass http://test;
proxy_set_header Host $host:$server_port;
}
}
负载均衡的核心代码为
upstream test {
server localhost:8080;
server localhost:8081;
}
这里我配置了2台服务器,当然实际上是一台,只是端口不一样而已,而8081的服务器是不存在的,也就是说访问不到,但是我们访问http://localhost 的时候,也不会有问题,会默认跳转到http://localhost:8080 具体是因为Nginx会自动判断服务器的状态,如果服务器处于不能访问(服务器挂了),就不会跳转到这台服务器,所以也避免了一台服务器挂了影响使用的情况,由于Nginx默认是RR策略,所以我们不需要其他更多的设置。
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
例如
upstream test {
server localhost:8080 weight=9;
server localhost:8081 weight=1;
}
那么10次一般只会有1次会访问到8081,而有9次会访问到8080。
上面的2种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用ip_hash了,ip_hash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream test {
ip_hash;
server localhost:8080;
server localhost:8081;
}
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backend {
fair;
server localhost:8080;
server localhost:8081;
}
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。
upstream backend {
hash $request_uri;
hash_method crc32;
server localhost:8080;
server localhost:8081;
}
以上5种负载均衡各自适用不同情况下使用,所以可以根据实际情况选择使用哪种策略模式,不过fair和url_hash需要安装第三方模块才能使用。
location [指令模式] url匹配模式 {
}
指令模式指用于匹配的方式,即精确匹配,前缀匹配还是正则匹配,当然这个是可选的,如果不写,则退化成正常匹配或者全匹配。url匹配模式则需要匹配的url,可以看成是web开发中的路由。下面就分别介绍指令模式和匹配模式。
=指令用于精确字符匹配(模式),不能使用正则,区分大小写。为了直观的观察匹配命中的location,使用rewrite指令,用于转发。目前只要理解命中了就重定向到rewrite后面的url即可。
location = /demo {
rewrite ^ http://google.com;
}
上述的配置表示只有访问 http://192.168.1.1/demo 这样的url,才能跳转到google的页面。除此之外的任何地址都无法访问,那怕是访问http://192.168.1.1/demo/这个地址也行。因为url匹配模式是/demo。
修改 location:
location = /demo$ {
rewrite ^ http://google.com;
}
熟悉正则的同学初看会以为/demo$表示demo结尾的url,其实不然,这里的$符号也是url的一部分,只有访问http://192.168.1.1/demo$这个地址才能跳转。
^~指令用于字符前缀匹配,和=精确匹配一样,也是用于字符确定的匹配,不能使用正则且区分大小写。和=不同的在于,^~指令下,访问的url无需url匹配模式一模一样,只需要其开头前缀和url匹配模式一样即可。
location ^~ /demo {
rewrite ^ http://google.com;
}
对于该模式(/demo),访问下列的地址都能匹配:
http://192.168.1.1/demo
http://192.168.1.1/demo/
http://192.168.1.1/demo/aaa
http://192.168.1.1/demo/aaa/bbb
http://192.168.1.1/demo/AAA
http://192.168.1.1/demoaaa
http://192.168.1.1/demo.aaa
只需要以/demo为前缀开头的url都能匹配。与该模式后的是否大小写无关。
^~不支持正则。模式/demo$中的$并不代表字符模式结束,而是一个是实实在在的$,只有访问/demo$开头的url才能匹配,http://192.168.1.1/demo则不再匹配。
模式/[0-9]emo也不代表正则中的http://192.168.1.1/0emo、http://192.168.1.1/5emo之类,只有访问以 /[0-9]emo开头url才行,例如http://192.168.1.1/[0-9]emo或http://192.168.1.1/[0-9]emo/aaa
前缀匹配通常用于匹配文件夹,如配置静态文件。
众所周知,nginx的url功能强大,配置灵活。字符匹配中,支持正则和不支持正则完全是两个境界。前面的两种方式都不能使用正则,未免让人觉得nginx有点虚夸。
实际上,nginx支持正则匹配。所使用的指令是~和~*,前者表示使用正则,区分大小写,后者表示使用正则,不区分大小写。与前缀匹配一样,正则匹配也是只需匹配以url模式开头的即可。
location ~ /[0-9]emo {
rewrite ^ http://google.com;
}
对于上述的模式,可以匹配的url如下:
http://192.168.1.1/5emo
http://192.168.1.1/9emo
http://192.168.1.1/5emo/aaa
http://192.168.1.1/5emo/AAA
http://192.168.1.1/5emoaaa
只要是以正则表达式/[0-9]emo匹配的字符开头的url,都能匹配。
使用~*则不区分大小写
location ~ /[0-9]EmO {
rewrite ^ http://google.com;
}
下面的都能匹配
http://192.168.1.1/5emo
http://192.168.1.1/9Emo
http://192.168.1.1/5emo/Aaa
http://192.168.1.1/5eMoEaaa
正常匹配的指令为空,即没有指定匹配指令的即为正常匹配。其形式类似 /XXX/YYY.ZZZ正常匹配中的url匹配模式可以使用正则,不区分大小写。
location /demo {
rewrite ^ http://google.com;
}
上述模式指的是匹配/demo的url,下面的都能匹配
http://192.168.1.1/demo
http://192.168.1.1/demo/
http://192.168.1.1/demo/aaa
http://192.168.1.1/demo/aaa/bbb
http://192.168.1.1/demo/AAA
http://192.168.1.1/demoaaa
http://192.168.1.1/demo.aaa
正常匹配和前缀匹配的差别在于优先级。前缀的优先级高于正常匹配
全匹配与正常匹配一样,没有匹配指令,匹配的url模式仅一个斜杠/
location / {
rewrite ^ http://google.com;
}
全匹配也可以配合 精确匹配和正则匹配一些指令,只不过这样的设定意义不大。通过都会有一个默认的location,这个就是全匹配。
命名匹配指的是使用@比绑定一个模式,类似变量替换的用法。
error_page 404 = @not_found
location @not_found {
rewrite http://google.com;
}
上述的作用是如果访问没有匹配的url会触发404指令,然后就匹配到@not_found 这个 location上。
精确匹配 > 前缀匹配 > 正则匹配 > 正常匹配 > 全匹配
正则匹配成功之后停止匹配,非正则匹配成功还会接着匹配。
在所有匹配成功的url中,选取匹配度最大的url字符地址。
Nginx是支持热启动的,也就是说当我们修改配置文件后,不用关闭Nginx,就可以实现让配置生效,当然我并不知道多少人知道这个,反正我一开始并不知道,导致经常杀死了Nginx线程再来启动。。。
Nginx从新读取配置的命令是
nginx -s reload
windows下面就是
nginx.exe -s reload
原文:https://www.cnblogs.com/redStarbulingbuling/p/10284081.html