Nginx
- enginx X=Nginx
- http协议:web服务器(类似于httpd)、http reverse proxy(类似于httpd)、imap/pop3 reverse proxy
- Nginx is a free, open-source,high-performance HTTP server and reverse proxy,as well as an IMAP/POP3 proxy server.
- C10K(10K Connections).
- Tengine,OpenResty
- http协议:
- URL:scheme://username:password@host:port/path;params?query#frag
- DocumentRoot:/PATH/TO/SOMEDIR
- Location:URL
- Alias
- params:
- key=value&key=vlaue
- query:查询条件,过滤表达式
- field=vlaue
- 网页中的位置
- DocumentRoot:/PATH/TO/SOMEDIR
- http事务:
-
request:
<method><URL><VERSION> HEADERS name:value <body>
-
response:
<VERSION><STATUS><REASON-PHRASE> HEADERS <body>
-
Method:GET请求资源/HEAD头部/POST提交表单,PUT上传/DELETE,TRACES,OPTIONS方法
-
Status Code:
- 1xx:
- 2xx:成功类型响应码,200
- 3xx:重定向类的响应码,301(permanent),302,304(not modified)
- 4xx:客户端错误,403,404
- 5xx:服务端错误,502
-
认证:
- 基于ip认证
- 基于用户认证:basic(明文)/digest(校验后加密传输,但是支持较差)
-
httpd MPM:
- prefork:进程模型,两级结构,主进程master负责生成子进程,每个子进程负责相应一个请求;
- woker:线程模型,三级结构,主进程master负责生成多个子进程,每个子进程负责生成多个线程,每个线程响应一个请求;
- event:主进程master负责生成子进程,每个子进程相应多个请求;
-
- URL:scheme://username:password@host:port/path;params?query#frag
- I/O模型:
- 阻塞型(两段都是阻塞型)、非阻塞型(第一阶段是非阻塞型,第二阶段是阻塞型)、复用型(,两阶段都为阻塞型,但是阻塞在多路IO上,不直接面向第一或第二阶段,即IO复用器,IO复用器可监控IO阻塞情况)、信号驱动型(第一阶段非阻塞型,第二阶段为阻塞型)、异步
- 同步/异步:
- 关注消息通知机制;
- 消息通知:
- 同步:等待对方发送消息;
- 异步:被调用者通过状态、通知或回调机制通知调用者被调用者的运行状态;
- 阻塞/非阻塞:
- 关注调用者在等待结果返回之前所处的状态;
- 阻塞:blocking,调用结果返回之前,调用者被挂起;闲等
- 非阻塞:nonblocking,调用结果返回之前,调用者不会被挂起;忙等,只能一遍一遍重复问调用结果情况,不能进行其他操作;
- 关注调用者在等待结果返回之前所处的状态;
- 一次文件IO请求,都会由两阶段组成:
- 第一步:等待数据,即数据从磁盘到内核内存;
- 第二步:复制数据,即数据内核内存到进程内存;
- 复用型IO调用:
- select():1024 prefork模型,最大并发数为1024
- poll():nolimit
- event-driven;
- epoll(Linux):libevent
- yum info libevent
- Kquene(BSD):
- /dev/poll(Solaris):
- epoll(Linux):libevent
- httpserver
- static
- nmap,nmt
- reverse proxy
- nginx
- Nginx的架构
- master/worker
- 一个master进程:
- 负责加载和分析配置文件、管理worker进程、平滑升级
- 一个或多个woker进程
- 处理并响应用户请求
- 缓存相关的进程:
- cache loader:载入缓存对象
- cache manager:管理缓存对象
- 一个master进程:
- 特性:异步,时间驱动和非阻塞
- 并发请求处理:通过kevent/epoll/select,/dev/poll
- 文件IO:高级IO、sendfile、异步、mmap
- nginx高度模块化,但其模块早期不支持DSO机制,近期版本支持动态装载和卸载;
- 模块分类:
- 核心模块:core module
- 标准模块:
- HTTP modules:
- Standard HTTP modules
- Optional HTTP modules
- Mail modules
- Stream modules
- HTTP modules:
- 3rd party modules
- 模块分类:
- nginx的功用:
- 静态的web资源服务器;(图片服务器,或js/css/html/txt等静态资源服务器);
- 结合fastcgi/uwsgi/scgi等协议反代动态资源请求;
- http/https协议的反向代理;
- imap4/pop3协议的反向代理;
- tcp/udp协议的请求转发;
- master/worker
nginx的安装
- rpm(epel源)安装,官方有文档
- 源码编译安装
- 二进制安装
- 配置:
- 配置文件的组成部分:
- /etc/nginx/nginx.conf
- /etc/nginx/conf.d/*.conf
- include conf.d/*.conf
- fastcgi,uwsgi,scgi等协议相关的配置文件
- mime.types:支持的mime类型:多用途互联网邮件扩展类型
- 主程序文件:
- /usr/sbin/nginx
- nginx -V #查看nginx安装时的配置以及版本和编译环境
- nginx -t #检查nginx配置文件语法
- nginx -s signal #向nginx进程发送信号,有reload|restart|start|sop等
- nginx -p #设置配置文件路径
- Unit File:nginx.service
- /usr/sbin/nginx
- 主配置文件的配置指令:
- directive value [value2…];
- 注意:
- 指令必须以分号结尾
- 支持使用配置变量;
- 内建变量:由nginx模块引入,可直接引用;
- 自定义变量:由用户使用set命令定义:
- set variable_name value;
- 引用变量:$variable_name
- 主配置文件结构:
- 配置文件的组成部分:
main block:主配置段,也即全局配置段
event {
...
}:事件驱动相关的配置;
http {
...
}:http/https协议相关的配置段
mail {
...
}
stream {
...
}
-
- http协议相关的配置结构
http {
...
...:各server的公共配置
server {
...
}:每个server用于定义一个虚拟主机;
server {
...
listen 监听地址端口
server_name 主机名
root 相当于DocumentRoot
alias 路径别名
location [OPERATOR] URL {
...
if CONDITION {
...
}
}
}
}
main配置段常见的配置指令
-
- main配置段常见的配置指令
-
分类:
- 正常运行必备的配置
- 优化性能相关的配置
- 用于调试及定位问题相关的配置
- 事件驱动相关的配置
-
正常运行必备的配置:
-
user
syntax:user user [group];
Default:user nobody nobody;
Context:main -
pid /PATH/TO/PID_FILE;
指定存储nginx主进程进程号码的文件路径; -
include file | mask;
指明包含进来的其他配置文件片段; -
load_module file;
指明要装载的动态模块
-
-
性能优化相关的配置:
- worker_process number | auto;
woker进程的数量;通常应该小于等于当前主机的cpu的物理核心数;
auto:当前主机物理cpu核心数; - worker_cpu_affinity cpumask …;
worker_cpu_affinity auto | [cpumask];
CPUMASK:
00000001:0号CPU
00000010:1号CPU
… …
将进程绑定在指定CPU上
ps axo comm,pid,psr | grep nginx:查看进程运行在哪个cpu上 - woker_priority number;
指定woker进程的nice值,设定woker进程优先级;[-20,20]
ps axo comm,pid,psr,ni | grep nginx:查看进程优先级
woker_priority -5 - woker_rlimit_nofile number;
woker进程能够打开的文件数量上限;需要先上调nginx用户的ulimit数;
woker_rlimit_nofile 65535;
- worker_process number | auto;
-
调试、定位问题:
- daemon on | off;
是否以守护进程方式运行nginx - master_process on | off;
是否以master/worker模型运行nginx;默认为on; - error_log_file [level];
- daemon on | off;
-
事件驱动相关的配置:
-
- main配置段常见的配置指令
events {
...
}
-
1. woker_connections number; 每个worker进程所能够打开的最大并发连接数数量; worker_processes * worker_connections 2. use method; 指明并发连接请求的处理方法; use epoll; 3. accept_mutex on | off; 处理新的连接请求的方法;on意味着由各worker轮流处理新请求,off意味着每个新请求的到达都会通知所有的worker进程;
http协议的相关配置
-
- http协议的相关配置:
- 与套接字相关的配置:
-
server {…}
- 配置一个虚拟主机;
server {
listen address[:PORT] | PORT;
server_name SERVER_NAME;
root /PATH/TO/DOCUMENT_ROOT; #web服务器
#proxy_pass http://192.168.79.7 #反代
}
- 配置一个虚拟主机;
-
listen PORT | address[:port]|unix:/PATH/TO/SOCKET_FILE
-
listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]
defualt_server:设定为默认虚拟主机;
ssl:限制仅能够通过ssl连接提供服务;
backlog=number:后援队列长度;
rcvbuf=size:接收缓冲区大小;
sndbuf=size:发送缓冲区大小 -
server_name name …
- 指明虚拟主机的主机名称;后可跟多个由空白字符分隔的字符串;
- 支持*通配任意长度的任意字符串;server_name *.magedu.com www.magedu.*
- 支持~起始的字符做正则表达式模式匹配;server_name ~^www\d+.magedu.com$
- 匹配机制:
- 首先是字符串精确匹配
- 左侧*通配符;
- 右侧*通配符;
- 正则表达式;
- 练习:定义四个虚拟主机,混合使用三种类型的虚拟主机;仅开放给来自于本地网络中的主机访问;
- 指明虚拟主机的主机名称;后可跟多个由空白字符分隔的字符串;
-
- 与套接字相关的配置:
- http协议的相关配置:
server {
listen 80;
server_name www.a.com;
root /data/test;
location / {
allow 192.168.79.27;
deny all;
}
}
server {
listen 192.168.79.47:8080;
server_name www.b.cn;
root /data/test2;
location / {
allow 192.168.79.27;
deny all;
}
}
server {
listen 8080;
server_name www.c.org;
root /data/test3;
location / {
allow 192.168.79.27;
deny all;
}
}
- tcp_nodelay on | off;
- 仅对keepalive连接生效,使之不等待合并一起发送;
- tcp_nopush on | off;
- 仅当sendfile为on时生效,先将响应报文的首部和文件头部在一个报文中进行发送,然后将一个完整的文件通过一个完整的报文发送出去;
- 在sendfile模式下,是否启用TCP_CORK选项;文件内容与应用层首部合并起来一块发送
- types_hash_max_size 2048;
- 设定保存类型hash表的最大值;
- sendfile on | off;
- 是否启用sendfile功能
- 路径相关的配置
- root path;
location = / {
...
}
-
- 设置web资源路径映射;用于指明用户请求的rul所对应的本地文件系统上的文档所在目录路径;可用的位置:http,server,location,if in location;
- location [ = | ~ | ~* | ^~ ] uri {…}
- set configuration depending on a request URI.
-
在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;nginx会根据用户请求的URI来检查定义的所有location,并找出一个最佳匹配,而后应用其哦欸之;
-
=:对URI做精确匹配;例如,http://www/magedu.com/,http://www/magedu.com/index.html
-
~:对URI做正则表达式模式匹配,区分字符大小写;
-
~*:对URI做正则表达式模式匹配,不区分字符大小写;
-
^~:对URi的左半部分做匹配检查,不区分字符大小写;
-
不带符号:匹配起始与此URL的所有url;
-
匹配优先级:=,^,,~*,不带符号;
-
- set configuration depending on a request URI.
- location [ = | ~ | ~* | ^~ ] uri {…}
- 设置web资源路径映射;用于指明用户请求的rul所对应的本地文件系统上的文档所在目录路径;可用的位置:http,server,location,if in location;
root /vhsots/www/htdocs/
http://www.magedu.com/index.html -->/vhosts/www/htdocs/index.html
server {
root /vhosts/www/htdocs/
location /admin/ {
root /webapps/app1/data/
}
}
-
- alias path:
- 定义路径别名,文档映射的另一种机制;仅能用于location上下文;
- 注意:location中使用root指令和alias指令的意义不同;
- root,给定的路径对应于location中的/url/最左侧的/;
- alias,给定的路径对应于location中的/url/最右侧的/;
- index file …;
- 默认资源:http,server,location;
- error_page code … [=[response]] url;
- Defines the URL that will be shown for the specified errors.
- try_files file … url;
- 注意:location中使用root指令和alias指令的意义不同;
- 定义路径别名,文档映射的另一种机制;仅能用于location上下文;
- alias path:
2019/5/28 2:24
定义客户端请求的相关配置
-
- 定义客户端请求的相关配置
-
keepalive_timeout timeout [header_timeout];
- 设定保持连接的超时时长,0表示禁止长连接;默认为75s;
-
keepalive_requests number;
- 在上一次长连接上所允许请求的资源的最大数量,默认为100;
-
keepalive_disable none | browser …;
- 对哪种浏览器禁用长连接;
-
send_timeout time;
- 向客户端发送响应报文的超时时长,此处,是指两次写操作之间的间隔时长;
-
client_body_buffer_size size;
- 用于接收客户端请求报文的body部分的缓冲区大小;默认为16K;超出此大小时,其将被暂存到磁盘上的由client_body_temp_path指令所定义的位置;
-
client_body_temp_path path [level1 [level2 [level3]]];
- 设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量;
- 16进制的数字;
- client_body_temp_path path /var/tmp/client_body 2 1 1
- 1:表示用一位16进制数字表示一级子目录;0-f
- 2:表示用2位16进制数字表示二级子目录;00-ff
- 2:表示用2位16进制数字表示二级子目录;00-ff
- 设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量;
-
limit_rate rate;
- 限制响应给客户端的传输速率,单位时bytes/second,0表示无限制;
-
limit_except method … { … }
- 限制对指定的请求方法之外的其他方法使用客户端;
limit_except GET {
allow 192.168.1.0/24; 仅允许192.168.1.0/24的主机使用GET以外的请求方法
deny all;
}
- 限制对指定的请求方法之外的其他方法使用客户端;
-
- 定义客户端请求的相关配置
文件操作优化的配置
-
- aio on | off | threads=[pool];
- 是否启用aio功能;异步非阻塞,建议设置为on
- directio size | off;
- 在linux主机启用O_DIRECT标记,此处意味着文件大于等于给定的大小时使用,例如directio 4m;
- open_file_cache off;
- open_file_cahce max=N [inactive=time]; 建议设置
- nginx可以缓存一下三种信息:
- 1.文件的描述符、文件大小和最近一次的修改时间;
- 2.打开的目录结构;
- 3.没有找到的或者没有权限访问的文件的相关信息;
- max=N:可缓存的缓存项上线;达到上限后会使用LRU算法实现缓存管理;
- inactive=time:缓存项的非活动时长,在此处指定的时长内未被命中的或命中的次数少于open_file_cache_min_users指令所指定的次数的缓存项即为非活动项;
- nginx可以缓存一下三种信息:
- open_file_cache_valid time;
- 缓存项有效性的检查频率;默认为60s;
- open_file_cache_min_users number;
- 在open_file_cache指令的inactive参数指定的时长内,至少应该呗命中多少次方可被归类为活动项;
- open_file_cache_erroes on | off;
- 是否缓存查找时发生错误的文件一类的信息;缓存否定应答
- aio on | off | threads=[pool];
ngx_http_access_module模块:实现基于ip的访问控制功能
- allow address | CIDR | unix:| all;
- deny address | CIDR | unix | all;
可用的位置:http,server,location,limit_except
ngx_http_auth_basic_module模块:实现基于用户的访问控制,使用basic机制进行用户认证
-
auth_basic string | off;
Default:auth_basic off;
Context: http, server, location, limit_except -
auth_basic_user_file file;
注意:htpasswd命令由httpd-tools所提供;
示例:
[root@www ~]# yum -y install httpd-tools
[root@www ~]# htpasswd -c -m /etc/nginx/.ngxpasswd tom
New password:
Re-type new password:
Adding password for user tom
#修改nginx配置文件
[root@www ~]# vim /etc/nginx/conf.d/vhost1.conf
#在vhost1.conf配置中添加新的location,如下:
location ~* ^/(admin|login) {
auth_basic “admin area or login url”;
auth_basic_user_file /etc/nginx/.ngxpasswd;
#创建目录和admin主页
[root@www ~]# mkdir /data/nginx/vhost1/admin
[root@www ~]# vim /data/nginx/vhost1/admin/index.html
[root@www ~]# nginx -t
[root@www ~]# nginx -s reload
使用另外主机测试访问:
ngx_http_stub_status_module模块:用于输出nginx的基本状态信息
- stub_status;
配置示例:
[root@www ~]# vim /etc/nginx/conf.d/vhost1.conf
location ~* ^/(admin|login) {
auth_basic “admin area or login url”;
auth_basic_user_file /etc/nginx/.ngxpasswd;
stub_status;
}
[root@www ~]# nginx -s reload
访问测试:
Active connections: 活动状态的连接数;
accepts:已经接受的客户端请求的总数;
handled:已经处理完成的客户端请求的总数;
requests:客户端发来的总的请求数;
Reading:处于读取客户端请求报文首部的连接的连接数;
Writing:处于向客户端发送响应报文过程中的连接数;
Waiting:处于等待客户端发出请求的空闲连接数
curl --silent hhtp://www/ilinux.io/ngxstatus | awk '/^Active/{print $2}' 处于活动状态的连接数
ngx_http_log_module模块:用于以指定的格式写入请求日志
-
log_format name string …;
string 可以使用nginx核心模块及其它模块的内嵌变量
注意:此配置只能用于http段中 -
access_log path [format [buffer=size] [gzip=[level1]] [flush=time][if=condition]];
-
access_log off;
- 访问日志文件路径,格式及相关的缓冲的配置;
- buffer=size: 设置日志缓冲区大小
- flush=time:定义清空时长
- 访问日志文件路径,格式及相关的缓冲的配置;
-
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
-
open_log_file_cache off;
缓存各日志文件相关的元数据信息;
max:缓存的最大文件描述符数量;
min_uses:在inactive指定的时长内访问大于等于此值方可被当作活动项;
inactive:非活动时长
valid:验证缓存中各缓存项是否为活动项的时间间隔
示例:为nginx定义使用类似于httpd的combined格式的访问日志
#在/etc/nginx/nginx.conf文件中http段配置日志格式
[root@www ~]# vim /etc/nginx/nginx.conf
http {
log_format comd '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent"';
...
}
#给vhost1主机添加访问日志,设置为comd格式
[root@www ~]# vim /etc/nginx/conf.d/vhost1.conf
server {
...
access_log /var/log/nginx/vhost1-access.log comd;
...
}
#访问测试后查看日志格式
[root@www ~]# tail -2 /var/log/nginx/vhost1-access.log
192.168.79.1 - - [31/May/2019:11:34:07 +0800] "GET /image/flower.png HTTP/1.1" 200 3572 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36" "-"
ngx_http_gzip_module:用gzip格式压缩响应;
-
gzip on | off;
Enables or disables gzipping of responses. -
gzip_comp_level level;
Sets a gzip compression level of a response. Acceptable values are in the range from 1 to 9. -
gzip_disable regex …;
Disables gzipping of responses for requests with “User-Agent” header fields matching any of the specified regular expressions. -
gzip_min_length length;
启用压缩功能的响应报文大小阈值; -
gzip_buffers number size;
支持实现压缩功能时为其配置的缓冲区数量及每个缓存区的大小; -
gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any …;
nginx作为代理服务器接收到从被代理服务器发送的响应报文后,在何种条件下启用压缩功能的;
off:对代理的请求不启用
no-cache, no-store,private:表示从被代理服务器收到的响应报文首部的Cache-Control的值为此三者中任何一个,则启用压缩功能; -
gzip_types mime-type …;
压缩过滤器,仅对此处设定的MIME类型的内容启用压缩功能; -
配置示例:
- gzip on;
- gzip_comp_level 6;
- gzip_min_length 64;
- gzip_proxied any;
- gzip_types text/xml text/css application/javascript;
此配置可用位置:http, server, location
ngx_http_ssl_module模块:
-
ssl on | off;
Enables the HTTPS protocol for the given virtual server.
是否启用htttps协议 -
ssl_certificate file;
当前虚拟主机使用PEM格式的证书文件; -
ssl_certificate_key file;
当前虚拟主机上与其证书匹配的私钥文件; -
ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1][TLSv1.2]
支持ssl协议版本,默认为后三个; -
ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
builtin[:size]:使用Openssl内建的缓存,此缓存为每worker进程私有;
[shared:name:size]:在各worker之间使用一个共享的缓存; -
ssl_session_timeout time;
客户端一侧的连接可以服用ssl session cache中缓存的ssl参数的有效时长;
配置示例:
#创建私有CA自签证书,以192.168.32.132为CA
[root@www ~]# cd /etc/pki/CA
[root@www CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
........................................................................+++
..................................+++
e is 65537 (0x10001)
[root@www CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:beijing
Locality Name (eg, city) [Default City]:beijing
Organization Name (eg, company) [Default Company Ltd]:magedu
Organizational Unit Name (eg, section) []:devops
Common Name (eg, your name or your server's hostname) []:www.c.org
Email Address []:
[root@www CA]# touch index.txt
[root@www CA]# echo 01 > serial
#在nginx主机上生成私钥和申请证书
[root@www ~]# mkdir /etc/nginx/ssl
[root@www ~]# (umask 066;openssl genrsa -out /etc/nginx/ssl/.nginx.key 2048)
[root@www ~]# openssl req -new -key /etc/nginx/ssl/.nginx.key -out /etc/nginx/ssl/nginx.crs -days 365
[root@www ssl]# scp nginx.csr 192.168.79.37:/tmp/
#在CA上签署证书
[root@www CA]# openssl ca -in /tmp/nginx.csr -out certs/nginx.crt -days 365
#把签署好的证书nginx.crt传会nginx主机
[root@www CA]# scp certs/nginx.crt root@192.168.79.37:/etc/nginx/ssl #修改nginx配置文件,启用ssl
[root@www ~]# vim /etc/nginx/conf.d/test.conf
server {
listen 443;
ssl on;
root /var/www/html;
gzip on;
gzip_comp_level 9;
gzip_types text/xml text/css;
ssl_certificate "/etc/nginx/ssl/nginx.crt";
ssl_certificate_key "/etc/nginx/ssl/.nginx.key";
ssl_protocols sslv2 sslv3 tlsv1 tlsv1.1 tlsv1.2;
ssl_session_cache shared:SSL:10m;
index index.html;
location / {
allow all;
}
location /etc {
autoindex on;
alias /var/www/html/etc/;
access_log /var/log/nginx/ssl_nginx_test.log;
}
location /image {
rewrite /(.*)\.png$ /$1.jpg break;
return http://192.168.79.27;
autoindex on;
allow all;
}
[root@www ~]# vim /var/www/html/index.html
<h1>nginx</h1>
<h2>192.168.79.7</h2>
#检查语法,重载配置
[root@www ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@www ~]# nginx -s reload
ngx_http_rewrite_module模块:用于使用正则表达式模式更改请求URI,返回重定向,并有条件的选择配置
例如:
bbs.magedu.com/ --> www.magedu.com/bbs/
http://www.magedu.com/ --> https://www.magedu.com/
http://www.magedu.com/login.php;username=tom --> http://www.magedu.com/tom/
http://www.ilinux.io/bbs/ --> http://bbs.ilinux.io/
将用户请求的URI基于regex所描述的模式进行检查,然后完成替换;
-
rewrite regex replacement [flag]
将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为replacement指定的新的URI;- 注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而上逐个检查;被某条件规则替换完成后,会重新一轮的替换检查,因此,隐含有循环机制;[flag]所表示的标志位用于控制此循环机制;
如果replacement是以http://或https://开头,则替换结果会直接以重定向返回给客户端;301:永久重定向; - [flag]:
-
last:重写完成后停止对当前URI在当前location中后续的其他重写操作,而后对新的URI启动新的一路重写检查;提前重启新一轮循环;感觉容易发生死循环,返回500报错。
-
break:重写完成后停止对当前URI在当前location中后续的其他重写操作,而后直接跳转至重写规则配置块之后的其他配置;循环结束;
-
redirect:重写完成后以临时重定向方式直接返回重写后生成的新URI给客户端,有客户端重新发起请求;不能以http://或https://开头;
-
permanent:重写完成后以永久重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求;
-
redirect和permanent可以重定向至其他服务器。
-
- 注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而上逐个检查;被某条件规则替换完成后,会重新一轮的替换检查,因此,隐含有循环机制;[flag]所表示的标志位用于控制此循环机制;
-
return
停止处理并将指定的代码返回给客户端
return code [text];
return code URL;
return URL; -
rewrite_log on |off;
是否开启重写日志 -
if (condition) {…}
引入一个新的配置上下文:条件满足时,执行配置块中的配置指令;
可用于server和location段中- condition:
-
比较操作符:
==
!=
~*:模式匹配,不区分字符大小写
~:模式匹配,区分字符大小写
!~:模式不匹配,区分字符大小写
!~:模式不匹配,不区分字符大小写
文件及目录存在性判断:
-e, !-e
-f, !-f
-d, !-d
-x, !-x -
set $variable value
用户自定义变量
简单示例:
#重新编辑配置文件vhost.conf
[root@www conf.d]# vim vhost.conf
server {
listen 80;
server_name www.ilinux.com;
root /data/nginx/vhost1;
rewrite /(.*)\.png$ /$1.jpg;
}
[root@www1 conf.d]# nginx -s reload
访问测试.png能否重写为.jpg
ngx_http_referer_module模块:
The ngx_http_referer_module module is used to block access to a site for requests with invalid values in the “Referer” header field.
- valid_referers none | blocked | server_names | string …;
定义referer首部的合法引用用值;- none:请求报文首部没有referer首部;
- blocked:请求报文的referer首部没有值;
- server_names:参数,其可以有值作为主机名或主机名模式;
- arbitrary_string:直接字符串,但可使用*作通配符;
- regular expression:被指定的正则表达式模式匹配到的字符串;要使用~打头,例如 ~.*.magedu.com;
- $invalid_referer : 模块内置变量,非法引用,只要没被valid_referers定义匹配到的就是非法引用
- …
配置示例:
valid_referers none block server_names *.magedu.com *.mageedu.com magedu.* mageedu.* ~\.magedu\.;
if($invalid_referer) {
return http://www.magedu.com/invalid.jpg;
}