events配置部分
worker_connections 1024;
定义每个work_process同时开启的最大连接数,即允许最多只能有这么多连接。
accept_mutex on;
当某一个时刻只有一个网络连接请求服务器时,服务器上有多个睡眠的进程会被同时叫醒,这样会损耗一定的服务器性能。 Nginx中的accept_mutex设置为on,将会对多个Nginx进程(worker processer)接收连接时进行序列化,防止多个进程争抢资源。 默认就是on。
multi_accept on;
nginx worker processer可以做到同时接收多个新到达的网络连接,前提是把该参数设置为on。 默认为off,即每个worker process一次只能接收一个新到达的网络连接。
use epoll;
Nginx服务器提供了多个事件驱动器模型来处理网络消息。
其支持的类型有:select、poll、kqueue、epoll、rtsing、/dev/poll以及eventport。
* select:只能在Windows下使用,这个事件模型不建议在高负载的系统使用
* poll:Nginx默认首选,但不是在所有系统下都可用
* kqueue:这种方式在FreeBSD 4.1+, OpenBSD2.9+, NetBSD 2.0, 和 MacOS X系统中是最高效的
* epoll: 这种方式是在Linux 2.6+内核中最高效的方式
* rtsig:实时信号,可用在Linux 2.2.19的内核中,但不适用在高流量的系统中
* /dev/poll: Solaris 7 11/99+,HP/UX 11.22+, IRIX 6.5.15+, and Tru64 UNIX 5.1A+操作系统最高效的方式
* eventport: Solaris 10最高效的方式
rewrite中的break和last
两个指令用法相同,但含义不同,需要放到rewrite规则的末尾,用来控制重写后的链接是否继续被nginx配置执行(主要是rewrite、return指令)。
示例1(连续两条rewrite规则):
server{
listen 80;
server_name test.com;
root /tmp/123.com;
rewrite /1.html /2.html ;
rewrite /2.html /3.html ;
}
当我们请求1.html时,最终访问到的是3.html,两条rewrite规则先后执行。
break和last在location {}外部
格式:rewrite xxxxx break;
示例2(增加break):
server{
listen 80;
server_name test.com;
root /tmp/123.com;
rewrite /1.html /2.html break;
rewrite /2.html /3.html;
}
当我们请求1.html时,最终访问到的是2.html
说明break在此示例中,作用是不再执行break以下的rewrite规则。
但,当配置文件中有location时,它还会去执行location{}段的配置(请求要匹配该location)。
示例3(break后面还有location段):
server{
listen 80;
server_name test.com;
root /tmp/123.com;
rewrite /1.html /2.html break;
rewrite /2.html /3.html;
location /2.html {
return 403;
}
}
当请求1.html时,最终会返回403状态码,说明它去匹配了break后面的location{}配置。
以上2个示例中,可以把break替换为last,它们两者起到的效果一模一样。
当break和last在location{}里面
#示例4(什么都不加):
server{
listen 80;
server_name test.com;
root /tmp/123.com;
location / {
rewrite /1.html /2.html;
rewrite /2.html /3.html;
}
location /2.html
{
rewrite /2.html /a.html;
}
location /3.html
{
rewrite /3.html /b.html;
}
}
#当请求/1.html,最终将会访问/b.html,连续执行location /下的两次rewrite,跳转到了/3.html,然后又匹配location /3.html
#示例5(增加break):
server{
listen 80;
server_name test.com;
root /tmp/123.com;
location / {
rewrite /1.html /2.html break;
rewrite /2.html /3.html;
}
location /2.html
{
rewrite /2.html /a.html;
}
location /3.html
{
rewrite /3.html /b.html;
}
}
#当请求/1.html,最终会访问/2.html
#在location{}内部,遇到break,本location{}内以及后面的所有location{}内的所有指令都不再执行。
#示例6(增加last):
server{
listen 80;
server_name test.com;
root /tmp/123.com;
location / {
rewrite /1.html /2.html last;
rewrite /2.html /3.html;
}
location /2.html
{
rewrite /2.html /a.html;
}
location /3.html
{
rewrite /3.html /b.html;
}
}
#当请求/1.html,最终会访问/a.html
#在location{}内部,遇到last,本location{}内后续指令不再执行,而重写后的url再次从头开始,从头到尾匹配一遍规则。
- 当rewrite规则在location{}外,break和last作用一样,遇到break或last后,其后续的rewrite/return语句不再执行。但后续有location{}的话,还会近一步执行location{}里面的语句,当然前提是请求必须要匹配该location。
- 当rewrite规则在location{}里,遇到break后,本location{}与其他location{}的所有rewrite/return规则都不再执行。
- 当rewrite规则在location{}里,遇到last后,本location{}里后续rewrite/return规则不执行,但重写后的url再次从头开始执行所有规则,哪个匹配执行哪个。
nginx location优先级
= 高于 ^~ 高于 ~* 等于 ~ 高于 /
对比/和~
示例1:
server{
listen 80;
server_name www.aminglinux.com;
root /tmp/123.com;
location /abc/
{
echo "/";
}
location ~ 'abc'
{
echo "~";
}
}
#测试命令:curl -x127.0.0.1:80 'www.aminglinux.com/abc/1.png'
#结果是:~
对比~和~*
示例2:
server
{
listen 80;
server_name www.aminglinux.com;
root /tmp/123.com;
location ~ 'abc'
{
echo '~';
}
location ~* 'abc'
{
echo '~*';
}
}
测试命令:curl -x127.0.0.1:80 'www.aminglinux.com/abc/123.html'
结果是:~
示例3:
server
{
listen 80;
server_name www.aminglinux.com;
root /tmp/123.com;
location ~* 'abc'
{
echo '~*';
}
location ~ 'abc'
{
echo '~';
}
}
测试命令:curl -x127.0.0.1:80 'www.aminglinux.com/abc/123.html'
结果是:~*
结论:~和~*优先级其实是一样的,如果两个同时出现,配置文件中哪个location靠前,哪个生效。
对比^~和~
示例4:
server
{
listen 80;
server_name www.aminglinux.com;
root /tmp/123.com;
location ~ '/abc'
{
echo '~';
}
location ^~ '/abc'
{
echo '^~';
}
}
测试命令:curl -x127.0.0.1:80 'www.aminglinux.com/abc/123.html
结果是:^~
对比=和^~
示例5:
server
{
listen 80;
server_name www.aminglinux.com;
root /tmp/123.com;
location ^~ '/abc.html'
{
echo '^~';
}
location = '/abc.html'
{
echo '=';
}
}
测试命令:curl -x127.0.0.1:80 'www.aminglinux.com/abc.html
结果是:=