dengchengchao / notes-nginx Goto Github PK
View Code? Open in Web Editor NEW《Nginx高性能Web服务器详解》读书笔记
《Nginx高性能Web服务器详解》读书笔记
前面说过Nginx
的主要配置文件为conf/nginx.conf
默认配置如下:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
上述配置意思后面再详细解读。
首先我们分析Nginx
的配置文件的结构:
Nginx
配置文件的通用结构为
xxx{ //
... //全局配置
xxx{ //xxx子模块配置
}
}
其中,全局配置能够影响子模块配置
由此,我们可以从大模块->包含模块的顺序开始分析。
首先是最外层的配置,Nginx
最外层分别又:
全局块: 全局块配置在所有的大括号外,主要用于设置Nginx
整体的一些运行配置命令
events
块: events
块主要涉及的到Nginx
服务器与用户的网络连接,比如是否允许同时开启多个网络连接,每个worker process
可以支持多少个连接数等等
这一块主要影响Nginx
服务器的性能
http
块: http
块主要配置http
请求的各种配置,比如代理,缓存,日志等
这三个块是
Nginx
配置的主要模块。而每个块中又可以包含子模块。这里主要介绍http
块的子模块:
server块: server
块的配置主要和"虚拟主机"的配置有关。一个server
块,对应一个"虚拟主机"
对于每个虚拟主机,也可以包含自己单独的配置,下面介绍其子模块
location块: location
块的主要作用Nginx
接收到请求后,对虚拟主机的请求再一次细分,有点类似ServletMapping
的作用。。
配置到
location
块之后,基本就没有其他的什么配置了。
整体来说,Nginx
的主要配置的块划分如下所示:
xxx
xxx
http{
server{
location{
}
}
}
需要注意的是,Nginx
每条配置都需要以;结尾
配置Nginx
服务器用户组,只有被设置的用户(用户组)成员才可以启动Nginx
user [user] [group]
user nobody nobody; //默认为nobody
配置允许生成的worker process
数量
worker_processes [number] | [auto]
默认唯一
配置PID
文件路径
pid [filePath]
注意,filePath
同时需要包含文件名
配置错误日志路径以及级别
error_log [filePath] | [stderr| info | notice | warn | error | crit | alert | emerg]
此命令可以在
http
,server
,location
块中单独配置
引入其他配置文件
include [filePath]
此配置可以放在任意块中
设置网络连接序列化,避免”惊群“效应,使得每个work prcess
按顺序接收请求
accept_mutex [on | off]
默认为on
设置是否允许worker prcess
同时接收多个网络连接
multi_accept [on | off]
默认为off
设置事件驱动模型
use [method]
method
可以选择为:select | poll | kqueue | epoll | rtsig | /dev/poll | eventport
配置最大连接数
worker_connections [number]
默认为512
注意最大连接数包括了所有可能的连接数,不仅仅是前端用户连接的数量
以下命令可以选择在http, server, location
中进行配置,主要都是http
的一些参数
配置MIME-Type
一般默认情况下,Nginx
默认定义了一个IME-Type
文件,里面配置了默认的IME
类型,我们只用将其包含进来即可:
include mime.types
此文件中定义了一个默认文件对应的MIME-Type
,比如html
文件对应text/html
等
此外,还可以定义一个默认类型:
default_type mime-type
表示当一个都没有在types
文件中匹配到的时候,则使用此MIME
类型
定义服务器日志
access_log [filePath] [format]
access_log
记录的是前端访问Nginx
的日志。filePath
为日志保存的路径,需要精确到名称。format
为日志格式,一般使用默认的即可。
此配置可以定义http
块,server
块,或者location
块中
可以使用access_log off;
指令关闭访问日志
配置sendfile
sendfile on | off
sendfile_max_chunk [size]
sendfile()
有点类似0拷贝的文件传输,默认为off
sendfile_max_chunk
用于设置每个worker process
每次调用sendfile()
传输的数据最大的值,0
表示无限制
超时时间
keepalive_timeout [time] [header_timeout]
keepalive_timeout
表前端用户连接后,保持连接的时间
time
:时间,默认为75s
header_timeout
: 可选项,在应答报文头部的Keep—Alive
域设置超时间:keep-Alive:timeout=[timeout]
示例:keepalive_timeout 120s 100s;
配置单链接请求数上限
keepalive_requests [numbers]
表示用户成功建立会话之后,用户通过此连接发送请求的数量限制,默认为100,
此配置还可以配置到location
中
配置网络监听
网络监听配置有3中方式
IP
地址: listen [address] [:port] [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sendbuf=size] [deffered] [bind] [ssl]
listen [port] [default_server] [setfib=number] [rcvbuf=size] [sendbuf=size] [accept_filter=filter] [deffered] [bind] [ipv6only=on | off ] [ssl]
下面对上面的参数进行一一解释:
address
: ip
地址,如果是IPv6
地址,则需要使用[]
括起来。port
: 端口号,如果只定义了IP
地址,没有定义端口号,则使用80端口path
: socket
文件路径default_server
: 标识符,将此虚拟主机设置为address:port
的默认主机ssl
: 设置连接使用SSL
模式进行backlog=num
: 设置监听函数listen()
最多允许num
个网络连接处于挂起状态一般情况下,其他的标识符不怎么常用。下面列举一些listen
的常用方法:
listen *:80 | *:8000; #监听所有80端口和8000端口
listen 192.168.1.10:8000; #监听指定ip和端口
listen 192.16.1.10; #监听指定ip下80端口的链接
listen 8000; #监听8000端口下的所有连接
listen 192.168.0.1 default_server #监听80端口,并设置为默认虚拟主机处理
配置虚拟主机名
server_name [name];
name
可以定义多个,以空格隔开,可以使用通配符,但是通配符只能在名称的首段或者尾段。
如: server_name *.myserver.com www.myserver.*
;
同时,name
还可以使用正则表达式,需要以~
开头,表明需要使用正则表达式解析
如:server_name ~^www\d+\.myserver\.com$;
同时在使用正则表达式的时候,支持使用$1 $2
获取捕获变量
且,对于server_name
匹配顺序如下:
server_name
server_name
成功server_name
成功server_name
成功其次,再按照先后顺序进行匹配。
server_name:也可以通过虚拟
IP
进行区分,这里不详细描述
配置location
块
location [ = | ~ | ~* | ^~ ] uri
简单介绍下每个前缀的意思:
例如:location /user/~[\d*]test
其中,/user/
这部分为不包含 正则表达的uri
,后面的匹配字符为包含正则的uri
Nginx
会首先找到所有符合不包含正则表达式uri
:/user/
,然后再通过正则进行匹配~[\d*]
。
=
:用于标准uri
前。要求请求字符串与uri
严格匹配,如果匹配成功,则停止继续向下搜索~
: 用来表示uri
包含正则表达式,并且区分大小写~*
: 用于表示uri
包含正则表达式,并且不区分大小写^~
: 当uri
查找标准uri
的时候,成功匹配到该uri
时,直接使用该location
处理请求 详见: 一文弄懂Nginx的location匹配
配置请求的根目录
root [path]
值得注意的是,root
是会拼接上url
中的path
的,例如
location /data/
{
root /location;
}
则当请求是/data/index.html
的时候,会在/location/data/
目录下查找index.html
配置修改location
中的uri
alias [path]
alias
功能和root
差不多,不过root
是拼接url
,但是alias
是替换掉路径。
比如:
location /data/
{
alias /location/test/;
}
则当请求是/data/index.html
的时候,Nginx
会到/location/test/
目录下查找index.html
文件,注意alias
应该以/
结尾,而root
则没有关系。
设置默认页面
index [filePath]
设置错误页面
error_page code [=[response] uri
code
错误码response
: 替换的错误代码uri
: 返回的错误页面比如:
error_page 404 /404.html
error_page 410 =301 /empty.gif
//将错误码修改为301
设置用户白名单
allow [address] | [CIDR] | all;
address
: 用户的ip
地址
CIDR
:客户端的CIDR
地址
all
: 表示允许所有用户访问
设置黑名单
deny [addiress] | [CIDR] | all;
address
: 用户的ip
地址
CIDR
:客户端的CIDR
地址
all
: 表示禁止所有用户访问
当白名单和黑名单同时匹配的时候,Nginx
会在检索到第一个匹配的名单后,立即停止检索。
也就是以先配置的为准。
配置Nginx
访问密码()
auth_basic [string | off ]
string
: 开启认证功能,配置验证时的提示信息
off
: 关闭认证功能
auth_basic_user_file [filePath]
filePath
: 指定密码,比如:
name1:password1
name2:password2
到这里Nginx
指定DNS
resolver [address] [valid=time]
address
: DNS
服务器地址,默认端口53
time
:数据包有效时间
在访问站点的时候,如果数据包不能再规定时间内到达目的地,则再
time
时间内,数据会被丢弃
resolver 8.8.8.8
DNS
超时时间
resolver_timeout [time]
设置域名解析超时时间
设置代理服务器的协议和地址
proxy_pass [URL]
例如:
server{
resolver 8.8.8.8;
listen 82;
location /
{
proxy_pass http://$http_host$request_uri;
}
}
设置代理地址
proxy_pass [URL]
url
: 被代理服务器的协议以及地址,注意需要包含协议:比如http | https
,同时可以指向服务器组更加值得注意的是,
Nginx
在处理URL
中,是否包含路径的处理方式是完全不同的对于
URL
参数中包含路径的时候,Nginx
会丢弃掉location
中的路径而使用URL
中的路径。对于
URL
参数中不包含路径的时候,Nginx
才会保留location
中的路径比如:
location pages { proxy_pass 127.0.0.1/test }当用户请求
xxx/pages/num1
的时候,会被代理为127.0.0.1/test/num1
location pages{ proxy_pass 127.0.0.1 }当用户请求
xxx/pages/num1
的时候,会被代理为127.0.0.1/pages/num1
这就是为什么添加斜杠和不添加斜杠会有区别的原因。
设置隐藏头
proxy_hide_header [field]
用于设置在响应Http
的时候,需要隐藏的头的内容
设置需要显示的头信息
proxy_pass_header [field]
配置是否将客户端的请求体发送给代理服务器
proxy_pass_request_body [ on | off ]
配置是否将客户端请求的头发送给代理服务器
proxy_pass_request_headers [ on | off ]
更改请求头
proxy_set_header [field] [value]
默认为:
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
此指令比较常用的为:
proxy_set_header Host $http_host #将host头设置为客户端地址
proxy_set_header Host $host #将当前location的server_name设置host
proxy_set_header Host $host:$proxy_port #将server_name和listener指定设置为host
更改请求体
proxy_set_body [value]
设置Nginx
与代理服务器连接超时时间
proxy_connect_timeout [time]
设置Nginx
发送read
请求后,等待的超时时间
proxy_read_timeout [time]
设置Nginx
发送write
请求后,等待的超时时间
proxy_write_timeout [time]
设置用于Nginx
服务器提供代理服务器的Http
版本
proxy_http_version [ 1.0 | 1.1 ]
默认1.0
设置Nginx
请求代理服务器的时候的请求方法,当设置了此指令的时候,客户端请求的方法将被忽略
proxy_method [method]
设置当客户端中断网络请求的时候,Nginx
是否中断被代理服务器的请求
proxy_ignore_client_abort [ on | off ]
默认为off
设置接收到代理服务器返回的数据后,不处理的头
proxy_ignore_headers [field]
设置重定向中的Location
和Refresh
proxy_redirect [redirect] [replacement];
proxy_redirect default;
proxy_redirect off;
redirect
: 匹配Location
头域的字符串,支持正则表达式replacement
:用于替换redirect
返回的内容例如:
proxy_redirect http://localhost:8081/proxy/ http://myweb/frontend/;
default
: 使用location
块的uri
作为replacement
,并使用proxy_pass
作为redirect
例如,default
的效果等同于:
location /server/
{
proxy_pass http://proxyserver/source/;
proxy_redirect http://proxyserver/source/ /server/;
}
off
:关闭所有配置配置使用Nginx
的错误页面
proxy_intercept_errors [on | off]
当被代理服务器返回的HTTP
状态码大于等于400的时候,是否使用Nginx
自带的错误页。
配置存放HTTP
报文头哈希表的容量
proxy_headers_hash_max_size [size]
Nginx
使用Hash
表存储HTTP
头信息,用于快速检索HTTP
头内容,默认512个字符
配置ssl
加密
proxy_ssl_session_reuse on | off
配置后,Nginx
将使用SSL
安全协议连接被代理的服务器
就像BufferedReader
一样,Nginx
也可以配置一个缓存区,用来等待接收了所有数据后,再转发给前端。
相关指令如下:
以下指定都是每次
Http
请求的配置,没有总的Buffer
和配置
设置proxy_buffering
是否开启
proxy_buffering on | off
默认为开启状态
设置缓冲区大小
proxy_buffers [number] [size]
例如:
proxy_buffers 8 4k
默认为4k或8k
设置第一次获取响应数据大小
proxy_buffer_size [size]
一般第一次获取的数据为Http
头
默认为4KB或者8KB
限制同时出去BUSY
状态的proxy buffer
总大小
proxy_busy_buffers_size [size]
默认为8KB或16KB
设置临时路径
当Buffer
不够存放响应数据的时候,Nginx
会将接下来的数据放在此路径中
proxy_temp_path path [level1 [level2]]
[level1] 表示存放的路径,比如 temp/1/2/3
表示 temp 1 2 3
level3
设置临时文件总大小
proxy_max_temp_file_size [size]
默认为1024MB
配置同时写入(IO)临时文件的数据量总大小
proxy_temp_file_write_size [size]
用于防止IO
负载过重,默认8KB或16KB
Nginx
可以配置缓存,用来提高效率
Nginx缓存会检查被代理服务器响应的
HTTP
头中的Cache-Control,Expires
,控制此条数据是否缓存
设置存放缓存索引的内存区域名称
proxy_cache [zone] | [off]
zone
: 区域名称。缓存过滤
proxy_cache_bypass [string]
设置不进行缓存的条件
string
条件变量,只有当所有条件变量都为空的时候,响应才从缓存中获取例如:
proxy_cahche_bypass $cookie_nocache $arg_nocache $arg_comment $http_paragma
设置缓存Key
proxy_cache_key [string]
string
: key
,默认为$scheme$proxy_host$url$is_asrs$args
是否开启缓存锁
proxy_cache_lock on | off
默认为关闭状态
设置锁超时时间
proxy_cache_lock_timeout [time]
设置缓存条件次数
proxy_cache_min_uses [numbers]
当有当用户相同的请求到达某些次数后,才进行缓存
设置当被代理服务器状态异常的时候,直接返回缓存
proxy_cache_use_stale | timeout | invalid_header |updating | http_500 | http_502 | http_404 | off
当被代理服务器异常的时候,使用此指令可以让Nginx
直接返回被缓存的数据。默认off
updating
表示被请求的数据在Nginx
中正好处理更新状态
通过状态码设置缓存时间
proxy_cache_valid [code ... ] [time]
code
: 默认为200,301,302 可以使用any
表示任何比如:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 301 1h;
设置不使用缓存的条件
proxy_no_cache [string]
string
条件变量,只有当所有条件变量都为空的时候,才使用缓存功能
设置磁盘缓存
proxy_store on | off | string
string
: 自定义存放路径此指令用来配置是否在本地磁盘缓存来自代理服务器的数据,它不占用内存空间,也不提供缓存过期更新功能,对于静态数据效果较好
设置用户或用户组对缓存的访问权限
proxy_store_access users:permissions
当开启了缓存到本地磁盘后,用户是否此此数据有访问权限。
比如:
{
proxy_store on;
proxy_store_access user:rw group:rw all:r;
}
在Linux
版本的Nginx
中。
主要包含以下4个目录:
conf
: nginx
的配置文件,其中nginx.conf
是nginx
服务器的主要配置文件、html
: 存在Nginx
服务器在运行过程中调用的一些html
网页文件。比如500 error
,以及默认首页等logs
: nginx
的日志目录sbin
:nginx
服务器的主程序nginx
的运行机制为一个主进程以及多个worker process
,我们可以通过像主进程发送信息来管控整个服务。
比如在一个启动了Nginx
的服务器运行ps -ef | grep nginx
,可以看到如下结果:
root 27141 1 0 16:00 ? 00:00:00 nginx: master process ./nginx
nobody 27142 27141 0 16:00 ? 00:00:00 nginx: worker process
root 27222 17292 0 16:07 pts/0 00:00:00 grep --color=auto nginx
可以看到27141为主进程,27142为worker process
。
我们可以通过向主进程发送信号以控制Nginx
比如:
kill QUIT 27141
//停止nginx
nginx
主进程的PID
还可以通过nginx
启动的时候写入到logs/nginx.pid
文件中的进程号获取
除了可以通过
kill
命令发送信号,还可以通过nginx
客户端发送信号
Nginx
可以接受的信号如下:
信号 | 作用 |
---|---|
TERM 或 INT | 快速停止Nginx 服务 |
QUIT | 平缓停止Nginx 服务 |
HUP | 使用新的配置文件启动进程,之后平缓停止原有进程(“平滑重启”) |
USR1 | 重新打开日志文件 |
USR2 | 使用新版Nginx 启动服务,之后平缓停止原有进程(“平滑升级”) |
WINCH | 平缓停止worker process ,用于Nginx 平滑升级 |
在Nginx
也会有内置命令自己读取/log/nginx.pid
文件,并发送信号,对应如下:
reload
: HUP
reopen
: USR1
stop
: TERM
quit
: QUIT
建议使用上面的方式,原理都是一样的,不过更加简单
输入nginx -h
,可以看到官方说明如下:
-v
: 查看版本-V
:查看版本以及配置-t
: 测试配置是否有效-q
: 测试配置时只提示错误信息-s
: 给主进程发送信息,stop quit reopen reload
-p
: 指定nginx
服务器路径前缀-c
: 指定配置文件路径-g
: 指定nginx
附加配置文件路径Nginx
停止有两种方式,分别是平滑停止和立即停止。
平滑停止指的是首先处理完当前正在处理器请求,并且停止接收请求,然后再停止服务器。
对应
nginx -s quit
立即停止指的是立即丢弃当前所有连接,停止工作。
对应
nginx -s stop
对用Nginx
的重启,也包含两种方式,第一种是关闭Nginx
,然后再打开,这样整个程序都会重启加载,第二种是平滑重启。
暴力重启
nginx -s stop
nginx -s start
平滑重启
Nginx
的平滑重启原理如下,首先Nginx
接收到信号后,会读取新的Nginx
服务,然后平缓(QUIT
)的关闭旧的服务进程,如果新的配置有问题,则仍然使用旧的Nginx
服务
Nginx
升级也有暴力升级和平滑升级两种方式,第一种方式和重启差不多,下面详细说第二种方式。
Nginx
没有内置的升级命令,所有只能使用kill
或则nginx
二进制文件发送信号。
升级过程如下:
Nginx
接收到USER2
信号后,会将旧的nginx.pid
文件添加后缀.oldbin
Nginx
会执行新版本的Nginx
服务器的二进制文件启动服务,如果新的服务启动成功,则系统中会存在两个Nginx
服务,Nginx
服务进程发送WINCH
信号,使得就得nginx
服务平滑停止过程如下:
首先将升级的二进制文件替换掉旧的二进制文件,然后执行以下命令
./nginx -g USR2
//发送平滑升级信号,此信号会使得Nginx
自动启动新的进程,并修改pid
文件
此命令执行完毕后,系统中会有两个
Nginx
进程同时服务
./nginx -g WINCH
//发送平滑停止旧服务器信号,
此命令用于停止旧的
Nginx
进程的worker process
,但是master process
还存在
./nginx -g QUIT
//使得旧的服务退出
执行到这里后,整个旧的
Nginx
便退出服务
Linux
系统参数vi /etc/sysctl.conf
net.core.netdev_max_backlog
表示网络结果接收包的速率比内核处理速率快的时候,允许发送到队列数据包的最大数目,一般默认为128.
net.core.netdev_max_backlog=262144
net.core.somaxconn
用于调节系统同时发起的TCP
连接数,一般默认128,值过小可能引起连接超时或则重传问题
net.core.somaxconn=262144
net.ipv4.tcp_max_orphans
用于防止Dos
的参数,系统内存充足的时候,可以增大这个参数
net.ipv4.tcp_max_orphans=262144
net.ipv4.tcp_max_syn_backlog
记录尚未收到客户端确认信息的链接请求的最大值。
net.ipv4.tcp_max_syn_backlog=262144
net.ipv4.tcp_timestamps
时间戳可以避免序列号的卷绕。一个1Gbps 的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。
net.ipv4.tcp_timestamps=0
net.ipv4.tcp_synack_retries
为了打开对端的连接,内核需要发送一个SYN 并附带一个回应前面一个SYN 的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK 包的数量
net.ipv4.tcp_synack_retries=1
net.ipv4.tcp_syn_retries
同上
net.ipv4.tcp_syn_retries = 1
worker_processes
设置Nginx
服务进程数,一般为CPU
的整数倍。
worker_prcesses 4;
worker_cpu_affinity
为每个进程分配CPU
,建议将每个进程分配到不同的CPU
中
worker_cpu_affinity 0001 0010 0100 1000
keepalive_timeout
设置Nginx
服务器与客户端保持连接的超时时间
keepalive_timeout 60 50;
send_timeout
设置Nginx
等待客户端响应超时时间,当成功连接后,如果超过这个时间客户端没有再次发送请求,则断开连接
send_timeout 10s
client_header_buffer_size
客户端请求头缓冲区大小,默认1KB,超过此大小可能会莫名其妙报400错误,
client_header_buffer_size 4k;
multi_accept
配置Nginx
服务器是否尽可能多的接收客户端的网络连接请求,默认为off
multi_accept on
use
配置使用的事件驱动模型
use epoll
worker_connections
设置Nginx
每个工作进程允许同时连接客户端最大数量
worker_connections 65535
配置服务器组
upstream [name]{
server address [paramters];
server address [paramters];
server address [paramters];
}
name
:服务器的名字
address
: 服务器的地址,可以是ip
或则是域名
paramters
: 服务器的其他配置,主要包含以下
weight = number
设置权重,权重越高的服务器会被有限调用max_fails = number
失败次数,当在fail_timeout
时间内请求失败超过这个次数时,任务服务器down
,默认为1fail_timeout = time
: 指定失败清理时间以及此事件内,不再检查此服务是否恢复。默认10sbackup
: 备用服务器,只有当正常服务器无效的时候,才会启动此服务器down
:永久无效服务器,通常与ip_hash
配合使用例如:
upstream test{
server test.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server 192.168.0.1 backup
}
保持会话
默认情况下,Nginx
会把请求轮流发送给服务器组中的服务进行处理,但是某些时候需要有会话机制。此时可以通过ip_hash
设置。
ip_hash;
ip_hash
不能与server
指令中的weight
一起使用。配置如下
upstream test{
ip_hash;
server test.com;
server test2.com;
}
连接池
当Nginx
作为反向代理的时候,大多数情况都是Nginx
和后端服务器连接,此时当3次握手后,可以暂时保持连接,而不断开,这样可以更大的提升性能。
keepalive [connections]
connections
为Nginx
服务器每个工作进程允许该服务器保持的空闲网络连接的上限。当超过该连接,则使用LRU
算法关闭连接
最少连接配置
least_conn
可以配置Nginx
使用least_conn
算法分配连接,当连接到来的时候,Nginx
将选择目前连接最少的服务器,当同时又多个连接最少的服务器时,再使用加权轮加,选择权重最高的服务器。
rewrite
有点像Servlet
的重定向,但是不是301那种让浏览器重定向,而是让服务器自己重定向。
if ( condition ){ ... }
例如:
if($request_method = POST){
return 405;
}
注意这里的字符串不用加引号
同时,condition
可以使用正则表达式进行匹配。
~
表示对大小写敏感~*
表示对大小写不敏感!~
/ ~*
: 取反()
:捕获变量,使用$1 , $2
获取值例如:
if($http_user_agent ~ MSIE){
# $http_user_agent 的值是否含有MSIE字符串
}
一般正则表达式不用添加引号,但是如果表达式里面包含右花括号或则分号的时候,需要添加引号
if(-f $request_filename){
#如果文件存在,则。。
}
-f
:判断文件是否存在-d
:判断文档是否存在-e
:判断请求的文档或目录-x
:判断请求的文件是否可执行直接返回,不再执行后面的指令
完成对请求的处理。
return { text }
return [code] [URL];
return [URL];
通过正则表达式来修改URL
rewrite [regex] [replacement] [flag];
注意
rewrite
接收不到HOST
地址,只能修改路径比如: dengchengchao.com/test/123 ,
rewrite
只能接收到/test/123
同时
rewrite
也接收不到参数,比如: dengchengchao.com/test?name=dcc. 获取不到
name=dcc
replacement
: 匹配成功后用于替换URI
中被截取的字符号flag
: 用来设置rewrite
对URI
处理的行为
last
: 匹配成功后终止URI
在本块的处理,交由给location
重新匹配break
: 匹配成功后继续交给本块中的其他重写URI
处理redirect
: 将重写后的URI
返回给客户端,状态为302
,指明为临时重定向permanent
: 将重写后的URI
返回给客户端,状态为301
,指明为永久重定向rewrite_log on | off
是否开启重定向日志输出
默认off
set variable value
设置新的变量名
开启 gzip
压缩
gzip on | off;
设置gzip
缓存空间大小
gzip_buffers [number] [size]
number
: 指定Nginx
服务器需要向系统申请缓存空间的个数size
: 每个缓存空间的大小默认为number*size=128
即gzip_buffers 32 4k
设置gzip
压缩程度
gzip_comp_level [level]
级别为1到9,1压缩程度最低,效率最高,9表示压缩程度最高,效率最低。默认为1
设置gzip
过滤名单
gzip_disable [regex]
某些情况下,有些浏览器不支持gizp
压缩,因此可以通过User-Agent
正则表达式过滤
例如: gzip_disable "MSIE [1-6]\."
表示IE6及以下不启动压缩
设置gzip
最低支持的Http
协议版本
gzip_http_version 1.1
表示Http
为1.1
及以上版本的时候,才使用Gzip
压缩,默认为1.1
设置gzip
最小长度
gzip_min_length [length]
只有当长度超过此长度,才启用压缩,长度过小的话压缩效果不明显,默认为20
gzip_min_length 1024
设置需要压缩的MIME
类型
gzip_types mime-type ...
某些时候,对于图片,视频,以及超大文件,不建议gzip
压缩。因为效果不大,并且消耗CPU
gzip_types text/plain application/x-javascript text/css text/html application/xml
设置添加gzip
头
gzip_vary on | off
开启此指令的时候,会在响应数据添加一个头部:Vary:Accept-Encoding
启用静态压缩
gzip_static [ on | off | always ]
on
:开启模块功能off
: 关闭模块功能always
: 一直发送gzip
文件,不检查客户端是否支持压缩静态压缩用于发送压缩文件,比如.gz
文件。
同时,静态压缩也支持:gzip_http_version , gzip_disable,gzip_vary
等
解压缩指令
gunzip_static on | off
此功能主要用于如果客户端不支持Gzip
处理,那么Nginx
服务器将返回解压后的数据,这样Nginx
作为中间层的时候,Nginx
和后端的传输可以使用压缩,然后Nginx
再进行解压
同时,gunzip
也支持:gunzip_http_version , gunzip_disable,gunzip_vary
等
以上,基本是所有示例,接下来附带配置示例:
http{
gzip on; #开启gzip
gzip_min_length 1024; #gzip最小长度
gzip_buffers 4 16k; #缓存区配置
gzip_comp_level 2; #压缩级别
gzip_types text/plain application/x-javascript text/css application/xml; #压缩资源类型
gzip_vary on; #启用压缩标志
gunzip_static on; #检查预压缩文件
}
首先明白Nginx
的依赖:
PCRE pcre-devel
:Nginx
的Http
模块使用的pcre
模式解析的正则表达式,所以需要在Linux
上安装pcre
库,pcre-devel
是使用pcre
二次封装的一个库,Nginx
也依赖于它
yum install -y pcre pcre-devel
zilb
: Nginx
使用zlib
对http
包的内容进行gzip
压缩。
yum install -y zlib zlib-devel
OpenSSL
: Nginx
使用OpenSSL
支持Https
协议
yum install -y openssl openssl-devel
安装好以上依赖之后,上官网下载最新的二进制包,虽然一般yum
源也有Nginx
,但是这个源可能很久没有更新了,因此最好直接去官方下载最新的二进制包,编译安装。
同时,也可以使用命令进行安装下载
wget -c https://nginx.org/download/nginx-1.10.1.tar.gz
下载了二进制包之后,接下来就是解压:
tar -zxvf nginx-1.4.2.tar.gz
接下来是配置Nginx
,默认情况下我们使用默认配置即可
./configure
一切准备就绪后,就可以进行编译安装了
make
make install
make 为编译 make install 为安装
安装完成后,一般默认安装位置为/usr/local/nginx
到这里Nginx
基本安装完毕。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.