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天
Jsp文件交给tomcat location ~ \.jsp$ { proxy_pass http://localhost:8080; } proxy_pass,它表示代理路径,相当于转发 |
其中最核心的就是"proxy_pass http://localhost:8080;"这条配置,它将匹配到的请求都转发给Tomcat去处理。
如果项目的样式或者图片加载不出来,要配置静态文件的路径,完成动静分离