nginx详解
一、什么是正向代理和反向代理?
-
正向代理
-
反向代理
-
URI、URL和URN:
URI :Uniform Resource Identifier,统一资源标识符;
URL:Uniform Resource Locator,统一资源定位符;
URN:Uniform Resource Name,统一资源名称。
URL主要由三部分组成:第一部分是协议(或成为服务方式),第二部分是存有该资源的主机IP地址(有时也包括端口号),第三部分是主机资源的具体地址,如目录和文件夹名等。
URI和URL都定义了资源是什么,但URL是一种具体的URI,它不仅唯一标识资源,而且还提供了定位该资源的信息。URI 是一种语义上的抽象概念,可以是绝对的,也可以是相对的,而URL则必须提供足够的信息来定位,是绝对的。
二、nginx负载均衡策略
nginx服务器负载均衡策略可以划分为两大类:
1.内置策略
轮询:将每个前端请求按顺序(时间顺序或者排列顺序)逐一分配到不同的后端节点上,对于出现问题的后端节点自动排除;
加权轮询:在轮询的基础上加上weight,指定各后端节点被轮询到的几率;
IP_hash:将前端访问的IP进行hash操作,然后根据hash结果将请求分配给不同的后端节点上。注:同一IP经过hash的出来的值是一样的,即请求固定落在hash后选择的那台后端服务器上。
2.扩展策略
url_hash:对前端访问的url进行hash操作。(若后端服务器异常,不能自动排除该节点)
fair:将请求转发到一个最近负载最小的后台节点。如何判断负载最小?Nginx通过后端节点对请求的响应时间来判断负载的情况。响应时间短的节点负载相对较轻。
三、nginx基本配置详解
##### **1.nginx.conf**:
worker_processes 1;
error_log /usr/local/nginx/logs/nginx_error.log;
pid /usr/local/nginx/nginx.pid;
events{
worker_connections 1024;
}
http{
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream back{
server address weight=2 max_fails=5 fail_timeout=30s;
server address weight=1 max_fails=5 fail_timeout=30s;
ip_hash;
}
server{
listen 80;
server_name localhost;
location / {
index index.html index.php;
root /usr/local/nginx/html;
}
location ~ /api/1.0/ll/(.*) {
proxy_pass http://back; # 设置被代理服务器地址
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html{
root html;
}
}
}
2.upstream 中server指令语法如下:
server address [parameters] 注: 关键字server为必选项,address也为必选项,可以是主机名、域名、ip或 unix socket,也可以指定端口号; parameters是可选参数,可以是如下参数:
down:将server标记为宕机状态;
backup:将组内服务器标记为备用服务器,只有当正常的服务器处于宕机状态或则繁忙状态时,该服务器才会被用来处理客户端请求;
weight:表示server的负载权重,权重越大被请求的几率越大,默认为1;
fail_timeout:请求时间超过这个值时,认定其为请求失败,此时断开连接,默认值为10s;
max_fails:设置一个请求失败的次数,在一定范围时间内(即fail_timeout时间内),当对组内某台服务器请求失败的次数超过该变量设置的值时,认为该服务器无效,默认值是1(即默认情况下只要发生错误就认为server宕机了);
fail_timeout和max_fails通常联合使用:如果某台server在fail_timeout时间内出现了max_fails次连接失败,那么Nginx会认为该server已经宕机,从而在fail_timeout时间内不会再去请求这台server。
3.location用法:
location 模式 | 含义 |
---|---|
以 = 开头 | 表示精准匹配,如只匹配根目录结尾的请求,后面不能带任何字符串 |
以 ^~ 开头 | 表示uri以某个常规字符串开头,不是正则匹配 |
以 ~ 开头 | 表示区分大小写的正则匹配 |
以 ~* 开头 | 表示不区分大小写的正则匹配 |
以 / 开头 | 通用匹配, 如果没有其它匹配,任何请求都会匹配到 |
1)精准匹配 /,主机名后面不能带任何字符串
location = / {
[configuration A]
}
2)通用匹配,所有地址都以/开头,所以这条规则将会在最后匹配,即默认请求
location / {
[configuration B]
}
3)匹配以 /test/ 开头的地址,匹配符合以后,还要继续往下搜索。只有后面的正则表达式没有匹配到时,这一条才会采用(该普通匹配遵循最长匹配规则),即若uri为/test/mine/则会采用第二条的配置
location /test/ {
[configuration C]
}
location /test/mine/ {
#配置
}
4)匹配任何以/images/开头的地址,匹配符合以后,停止往下搜索正则
location ^~ /images/ {
[configuration D]
}
5)匹配所有以gif、jpg或jpeg结尾的请求。需要注意的是,若配置了4中的配置,则/images/下的图片都只会被配置D处理,因为^~不再往下搜索
location ~* \.(gif|jpg|jpeg)$ {
[configuration E]
}
6)各匹配顺序优先级如下
(location =) > (location 完整路径) > (location ^~ 路径)> (location ~,~*正则顺序) > (location 部分起始路径) > (/)
7)测试时的configuration推荐使用以下配置来测试,可以配置不同的rewrite网址来达到测试效果,如下所示。在浏览器中输入ip+端口号/test/即可测试匹配是否成功。
location /test/ {
rewrite ^ https://jeryliang.github.io/;
}
8)若使用location来实现访问静态文件的话,有以下需要注意的地方
例:该例子就是访问nginx默认的index.html
默认配置为:
location / {
index index.html;
root /usr/local/nginx/html;
}
修改后的配置:
location /html/ {
index index.html;
root /usr/local/nginx/;
}
以上两个配置都能实现访问nginx默认的index.html。这是为什么呢?修改后的配置通过请求ip:port/html/也可以访问,是因为匹配字符串html会和root指定路径进行拼接,实际的拼接后的路径为/usr/local/nginx/html。
而默认的其实也是拼接的,只不过匹配字符串为/,拼接后和原始/usr/local/nginx/html是一样的,所以访问到了index.html。
4.nginx中的rewrite实现域名跳转
在开始讲述rewrite功能前,需要搞清楚"地址重写"和"地址转发"两个概念。(注:rewrite功能依赖于PCRE库)
地址重写:其实也就是地址重定向,例:输入google.cn访问谷歌时,在被服务器重定向为www.google.com的过程就是地址重定向的过程,此时浏览器的地址会变为www.google.com;
地址转发:是指一个域名指指到另一个已有站点的过程。
这两者的主要区别如下:
地址转发后客户端浏览器地址栏中的地址是不会改变的,而地址重写后的客户端浏览器地址栏中的地址改变为服务器选择确定的地址;
在一次地址转发过程中,只产生一次网络请求,而地址重写一般会产生两次或两次以上的请求;
地址转发的速度比地址重定向快。
rewrite可以在server块或者location块中配置,以下为几个例子:
# 例1:域名跳转
server {
listen 80;
server_name liang.jerry.com;
rewrite ^/ http://www.jerry.info/;
}
# 例2:多域名跳转
server {
listen 80;
server_name liang.jerry.name liang.jerry.info;
index index.htm index.php;
root /usr/local/html;
if($host ~ jerry\.info){ # $host的值中是否包含(其中~对大小写敏感)jerry.info字符串,若 #包含则为真
rewrite ^(.*) http://liang.jerry.name/$1 permanent;
#^为匹配字符串的开始,(.*)匹配任意字符,permanent表示返回301永久重定向,地址栏会显示跳转后的地址;
}
}
# 例3:三级域名跳转
server {
listen 80;
server_name liang1.jerry.name liang2.jerry.name;
# ~*对字母大小写不敏感,若$http_host中包含 任意字符.jerry.name字符串,则为真
if($host ~* ^(.*)\.jerry\.name$){
rewrite ^(.*) http://liang.jerry.name$1;
break; # 此处break目的在于重定向后不再进行location的匹配(即后续的其他rewrite),
}
}
5.rewrite常用正则
. 匹配除换行符以外的任意字符
? 重复0次或1次
+ 重复1次或更多次
* 重复0次或更多次
\d 匹配数字
^ 匹配字符串的开始
$ 匹配字符串的结束
{n} 重复n次
{n,} 重复n次或更多次
[c] 匹配单个字符c
[a-z] 匹配a-z小写字母的任意一个
小括号()之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容,同时还有转义字符\
5.反向代理服务需要注意的细节
proxy_pass指令,先看如下例子:
# 例1
upstream proxy_svrs {
server http://192.168.1.1:8088/uri/;
server http://192.168.1.1:8088/uri/;
server http://192.168.1.1:8088/uri/;
}
server {
listen 80;
server_name www.jerry.com;
location / {
proxy_pass proxy_svrs;
}
}
# 例2
upstream proxy_svrs {
server 192.168.1.1:8088/uri/;
server 192.168.1.1:8088/uri/;
server 192.168.1.1:8088/uri/;
}
server {
listen 80;
server_name www.jerry.com;
location / {
proxy_pass http://proxy_svrs;
}
}
即在服务器组中已经指明了传输协议"http://"时,proxy_pass中就不需要指明,反之,要在proxy_pass中指明。
需要注意的是如下的情况:
server proxy_svrs {
listen 80;
server_name www.jerry.com;
location /server/ {
proxy_pass http://192.168.1.2/jerry/;
}
}
在这配置的情况下,假如客户端发起的请求为http://www.jerry.com/server/,Nginx会把地址转向"http://192.168.1.2/jerry/"。所以,在使用proxy_pass代理的时候,如果不想改变原有地址中的URI,就不要在URL中配置URI。同时,需要注意的是"/"同样是作为URI,如http://192.168.1.2和http://182.168.1.2/是有区别的,若代理的URL中包含URI,第二种会替换掉原有URL中的URI。如下:
server {
listen 80;
server_name www.jerry.com;
location /server/ {
# 配置1: proxy_pass http://192.168.1.2;
# 配置2: proxy_pass http://192.168.1.2/;
}
}
proxy_set_header指令
该指令可以更改Nginx服务器接收到的客户端请求的请求头信息,然后将新的请求头发送给被代理的服务器。其语法结构为:
proxy_set_header field value;
# field为要更改的信息所在的头域;
# value为更改的值,支持使用文本、变量或者变量的组合
#例1
proxy_set_header Host $http_host; #将目前Host头域的值填充成客户端的地址
proxy_set_header Host $host; #将当前location块的server_name指令值填充到Host头域
proxy_http_version指令
该指令用于设置Nginx服务器提供代理服务的HTTP协议版本,默认设置为1.0版本。1.1版本支持upstream服务器组设置中的keepalive指令。
proxy_http_version 1.0 | 1.1;
参考
location、rewrite规则:https://www.cnblogs.com/dadonggg/p/7797281.html
《nginx高性能web服务器详解》