Nginx的配置
nginx配置主要就是配置三个区段:http,server,location
http没什么好说的,server也没什么好说的主要就是location
location通过指定的模式与客户端请求的URI来匹配,模式类似正则表达式,当然也支持正则表达式,基本语法:
location [=||*|^~|@] pattern{……}
这个[]里面可以写参数也可以不写参数,所以大概有这么几种情况
location = pattern{} #精准匹配
location pattern{}#一般匹配
location ~ pattern{}#正则匹配
精准匹配
先来说精准匹配,顾名思义就是说location后面的pattern被限制为一个固定的串,所以请求的URI必须和这个pattern一致
server{
server_name localhost;
location = /aaa{
[...]
}
}
#http://localhost/abc 匹配
#http://localhost/ABC 忽略大小写就匹配,比如windows
#http://localhost/abc?paraml 忽略查询参数也匹配,其它的就不匹配了
这时候请求的URI就固定为/abc了比如:http://localhost/abc
一般匹配
一般匹配,这种模式就是左前缀匹配,就是说以pattern开头的匹配
server{
server_name localhost;
location /aaa{
[...]
}
}
#http://localhost/abc 匹配
#http://localhost/ABC 忽略大小写就匹配,比如windows
#http://localhost/abc?paraml 忽略查询参数也匹配,其它的就不匹配了
#http://localhost/abcdefg 匹配,也就是说只要前缀匹配就行
正则匹配 ~
这时候pattern必须是正则表达式,注意正则不只一种,这是第一种
server {
server_name localhost;
location ~ ^/abcd$ {
[…]
}
}
http://localhost/abcd # 完全匹配
http://localhost/ABCD # 不匹配,~ 对大小写是敏感的
http://localhost/abcd?param1 # 忽略查询串参数(query string arguments),这里就是 /abcd 后面的 ?param1
http://localhost/abcd/ # 不匹配,因为末尾存在反斜杠(trailing slash),并不匹配正则表达式 ^/abcd$
http://localhost/abcde # 不匹配正则表达式 ^/abcd$
正则匹配~*
这种匹配就不区分大小写了,pattern是正则表达式,比起第一种就是忽略大小写
server {
server_name localhost;
location ~ ^/abcd$ {
[…]
}
}
http://localhost/abcd # 完全匹配
http://localhost/ABCD # 匹配,~* 对大小写是不敏感的
http://localhost/abcd?param1 # 忽略查询串参数(query string arguments),这里就是 /abcd 后面的 ?param1
http://localhost/abcd/ # 不匹配,因为末尾存在反斜杠(trailing slash),并不匹配正则表达式 ^/abcd$
http://localhost/abcde # 不匹配正则表达式 ^/abcd$
正则匹配 ^~ ,!和!*,
这三种分别是这样的
- ^~ 和一般模式一样,只是pattern是正则表达式
- !区分大小写,!*不区分大小写
通用匹配/
这个会匹配任意的请求
特殊匹配@
定义一个只能被nginx内部访问的块,不能被外部请求到
匹配的优先级
比如当有两个以上的location时去匹配谁呢,这时候就需要根据优先级来判断了。
1:带有“=“的精确匹配优先
2:没有修饰符的精确匹配
3:正则表达式按照他们在配置文件中定义的顺序
4:带有“^~”修饰符的,开头匹配
5:带有“~” 或“~*” 修饰符的,如果正则表达式与URI匹配
6:没有修饰符的,如果指定字符串与URI开头匹配
示例:
location =/ {} #只匹配/的请求
location / {} #匹配任意请求,优先级低于正则表达式和其它的模式
location ^~ /images/ {} #匹配images下的文件
location ~* \.(gif|jpg|jpeg)$ {} #不区分大小写的匹配以这几种图片格式结尾的请求
root和alias指令
location /img/ {
alias /images/;
}
这种做法就是访问/images/下面的文件,也就是说/img/是一个别名,而且alias末尾必须加上/。
location /img/ {
root /usr/local/images;
}
root就代表指定了一个根目录,会和请求的目录拼成一个目录/usr/local/images/img/,后面的/可有可无。
最后贴一个必须的location
#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说.
#这里是直接转发给后端应用服务器了,也可以是一个静态首页
# 第一个必选规则
location = / {
proxy_pass http://127.0.0.1:88; #代理
}
# 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
location ~ /\.
{
deny all; # 其他的任意后缀都不让其访问;
}
#第三个规则就是通用规则,用来转发动态请求到后端应用服务器
location /
{
try_files $uri @apache; #try_files 将尝试你列出的文件并设置内部文件指向
}
location @apache
{
internal; # internal指令指定某个location只能被“内部的”请求调用,外部的调用请求会返回”Not found”
proxy_pass http://127.0.0.1:88;
proxy_connect_timeout 300s;
proxy_send_timeout 900;
proxy_read_timeout 900;
proxy_buffer_size 32k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_redirect off;
proxy_hide_header Vary;
proxy_set_header Accept-Encoding '';
proxy_set_header Host $host;
proxy_set_header Referer $http_referer;
proxy_set_header Cookie $http_cookie;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}