Nginx作为近年来较火的反向代理服务器,安装在目的主机端,主要用于转发客户机请求,后台有多个http服务器提供服务,nginx的功能就是把请求转发给后面的服务器,决定哪台目标主机来处理当前请求。

最新版本下载地址:http://nginx.org/en/download.html

我的理解:gateway是对服务的统一,比如请求接口地址,nginx是路径的统一,比如访问连接

 

一.配置:

listen 表示当前的代理服务器监听的端口,默认的是监听80端口。

server_name 表示监听到之后需要转到哪里去,localhost表示转到本地,也就是直接到nginx文件夹内。

location 表示匹配的路径。

root 表示到指定文件路径寻找文件,可用于静态文件。

index 表示默认主页,可以指定多个,按顺序查找。

proxy_pass 它表示代理路径,相当于转发,它将匹配到的请求都转发给相应服务去处理。

其他的配置

proxy_set_header Host $host; 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP。

client_max_body_size 10m; 允许客户端请求的最大单文件字节数。

client_body_buffer_size 128k; 缓冲区代理缓冲用户端请求的最大字节数。

proxy_connect_timeout 90; Nginx跟后端服务器连接超时时间。

proxy_read_timeout 90; 连接成功后,后端服务器响应时间。

proxy_buffer_size 4k; 设置代理服务器保存用户头信息的缓冲区大小。

proxy_buffers 6 32k; proxy_buffers缓冲区。

proxy_busy_buffers_size 64k; 高负荷下缓冲大小。

proxy_temp_file_write_size 64k; 设定缓存文件夹大小。

 

 

二.location匹配规则

nginx官方文档给出location语法如下:

location [=|~|~*|^~] uri { … }

其中,方括号中的四种标识符是可选项,用来改变请求字符串和uri的匹配方式。uri是待匹配的请求字符串,可以是不包含正则的字符串,这种模式被称为“标准的uri";也可以包含正则,这种模式被称为"正则uri",如下:

location ~ .*\.(php|php5)?$ {}

2.1 标识符

=:精确匹配

~:正则匹配,区分大小写

~*:正则匹配,不区分大小写

^~:非正则匹配

标识符

描述

=

         精确匹配;用于标准uri前,要求请求字符串和uri严格匹配。如果匹配成功,就停止匹配,立即执行该location里面的请求。

 

location  = /login {

  # 精确匹配 /login ,匹配成功后,立即结束

}

 

~

         正则匹配;用于正则uri前,表示uri里面包含正则,并且区分大小写。

 

location ~ /images/ {

  #正则匹配,区分大小写,匹配成功后,立即结束

}

~*

         正则匹配;用于正则uri前,表示uri里面包含正则,不区分大小写。

 

location ~* /images/ {

  #正则匹配,不区分大小写,匹配成功后,立即结束

}

^~

         非正则匹配;用于标准uri前,nginx服务器匹配到前缀最多的uri后就结束,该模式匹配成功后,不会使用正则匹配。

location ^~ /images/ {

  # 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。

}

 

         普通匹配(最长字符匹配);与location顺序无关,是按照匹配的长短来取匹配结果。若完全匹配,就停止匹配。

 

location  /blog/ {

  # 与location顺序无关

  # 若完全匹配成功,就不在继续匹配,否则还会进行正则匹配

}

 

2.2 location与root

root的处理结果是:root路径+location路径

location /test001/ {        //http://localhost/test001/

         root   html/test;

         index index.html;

 }

如果匹配,会打开nginx\html\test\test001下的index.html

 

location /test002 {       //http://localhost/test002

         root   html/test;

         index index.html;

 }

location /test003/ {    //http://localhost/test003/

         root   html/test/;

         index index.html;

 }

 location /test004 {     //http://localhost/test004

         root   html/test/;

         index index.html;

 }

 

localhost后的路径是目录的最后一层,location后面配的什么,浏览器访问的时候就写什么

2.3 location与proxy_pass

proxy_pass是反向代理配置,用于代理请求,适用于前后端负载分离或多台机器、服务器负载分离的场景,在匹配到location配置的URL路径后,转发请求到【proxy_pass】配置的URL,是否会附加location配置路径,与proxy_pass配置的路径后是否有"/“有关,有”/"则不附加,

都有不附加, 都没附加, pass有local没不附加, pass没local有则附加

我们请求的网站为:192.168.1.123:80/static/a.html

这里我们分4种情况讨论:

server{

port  80,

server name  192.168.1.123

 

1.location后没有/,转发网站没有/

最后网址经过nginx转向到的网址是:192.168.2.321:81/static/a.html

location /static{

proxy_pass  192.168.2.321:81

}

 

 

2.location后没有/,转发网站有/

最后网址经过nginx转向到的网址是:192.168.2.321:81/a.html

location /static{

proxy_pass  192.168.2.321:81/

}

 

 

3.location后有/,转发网站没有/

最后网址经过nginx转向到的网址是:192.168.2.321:81/static/a.html

location /static/{

proxy_pass  192.168.2.321:81

}

 

 

 

4.location后有/,转发网站有/

最后网址经过nginx转向到的网址是:192.168.2.321:81/a.html

 

location /static/{

proxy_pass  192.168.2.321:81/

}

总结:
从这四种我们可以的看出,当nginx里面匹配时可以把端口后的参数分为path1+path2(其中我在上方标注的location属于path1,proxy_pass属于path2)
当proxy_pass

里面是ipport+/时nginx最后匹配的网址是 proxy_pass的内容加上path2
里面是ip:port时nginx最后匹配的网址是 proxy_pass的内容加上path1+path2

其他:

location /test/ {

proxy_pass http://127.0.0.1:8080/img;

}

请求/test/1.jpg(省略了协议与域名),将会被nginx转发请求到http://127.0.0.1:8080/img1.jpg(未附加/test/路径,但附加了/test/之后的路径img)。

 

 

 

三.location匹配顺序

在没有标识符的请求下,匹配规则如下:

1、nginx服务器首先在server块的多个location块中搜索是否有标准的uri和请求字符串匹配。如果有多个标准uri可以匹配,就匹配其中匹配度最高的一个location。

2、然后,nginx在使用location块中,正则uri和请求字符串,进行匹配。如果正则匹配成功,则结束匹配,并使用这个location处理请求;如果正则匹配失败,则使用标准uri中,匹配度最高的location。

备注:

1、如果有精确匹配,会先进行精确匹配,匹配成功,立刻返回结果。

2、普通匹配与顺序无关,因为按照匹配的长短来取匹配结果。

3、正则匹配与顺序有关,因为是从上往下匹配。(首先匹配,就结束解析过程)

4、在location中,有一种统配的location,所有的请求,都可以匹配,如下:

location  / {

  # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求

  # 但是正则和最长字符串会优先匹配

}

 

5、location ~\.html$ {allow all;} 正则 location以 .html 结尾的 URI 请求,都允许访问。

结合标识符,匹配顺序如下:

(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (location /)

即(精确匹配)> (最长字符串匹配,但完全匹配) >(非正则匹配)>(正则匹配)>(最长字符串匹配,不完全匹配)>(location通配)

 

 

四.Nginx命令

Linux

进入ngxin目录中

cd /usr/local/nginx/sbin

启动命令:nginx

重新加载配置文件:nginx -s reload

停止:nginx -s stop

检查nginx配置是否正确, 执行 ./nginx –t, 出现以下信息则配置正确

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok

nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

官方文档:http://nginx.org/en/docs/http/ngx_http_core_module.html#location

 

Windows

1.start nginx  开启nginx服务

2.nginx -s stop 关闭nginx服务,快速停止nginx,可能并不保存相关信息

3.nginx -s reload  重载nginx服务,当你改变了nginx配置信息并需要重新载入这些配置时可以使用此命令重载nginx

4.nginx -t  测试配置文件正确性

5.nginx -v 

nginx命令参数v与V的区别

nginx -v命令只是简单显示nginx的版本信息(nginx version)

nginx -V不但显示nginx的版本信息,而且还显示nginx的配置参数信息。  

 

五.静态文件过滤

我们需要分文件类型来进行过滤,比如jsp直接给tomcat处理,因为nginx并不是servlet容器,没办法处理JSP,而html,js,css这些不需要处理的,直接给nginx进行缓存。

   ###静态文件gif、jpg等都在本地打开,存放的目录为html,缓存到客户端为30天  
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css|js|htm|html)$ {  
            root html;  
            access_log off;  
            expires 30d;  
        }

 

Jsp文件交给tomcat

location ~ \.jsp$ {  

        proxy_pass http://localhost:8080;  

}  

proxy_pass,它表示代理路径,相当于转发

其中最核心的就是"proxy_pass http://localhost:8080;"这条配置,它将匹配到的请求都转发给Tomcat去处理。

如果项目的样式或者图片加载不出来,要配置静态文件的路径,完成动静分离