nginx配置文件结构

1、nginx配置文件结构

 源码安装Nginx 配置文件:
 默认安装目录:/usr/local/nginx
 [root@jfedu nginx]# ls 
 conf  html  logs  sbin

 #  nginx中默认目录解释
 conf: 存放nginx 配置文件
 html:存放nginx发布网页
 logs:存放nginx 日志文件
 sbin:存放nginx 启动文件

 nginx 主配置文件:/usr/local/nginx/conf/nginx.conf
 nginx 访问日志文件:/usr/local/nginx/logs/access.log
 nginx 错误日志文件:/usr/local/nginx/logs/error.log
 nginx 启动文件:/usr/local/nginx/sbin/nginx

 nginx 主配置文件结构问题:
 nginx.conf配置文件有指令控制的模块进行组成,指令分为简单指令和块指令。
 一个简单指令有名称和参数组成,空格分隔,分号结尾。
 块指令:
 - 全局块:配置全局的参数
 - events块:配置nginx 引擎,nginx与用户连接的相关参数
 - http 块:提供http服务
 - server块:配置虚拟主机,一个http 可以有多个server
 - location 块:匹配url 之后做什么操作或者响应。 
 # 块指令:以“{” 开头, “}”结尾。
 # nginx 参数进行配置的时候要分清楚块的内容,不能把一些小的参数配置到全局块里面,比如日志。

 默认配置分析:
 cat /usr/local/nginx/conf/nginx.conf
 # 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;
         }

         # 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;
         }
    }
}

2、location优先级

 =                           字面精确匹配;
 ^~                          最大前缀匹配; 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。
 nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。
 /                           不带任何前缀:最大前缀匹配; 通用匹配,任何请求都会匹配到。
 ~                           区分大小写相关的正则匹配;
 ~*                          不区分大小写无关的正则匹配;只会匹配后面的正则表达式大小写,和网页文件无关
 !~和!~*                分别为区分大小写不匹配及不区分大小写不匹配 的正则

3、ECHO模块测试 nginx location规则

 # 支持在配置文件中使用echo,sleep,time,exec 等命令
 # 不加echo 模块,不能再配置文件使用上述命令

 #下载
 wget https://github.com/openresty/echo-nginx-module/archive/v0.61.tar.gz

 #查看原来参数:
 [root@jfedu sbin]# ./nginx -V 
 nginx version: nginx/1.14.0
 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) 
 configure arguments:

 #增加模块到原来的nginx中
 [root@jfedu root]# ls 
 v0.61.tar.gz
 tar xzf v0.61.tar.gz -C nginx-1.14.0
 [root@jfedu nginx-1.14.0]# pwd 
 /root/nginx-1.14.0
 #预编译参数
 [root@jfedu nginx-1.14.0]# ./configure --add-module=echo-nginx-module-0.61
 
 #编译
 [root@jfedu nginx-1.14.0]# make

 #平滑升级
 [root@jfedu nginx-1.14.0]# mv /usr/local/nginx/sbin/nginx  /usr/local/nginx/sbin/nginx.old
 [root@jfedu nginx-1.14.0]# cp objs/nginx /usr/local/nginx/sbin/nginx
 [root@jfedu nginx-1.14.0]# make upgrade
 /usr/local/nginx/sbin/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
 kill -USR2 cat /usr/local/nginx/logs/nginx.pid
 #向nginx 的pid 文件,发送一个信号,告诉pid 利用nginx 执行文件,生成一个新的nginx 进程
 sleep 1
 test -f /usr/local/nginx/logs/nginx.pid.oldbin
 kill -QUIT cat /usr/local/nginx/logs/nginx.pid.oldbin
 #完美退出老的nginx 进程

 #平滑升级就成功了
 [root@jfedu nginx-1.14.0]# /usr/local/nginx/sbin/nginx -V 
 nginx version: nginx/1.14.0
 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) 
 configure arguments: --add-module=echo-nginx-module-0.61

4、location测试配置

配置location 测试命令
# 配置了一个域名
 server {
         listen       80;
         server_name  www.jf1.com; 配置域名
# 本地域名生效
 vim /etc/hosts
 10.0.0.6    www.jf1.com
 
修改了配置文件,echo 命令测试 "/"  "= /test.png" "/test.png" 两个优先级,谁更优先?
         location / {
                 echo "jfedu0";
         }
         location /test.png {
                 echo "jfedu1";
         }
         location = /test.png {
                 echo "jfedu2";
         }
 # 测试:
 [root@jfedu conf]# curl www.jf1.com        # 匹配  "/" 
 jfedu0
 [root@jfedu conf]# curl www.jf1.com/
 jfedu0
 [root@jfedu conf]# curl www.jf1.com/test.png   # 精确匹配
 jfedu2
 [root@jfedu conf]# curl www.jf1.com/test    # 匹配  "/",匹配字符没有匹配到,默认有/ 托底。如果没有echo 模块,这个访问url 就会报错 404 ,没有找到这个文件。
 jfedu0

 修改了配置文件,echo 命令测试 "^~ /test/"  "^~ /test" 两个优先级,谁更优先?
        location ^~ /test/ {
                 echo "jfedu3";
         }
         location ^~ /test {
                 echo "jfedu4";
         }
 测试
 [root@jfedu conf]# curl www.jf1.com/test   #最大前缀匹配test
 jfedu4 
 [root@jfedu conf]# curl www.jf1.com/test666   #最大前缀匹配test666
 jfedu4
 [root@jfedu conf]# curl www.jf1.com/test666777
 jfedu4
 [root@jfedu conf]# curl www.jf1.com/test/    #匹配目录
 jfedu3
 [root@jfedu conf]# curl www.jf1.com/test123/  #最大前缀匹配test
 jfedu4
 [root@jfedu conf]# curl www.jf1.com/test/123  #匹配目录test里面的文件
 jfedu3
 # 匹配"^~ /test/"  "^~ /test" ,"^~ /test/" 匹配目录使用,"^~ /test" 主要匹配文件,和文件名前缀匹配

 修改了配置文件,echo 命令测试 "~"  "~" 两个优先级,谁更优先?
        location ~ /test {
                 echo "jfedu5";
         }         
         location ~  /Test {
                 echo "jfedu6";
         }
 # 测试
 [root@jfedu conf]# curl www.jf1.com/test   #大小写相关
 jfedu5
 [root@jfedu conf]# curl www.jf1.com/tesT   #大小写无关
 jfedu6
 # 如果 "~"  "~*" 在配置文件中执行功能是相同的,那么匹配顺序会按照配置中配置的先后顺序进行匹配。

 #总结优先级
 "=" 高于 "^~" 高于 "~*" 高于 "~" 高于 "=/" 高于 "/" 
 #如果整条location 规则中有 = 号,肯定是精确匹配。
 生产环境中常用的几条规则:
     location  =/ {   
 #直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理.
 }
     location ^~ /test/ {
 #匹配目录
 }
 location ~* \.(jpg|jpeg|css|js)$ {
 #匹配无关大小写以.jpg .jpeg .css .js 等结尾的文件
 #. 转义点为.的原意,$ 代表以什么固定结尾
 }
 location ~ ".bak|.html"  {
     return 404;
 #匹配相关大小写的文件,url 中出现.bak  .html 字眼的URL直接拒绝
 }

=/ 和 =  /的区别是什么 ?

没有区别,带上等号,就代表是精确匹配了

发表评论

后才能评论