美文网首页
Nginx基本模块以及指令介绍

Nginx基本模块以及指令介绍

作者: 9c46ece5b7bd | 来源:发表于2018-11-18 18:41 被阅读27次

Nginx模块概览

nginx的模块分类

Nginx基本模块以及指令介绍

基本模块主要是和HTTP相关的模块,也是用的最多的模块.

HTTP Core模块以及指令

alias指令
作用:在location中定位文档资源,一般为和URI进行连接匹配[比如location为"/ur",alias为"/data/或/data",则访问"/ur/index.html"则访问的位置为"/data/index.html"]
作用域:location
注意:alias不能在有location的正则表达式中使用[location的时候不能location ~],如果要使用正则需要用到rewrite和root

示例:

# 老版本测试nginx配置
$ mkdir /export/servers/nginx/html/{i,j}
$ echo iiiiii > /export/servers/nginx/html/i/index.html
$ echo jjjjjj > /export/servers/nginx/html/j/index.html
$ echo index > /export/servers/nginx/html/index.html

# nginx配置[访问localhost/i/index.html 应该会访问到/export/servers/nginx/html/i/index.html;访问localhost/j/index.html应该会访问到/export/servers/nginx/html/index.html]
      location /i {
                root /export/servers/nginx/html/;
        }
     location /j {
                alias /export/servers/nginx/html/;
        }

# localhost/j/index.html 的内容应该是/export/servers/nginx/html/index.html "index"
$  curl localhost/j/index.html
index

# localhost/i/index.html 的内容应该是/export/servers/nginx/html/i/index.html "iiiiii"
$ curl localhost/i/index.html
iiiiii

# 增加一个正则匹配的location
      location /i {
                root /export/servers/nginx/html/;
        }
     location /j {
                alias /export/servers/nginx/html/;
        }
        location ~.*\.(js|css)?.*$ {
                expires 1h;
        }

bash-4.1# curl localhost/j/index.html
jjjjjj
bash-4.1# curl localhost/i/index.html
iiiiii
bash-4.1# curl localhost/index.html
index

后面这个示例可以看到,当我们访问localhost/j/index.html时,并没有访问到/export/servers/nginx/html/index.html中的内容,原因其实是因为location的匹配规则的优先级,导致location /j没有生效,因而在访问localhost/j/index.html的时候,会默认去全局的root指令下去找,相当于并没有使用alias指令。

root指令

作用:为请求指定默认的文档地址;一般是将"uri"的路径追加到"root"的路径中[比如location /ur;root /data/;那么请求"/ur/index.html"的时候其实访问的是"/data/ur/index.html"]
作用域:http, server, location, if in location
注意:root和alias不能同时都存在location中
示例:

# 语法和默认值
root html

# 示例: 当请求"/i/top.gif" 返回"/spool/w3/i/top.gif"
## 此时/i/和/i 对于root的指令时无差别的都是将URI追加到root后面
location  /i/ {
 root  /spool/w3;
}

# 访问"/j/top.gif"的时候返回"/spool/ws/top.gif"
location /j/ {
 alias /spool/w3;
}

注意:牢记root指令将一直追加目录到请求URL中,比如"/i/top.gif"请求将不会转到"/spool/w3/top.gif",此时一般要使用alias指令

location指令

作用:一般用于URI的规则匹配,进行后续动作的处理;必须用在server中[http->server->location]
server
注意:需要注意[=|~|~*|^~]的匹配原理以及细节
注意1:~*不区分大小写;~区分大小写;两者可以对URI进行正则匹配
注意2:location的匹配规则顺序非常重要

location的匹配优先级:

  • 1.当指令为= ,进行精确匹配,匹配到立即停止
  • 2.其余带有常规字符串的指令,如果匹配到^~ ,即停止匹配
  • 3.正则匹配表达式
  • 4.如果3中匹配了就返回结果,否则从2中匹配的结果进行请求
# 语法以及默认值
location [=|~|~*|^~] /uri/ { ... }

# 该指令允许根据URI进行不同的配置。 它可以使用文字字符串和正则表达式进行配置[不区分大小写]
~*
# 或者大小写敏感的配置可以使用
~

# 为了确定让一个location匹配到一个指定的query,字面的字符串会先被检查.字面字符串与查询的开头部分匹配并且是大小写敏感的,大部分指定的查询会被匹配生效,然后是正则匹配.当第一个正则匹配成功后将会停止匹配.当第一个正则匹配成功后将会停止匹配.如果正则匹配没有匹配到,将会使用使用字面字符串进行匹配请求.

# 有两种方式可以改变这种行为,第一种是使用"=",使用精确匹配,如果匹配到,查询会停止并立刻进行请求。比如类似"/"的请求经常出现,那么使用"location = /"可以促进请求的执行

# 第二种方式使用前缀[该前缀被用于字面字符串,并且告诉nginx如果有一个path匹配到了,就不要检测正则表达式].如下规则表示当URL中为"/images/"开头时,就停止查询.所有的正则表达式将不会生效
location ^~ /images/ {  };

# 知道nginx是如何解码URL的是非常重要的,比如你想访问"/images/%20/test",那么你必须使用"/images/ /test"来确定location

## 如下配置:
### / -> configuration A
### /documents/document.html -> configuration B
### /images/1.gif -> configuration C
### /documents/1.jpg -> configuration D

location  = / {

  # 仅匹配"/"
  [ configuration A ] 
}
location  / {
  # 只要以"/"开头,会匹配任何查询,但是正则表达式和任意长度的常用块会优先匹配
  [ configuration B ] 
}
location ^~ /images/ {
  # 匹配任何以"/images/"开头的查询,并停止查询;正则表达式将无法匹配
  [ configuration C ] 
}
location ~* \.(gif|jpg|jpeg)$ {
  # 匹配任意以"gif,jpg,jpeg"结尾的查询.然而所有请求到/images/目录的将被在"^~ /images/"中处理
  # Configuration C.   
  [ configuration D ] 
}


注意4:所有的路径字符串都被按照字母顺序进行排序,然后nginx继续搜索列表以查找匹配,直到请求URI具有“更高”值,然后当前字符串就被存储在list中.这个特性使用的是strcmp()家族的函数,一旦strcmp()返回-1,URI查找就会停止,一旦查找停止就会使用最后匹配到的字符串

# 如果访问"/az",nginx将在这个list中查找.首先"/"被匹配,但是"/"小于"/az",继续查找,"/a"也匹配,但是"/a"依然小于"/az",继续查找,"/apple"不匹配,继续查找"/banana"大于"/az",因此整个查找会停止。那么符合匹配规则的就只有["/","/a"]两个URI,因此最后一个匹配URI"/a"生效,因此"/az"默认会走"/a"下的location
/
/a
/apple
/banana

client_body_in_file_only指令
作用域:http, server, location
示例:

# 作用是存储客户端请求体到一个文件
# 语法[default:off]
client_body_in_file_only on|off

client_body_in_single_buffer指令
作用域:http, server, location

# 开启是否将全部的body体保存在一个请求buffer中
官方建议使用$request_body 来减少操作拷贝

client_body_buffer_size
作用域:http, server, location

# 语法及默认值
# 指定客户端请求体buffer大小.如果请求体超过buffer,全部请求体或一部分将被写入临时文件.默认大小是两倍的pages size
client_body_buffer_size [8k/16k]

client_body_temp_path指令
作用域:http, server, location

# 语法
client_body_temp_path dir-path [ level1 [ level2 [ level3 ]
# 示例
client_body_temp_path /spool/nginx/client_temp 1 2;

client_body_timeout指令
作用域:http, server, location

# 指定从客户端读取请求体的超时时间
client_body_timeout time

client_header_buffer_size指令
作用域:http, server

# 语法和默认值[设置来自客户端请求header的buffer大小]
client_header_buffer_size 1k

client_header_timeout指令

作用域:http, server

# 设置客户端读取请求header的超时时间
The timeout is set only if a header is not get in one readstep. If after this time the client send nothing, nginx returns error "Request time out" (408).

client_max_body_size
注意:该参数过小可能倒是上传文件时出现413错误
作用域:http, server, location

# 语法以及默认值
client_max_body_size 1m

# 设置请求体最大值,一般上传文件的时候需要设置这个取的值Content-Length
If size is greater the given one, then the client gets the error "Request Entity Too Large" (413).

default_type指令
作用域:http, server, location

# 默认值以及语法[通常会和include       mime.types;结合使用]
default_type text/plain
# 给不同的URL设置默认的mime类型
location = /proxy.pac {
 default_type application/x-ns-proxy-autoconfig;
}
location = /wpad.dat {

  rewrite . /proxy.pac;
 default_type application/x-ns-proxy-autoconfig;
}

error_page指令
作用:Nginx的error_page其实可以当做web站点的一个降级处理
作用域:http, server, location, if in location
注意:当error_page后面的uri为一个URL地址时,其实是一个302临时重定向,code后面的=以及状态码重置都不会生效,直接返回302

# 指定一个当返回错误的时候的URL

# 语法
error_page code [ code... ] [ = | =answer-code ] uri | @named_location

# 示例
error_page   404          /404.html;
error_page   502 503 504  /50x.html;
error_page   403          http://example.com/forbidden.html;
error_page   404          = @fetch;

# 使用如下方式可以改变error_code并转发到合适的地址[=code之间不能有空格]
error_page 404 =200 /.empty.gif;

# 如果代理或FastCGI服务器处理了错误的请求,并且该服务器可以返回不同的状态码,例如200,302,401或404,则可以隐藏返回的状态码:
error_page   404  =  /404.php;

# 如果想按照原样返回错误代码
error_page   404  /404.php;

# 示例1
location /test {
        error_page 404 =404 /error.html;
}
# 访问的是错误页内容,并且返回一个指定的错误码
bash-4.1# curl localhost/test
sorry ,it's a error page.
bash-4.1# curl localhost/test -I
HTTP/1.1 404 Not Found
Server: nginx/1.14.1
Date: Sun, 11 Nov 2018 07:05:38 GMT
Content-Type: text/html
Content-Length: 26
Connection: close
ETag: "5be7d217-1a"

# 示例2
    location /test {
        error_page 404 = /error.html;
    }
# 目标地址是404,但是会访问到错误页,并替换为错误页内容的状态码
bash-4.1# curl localhost/test
sorry ,it's a error page.
bash-4.1# curl localhost/test -I
HTTP/1.1 200 OK
Server: nginx/1.14.1
Date: Sun, 11 Nov 2018 07:09:09 GMT
Content-Type: text/html
Content-Length: 26
Last-Modified: Sun, 11 Nov 2018 06:54:15 GMT
Connection: close
ETag: "5be7d217-1a"
Expires: Sun, 11 Nov 2018 08:09:09 GMT
Cache-Control: max-age=3600
Accept-Ranges: bytes

# 示例3 [会影藏目标地址的状态码]
  location /test {
    error_page 404  /error.html;
  }
# 目标地址是404 但是会默认访问到错误页内容,隐藏错误页的状态码
bash-4.1# curl localhost/test
sorry ,it's a error page.
bash-4.1# curl localhost/test -I
HTTP/1.1 404 Not Found
Server: nginx/1.14.1
Date: Sun, 11 Nov 2018 07:10:19 GMT
Content-Type: text/html
Content-Length: 26
Connection: close
ETag: "5be7d217-1a"

# 示例4
    location /test {
        #error_page 404 =200  http://www.jd.com/error2.aspx;
        error_page 404 =  http://www.jd.com/error2.aspx;
        #error_page 404   http://www.jd.com/error2.aspx;
    }
# 如上的错误页配置不论是否有=|code都会返回302


index指令
作用域:http, server, location
注意1:通常情况下index指令和root指令一起使用
注意2:如果想要自动生成首页内容需要使用autoindex on参数

# 语法[指定默认的首页内容]
index file [file...]
# 默认值
index index.html 

internal指令
作用域:location
表示匹配位置只能用于所谓的“内部”请求。
内部请求一般包含如下:

  • error_page重定向的请求
  • ngx_http_ssi_module模块中被include virtual命令创建的子请求
  • ngx_http_rewrite_module模块中被rewrite指令改变的请求
# 示例1: 一个阻止客户端直接获取错误页面的示例
error_page 404 /404.html;
location  /test {
  internal;

}

## 访问/test的URI时会自动返回到error_page;rewrite;以及include virtual的相关请求

# 注意在nginx0.7以前是使用@location语法
location / {
    root /var/www/html;
    error_page 404 @40x;

}
 
location @40x {
  root /var/www/errors/40x.html;
}

keepalive_timeout指令

keep-alive相关知识

http, server, location
作用:为客户端的keep-alive链接设置超时时间

# 语法和默认的参数
keepalive_timeout 75

# 在响应header中的值显示为[当请求时带有Connection: keep-alive时]
Keep-Alive: timeout=time

Header相关消息:

  • MSIE and Opera浏览器会忽略Keep-Alive: timeout=<N>
  • MSIE浏览器会保持connection alive 60-65秒,然后发送a TCP RST.
  • Opera浏览器会保持connection alive很长时间
  • Mozilla会保持N+1-10秒
  • Konqueror会保持N秒

keepalive_requests指令

作用:指定可以可以被用来保持keep-alive的请求数量

作用域:http, server, location

# 语法和默认值
keepalive_requests 100

large_client_header_buffers指令

作用:客户端请求中header的最大大小和指令;请求行不能大于这个值,如果大于后Nginx将会返回"Request URI too large" (414).
作用域:http, server

注意1:请求行中最大的header必须不能大于一个buffer的大小,否则客户端会返回"Bad request" (400)
注意2:默认的buffer大小等于page的大小,一般取决于平台为4k或8k

# 语法和默认值
large_client_header_buffers number size
large_client_header_buffers 4 4k/8k

# 生产值
large_client_header_buffers 4 512k;

limit_except指令
作用:限制HTTP方法,可在位置内访问
作用域:location

# 在ngx_http_access_module和ngx_http_auth_basic_module模块中限制
limit_except  GET {
  allow  192.168.1.0/32;
  deny   all;

}

limit_rate指令

作用:配置响应到客户端的速度,指标为每秒多少字节;限制仅限于一个链接,如果客户端打开两个链接,那速度将是两倍

作用域:http, server, location, if in location

注意1:如果非常必要的话,可以在 server层进行限制,并基于某些条件进行限制;相反应该使用$limit_rate 变量进行限制

server {
  if ($slow) {
    set $limit_rate  4k;
  }

}

listen指令

作用域:server

注意:listen指令仅能在server块中指定

# 语法和默认值
listen address:port [ default [ backlog=num | rcvbuf=size | sndbuf=size | accept_filter=filter | deferred | bind | ssl ] ]
default: listen 80
# 指定监听端口以及默认服务[通常不指定server_name的时候会请求默认服务器]
listen       80 default_server

# 示例配置:
server
      {
         listen                 80 default_server;
         server_name            localhost;
         location / {
             rewrite ^/(.*) http://bgops.github.io permanent;
         }
      }

server指令

作用:为虚拟主机分配一个配置文件

作用域:http

注意:一般使用server下的listen和server_name来区分一个具体的服务

# 语法
server {...}

server_name指令
作用:指定server_name的hosts请求头
注意:server name按照如下顺序被解析:

  • full, static names
  • names with a wildcard at the start of the name — *.example.com
  • names with a wildcard at the end of the name — www.example.*
  • names with regular expressions

注意:*不能作为第一个server_name 不过可以使用_代替

tcp_nodelay指令
作用域:http, server, location

作用:允许或拒绝socket的参数TCP_NODELAY
tcp_nopush指令
作用:允许或拒绝socket的参数TCP_NOPUSH

注意:tcp_nopush和tcp_nodelay通常都为on

try_files指令

作用:表示测试文件是否存在,如果文件都不存在将会寻找fallback内容

作用域:location

# 语法
try_files file1 [file2 ... filen] fallback
# 表示测试文件是否存在,如果index.html index.htm都不存在将会去@fallback块中查找
location / {

  try_files index.html index.htm @fallback;
}
 
location @fallback {
 root  /var/www/error;
 index index.html;

}

types指令

作用:指定MIME的类型
作用域:http, server, location

#  
types  {
  text/html    html;
  image/gif    gif;
  image/jpeg   jpg;
}


log_subrequest指令
作用:开启或关闭在access_log中记录例如rewrite rules and/or SSI 请求过来的子请求
作用域:http, server, location

log_subrequest [on|off]

open_file_cache指令

作用:设置被激活的缓存cache,以下信息将会被缓存:

  • 打开的文件描述符,会带有文件的大小和改变时间信息
  • 相关的目录信息
  • 当查找一个文件,该文件不存在,不能读等以下相关的错误信息open_file_cache_errors
# 指定在cache中项目的最大个数,当cache满之后将使用LRU(Least Recently Used)算法[最近最少使用]进行淘汰;inactive指定被缓存的时间[过期时间]
 open_file_cache max=1000 inactive=20s; 
# 
 open_file_cache_valid    30s; 
 open_file_cache_min_uses 2;
# 指定当查找一个文件时是否在cache中记录错误信息
 open_file_cache_errors   on;

send_timeout指令

作用:为客户端设定响应超时
作用域:http, server, location

# 默认值
send_timeout 60

HTTP 基本模块的变量

$http_user_agent

$http_cookie

$content_length

$content_type

$document_uri

$host

$remote_addr:客户端地址

$request_filename:当前的请求文件,取自root or alias and URI request

$request_method:请求方法

$scheme:协议

rewrite  ^(.+)$  $scheme://example.com$1  redirect;

$server_addr:服务地址nginx绑定地址

$server_name:虚拟主机名称

$server_protocol:访问协议

Nginx配置示例

1. nginx主配置中的keepalive_timeout的作用

[pe@localhost ~]$ sudo netstat -antlp | grep 80
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      5350/nginx
tcp        0      0 10.0.0.1:80           10.13.15.68:54282           ESTABLISHED 25606/nginx
tcp        0      0 10.0.0.1:80           10.13.15.68:54280           ESTABLISHED 25606/nginx
tcp        0      0 10.0.0.1:80           10.13.15.68:54283           ESTABLISHED 25606/nginx
tcp        0      0 10.0.0.1:80           10.13.15.68:54281           ESTABLISHED 25606/nginx
tcp        0      0 :::3306                     :::*                        LISTEN      1804/docker-proxy
[pe@localhost ~]$ date
2018年 11月 10日 星期六 16:19:22 CST
[pe@localhost ~]$ sudo netstat -antlp | grep 80
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      5350/nginx
tcp        0      0 10.0.0.1:80           10.13.15.68:54282           ESTABLISHED 25606/nginx
tcp        0      0 10.0.0.1:80           10.13.15.68:54280           ESTABLISHED 25606/nginx
tcp        0      0 10.0.0.1:80           10.13.15.68:54283           ESTABLISHED 25606/nginx
tcp        0      0 10.0.0.1:80           10.13.15.68:54281           ESTABLISHED 25606/nginx
tcp        0      0 :::3306                     :::*                        LISTEN      1804/docker-proxy
[pe@localhost ~]$ date
2018年 11月 10日 星期六 16:19:54 CST
[pe@localhost ~]$ sudo vim /export/servers/nginx/conf/nginx.conf
[pe@localhost ~]$ date
2018年 11月 10日 星期六 16:20:23 CST
[pe@localhost ~]$ sudo netstat -antlp | grep 80
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      5350/nginx
tcp        0      0 :::3306                     :::*                        LISTEN      1804/docker-proxy
2. rewrite的用法

rewrite语法

语法:rewrite regex replacement [flag];
默认值:无
作用域:server,location,if
如果一个URI匹配指定的正则表达式regex,URI就按照replacement重写。
rewrite按配置文件中出现的顺序执行。flags标志可以停止继续处理。
如果replacement以"http://"或"https://"开始,将不再继续处理,这个重定向将返回给客户端。

reqrite 语法指令的参数详情:

  • last 停止处理后续rewrite指令集,然后对当前重写的新URI在rewrite指令集上重新查找。
  • break 停止处理后续rewrite指令集,并不在重新查找,但是当前location内剩余非rewrite语句和location外的的非rewrite语句可以执行。
  • redirect 如果replacement不是以http:// 或https://开始,返回302临时重定向
  • permant 返回301永久重定向

注意:如果nginx配置了多个虚拟主机,那么如果都没有匹配server_name的时候会去默认访问default_server
注意2:rewrite指令后的last,break,redirect,以及permanent的实际影响

      server {
            listen       80 default_server;
                        server_name   test.xxb.com;
                location /bug {
                        proxy_pass              http://172.24.212.224:8080/bugzilla;
                    }
        location / {
            #临时重定向
          #rewrite ^/$ http://xxbandy.github.io/sceneIndex.html redirect;
             #永久重定向
            #rewrite ^/$ http://my.oschina.net/xxbAndy/blog permanent;
            #rewrite ^/$ http://my.oschina.net/xxbAndy/blog redirect;
            #rewrite ^/$ http://my.oschina.net/xxbAndy/blog last;
            #rewrite ^/$ http://my.oschina.net/ break;
            #index hello.html;  #定义默认的首页

        #使用last完成rewrite,将hello的内容透明替换成index
        rewrite ^/index.html$ /hello.html last;
        #rewrite ^/index.html$ /hello.html break;
        #临时重定向好像只对同同一站点的文件匹配
                #rewrite ^/index.html$ /hello.html  redirect;  #内容替换,uri也替换
                #rewrite ^/index.html$ /hello.html permanent;

        #使用proxypass 或者rewrite重定向到其他网站
          #proxy_pass http://xxbandy.github.io/ ;
          #rewrite ^/$ http://xxbandy.github.io last;



        #if ($host = "ha.xxbandy.github.io") {
        #  rewrite ^/$ http://www.baidu.com;
        #}
        }

}

# 注意: last和break会直接进行请求规则的终止匹配,并直接代替用户访问内容
# 当行为是last或break的时候[通常last和break是在多个location中作用会比较明显break只要匹配到一次就终止]
bash-4.1# cat blog.bgops.com.conf
    server {
        listen 80;
        server_name  blog.bgops.com ;
        location /  {
                root    html;
                    rewrite        ^/$       /blog.html break;
                }
        }

bash-4.1# curl -H 'host:blog.bgops.com' localhost
blog.bgops.com

# 注意: redirect和permanent会分别进行302和301的临时重定向和永久重定向
# 修改为permanet的时候,仅会对本地文件进行永久重定向,此时域名不会进行改变 返回码为301
bash-4.1# curl -H 'host:blog.bgops.com' localhost  -I
HTTP/1.1 301 Moved Permanently
Server: nginx/1.14.1
Date: Sat, 10 Nov 2018 10:59:40 GMT
Content-Type: text/html
Content-Length: 185
Location: http://blog.bgops.com/blog.html
Connection: keep-alive

# 修改为redirect的时候会进行临时重定向
bash-4.1# curl -H 'host:blog.bgops.com' localhost  -I
HTTP/1.1 302 Moved Temporarily
Server: nginx/1.14.1
Date: Sat, 10 Nov 2018 11:01:53 GMT
Content-Type: text/html
Content-Length: 161
Location: http://blog.bgops.com/blog.html
Connection: keep-alive

## 所以对于临时重定向redirect和永久重定向permanent这两者之间有啥区别,其实对于用户来说都是内容改变为了重定向之后网站的内容,URI会如何变化呢?
## 但是对于搜索引擎或者运营人员来说302临时重定向会被认为是可疑转向,有作弊行为。也就是说,一个不道德的人在他自己的网址A做一个302重定向到你的网址B,出于某种原因, Google搜索结果所显示的仍然是网址A,但是所用的网页内容却是你的网址B上的内容,这种情况就叫做网址URL劫持。
## 配置文件修改为redirect临时重定向后就会直接跳转到重定向的页面
bash-4.1# curl -H 'host:blog.bgops.com' localhost  -I
HTTP/1.1 302 Moved Temporarily
Server: nginx/1.14.1
Date: Sat, 10 Nov 2018 11:13:47 GMT
Content-Type: text/html
Content-Length: 161
Connection: keep-alive
Location: https://www.baidu.com/

## 当网页A用301重定向转到网页B时,搜索引擎可以肯定网页A永久的改变位置,或者说实际上不存在了,搜索引擎就会把网页B当作唯一有效目标。
## 301的好处是没有网址规范化问题;网页A的PR网页级别会传到网页B
总结起来就是,一般内网应用其实301和302没什么太大区别,但是外网应用建议使用301永久重定向

3. 其他示例

问题1:当使用nginx作为虚拟主机的时候,用户访问不同的server_name会出现不同的站点,但当用户访问的server_name都不匹配时,会默认访问那个虚拟主机的内容

问题解析:一般当nginx作为虚拟主机的时候[或者反向代理],为了用户访问友好性,一般需要设置默认的default_server,不然会出现server_name不匹配而默认访问到其他站点。而当所有的server_name不匹配时,会按照反向代理的配置文件名进行字符串排序,首先访问第一个配置文件内容

# 三个配置内容大概如下
$ cat 1.conf
    server {
        listen 80;
        server_name  ts.bgops.com ;
        location /  {
                root html;
                    rewrite        ^/$              /ts.html;
        }
   }

$ cat 2.conf
    server {
        listen 80;
        server_name  blog.bgops.com;
        location /  {
                root html;
                rewrite      ^/$              /blog.html;
        }
   }

$ cat 3.conf
    server {
        listen 80;
        server_name  www.bgops.com ;
        location /  {
                root html;
                rewrite      ^/$              /www.html;
        }
   }


bash-4.1# grep -ri server_name *
1.conf:        server_name  ts.bgops.com ;
2.conf:        server_name  blog.bgops.com ;
3.conf:        server_name  www.bgops.com ;

### 可以看到,当server_name不匹配时会默认访问到1.conf里面的内容
bash-4.1# curl localhost
ts.bgops.com
bash-4.1# curl -H 'host:xxbandy.github.io' localhost
ts.bgops.com
bash-4.1# curl -H 'host:ts.bgops.com' localhost
ts.bgops.com
bash-4.1# curl -H 'host:blog.bgops.com' localhost
blog.bgops.com
bash-4.1# curl -H 'host:www.bgops.com' localhost
www.bgops.com

### 我们尝试改一下名字[会发现当server_name不匹配时会默认访问第一个配置文件]
bash-4.1# mv 2.conf abc.conf
bash-4.1# mv 3.conf acd.conf
bash-4.1# mv 1.conf acc.conf
bash-4.1# /export/servers/nginx/sbin/nginx -s reload
bash-4.1# grep -ri server_name *
abc.conf:        server_name  blog.bgops.com ;
acc.conf:        server_name  ts.bgops.com ;
acd.conf:        server_name  www.bgops.com ;
bash-4.1# curl localhost
blog.bgops.com

bash-4.1# mv acd.conf aaa.conf
bash-4.1# /export/servers/nginx/sbin/nginx -s reload
bash-4.1# grep -ri server_name *
aaa.conf:        server_name  www.bgops.com ;
abc.conf:        server_name  blog.bgops.com ;
acc.conf:        server_name  ts.bgops.com ;
bash-4.1# curl localhost
www.bgops.com

`注意:其实如果多个server_name使用不同的文件进行区分的时候,会将所有文件按照文件名进行排序[对server块进行了一个排序],默认会访问第一个server块内的域名;而如果所有的server_name在一个配置文件的话,默认访问的也是最上面那个域名的内容;但是如果最上面的server_name如果有异常很容易对客户造成影响。因此一般会在企业内部统一定一个内部默认服务器,当所有server_name都不匹配的时候进行服务提供.`

server
      {
         listen                 80 default_server;
         server_name            localhost;
         location / {
             rewrite ^/(.*) http://xxbandy.github.io permanent;
         }
      }

相关文章

网友评论

      本文标题:Nginx基本模块以及指令介绍

      本文链接:https://www.haomeiwen.com/subject/ccbgfqtx.html