Fork me on GitHub

nginx配置详解

1. nginx配置总览

一般来说nginx的配置文件位于/etc/nginx/nginx.conf,大体的结构如下


...              #全局块

events {         #NGINX工作模式
   ...
}

http      #http块
{
    ...   #http全局块
    server        #server块
    { 
        ...       #server全局块
        location [PATTERN]   #location块
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     #http全局块
}

大体的职责

1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。

2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。

3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。

4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。

5、location块:配置请求的路由,以及各种页面的处理情况。

一份默认的nignx配置文件如下

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    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  /var/log/nginx/access.log  main;

    sendfile            on; 
    tcp_nopush          on; 
    tcp_nodelay         on; 
    keepalive_timeout   65; 
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;  
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.

        location / { 
        }   

        error_page 404 /404.html;
            location = /40x.html {
        }   

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }   
    }   

# Settings for a TLS enabled server.
#
#    server {
#        listen       443 ssl http2 default_server;
#        listen       [::]:443 ssl http2 default_server;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers HIGH:!aNULL:!MD5;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        location / {
#        }
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }

}

2. main模块

2.1 配置用户用户组

指定Nginx Worker进程运行用户以及用户组

user user [group];
  • user, 可运行 Nginx 服务器的用户
  • group, 指定可运行用户组

当配置user nginx;时,使用root用户启动nginx,查看下进程情况,发现master进程是root,worker进程是nginx。

$ ps -ef | grep nginx 
root      1190     1  0 Jul20 ?        00:00:00 nginx: master process /usr/sbin/nginx
nginx     1191  1190  0 Jul20 ?        00:00:42 nginx: worker process
nginx     1192  1190  0 Jul20 ?        00:00:47 nginx: worker process
root      7104  7049  0 16:52 pts/0    00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn nginx

2.2 配置worker process 数

worker角色的工作进程的个数,master进程是接收并分配请求给worker处理。这个数值简单一点可以设置为cpu的核数,也是 auto 值,如果开启了ssl和gzip更应该设置成与逻辑CPU数量一样甚至为2倍,可以减少I/O操作。

worker_processes number | auto;
  • number, 指定 Nginx 进程最多可产生的 worker process 数
  • auto, Nginx 自动

查看物理cpu个数

cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l
1

查看逻辑cpu个数

cat /proc/cpuinfo |grep "processor"|wc -l
2

查看下进程情况,有 一个master进程,两个worker进程

$ ps -ef | grep nginx 
root      1190     1  0 Jul20 ?        00:00:00 nginx: master process /usr/sbin/nginx
nginx     1191  1190  0 Jul20 ?        00:00:42 nginx: worker process
nginx     1192  1190  0 Jul20 ?        00:00:47 nginx: worker process
root      7104  7049  0 16:52 pts/0    00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn nginx

当设置worker_processes auto;时,可以看出nginx默认启动的数量是和逻辑cpu数量一致的。

2.3 PID文件存放路径

Nginx 进程作为系统守护进程运行,在文件中保存当前运行程序主进程号,支持配置 PID

pid file_path;

pid文件的作用

(1) pid文件的内容:pid文件为文本文件,内容只有一行, 记录了该进程的ID。
(2) pid文件的作用:准确判断进程是否正在运行,防止进程启动多个副本。只有获得pid文件(固定路径固定文件名)写入权限(F_WRLCK)的进程才能正常启动并把自身的PID写入该文件中。其它同一个程序的多余进程则自动退出。

2.4 错误日志路径

全局块、http 块 和 server 块都可以对 Nginx 日志进行配置

error_log file | stderr [debug | info | notice | warn | error |crit | alert | emerg];

日志级别可选,从低到高 debug, info, notice, warn, error, crit, alert, emerg ,其中,debug输出日志最为最详细,需要注意的是 debug 需要编译时使用 --with-debug 开启。

2.5 引入其他配置

Nginx 提供 include 配置来引入其他文件

include file;

file 是要引入的配置文件,支持相对路径和正则匹配

3. events模块

3.1 use 用来指定Nginx的工作模式。

use select|poll|kqueue|epoll|resig|/dev/poll|eventport;

Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中,因为Mac基于BSD,所以Mac也得用这个模式,对于Linux系统,epoll工作模式是首选。

工作模式的简介:

  • select: 这是一种标准的请求处理方法。如果一个平台上缺少相应的更加有效的方法,那么Nginx会自动使用select方法。
  • poll: 这是一种标准的请求处理方法。如果一个平台上缺少相应的更加有效的方法,那么Nginx会自动使用poll方法。
  • kqueue: 这是BSD家族操作系统上可用的一种高效的请求处理方法。可用于FreeBSD, OpenBSD, NetBSD和OS X。kqueue方法会忽略multi_accept。
  • epoll: 这是Linux系统上可用的一种高效的请求处理方法,类似于kqueue。它有一个额外的directive,那就是epoll_events。epoll_events指定了Nginx可以向内核传递的事件数量。默认的值是512。

3.2 worker_connections 用于定义Nginx每个进程的最大连接数

worker_connections number;

即接收前端的最大请求数。最大客户端连接数由worker_processes和worker_connections决定,即Max_clients = worker_processes * worker_connections,在作为反向代理时,Max_clients变为:Max_clients = worker_processes * worker_connections / 4。

进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令“ulimit -n 65536”后worker_connections的设置才能生效。

3.3 设置网路连接序列化,防止惊群现象发生,默认为on

accept_mutex on; 

惊群现象

主进程(master 进程)首先通过 socket() 来创建一个 sock 文件描述符用来监听,然后fork生成子进程(workers 进程),子进程将继承父进程的 sockfd(socket 文件描述符),之后子进程 accept() 后将创建已连接描述符(connected descriptor)),然后通过已连接描述符来与客户端通信。

那么,由于所有子进程都继承了父进程的 sockfd,那么当连接进来时,所有子进程都将收到通知并“争着”与它建立连接,这就叫“惊群现象”。大量的进程被激活又挂起,只有一个进程可以accept() 到这个连接,这当然会消耗系统资源。

Nginx对惊群现象的处理

Nginx 提供了一个 accept_mutex 这个东西,这是一个加在accept上的一把共享锁。即每个 worker 进程在执行 accept 之前都需要先获取锁,获取不到就放弃执行 accept()。有了这把锁之后,同一时刻,就只会有一个进程去 accpet(),这样就不会有惊群问题了。accept_mutex 是一个可控选项,我们可以显示地关掉,默认是打开的。

3.4 worker_rlimit_nofile

由于每一个socket都会打开一个文件描述符,所以服务器可以同时处理连接数量受到系统文件描述符数量的限制。如果nginx打开的socket数量超过了文件描述符的数量,那么在error.log文件中会出现too many opened files错误。我们可以用下面的命令来查看文件描述符的数量:

$ ulimit -n

Nginx worker进程默认的用户名是www-data,用户www-data所拥有的文件描述符的数量要大于worker进程数量与worker_connections之乘积。 nginx有一个worker_rlimit_nofile directive,可以用来设置系统可用的文件描述符。这与ulimit设置可用文件描述符的作用是一样的。如果它们都设置了可用文件描述符,那么worker_rlimit_nofile会覆盖ulimit的设置。

worker_rlimit_nofile 20960;

查看操作系统对一个进程施加的限制,我们可以用命令读取/etc/$pid/limits文件,$pid是进程的pid。

3.5 设置一个进程是否同时接受多个网络连接,默认为off

multi_accept on;

multi_accept可以让nginx worker进程尽可能多地接受请求。它的作用是让worker进程一次性地接受监听队列里的所有请求,然后处理。如果multi_accept的值设为off,那么worker进程必须一个一个地接受监听队列里的请求。

4. http模块

4.1 定义 MIME TYPE 类型

浏览器使用 MIME Type 来区分不同的媒体类型, Nginx 作为 Web 服务器,必须能够识别前端请求的资源类型。

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

1、include

用来设定文件的mime类型,类型在配置文件目录下的mime.type文件定义,来告诉nginx来识别文件类型。

2、default_type

设定了默认的类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置asp的locate 环境时,Nginx是不予解析的,此时,用浏览器访问asp文件就会出现下载窗口了。

以下是mime.types文件的内容,该文件中包含了浏览器能够识别的 MIME 类型,以及对应的文件后缀名。

types {
    text/html                             html htm shtml;
    text/css                              css;
    text/xml                              xml;
    image/gif                             gif;
    image/jpeg                            jpeg jpg;
    application/javascript                js; 
    application/atom+xml                  atom;
    application/rss+xml                   rss;

    text/mathml                           mml;
    text/plain                            txt;
    text/vnd.sun.j2me.app-descriptor      jad;
    text/vnd.wap.wml                      wml;
    text/x-component                      htc;

    image/png                             png;
    image/tiff                            tif tiff;
    image/vnd.wap.wbmp                    wbmp;
    image/x-icon                          ico;
    image/x-jng                           jng;
    image/x-ms-bmp                        bmp;
    image/svg+xml                         svg svgz;
    image/webp                            webp;

    application/font-woff                 woff;
    application/java-archive              jar war ear;
    application/json                      json;
    application/mac-binhex40              hqx;
    application/msword                    doc;
    application/pdf                       pdf;
    application/postscript                ps eps ai; 
    application/rtf                       rtf;
    application/vnd.apple.mpegurl         m3u8;
    application/vnd.ms-excel              xls;
    application/vnd.ms-fontobject         eot;
    application/vnd.ms-powerpoint         ppt;
    application/vnd.wap.wmlc              wmlc;
    application/vnd.google-earth.kml+xml  kml;
    application/vnd.google-earth.kmz      kmz;
    application/x-7z-compressed           7z; 
    application/x-cocoa                   cco;
    application/x-java-archive-diff       jardiff;
    application/x-java-jnlp-file          jnlp;
    application/x-makeself                run;
    application/x-perl                    pl pm;
    application/x-pilot                   prc pdb;
    application/x-rar-compressed          rar;
    application/x-redhat-package-manager  rpm;
    application/x-sea                     sea;
    application/x-shockwave-flash         swf;
    application/x-stuffit                 sit;
    application/x-tcl                     tcl tk;
    application/x-x509-ca-cert            der pem crt;
    application/x-xpinstall               xpi;
    application/xhtml+xml                 xhtml;
    application/xspf+xml                  xspf;
    application/zip                       zip;

    application/octet-stream              bin exe dll;
    application/octet-stream              deb;
    application/octet-stream              dmg;
    application/octet-stream              iso img;
    application/octet-stream              msi msp msm;

    application/vnd.openxmlformats-officedocument.wordprocessingml.document    docx;
    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet          xlsx;
    application/vnd.openxmlformats-officedocument.presentationml.presentation  pptx;

    audio/midi                            mid midi kar;
    audio/mpeg                            mp3;
    audio/ogg                             ogg;
    audio/x-m4a                           m4a;
    audio/x-realaudio                     ra;

    video/3gpp                            3gpp 3gp;
    video/mp2t                            ts;
    video/mp4                             mp4;
    video/mpeg                            mpeg mpg;
    video/quicktime                       mov;
    video/webm                            webm;
    video/x-flv                           flv;
    video/x-m4v                           m4v;
    video/x-mng                           mng;
    video/x-ms-asf                        asx asf;
    video/x-ms-wmv                        wmv;
    video/x-msvideo                       avi;
}

4.2 自定义 Access 日志

与 error_log 不同的是,Nginx 进程运行时访问日志,由 Nginx 提供服务过程中应答前端请求的日志。

Nginx 服务器支持对服务日志的格式、大小、输出等进行配置,需要使用两个配置 log_formataccess_log

配置日志格式的语法是:

log_format format_name 'set_of_variables_to_define_format';

并且配置访问日志的语法是:

access_log /path/to/log_file format_name;		#simplest form 
//OR
access_log /path/to/log_file [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];

4.2.1 log_format

自定义日志格式

log_format format_name 'set_of_variables_to_define_format';
  • format_name : 给定义的格式起的名称,应该是全局唯一的
  • set_of_variables_to_define_format自定义格式化字符串,也可以增删部分参数

默认的配置格式

    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  /var/log/nginx/access.log  main;

实际产生的日志

123.151.43.110 - - [02/Aug/2018:03:30:16 +0800] "GET / HTTP/1.1" 200 3700 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36" "-"

常见的内置变量

$remote_addr, $http_x_forwarded_for 记录客户端IP地址
$remote_user 记录客户端用户名称
$request 记录请求的URL和HTTP协议
$status 记录请求状态
$body_bytes_sent 发送给客户端的字节数,不包括响应头的大小; 该变量与Apache模块mod_log_config里的“%B”参数兼容。
$bytes_sent 发送给客户端的总字节数。
$connection 连接的序列号。
$connection_requests 当前通过一个连接获得的请求数量。
$msec 日志写入时间。单位为秒,精度是毫秒。
$pipe 如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。
$http_referer 记录从哪个页面链接访问过来的
$http_user_agent 记录客户端浏览器相关信息
$request_length 请求的长度(包括请求行,请求头和请求正文)。
$request_time 请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
$time_iso8601 ISO8601标准格式下的本地时间。
$time_local 通用日志格式下的本地时间。

4.2.2 access_log

access_log path [format [buffer=size]];
  • path, 配置服务日志的文件存放路劲及名称
  • format 可选,自定义日志格式,也可以通过 log_format 配置指定好,直接引用格式名
  • size 临时存放日志的内存缓存区大小

可以使用同一级别的access_log指令指定多个日志,两个日志文件都会被记录

access_log /var/log/nginx/access.log;
access_log /var/log/nginx/custom_log custom;

如果要取消记录日志功能,使用

access_log off;

4.3.3 error_log

前面在全局模块已经提到过error_log命令,和access_log类似,error_log也是设置记录日志的指令。不过它记录的是错误日志。

该指令在 http, stream, server 和 location 段都可以被指定,可以覆盖更外面的段的设置。

error_log file | stderr [debug | info | notice | warn | error |crit | alert | emerg];

这些问题属于不同的严重程度级别: 调试 , 信息 , 通知 , 警告 , 错误 (这是默认级别,全球工作), 暴击 , 警报或重大事件 。

例如:

error_log /var/log/nginx/error_log warn; 

这将指示Nginx记录所有类型警告和更严重的日志级别暴击 , 警报和emerg消息的消息。

在下一个示例中,将会记录暴击 , 警报和紧急级别的消息。

error_log /var/www/example1.com/log/error_log crit;

和access_log类似,可以使用同一级别的error_log指令指定多个日志,两个日志文件都会被记录

error_log  /var/www/example1.com/log/error_log  warn;
error_log  /var/log/nginx/example1.error_log  crit;

4.4 sendfile

当一个程序需要传输文件时,Linux内核首先将文件数据缓冲,然后将文件数据传送给程序缓冲,最后程序将文件数据传输到目的地。Sendfile方法是一种数据传输的更高效的方法,数据在内核中的文件描述符之间传输,而不需要将数据传输给程序缓冲。这种方法的结果是改善了对操作系统资源的利用。

我们可以用sendfile directive来启用sendfile方法,在http,server,location三个模块都可以定义。

http {
 sendfile on ;
}

默认情况下,sendfile 的值是on。

4.5 配置连接超时时间

用户连接回话连接后, Nginx 服务器可以保持打开一段时间,在超过这个时间之后,服务器会关闭该连接。

keepalive_timeout timeout [header_timeout];
  • timeout 对连接的保持时间
  • header_timeout 可选,在 Response 头部 Keep-Alive 域设置超时时间

示例

keepalive_timeout 120s 100s;

5. server模块

erver模块是http的子模块,它用来定一个虚拟主机,我们先讲最基本的配置,这些在后面再讲。下面是一个简单的server

server{
    server_name www.xxx.cn xxx.cn;
    listen 80; 
    #工程根目录
    root /data/laravel-vue/public/;
    charset UTF-8;
    #日志文件位置,自己选择
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    index index.php index.html index.htm;

    #error_page 500 502 503 504 404 /missing.html;
    #error_page 403 =404 /missing.html;

    location / { 
        try_files $uri $uri/ /index.php$is_args$args;
    }   

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }   
}

1、server 标志定义虚拟主机开始。

2、listen 用于指定虚拟主机的服务端口。

监听端口,默认80,小于1024的要以root启动。可以为listen *:80、listen 127.0.0.1:80等形式。

同时监听IPv4和IPv6地址

listen [::]:80;

但是从nginx 1.3某个版本起,上面语句只是监听ipv4地址,因为有个参数ipv6only是默认打开的,上面就相当于

listen [::]:80 ipv6only=on;  #改版后,只是监听ipv6地址了

所以要同时监听ipv4和ipv6

listen 80;
listen [::]:80;

3、server_name 用来指定IP地址或者域名

多个域名之间用空格分,还可以使用通配符 * ,但通配符只能放到首尾,server_name中还能使用正则表达式,使用 ~ 开始

server_name ~^ww\d+\.einverne\.info$;

匹配 ww1.einverne.info 但不匹配 www.einverne.info

对于不同的匹配方式,Nginx 按照如下优先级选择虚拟主机

准确匹配 server_name
通配符在开始时匹配 server_name 成功
通配符在结尾时匹配 server_name 成功
正则表达式匹配

在以上四种匹配方式中,如果 server_name 被处于同一优先级匹配方式匹配多次成功,则首次匹配成功的虚拟主机处理请求。

4、root 表示在这整个server虚拟主机内,全部的root web根目录。

5、index 全局定义访问的默认首页地址。

当找不到时候,会尝试按照index 指令后面定义的顺序查找文件,有则按照找到的文件运行。

index index.php index.html index.htm;

先查找 index.php,然后index.html ,最后index.htm

6、charset 用于设置网页的默认编码格式。

7、access_log 和 error_log 用来指定此虚拟主机的日志存放路径,前面说的比较详细了,这里的优先级高于http块。

6 location块

location模块是nginx中用的最多的,也是最重要的模块了,什么负载均衡、反向代理等都与它相关,location根据它字面意思就知道是来定位的,定位URL,解析URL。

下面分析一份平常在用的站点配置。

server{
    server_name www.xxx.cn xxx.cn;
    listen 80; 
    #工程根目录
    root /data/laravel-vue/public/;
    charset UTF-8;
    #日志文件位置,自己选择
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    index index.php index.html index.htm;

    #error_page 500 502 503 504 404 /missing.html;
    #error_page 403 =404 /missing.html;

    location / { 
        #第一种写法
        try_files $uri $uri/ /index.php$is_args$args;
        #第二种写法
        #try_files $uri $uri/ /index.php?$query_string;
    }   

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        #第一种写法
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    #第二种写法,区别在于第一种,include引入的配置已经包括上面的参数
    # include fastcgi.conf;
    }   
}

分析下上面的配置,

1、 location / 是一个通用配置,如果没有优先级更高的匹配则都会走到这个通用路由下,

2、 try_files指令负责了重定向操作,

实际上这里做了动静分离,静态文件直接去相应目录拿,动态文件进行改写

如果是$uri$uri/的形式,则直接匹配到相应文件,找不到静态文件,则会尝试按照index的顺序,后置加上后进行匹配,比如这里首先匹配index.php,如果匹配上则送入location ~ \.php$路由下。

如果不是$uri$uri/的形式的话,则中间加个index.php,然后拼接上和参数,此时有了index.php,根据匹配规则会被送到location ~ \.php$路由下。

3、 location ~ \.php$用来处理php动态语言

我们启动php-fpm,监听9000端口

fastcgi_pass 127.0.0.1:9000;

就是说将请求转发到9000端口,交给php-fpm处理,此时从nginx到php-fpm可能有点语言不通,需要翻一下,所以就有了下面的引入参数

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;

还有另一种写法,这里面已经包括了SCRIPT_FILENAME参数

include fastcgi.conf;

7. 其它一些问题

上面介绍了nginx的基本配置,这一章节探讨一些没有讲到的问题。

7.1 alias目录和root目录的区别:

配置demo:

    location /test.html {
        root /data/ceshi/;
        # root /data/ceshi;路径结尾加不加/,不影响结果
    }   
    
    location /xx/test.html {
        root /data/ceshi/;
    }   
  • 浏览器访问 xxx.com/test.html,实际访问的是 /data/ceshi/test.html
  • 浏览器访问 xxx.com/xx/test.html,实际访问的是 /data/ceshi/xx/test.html

结论: root属性,会把root的值(这里是yyy)加入到访问路径(locaition)之前
配置demo:

location  /xxx {
    alias /data/ceshi/;    
    # alias /data/ceshi; 查看资料说必须加上/,否则会找不到文件,实测可以找到,这里自己可以尝试下。
}

  • 浏览器访问 xxx.com/xxx,实际访问的是 /data/ceshi
  • 浏览器访问 xxx.com/xxx/test.html,实际访问的是 /data/ceshi/test.html

结论:alias属性,和root的逻辑不通,会把alias的值(这里/data/ceshi/)替代访问路径匹配的部分(这里是/xxx)

7.2 在写location的时候,匹配url,加不加 /的探讨

location /test/location /test 为例

测试1:

    location / { 
        return 601; 
        try_files $uri /index.php$is_args$args; 
    }   
 
    location /test { 
        return 602; 
    }   
 
    location /test/ { 
        return 603; 
    }   

访问 http://xxx.com/test   => 602

访问 http://xxx.com/test/   => 603

测试2:

    location / { 
        return 601; 
        try_files $uri /index.php$is_args$args; 
    }   
 
    location /test { 
        return 602; 
    }   

访问 http://xxx.com/test   => 602

访问 http://xxx.com/test/   => 602

测试3:

    location / { 
        return 601; 
        try_files $uri /index.php$is_args$args; 
    }   
 
    location /test/ { 
        return 603; 
    }   

访问 http://xxx.com/test   => 601

访问 http://xxx.com/test/   => 603

7.3 nginx中的变量

$arg_name
请求中的的参数名,即“?”后面的arg_name=arg_value形式的arg_name

$args
请求中的参数值

$binary_remote_addr
客户端地址的二进制形式, 固定长度为4个字节

$body_bytes_sent
传输给客户端的字节数,响应头不计算在内;这个变量和Apache的mod_log_config模块中的“%B”参数保持兼容

$bytes_sent
传输给客户端的字节数 (1.3.8, 1.2.5)

$connection
TCP连接的序列号 (1.3.8, 1.2.5)

$connection_requests
TCP连接当前的请求数量 (1.3.8, 1.2.5)

$content_length
“Content-Length” 请求头字段

$content_type
“Content-Type” 请求头字段

$cookie_name
cookie名称

$document_root
当前请求的文档根目录或别名

$document_uri
同 $uri

$host
优先级如下:HTTP请求行的主机名>”HOST”请求头字段>符合请求的服务器名

$hostname
主机名

$http_name
匹配任意请求头字段; 变量名中的后半部分“name”可以替换成任意请求头字段,如在配置文件中需要获取http请求头:“Accept-Language”,那么将“-”替换为下划线,大写字母替换为小写,形如:$http_accept_language即可。

$https
如果开启了SSL安全模式,值为“on”,否则为空字符串。

$is_args
如果请求中有参数,值为“?”,否则为空字符串。

$limit_rate
用于设置响应的速度限制,详见 limit_rate。

$msec
当前的Unix时间戳 (1.3.9, 1.2.6)

$nginx_version
nginx版本

$pid
工作进程的PID

$pipe
如果请求来自管道通信,值为“p”,否则为“.” (1.3.12, 1.2.7)

$proxy_protocol_addr
获取代理访问服务器的客户端地址,如果是直接访问,该值为空字符串。(1.5.12)

$query_string
同 $args

$realpath_root
当前请求的文档根目录或别名的真实路径,会将所有符号连接转换为真实路径。

$remote_addr
客户端地址

$remote_port
客户端端口

$remote_user
用于HTTP基础认证服务的用户名

$request
代表客户端的请求地址

$request_body
客户端的请求主体
此变量可在location中使用,将请求主体通过proxy_pass, fastcgi_pass, uwsgi_pass, 和 scgi_pass传递给下一级的代理服务器。

$request_body_file
将客户端请求主体保存在临时文件中。文件处理结束后,此文件需删除。如果需要之一开启此功能,需要设置client_body_in_file_only。如果将次文件传递给后端的代理服务器,需要禁用request body,即设置proxy_pass_request_body off,fastcgi_pass_request_body off, uwsgi_pass_request_body off, or scgi_pass_request_body off 。

$request_completion
如果请求成功,值为”OK”,如果请求未完成或者请求不是一个范围请求的最后一部分,则为空。

$request_filename
当前连接请求的文件路径,由root或alias指令与URI请求生成。

$request_length
请求的长度 (包括请求的地址, http请求头和请求主体) (1.3.12, 1.2.7)

$request_method
HTTP请求方法,通常为“GET”或“POST”

$request_time
处理客户端请求使用的时间 (1.3.9, 1.2.6); 从读取客户端的第一个字节开始计时。

$request_uri
这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI,不包含主机名,例如:”/cnphp/test.php?arg=freemouse”。

$scheme
请求使用的Web协议, “http” 或 “https”

$sent_http_name
可以设置任意http响应头字段; 变量名中的后半部分“name”可以替换成任意响应头字段,如需要设置响应头Content-length,那么将“-”替换为下划线,大写字母替换为小写,形如:$sent_http_content_length 4096即可。

$server_addr
服务器端地址,需要注意的是:为了避免访问linux系统内核,应将ip地址提前设置在配置文件中。

$server_name
服务器名,www.cnphp.info

$server_port
服务器端口

$server_protocol
服务器的HTTP版本, 通常为 “HTTP/1.0” 或 “HTTP/1.1”

$status
HTTP响应代码 (1.3.2, 1.2.2)

$tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, $tcpinfo_rcv_space
客户端TCP连接的具体信息

$time_iso8601
服务器时间的ISO 8610格式 (1.3.12, 1.2.7)

$time_local
服务器时间(LOG Format 格式) (1.3.12, 1.2.7)

$uri
请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改,$uri不包含主机名,如”/foo/bar.html”。

参考资料

https://www.jianshu.com/p/bed000e1830b

http://www.cnphp.info/nginx-embedded-variables-lasted-version.html

posted @ 2018-12-04 20:44  archer-wong  阅读(657)  评论(0编辑  收藏  举报