nginx的location配置

默认配置信息

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

可以发现配置文件由一下几个部分组成:

main
events {...}
http {
    server {
        location {...}
    }
}

nginx的默认主配置文件主要由main,events,http,server和location 5个块组成,各个块的作用如下表:

说明
main 主要控制nginx的子进程所属的用户和用户组,派生子进程数,错误日志位置和级别,pid位置,子进程优先级,进程对应的CPU,进程能够打开的文件描述符数目等
events 控制nginx处理连接的方式
http nginx处理http请求的主要配置块,大多数配置都在这里面进行
server nginx中主机的配置块,可用于配置多个虚拟主机
location server中对应目录级别的控制块,可以有多个

对于嵌套块(http,server,location)中的指令,执行的书序为从外到内依次执行,内层块中的大部分指令会自动获取外层块指令的值作为默认值,只有某些特殊指令除外。

nginx中以#进行注释。

nginx中的指令由指令名和参数组成。当一个指令中含有多个自指令作为参数时,需要使用{}进行包括。且每条指令都以分号结尾。

相对路径指的是相对于当前配置文件所在目录的路径。

默认配置指令表:

指令 说明
worker_processes 配置ngxin的进程数,一般设为CPU总核数或总核数的二倍
worker_connections 配置nginx允许单个进程并发连接的最大请求数
include 用于引入配置文件
default_type 设置默认文件类型
send_file 默认值为on,表示开启高效文件传输
keepalive_timeout 设置长连接超时时间(单位:秒)
listen 监听端口,默认监听80端口
server_name 设置主机域名
root 设置主机站点根目录地址
index 指定默认索引文件
error_page 自定义错误页面

错误页面

nginx的默认配置文件中给出的错误处理方式为:

error_page 500 502 503 504 /50x.html;

在上述配置中,error_page指令用于自定义错误页面,500,502,503和504指的就是http错误代码,/50x.html用于表示当发生上述指定的任意一个错误时,都使用网站根目录下的50x.html文件处理。

此外,error_page指令还可以给单个错误指定处理页面。

error_page 403 /403.html;
error_page 404 /404.jpg;
error_page 500 http://aa.com/500.html;

location 语法

location语法及规定,具体如下:

location [= | ~ | ~* | ^~ ] URI {...} #语法类型1
location @name {...}                  #语法类型2

上述语法中,=、 ~、 ~*、 ^~ 和@都是location用于实现访问控制的前缀,且在使用时只能选择一种,当然也可以不设置前缀。前缀的含义如下表所示,URI表示URL地址中从域名到参数之间的部分,{...}表示指令块,用于满足location匹配条件后需要执行的指令。

前缀 说明
= 精准匹配,根据其后的指定模式进行精准匹配,例如,在访问时要与/html/aaa/index.html完全一致才会执行其后的指令快
~ 使用正则表达式完成location的匹配,区分大小写
~* 使用正则表达式完成location的匹配,不区分大小写
^~ 开头表示uri以某个常规字符串开头,不是正则匹配
/ 通用匹配,如果没有其它匹配,任何请求都会匹配到
!~ 和 !~* 分别为区分大小写不匹配及不区分大小写不匹配 的正则
@ 用于定义一个location块,且该块不能被外部客户端访问,只能被nginx内部配置指令所访问,可以用于错误处理

根据前缀可以分为普通location和正则location,其中*属于正则location,其余的前缀和没有前缀的情况都输入普通location。
优先级:

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

当有匹配成功时候,停止匹配,按当前匹配规则处理请求。

demo:

location = / { 
   # 精确匹配 / ,主机名后面不能带任何字符串  
   #规则A  
}  
location = /login {  
  # 精准匹配,/login
   #规则B  
}  
location ^~ /static/ {  
  # 匹配任何以 /static/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。
   #规则C  
}  
location ~ \.(gif|jpg|png|js|css)$ {  
   #匹配所有以 gif,jpg或jpeg,js,css 结尾的请求
   #规则D  
}  
location ~* \.png$ {  
   #匹配所有以png结尾的请求
   #规则E  
}  
location !~ \.xhtml$ {  
   #匹配所有不以png结尾的请求,区分大小写
   #规则F  
}  
location !~* \.xhtml$ {
    #匹配所有不以png结尾的请求 ,不区分大小写 
   #规则G  
}  
location / {  
  # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
  # 但是正则和最长字符串会优先匹配
   #规则H  
}

location /img/ {
        error_page 404 @img_err;
        #以 /img/ 开头的请求,如果链接的状态为 404。则会匹配到 @img_err 这条规则上。
    }
    
location @img_err {
        # 规则
    }

匹配过程:

对请求的url序列化。例如,对%xx等字符进行解码,去除url中多个相连的/,解析url中的.,..等。这一步是匹配的前置工作。

location有两种表示形式,一种是使用前缀字符,一种是使用正则。如果是正则的话,前面有*修饰符。

首先先检查使用前缀字符定义的location,选择最长匹配的项并记录下来。

如果找到了精确匹配的location,也就是使用了=修饰符的location,结束查找,使用它的配置。

然后按顺序查找使用正则定义的location,如果匹配则停止查找,使用它定义的配置。

如果没有匹配的正则location,则使用前面记录的最长匹配前缀字符location。

基于以上的匹配过程,我们可以得到以下两点启示:

  1. 使用正则定义的location在配置文件中出现的顺序很重要。因为找到第一个匹配的正则后,查找就停止了,后面定义的正则就是再匹配也没有机会了。
  2. 使用精确匹配可以提高查找的速度。例如经常请求/的话,可以使用=来定义location。

产生的效果如下:

访问根目录/,比如http:localhost/将匹配规则A。

访问 http://localhost/login 将匹配规则B,http://localhost/register 则匹配规则H

访问 http://localhost/static/a.html 将匹配规则C

访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用,而 http://localhost/static/c.png 则优先匹配到 规则C

访问 http://localhost/a.PNG 则匹配规则E, 而不会匹配规则D,因为规则E不区分大小写。

访问 http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.XHTML不会匹配规则G,因为不区分大小写。规则F,规则G属于排除法,符合匹配规则但是不会匹配到,所以想想看实际应用中哪里会用到。

访问 http://localhost/category/id/1111 则最终匹配到规则H,因为以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,比如FastCGI(php),tomcat(jsp),nginx作为方向代理服务器存在。

实际使用中建议由如下三个匹配规则:

#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。  
#这里是直接转发给后端应用服务器了,也可以是一个静态首页  
# 第一个必选规则  
location = / {  
    proxy_pass http://tomcat:8080/index  
}  
   
# 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项  
# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用  
location ^~ /static/ {  
    root /webroot/static/;  
}  
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {  
    root /webroot/res/;  
}  
 
#第三个规则就是通用规则,用来转发动态请求到后端应用服务器  
#非静态文件请求就默认是动态请求,自己根据实际把握  
#毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了  
location / {  
    proxy_pass http://tomcat:8080/  
}

| 参考

| https://www.cnblogs.com/koal/p/6915106.html

| https://segmentfault.com/a/1190000002797606

| https://segmentfault.com/a/1190000009651161

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容