nginx学习总结
能干什么:静态资源服务器(部署前端页面)、反向代理、负载均衡
使用nginx部署页面
# 负载均衡根据当时的情况来进行判断你访问哪一个tomcat,故障转移
#表示负载均衡服务器,也是通常再说的上游服务器。三种基本的负载均衡算法: 轮询、权重、ip绑定。
upstram mzd{
server 127.0.0.1:8080; #轮询(这是nignx默认的负载均衡算法,总上到下顺序轮流)
#server 127.0.0.1:8081 weight=3; # 权重(设置轮流的比例,数字越大,概率越大)
ip_hash; #id绑定(nignx通过你的ip计算出hash值来判断请求哪一个服务器(不确定))
}
server{ #如果需要多配置,可重写一个server,单个server_name一定不能相同
listen 80; #端口号
server_name localhost; #浏览器输入的域名(没有则本地)
location / { #表示url匹配,/表示全部匹配
proxy_pass http://127.0.0.1:8080 #反向代理地址(这里如果配置了负载均衡就是:http://mzd 必须和上面一致)
root html; #成功匹配之后进入的目录(可扩展,这个路径可以自定义)
index index.html index.htm; #默认页面
proxy_connect_timeout: 3s; #nginx向tomcat发起连接,即第一次握手等待tomcat回应的超时时间,tomcat的这次 回应只是说明能正常连接,并没有响应具体请求的内容。
proxy_read_timeout 5s; #nginx将请求发送给tomcat的超时时间,应该是确认能正常连接之后向tomcat发送真 正的业务请求。
proxy_send_timeout 3s; #tomcat接受到真正业务请求之后,nginx等待tomcat响应具体请求的内容的超时时 间。差不多可以理解tomcat处理具体请求时间的最大值,也就是tomcat必须 在这个时间内做完业务逻辑处理。
limit_conn conn 20;#限制并发连接数;
limit_rate 500k;#为限制下载速度;
proxy_set_header Host $proxy_host; #Host设置为$http_host时,则不改变请求头的值(会出错),Host设置为 $proxy_host时,则会重新设置请求头
}
location ~ /data/sql/data.sql { #设置多个文件
deny all; #禁止文件
}
location ~ /data/sql/data.sql {
access_log off; #不记录访问日志,减轻压力
expires 600; #设置每个文件的过期时间,3d表示3天天
allow 192.168.22.29; #只允许固定ip访问地址
}
error_page 500 502 503 504 /50x.html; #当用户发生此类错误跳转页面
localhost = /50x.html{
root html;
}
}
# 重写server存在跨域问题
# 扩展性比较强,静态资源是什么都可以。
解决ajax跨域方案:
location下加上
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
tomcat中加上(可以通过拦截器写入)
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.addHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
location来拦截: 这个只配置一个server,然后配置两个location,一个通过正则表达式拦截静态资源,还有一个拦截.do结尾的接口请求。
优点:不存在跨域问题
缺点:扩展性太差,静态资源的类型不可确定,每增加一种类型都需要重新修改配置文件并且重启nginx。
# 语法规则
location [=|~|~*|^~] /uri/ { … }
= 开头表示精确匹配
^~ 开头表示url以某个常规字符串开头,理解为匹配url路径。nginx不对url做编码,因此请求为/static/%20/aa(有空格)
~ ~* 开头区分大小写的正则匹配 开头不区分大小写的正则
!~ !~* 区分大小写不匹配 不区分大小写不匹配
/ 通用匹配,任何请求都能匹配到
首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。
这些规则都是访问默认的 root 下的目录(请求地址)
location = / { #规则A
访问根目录/, 比如http://localhost/将匹配规则A
}
location = /login { #规则B
访问 http://localhost/login 将匹配规则B,http://localhost/register 则匹配规则H
}
location ^~ /static/ { #规则C
访问 http://localhost/static/a.html 将匹配规则C
}
location ~ \.(gif|jpg|png|js|css)$ { #规则D
访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用, 而 http://localhost/static/c.png 则优先匹配到 规则C
}
location ~* \.png$ { #规则E
访问 http://localhost/a.PNG 则匹配规则E, 而不会匹配规则D,因为规则E不区分大小写。
}
location !~ \.xhtml$ { #规则F
访问 http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.XHTML不会匹配规则G,因为不区分大小写。
}
location !~* \.xhtml$ { #规则G
规则F,规则G属于排除法,符合匹配规则但是不会匹配到,所以想想看实际应用中哪里会用到。
}
location / { #规则H
访问 http://localhost/category/id/1111 则最终匹配到规则H,因为以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,比如FastCGI(php),tomcat(jsp),nginx作为方向代理服务器存在。
}
启动、停止和重启加载配置
进入到文件目录下
nginx -s stop #快速关机
nginx -s quit #正常关机
nginx -s reload #重新加载配置文件
nginx -s reopen #重新打开日志文件
参考官网文档:http://nginx.org
参考博客:
https://www.cnblogs.com/koal/p/6915106.html
http://outofmemory.cn/code-snippet/742/nginx-location-configuration-xiangxi-explai