nginx

nginx介绍

Nginx (engine x) 是一个高性能的HTTP反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东新浪网易腾讯淘宝等。

正向代理

我们常说的代理也就是只正向代理,正向代理的过程,它隐藏了真实的请求客户端,服务端不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替来请求,某些工具扮演的就是典型的正向代理角色。用浏览器访问http://www.google.com 时,被残忍的block,于是你可以在国外搭建一台代理服务器,让代理帮我去请求google.com,代理把请求返回的相应结构再返回给我。

反向代理

反向代理隐藏了真实的服务端,当我们请求 www.baidu.com 的时候,就像拨打10086一样,背后可能有成千上万台服务器为我们服务,但具体是哪一台,你不知道,也不需要知道,你只需要知道反向代理服务器是谁就好了,www.baidu.com 就是我们的反向代理服务器,反向代理服务器会帮我们把请求转发到真实的服务器那里去。Nginx就是性能非常好的反向代理服务器,用来做负载均衡。

 nginx安装

 

[root@localhost var]# yum install epel-release
[root@localhost var]# yum install nginx -y 

Nginx的默认网站目录是

/usr/share/nginx/html

nginx配置文件构成

nginx配置文件默认是在/etc/nginx/nginx.conf

nginx.conf是由多个块组成,最外面的块是main,main包含events和http,http包含upstream和多个server,server又包含多个location

main:全局设置,影响其他所有设置
server:主要用于指定主机和端口
upstream:主要用于负载均衡,设置一系列后端的服务器
location:匹配网页位置
这四者之间的关系式:server继承main,location继承server,upstream既不会继承其他设置也不会被继承。

nginx配置文件相关参数

user是个主模块指令,指定Nginx Worker进程运行用户以及用户组,默认由nobody账号运行。
worker_processes是个主模块指令,指定了Nginx要开启的进程数。每个Nginx进程平均耗费10M~12M内存。建议指定和CPU的数量一致即可。
error_log是个主模块指令,用来定义全局错误日志文件。日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少。
pid是个主模块指令,用来指定进程pid的存储文件位置。
include是个主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度
log_format是Nginx的HttpLog模块指令,用于指定Nginx日志的输出格式。main为此日志输出格式的名称,可以在下面的access_log指令中引用。
sendfile开启高效文件传输模式
tcp_nopush开启防备网络阻塞,减少网络报文段的数量
tcp_nodelay等待多个字节组合成一个数据包,从而提高I/O性能
keepalive_timeout连接超时时间,单位是秒
types_hash_max_size影响散列表的冲突率。types_hash_max_size越大,就会消耗更多的内存,但检索速度就更快。types_hash_max_size越小,消耗的内存就越小,但检索速度可能会变慢
default_type默认的文件类型

 

负载均衡

在/etc/nginx/nginx.conf配置文件中添加和修改以下内容

upstream 192.168.254.12 {
    server 192.168.254.13:80 weight=1;
    server 192.168.254.14:80 weight=3;
}

location / {
    proxy_pass http://192.168.254.12;
    index index.html index.htm;
}

可跟参数

轮询(默认):    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响;
Weight:        指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下;
down:            表示当前的server暂时不参与负载均衡;
backup:        预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻;

nginx高可用(探活)

第一步,安装依赖包

[root@lb02 ~]# yum install -y gcc glibc gcc-c++ prce-devel openssl-devel pcre-devel patch

第二步,下载源码包和支持探活的第三方模块

[root@lb02 ~]# wget http://nginx.org/download/nginx-1.16.1.tar.gz
[root@lb02 ~]# wget https://github.com/yaoweibin/nginx_upstream_check_module/archive/master.zip

第三步,解压源码包和第三方模块

[root@lb02 ~]# tar xf nginx-1.16.1.tar.gz
[root@lb02 ~]# unzip master.zip

第四步,进入nginx目录,打补丁(nginx的版本是1.14补丁就选择1.14的,p1代表在nginx目录,p0是不在nginx目录)

[root@lb02 ~]# cd nginx-1.16.1/
[root@lb02 nginx-1.14.2]# patch -p1 <../nginx_upstream_check_module-master/check_1.16.1+.patch

第五步,编译nginx和第三方模块

./configure --prefix=/usr/local/nginx --add-module=/root/nginx-1.16.1/modules/nginx_upstream_check_module-master 
make && make install

第六步,进入到nginx安装目录配置nginx.conf文件

添加如下内容

http {
    ....
    upstream nginx_test_api {
        server 127.0.0.1:81;
        server 127.0.0.1:82;
        server 127.0.0.1:83;
        server 127.0.0.1:84;

        check interval=2000 rise=2 fall=2 timeout=1000 type=http;
    } 
    ....
    server {
        ....
        location ^~ /melocal/ {
            proxy_pass http://nginx_test_api/;
        }
        location /upstream_status {
                check_status;
        }
        ....
    }
}

第七步,打开浏览器可以看到upstream健康状态

我们关掉一个机器端口然后测试一下

nginx动静分离

环境:

nginx调度:192.168.254.128
后端server1:192.168.254.129
后端server2:192.168.254.130

192.168.254.128 编辑nginx配置文件,在server中添加如下内容

#静态送给129处理
location ~ \.(html|gif|jpg|jpeg)$ {
    proxy_pass http://192.168.254.129;
    index index.html;
}

#动态送给130处理
location ~ \.php$ {
    proxy_pass http://192.168.254.130;
    index index.php;
}


#如果静态请求想交给自己处理可以这样修改 location
~*.(html|gif|jpg|jpeg)$ { root /var/www/html; index index.html index.htm; }

验证

 

 

 

 ok,没问题

说明

以 = 开头,表示精确匹配;如只匹配根目录结尾的请求,后面不能带任何字符串。
以^~ 开头,表示uri以某个常规字符串开头,不是正则匹配
以~ 开头,表示区分大小写的正则匹配;
以~* 开头,表示不区分大小写的正则匹配
以/开头,通用匹配, 如果没有其它匹配,任何请求都会匹配到

rewrite用法

以下为例子,只要url后缀带/static都会被跳转到百度这个网站

location /static {
    rewrite ^ https://www.baidu.com;
}

 高并发优化

  • 像逻辑思维里吴军说的,要知道一件事物的上限,才不会干傻事
  • nginx设计时,是计划支持1万并发的
  • 当然,最终达到了并且超过了,一般,2、3万没有问题,优化得好4万也许可以,但是如果领导让你配置成10万(单台),最好直接拒绝掉他
  • 要支撑高并发,除了nginx配置的优化,还有一个很重要的,就是操作系统内核参数的优化
  • 这两个是缺一不可的,不要觉得nginx的配置已经优化了就ok了
  • 操作系统这里都是默认linux的
  • 高并发,说的都是生产环境,既然是生产环境,一般不会用windows或者mac的,所以说的都是linux
  • 所以优化的时候,如果程序员负责nginx配置,那么系统员就要负责操作系统了,如果是同一个人负责就最好了

nginx优化

nginx的配置文件如下:

user www-data;
pid /run/nginx.pid;

worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
worker_rlimit_nofile 65535;


events {
        use epoll;
        worker_connections 65535;
        accept_mutex off;
        multi_accept off;

}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 60 50;
        send_timeout 10s;
        types_hash_max_size 2048;
        client_header_buffer_size 4k;
        client_max_body_size 8m;

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

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Gzip Settings
        ##

        gzip on;
        gzip_disable "msie6";
        gzip_min_length 1024;
        gzip_vary on;
        gzip_comp_level 2;
        gzip_buffers 32 4k;
        gunzip_static on;
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;


        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

 

worker_processes

worker_processes用来设置Nginx服务的进程数。推荐是CPU内核数或者内核数的倍数,推荐使用CPU内核数,因为我的CPU为4核的,所以设置为4。

其实,我更推荐的是配置auto。因为既然根据cpu来,何必先看看cpu是多少,再配置上呢?
当然,如果和cpu核数不一样,那就不要配置auto了。

worker_cpu_affinity

默认情况下,Nginx的多个进程有可能跑在某一个CPU或CPU的某一核上,导致Nginx进程使用硬件的资源不均,因此绑定Nginx进程到不同的CPU上是为了充分利用硬件的多CPU多核资源的目的。
worker_cpu_affinity用来为每个进程分配CPU的工作内核,参数有多个二进制值表示,每一组代表一个进程,每组中的每一位代表该进程使用CPU的情况,1代表使用,0代表不使用。所以我们使用worker_cpu_affinity 0001 0010 0100 1000;来让进程分别绑定不同的核上。

worker_connections

设置一个进程理论允许的最大连接数,理论上越大越好,但不可以超过worker_rlimit_nofile的值。还有个问题,linux系统中有个指令open file resource limit,它设置了进程可以打开的文件句柄数量,可以用下面的指令查看你的linux系统中open file resource limit指令的值,cat /proc/sys/fs/file-max
可以将该指令设置为23900251

echo2390251” > /proc/sys/fs/file-max; sysctl -p

 

worker_rlimit_nofile

设置毎个进程的最大文件打开数。如果不设的话上限就是系统的ulimit –n的数字,一般为65535。

use epoll

设置事件驱动模型使用epoll。事件驱动模型有select、poll、poll等。

select先创建事件的描述符集合,对于一个描述符,可以关注其上面的Read事件、Write事件以及Exception事件,所以要创建三类事件描述符集合,分别用来处理Read事件的描述符、Write事件的描述符、Exception事件的描述符,然后调用底层的select()函数,等待事件发生,轮询所有事件描述符集合的每一个事件描述符,检查是否有事件发生,有的话就处理。select效率低,主要是轮询效率低,而且还要分别轮询三个事件描述符的集合。
poll方法与select类似,都是先创建一个关注事件的描述符集合,再去等待这些事件发生,然后再轮询描述符集合,检查有无事件发生,如果有,就去处理。不同点是poll为Read事件、Write事件以及Exception事件只创建一个集合,在每个描述符对应的结构上分别设置Read事件、Write事件以及Exception事件。最后轮询的时候,可以同时检察权这三个事件是否发生。可以说,poll库是select库的优化实现。
epoll是Nginx支持的高性能事件驱动库之一。是公认的非常优秀的事件驱动模型。和poll库跟select库有很大的不同,最大区别在于效率。我们知道poll库跟select库都是创建一个待处理的事件列表,然后把这个列表发给内核,返回的时候,再去轮询检查这个列表,以判断事件是否发生。这样在描述符多的应用中,效率就显得比较低下了。一种比较好的方式是把列表的管理交由内核负责,一旦某种事件发生,内核就把发生事件的描述符列表通知给进程,这样就避免了轮询整个描述符列表。首先,epoll库通过相关调用同志内核创建一个有N个描述符的事件列表,然后给这些描述符设置所关注的事件,并把它添加到内核的事件列表中去。完成设置以后,epoll库就开始等待内核通知事件发生了,某一事件发生后,内核讲发生事件的描述符列表上报给epoll库,得到事件列表的epoll库,就可以进行事件处理了。epoll库在linux平台是高效的,它支持一个进程打开大数目的事件描述符,上限是系统可以打开文件的最大数目;同时,epoll库的IO效率不随描述符数量的增加而线性下降,因为它只会对内核上报的活跃的描述符进行操作。

accept_mutex

这个牵扯到《UNIX网络编程》第一卷中提到的“惊群”问题(Thundering herd problem),大致意思是当某一时刻只有一个网络连接到来时,多个睡眠进程会被同时叫醒,但只有一个进程可获得连接,如果每次唤醒的进程数目太多,会影响一部分系统性能。在Nginx服务器的多进程下,就可能出现这个问题,为了解决这个问题,Nginx配置了包含这样一条指令accept_mutex,当其设置为开启的时候,将会对多个Nginx进程接受连接进行序列化,防止多个进程对连接的争抢。当服务器连接数不多时,开启这个参数会让负载有一定程度的降低。但是当服务器的吞吐量很大时,为了效率,请关闭这个参数;并且关闭这个参数的时候也可以让请求在多个worker间的分配更均衡。所以我们设置accept_mutex off;

sendfile

使用开启或关闭是否使用sendfile()传输文件,普通应用应该设为on,下载等IO重负荷的应用应该设为off,因为大文件不适合放到buffer中。
传统文件传输中(read/write方式)在实现上3其实是比较复杂的,需要经过多次上下文切换,当需要对一个文件传输时,传统方式是:

调用read函数,文件数据被copy到内核缓冲区
read函数返回,数据从内核缓冲区copy到用户缓冲区
write函数调用,将文件数据从用户缓冲区copy到内核与socket相关的缓冲区
数据从socket缓冲区copy到相关协议引擎
从上面可以看出来,传统readwrite进行网络文件传输的方式,在过程中经历了四次copy操作。
硬盘->内核buffer->用户buffer->socket相关缓冲区->协议引擎
而sendfile系统调用则提供了一种减少多次copy,提高文件传输性能的方法。流程如下:

sendfile系统效用,文件数据被copy至内核缓冲区
记录数据文职和长度相关的数据保存到socket相关缓存区
实际数据由DMA模块直接发送到协议引擎

tcp_nopush

sendfile为on时这里也应该设为on,数据包会累积一下再一起传输,可以提高一些传输效率。

tcp_nodelay

小的数据包不等待直接传输。默认为on。
看上去是和tcp_nopush相反的功能,但是两边都为on时nginx也可以平衡这两个功能的使用。

keepalive_timeout

HTTP连接的持续时间。设的太长会使无用的线程变的太多。这个根据自己服务器访问数量、处理速度以及网络状况方面考虑。

send_timeout

设置Nginx服务器响应客户端的超时时间,这个超时时间只针对两个客户端和服务器建立连接后,某次活动之间的时间,如果这个时间后,客户端没有任何活动,Nginx服务器将关闭连接,将其设置为10s,Nginx与客户端建立连接后,某次会话中服务器等待客户端响应超过10s,就会自动关闭。

types_hash_max_size

types_hash_max_size影响散列表的冲突率。types_hash_max_size越大,就会消耗更多的内存,但散列key的冲突率会降低,检索速度就更快。types_hash_max_size越小,消耗的内存就越小,但散列key的冲突率可能上升。

client_header_buffer_size

该指令用于设置Nginx服务器允许的客户端请求头部的缓冲区大小,默认为1KB,此指令的赋值可以根据系统分页大小来设置,分页大小可以用以下命令获取getconf PAGESIZE。

client_max_body_size 8m

客户端上传的body的最大值。超过最大值就会发生413(Request Entity Too Large)错误。默认为1m,最好根据自己的情况改大一点。

gzip on

启用gzip,对响应数据进行在线实时压缩,减少数据传输量。

gzip_disable

Nginx服务器在响应这些种类的客户端请求时,不使用Gzip功能缓存应用数据,gzip_disable "msie6"对IE6浏览器的数据不进行GZIP压缩。

gzip_min_length

Gzip压缩功能对大数据的压缩效果明显,但是如果压缩很小的数据,可能出现越压缩数据量越大的情况,因此应该根据相应页面的大小,选择性开启或者关闭Gzip功能。建议将值设置为1KB。

gzip_comp_level

设置压缩程度,包括级别1到级别9,级别1表示压缩程度最低,压缩效率最高;级别9表示压缩程度最高,压缩效率最低,最费时间。

gzip_vary

用于设置在使用Gzip功能时是否发送带有“Vary:Accept-Encoding”头域的响应头部,该头域的主要功能是告诉接收方发送的数据经过了压缩处理,开启后端效果是在响应头部Accept-Encoding: gzip,对于本身不支持Gzip的压缩的客户端浏览器是有用的。

gzip_buffers;

该指令用于设置Gzip压缩文件使用存储空间的大小,
语法gzip_buffers number size;number,指定Nginx服务器需要向系统申请存储空间的个数,size,指定每个缓存空间的大小。根据配置项,Nginx服务器在对响应输出数据进行Gzip压缩时需向系统申请numbersize大小的空间用于存储压缩数据。默认情况下,numbersize的值为128,其中size的值为系统内存页一页的大小,用getconf PAGESIZE来获取

gunzip_static

开启时,如果客户端浏览器不支持Gzip处理,Nginx服务器将返回解压后的数据,如果客户端浏览器支持Gzip处理,Nginx服务器忽略该指令设置。仍然返回压缩数据。

gzip_types

Nginx服务器可以根据MIME类型选择性开启Gzip压缩功能。该指令涌来设置MIME类型。

操作系统优化

把如下的参数追加到Linux系统的/etc/sysctl.conf文件中,然后使用如下命令使修改生效:/sbin/sysctl -p

net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1

net.core.netdev_max_backlog参数

参数net.core.netdev_max_backlog,表示当每个网络接口接受数据包的速率比内核处理这些包的速率快时,允许发送队列的数据包的最大数目,我们调整为262144.

net.core.somaxconn

该参数用于调节系统同时发起的TCP连接数,一般默认值为128,在客户端高并发的请求的情况下,该默认值较小,可能导致连接超时或者重传问题,我们可以根据实际情况结合并发数来调节此值。

net.ipv4.tcp_max_orphans

该参数用于设定系统中最多允许存在多少TCP套接字不被关联到任何一个用户文件句柄上,如果超过这个数字,没有与用户文件句柄关联到TCP套接字将立即被复位,同时发出警告信息,这个限制只是为了简单防治Dos攻击,一般系统内存充足的情况下,可以增大这个参数。

net.ipv4.tcp_max_syn_backlog

该参数用于记录尚未收到客户端确认信息的连接请求的最大值,对于拥有128内存的系统而言,此参数的默认值为1024,对小内存的系统则是128,一般在系统内存比较充足的情况下,可以增大这个参数的赋值。

net.ipv4.tcp_timestamps

该参数用于设置时间戳,这个可以避免序列号的卷绕,在一个1Gb/s的链路上,遇到以前用过的序列号概率很大,当此值赋值为0时,警用对于TCP时间戳的支持,默认情况下,TCP协议会让内核接受这种异常的数据包,针对Nginx服务器来说,建议将其关闭。

net.ipv4.tcp_synack_retries

该参数用于设置内核放弃TCP连接之前向客户端发送SYN+ACK包的数量,为了建立对端的连接服务,服务器和客户端需要进行三次握手,第二次握手期间,内核需要发送SYN并附带一个回应前一个SYN的ACK,这个参数主要影响这个过程,一般赋予值为1,即内核放弃连接之前发送一次SYN+ACK包。

net.ipv4.tcp_syn_retries

该参数的作用与上一个参数类似,设置内核放弃建立连接之前发送SYN包的数量,赋值为1。

 

如果是编译的nginx,想要添加到系统守护进程systemd,如下:

[root@VM-0-15-centos ~]# vim /usr/lib/systemd/system/nginx.service 
[Unit]
Description=nginx
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPost=/bin/sleep 0.1
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

 

 

 

 

补充说明

4.部署nginx高可用时,upstream_name后面加/与不加/的区别
    1)如果不加/,那么我们在请求时应该为curl http://ip:port/melocal/.....
        location ^~ /melocal/ {
            proxy_pass http://upstream_name/;
        }
    2)如果加/,那么我们在请求时应该为curl http://ip:port/melocal/melocal.....
        location ^~ /melocal/ {
            proxy_pass http://upstream_name;
        }

 

 

真实的nginx.conf文件配置

[op@media-nginx-01 conf]$ cat nginx.conf
user  www;
worker_processes  auto;

error_log  /xx/logs/nginx/error.log;
error_log  /xx/logs/nginx/error.log  notice;
error_log  /xx/logs/nginx/error.log  info;

worker_rlimit_nofile 65535;

events {
    worker_connections  10240;
}


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

    log_format  main  '$server_name $host $remote_addr - $remote_user [$time_local] [$msec] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" $http_x_forwarded_for $request_time';
    access_log  /xx/logs/nginx/access.log  main;

    set_real_ip_from   1.64.0.0/10;
    set_real_ip_from   1.64.0.0/10;
    set_real_ip_from   1.18.0.0/16;
    set_real_ip_from   1.12.0.0/16;
    set_real_ip_from   1.22.0.0/16;
    real_ip_header     X-Forwarded-For;

    server_tokens off;
    sendfile        on;
    tcp_nopush      on;
    keepalive_timeout  65;
    proxy_ignore_client_abort on;
    server_names_hash_max_size 512;
    server_names_hash_bucket_size 512;
    client_max_body_size 50m;
    client_body_buffer_size 1m;
    proxy_max_temp_file_size 0;
    proxy_headers_hash_max_size 51200;
    proxy_headers_hash_bucket_size 6400;

    include /xxx/server/nginx/conf/vhosts/*.conf;

}

 虚拟主机中配置https真是文件

server{
        listen 443;
        server_name     bbs.xxx.com;
        access_log      /xxx/logs/nginx/bbs.xxx.com_access.log main;
        error_log       /xxx/logs/nginx/bbs.xxx.com_error.log error;
        ssl on;
        ssl_certificate /xxx/server/nginx/ca/xxx.com.crt;
        ssl_certificate_key  /xxx/server/nginx/ca/xxx.com.key;
        ssl_session_timeout 5m;
        ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers  ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;

        location / {
                rewrite ^/(.*)$ http://bbs.xxx.com ;
        }
}

HTTP核心模块(HTTP Core)

alias

语法:alias file-path|directory-path;
默认值:no
使用字段:location
这个指令指定一个路径使用某个某个,注意它可能类似于root,但是document root没有改变,请求只是使用了别名目录的文件。

location /aaa {
    alias /data/html; 
}
#当访问my.test.com/aaa这个域名的时候会访问/data/html这个文件夹里的index.html
#如果访问my.test.com/aaa/a.jpg这个域名的时候,其实访问的是/data/html/a.jpg图片
location ~ ^/download/(.*)$ {
    alias /data/html/$1;
}
#~代表正则表达式匹配,并且区分大小写
#~*代表正则表达式匹配,不区分大小写
#^以....开头 #$以...结尾 #请求"/download/a.jpg"将返回"/data/html/a.jpg"。同样,也可以在别名目录字段中使用变量。

 

client_body_in_file_only

语法:client_body_in_file_only on|off
默认值:off
使用字段:http, server, location
指定是否将用户请求体存储到一个文件里。

 

 

 

 

 

 

变量

core module 支持一些内置的变量,与apache使用的变量相一致。
首先,一些变量代表了客户端请求头部的一些字段,如:$http_user_agent, $http_cookie等等。注意,由于这些变量会在请求中定义,所以可能无法保证他们是存在的或者说可以定义到一些别的地方(例如遵循一定的规范)。
除此之外,下列是一些其他变量:

$arg_PARAMETER

这个变量包含在查询字符串时GET请求PARAMETER的值。

$args

这个变量等于请求行中的参数。

$binary_remote_addr

二进制码形式的客户端地址。

$body_bytes_sent

未知。

$content_length

请求头中的Content-length字段。

$content_type

请求头中的Content-Type字段。

$cookie_COOKIE

cookie COOKIE的值。

$document_root

当前请求在root指令中指定的值。

$document_uri

与$uri相同。

$host

请求中的主机头字段,如果请求中的主机头不可用,则为服务器处理请求的服务器名称。

$is_args

如果$args设置,值为"?",否则为""。

$limit_rate

这个变量可以限制连接速率。

$nginx_version

当前运行的nginx版本号。

$query_string

与$args相同。

$remote_addr

客户端的IP地址。

$remote_port

客户端的端口。

$remote_user

已经经过Auth Basic Module验证的用户名。

$request_filename

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

$request_body

这个变量(0.7.58+)包含请求的主要信息。在使用proxy_pass或fastcgi_pass指令的location中比较有意义。

$request_body_file

客户端请求主体信息的临时文件名。

$request_completion

未知。

$request_method

这个变量是客户端请求的动作,通常为GET或POST。
包括0.8.20及之前的版本中,这个变量总为main request中的动作,如果当前请求是一个子请求,并不使用这个当前请求的动作。

$request_uri

这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI。

$scheme

HTTP方法(如http,https)。按需使用,例:

rewrite  ^(.+)$  $scheme://example.com$1  redirect;

$server_addr

服务器地址,在完成一次系统调用后可以确定这个值,如果要绕开系统调用,则必须在listen中指定地址并且使用bind参数。

$server_name

服务器名称。

$server_port

请求到达服务器的端口号。

$server_protocol

请求使用的协议,通常是HTTP/1.0或HTTP/1.1。

$uri

请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改。

 

 

posted @ 2019-11-12 22:26  力王7314  阅读(233)  评论(0编辑  收藏  举报