默认配置信息
#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。
基于以上的匹配过程,我们可以得到以下两点启示:
- 使用正则定义的location在配置文件中出现的顺序很重要。因为找到第一个匹配的正则后,查找就停止了,后面定义的正则就是再匹配也没有机会了。
- 使用精确匹配可以提高查找的速度。例如经常请求/的话,可以使用=来定义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