Nginx-http服务的常用配置
安装nginx
官方已经提供了安装的rpm包,可以直接拿来配置使用,
rpm包有两种,一种是稳定版本的rpm,另外一种是主线版本的rpm,比较新,但不稳定,具体查看http://nginx.org/en/linux_packages.html#stable。我们安装使用稳定版本。
先配置yum仓库
[root@test yum.repos.d]# vim nginx.repo #新建仓库文件
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/rhel/6/x86_64/#选择适合自己的系统
gpgcheck=0
enabled=1
#仓库配置在上面的官方配置文档中有指明
[root@test yum.repos.d]# yum repolist #查看仓库列表
仓库标识 仓库名称 状态
base CentOS-6 - Base - mirrors.aliyun.com 6,706
epel Extra Packages for Enterprise Linux 6 - x86_64 12,511
extras CentOS-6 - Extras - mirrors.aliyun.com 53
nginx nginx repo 104
updates CentOS-6 - Updates - mirrors.aliyun.com 1,308
repolist: 20,682
#在正式安装前,应该先安装一些开发包,nginx有些模型需要依赖一些开发包
[root@test yum.repos.d]# yum install pcre-devel openssl-devel zlib-devel
[root@test yum.repos.d]# useradd -r -s /sbin/nologin nginx #新建一个系统用户,并且不应该让它登陆系统
#接下来,正式通过yum安装nginx
[root@test yum.repos.d]# yum install nginx -y
....
已安装:
nginx.x86_64 0:1.14.0-1.el6.ngx
完毕!
程序环境
配置文件的组成部分:
主配置文件:nginx.conf
include conf.d/*.conf #配置片段文件夹
fastcgi, uwsgi,scgi等协议相关的配置文件
mime.types:支持的mime类型
主程序文件:/usr/sbin/nginx
配置Nginx说明
Nginx命令
常用的有几个,说明下
[root@test nginx]# nginx -h
nginx version: nginx/1.14.0
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
Options:
-?,-h : this help
-v : show version and exit #显示版本
-V : show version and configure options then exit #显示版本号以及编译选项
-t : test configuration and exit #检查配置文件
-T : test configuration, dump it and exit #检查配置文件,并输出配置
-q : suppress non-error messages during #静默模式,不输出任何信息
configuration testing
-s signal : send signal to a master process: stop, quit, reopen, reload #常用,发送信号给主进程,stop, quit, reopen, reload
-p prefix : set prefix path (default: /etc/nginx/) #设置nginx的prefix
-c filename : set configuration file (default: /etc/nginx/nginx.conf) #指定配置文件,即使用指定的配置文件
-g directives : set global directives out of configuration file #
例如:
#查看nginx编译参数
[root@test nginx]# nginx -V
nginx version: nginx/1.14.0
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
#运行时,重载配置。
[root@test ~]# nginx -s reload
当运行此命令重载配置时,Nginx首先会检查配置语法,然后载入配置,主进程fork新进程,然后发送quit信号给旧的子进程,子进程收到quit信号后,停止接受新请求,然后处理完手上的任务,然后再结束。
#运行时,优雅关闭进程
[root@test ~]# nginx -s quit
#运行时,快速关闭进程
[root@test ~]# nginx -s stop
Nginx配置格式
Nginx的配置格式如下:
#配置:
主配置文件的配置指令:
directive value [value2 ...];
几个注意地方:
(1) 指令必须以分号结尾;
(2) 支持使用配置变量;
#Nginx配置支持使用变量,有两类。
内建变量:由Nginx模块引入,可直接引用;
自定义变量:由用户使用set命令定义;
set variable_name value;
引用变量:$variable_name
}
Nginx模块
Nginx高度模块化,由一个核心模块和一系列的功能模块组成。
Nginx的模块基本分为3种,核心模块、标准模块和第三方模块。
核心模块
主要是用于提供全局应用的基本功能,例如配置Nginx的工作特性等等等,核心的功能都在此模块种配置。
官方的核心模块配置详细说明:http://nginx.org/en/docs/http/ngx_http_core_module.html
标准模块
按Nginx作用上基本上有三个功能:作为web服务器,作为负载均衡服务器,作为邮件服务器,如和WEB相关的模块:"ngx_http_module";和mail相关的功能模块有"ngx_mailmodule",和tcp代理、负载均衡相关的功能模块有"ngx_stream*_module",这些类别的模块中又分为很多类别的模块,如http类别的模块中有基本核心模块、事件类模块、缓存类模块、SSL相关模块。
第三方模块
由第三方个人或组织编写的模块。
Nginx的配置文件
Nginx的配置文件有很多,例如
[root@test ~]# ls /etc/nginx/
conf.d fastcgi_params koi-utf koi-win mime.types modules nginx.conf scgi_params uwsgi_params win-utf
主配置文件结构:
main block:主配置快,也即全局配置段;
event { #事件驱动相关的配置;
...
}
http { #Nginx作为http服务端的配置段
...
}
mail { #Nginx作为mail服务器时的配置
...
}
stream { #Nginx在1.9.0开始新增的一个模块,用于实现4层协议转发,代理或负载均衡
#Nginx是分段配置的核心模块为core,对应配置文件中的Main和Events段。此外还有其他一些模块。配置文件中每一个指令必须以分号";"结束,否则语法错误。
配置Nginx
Main段配置
Main用于配置正常运行必备的配置,优化性能相关的配置、用于调式及定位问题的配置和事件驱动相关的配置。
正常运行必备的配置
#1.user Nginx的worker进程的属主
user nginx; #不写属组,则和用户同名的组
#2.pid /PATH/TO/PID_FILE;
指定存储nginx主进程进程号码的文件路径;
#3.include file | mask;
指明包含进来的其它配置文件片断。
#4.load_module file;
指明要装载的动态模块;
性能优化相关的配置:
1、worker_processes number | auto;
#worker进程的数量;通常应该等于小于当前主机的cpu的物理核心数;
#当设置为auto:当前主机物理CPU核心数;
#如:当前机器CPU核心数为4个,那么设置为4个,是一个不错的选择。
2、worker_cpu_affinity cpumask ...;
worker_cpu_affinity auto [cpumask]; #可以设置为自动
#绑定CPU核心。nginx通过位数识别CPU核心以及核心数,指定位数上占位符为1表示使用该核心,占位符为0表示不使用该核心
例如:
worker_processes 4; #我的机器有4核心,所以设置为4个
worker_cpu_affinity 0001 0010 0100 1000; #第一个worker绑定再0号CPU上,以此类推
worker_processes 2; #我的机器有4核心,但设置2个worker
#我想把第一个worker绑定在0和1号cpu上,第二个worker绑定在2和3号CPU上则可以
worker_cpu_affinity 0011 1100
3、worker_priority number; #指定worker进程的nice值,设定worker进程优先级;[-20,20]
4、worker_rlimit_nofile number;
worker进程所能够打开的文件数量上限;
调试、定位问题
1、daemon on|off; #是否以守护进程方式运行Nignx;
2、master_process on|off;
是否以master/worker模型运行nginx;默认为on;
3、error_log file [level];
事件驱动相关的配置:
events {
...
}
1、worker_connections number; #每个worker进程所能够打开的最大并发连接数数量;
#最大并发计算:worker_processes * worker_connections
2、use method;
#指明并发连接请求的处理方法;
use epoll;
3、accept_mutex on | off; #处理新的连接请求的方法;on意味着由各worker轮流处理新请求,Off意味着每个新请求的到达都会通知所有的worker进程;
Http常用配置
http段是由http相关模块支持的,Nginx中没有中心主机概念,就算只有一个主机,也需要配置成虚拟主机
在安装之后,nginx.conf主配文件中有http的默认配置
http {
include /etc/nginx/mime.types; #配置nginx所支持的mime文件
default_type application/octet-stream; #默认类型
#下面是日志格式配置,它定义了一个名为main格式的配置文件格式
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; #调用main格式,作为日志格式
sendfile on; #零复制
#tcp_nopush on;
keepalive_timeout 65; #保持连接的时长
#gzip on; #是否启用gzip压缩,置对文本有效
include /etc/nginx/conf.d/*.conf; #包含配置片段
}
配置一个虚拟主机
在http段中有配置指令include包含了/etc/nginx/conf.d/*.conf的文件,所以我们在此目录下新建一个虚拟主机配置文件。
[root@test conf.d]# vim vhost1.conf
server {
listen 80 default; #监听的端口,并且设置为默认主机
server_name www.ilinux.io; #服务器名称
root /data/web/vhost1/; #相当于httpd的directoryroot
}
1、listen port
在listen 指令后面可以跟上一些标签:
default_server:设定为默认虚拟主机;
ssl:限制仅能够通过ssl连接提供服务;
backlog=number:后援队列长度;
rcvbuf=size:接收缓冲区大小;
sndbuf=size:发送缓冲区大小;
2、server_name name ...;
指明虚拟主机的主机名称;后可跟多个由空白字符分隔的字符串;
支持通配任意长度的任意字符;server_name .magedu.com www.magedu.
支持~起始的字符做正则表达式模式匹配;server_name ~^www\d+.magedu.com$
匹配机制:
(1) 首先是字符串精确匹配;
(2) 左侧通配符;
(3) 右侧*通配符;
(4) 正则表达式;
例如:
server {
listen 80 ; #我把默认主机移除到其他位置
server_name ~^www\d.ilinux\.io$;
root /data/web/vhost1/;
}
以www[0-9].linux.io结尾即可匹配,
我用其他主机访问www.ilinux.io:
[root@vultr ~]# curl http://ilinux.io/index.html
<title>Welcome to nginx!</title>
...
匹配中了默认主机
#以www1.ilinux.io访问,则可以匹配中指定的主机
[root@vultr ~]# curl http://www1.ilinux.io/index.html
vhost1
分割线------------------------------------
server {
listen 80 ;
server_name ~^www\d.ilinux\.io$;
root /data/web/vhost1/;
sendfile on;
tcp_nodelay on;
tcp_nopush on;
}
3、sendfile
是否启用sendfile功能;例如,客户请求一个资源,正常来说,内核通过磁盘I/O把磁盘数据加载到内核buffer中,然后复制到nginx的buffer中,nginx才能组建响应报文,如果开启后,内核加载到资源后就直接发送给客户,响应报文则由nginx发送,随资源数据后到。开启后能加速资源的响应速度。
4、tcp_nodelay
在长连接中,客户请求的数据可能很小,如果off的话,Nginx可能对几次请求打包在一起才发送,如果客户刚好请求的资源好小,又刚好只请求一次,那么客户会感知到这个资源不能加载,所以推荐设置为on
5、tcp_nopush
在sendfile模式下,是否启用TCP_CORK选项;
在sendfile on 下才有效果,客户请求资源的时候,内核把资源加载到内核的内存缓存区后,内核直接等待nginx把响应头部发送过来,然后打包一起发送给客户;如果选择off,则内核先把资源直接发送到客户,nginx的响应报文随后到。
定义路径相关的配置
6、root和alias;
root和alias很容易混淆,他们都是用于映射web路径,用于指明用户请求的url所对应的本地系统上的文件路径,命令可以用在(http, server, location, if in location)的容器中;
例如:
root路径
location /images {
root /data/web/vhost1/
}
#如果客户请求URL为:www.ilinux.io/images/a.jpg,Nginx实际的映射路径为:/data/web/vhost1/images/a.jpg,把location的/images拆开"/"+"images",root指令所指定的路径仅仅是那个"/"
alias路径
用上面的例子,如果把root换成alias,意思就是整个url,它的本地文件系统路径映射为alias所指定的值
location /images {
alias /data/web/vhost1/
}
#如上,如果客户请求URL为:www.ilinux.io/images/a.jpg 所映射的本地路径为:/data/web/vhost1/a.jpg
7、location
简单来讲location容器主要是匹配URL,如果URL被匹配上,则应用location容器内的配置。
在一个server中的location配置段可以有多个,ngnix会根据用户请求的URI来检查定义的所有location,并找出一个最佳匹配,而后应用其配置;
匹配符号:
=:对URI做精确匹配,一般用于做文件匹配,如果用作匹配目录,不会匹配中该目录下的任何内容。
~:对URI做正则表达式匹配,区分大小写
*:对URI做正则表达式匹配,和相比,~*匹配大小写
~^:对URI的左半部分做匹配检查,不区分字符大小写
不带符号:匹配起始于此uri的所有的url;
匹配优先级顺序:
location = uri > location ^~ url > location *| > locaton uri
8、error_page
当出现对应的错误状态码时,返回指定的URI路径。
语法:error_page code ... [=[response]] uri;
例如:
我在网站根目录下新建一个网页文件,充当错误页.
[root@test vhost1]# echo "error" > error.html
[root@test conf.d]# vim vhost1.conf #编辑虚拟主机配置文件
error_page 404 403 /error.html;
[root@test conf.d]# nginx -s reload
当出现404,403错误时候,返回此页面给客户端。
定义客户端请求的相关配置
9、keepalive_timeout和keepalive_requests
设定保持连接的超时时长,0表示禁止长连接;默认为75s;
语法:keepalive_timeout timeout [header_timeout];
Context: http, server
keepalive_requests
在一次长连接上所允许请求的资源的最大数量,默认为100;
语法:keepalive_requests number;
Context:http, server, location
如果在长连接中,超出keepalive_requests的指定值,则断开连接。
10、keepalive_disable
对哪种浏览器禁用长连接,默认对msie6关闭长连接。
语法:keepalive_disable none | browser ...;
Context: http, server, location
11、client_body_buffer_size
用于接收客户端请求报文的body部分的缓冲区大小;默认为16k;超出此大小时,其将被暂存到磁盘上的由client_body_temp_path指令所定义的位置;
语法:client_body_buffer_size size;
12、client_body_temp_path
设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量;
16进制的数字;
例如:
client_body_temp_path /var/tmp/client_body 2 1 1
1:表示用一位16进制数字表示一级子目录;0-f
2:表示用2位16进程数字表示二级子目录:00-ff
2:表示用2位16进程数字表示三级子目录:00-ff
分级存储,创建多个目录,通过哈希算法,确认放在那个文件夹上,
对客户端进行限制的相关配置
13、limit_rate
语法:limit_rate rate;
限制响应给客户端的传输速率,单位是bytes/second,0表示无限制;
14、limit_except
限制对指定的请求方法之外的其它方法的使用客户端;
语法:limit_except method ... { ... }
例如:
限制对指定的请求方法之外的其它方法的使用客户端;
limit_except GET {
allow 192.168.1.0/24;
deny all;
}
文件操作优化的配置
15、aio on
是否启用aio功能,异步I/O,一般用在磁盘I/O操作上。
语法:aio on | off | threads[=pool];
16、open_file_cache、open_file_cache_valid、open_file_cache_min_uses
1、open_file_cache
语法:open_file_cache max=N [inactive=time];
nginx可以缓存以下三种信息:
(1) 文件的描述符、文件大小和最近一次的修改时间;
(2) 打开的目录结构;
(3) 没有找到的或者没有权限访问的文件的相关信息;
max=N:可缓存的缓存项上限;达到上限后会使用LRU算法实现缓存管理,或者配合其他指令管理缓存。
inactive=time:缓存项的非活动时长,在此处指定的时长内未被命中的或命中的次数少于open_file_cache_min_uses指令所指定的次数的缓存项即为非活动项;
2、open_file_cache_valid
语法:open_file_cache_valid time;
缓存项有效性的检查频率;默认为60s;多久检查一次缓存
3、open_file_cache_min_uses
语法:open_file_cache_min_uses number;
在open_file_cache指令的inactive参数指定的时长内,至少应该被命中多少次方可被归类为活动项;
4、open_file_cache_errors
语法:open_file_cache_errors on | off;
是否缓存查找时发生错误的文件一类的信息;
ngx_http_access_module模块
该模块主要是实现基于ip访问控制的功能,它提供了allow和deny两个指令。匹配规则很简单,由上到下,匹配中了就停止。
语法:
allow address | CIDR | unix: | all;
deny address | CIDR | unix: | all;
Context:http, server, location, limit_except
例如:
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}
允许指定的网段,如果在客户的ip不能被上面的允许规则匹配,则被拒绝。
ngx_http_auth_basic_module
主要实现基于用户的访问控制,使用basic机制进行用户认证;
配置很简单:
auth_basic string | off; #提示信息
auth_basic_user_file file; #认证文件
认证文件可以手写,或者使用htpasswd生成
如:
对根目录下的amdin文件夹做访问认证。
[root@test ~]# htpasswd -c -m /etc/nginx/htpasswd one #新建一个One账户
location /admin {
auth_basic passwd;
auth_basic_user_file /etc/nginx/htpasswd;
}
[root@test conf.d]# nginx -s reload #重载配置
ngx_http_stub_status_module模块
这模块主要用于显示nginx的运行状态;
用法很简单:
例如:
location /status {
stub_status; #增加此命令即可
auth_basic passwd;
auth_basic_user_file /etc/nginx/htpasswd;
}
参数说明:
Active connections: 3 #活动状态的连接数;
server accepts handled requests
213312 213312 210271
Reading: 0 Writing: 1 Waiting: 2
accepts:已经接受的客户端请求的总数;
handled:已经处理完成的客户端请求的总数;
requests:客户端发来的总的请求数;
Reading:处于读取客户端请求报文首部的连接的连接数;
Writing:处于向客户端发送响应报文过程中的连接数;
Waiting:处于等待客户端发出请求的空闲连接数;
ngx_http_log_module模块
模块提供了三个指令:log_format、access_log和open_log_file_cache。
1、log_format
语法:log_format name string ...;
用于定义日志格式,在主配文件中已经定义了一个main格式的日志格式,string能够使用nginx核心模块及其它模块内嵌的变量;
2、access_log
语法:access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
日志可以先缓冲在buffer中,大小由buffer参数指定,并且可以压缩存放,
3、open_log_file_cache
语法:open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
对于写日志操作,需要打开日志文件,对于写入及其频繁的日志文件,可以使用该指令缓存日志文件描述符。
max=N:可以缓存的最大文件描述符,超出了就使用LRU算法清楚掉
inactive=time:非活动时长
min_user=N:如果在非活动时长内,访问的次数少于该指明指定的值,则标记为非活动项
valid=time:多久检查一次缓存是否为活动项的间隔
默认main格式说明:
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
参数说明:
$remote_addr:客户端IP
如果客户端是前端的话,此时要获取到真正客户端地址需要使用变量$http_x_forward_for,但要求前端服务器要开启x_forward_for设置。
$remote_user:客户端用户
$time_local:本地时间
$request:客户端的请求首部,如GET /index.html HTTP/1.1
$status:记录客户端请求时返回的状态码
$body_bytes_sent:报文主体长度
$http_referer:referer信息
$http_user_agent:记录客户端的浏览器信息。也可以用于探测压力测试。
ngx_http_ssl_module
SSL握手简单过程:
三次TCP握手完成以后,
1.客户端say hello,并发送一个随机数给服务端。
2.服务端say hello,并回复一个随机数给客户端。
3.服务端发送数字证书给客户端。
4.客户端使用信任的CA公钥解密数字证书得到服务端的公钥。
5.客户端使用服务端的公钥加密一个预备主密钥并发送给服务端。
6.服务端使用自己的私钥解密预备主密钥
7.双方都得到了2个随机数加一个预备主密钥。通过这3个随机数形成一个会话主密钥,即session key。至此ssl握手结束,连接的认证过程也完毕。
对于服务端,配置https,需要提供自己的证书给客户端,由于该证书存放这公钥,所以也要指定私钥来用于解密。
默认的配置文件中已经有ssl的配置实例了
#server {
# listen 443 ssl; #对于该端口,只用于https
# 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;
# }
#}
实验过程:
###CA端
自建CA,我用另外一台服务器来充当CA,先自签一张数字证书。
[root@vultr CA]# cd /etc/pki/CA/
[root@vultr CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
...................................................................+++
.....................................................................+++
e is 65537 (0x10001) #新建一个私钥
[root@vultr CA]# openssl req -new -x509 -key private/ca.pem -out cacert.pem #自签了一个证书
[root@vultr CA]# echo "001" > serial #新建序列文件
[root@vultr CA]# touch index.txt #新建索引文件
###Nginx端
[root@test ssl]# (umask 077 ; openssl genrsa -out nginx.key 2048)
Generating RSA private key, 2048 bit long modulus
......+++
.........................................+++
e is 65537 (0x10001) #生成私钥
[root@test ssl]# openssl req -new -key nginx.key -out nginx.csr #生成一个证书
复制到ca认证服务器
[root@vultr CA]# openssl ca -in /tmp/nginx.csr -out nginx.crt
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
The organizationName field needed to be the same in the
CA certificate (boss) and the request (li-zw) #在CA服务器上签署该证书
移动到Nginx服务器。
[root@test ssl]# ls
nginx.crt nginx.csr nginx.key
##接下来,配置ssl
[root@test conf.d]# vim vhost1_ssl.conf
server{
listen 443 ssl;
root /data/web/vhost1/;
server_name www.ilinux.io;
ssl on;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_session_cache shared:SSL:20m;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_session_timeout 20m;
}
ngx_http_rewrite_module
地址重写模块,该模块功能依赖pcre,如没有可以通过yum安装。该模块提供了5个指令,break、return、set、rewrite和if,跟location工作的模式差不多,将用户请求的URI基于regex所描述的模式进行检查,而后完成替换;
break:作用是完成当前的作用集,不再执行rewrite指令
return:返回URL或状态码给客户端
set:用于定义变量
if:用于设定判断条件
rewrite:用于重写
rewrite:
语法:rewrite regex replacement [flag]
如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查,因此,隐含有循环机制;[flag]所表示的标志位用于控制此循环机制;如果replacement是以http://或https://开头,则替换结果会直接以重定向返回给客户端;
[flag]: last:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后对新的URI启动新一轮重写检查;提前重启新一轮循环; break:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;结束循环; redirect:重写完成后以临时重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求;不能以http://或https://开头; permanent:重写完成后以永久重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求;
例如:
我把访问www.ilinux.io/images/lena.png,在Nginx服务端上重写成www.ilinux.io/images/lena.jpg,客户端感知不到的,因为整个过程都是在nginx上实现
rewrite "^/images/(.*)\.png$" "/images/$1.jpg" last;
#把对http的所有访问重写到https
rewrite "^/(.*)" https://www.ilinux.io/$1;