Nginx详解

nginx详解

一、什么是正向代理和反向代理?


  • 正向代理

    image
    • 反向代理

      image

URI、URL和URN:

  • URI :Uniform Resource Identifier,统一资源标识符;

  • URL:Uniform Resource Locator,统一资源定位符;

  • URN:Uniform Resource Name,统一资源名称。

image
  • 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.2http://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;

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容