Nginx配置项及部分参数的优化

来源:互联网 发布:云计算与物联网的关系 编辑:程序博客网 时间:2024/05/24 00:59

Nginx配置及部分优化

配置文件的组成部分:

主配置文件:nginx.conf //没有片段化的配置文件,所以需要自己添加 include conf.d/*.conf来进行片段化的设定
/etc/nginx/conf.d/*.conf
fastcgi的配置文件:/etc/nginx/fastcgi.conf(新) fastcgi_params(php传递参数) fastcgi _conf.default(默认配置) //使用哪个最好主配置文件中指明,前两个与php结合
uwsgi_params //定义fastcgi和pam结合
/usr/local/nginx/html //主测试页

配置指令(必须以分号结尾):
main block:对http及mail模块均有效;
Directive value1 [value2…];
支持使用变量:
内置变量:由模块引入,可直接引用;
自定义变量:set variable_name value;
引用变量:$variable_name

配置文件组织结构
配置前进行备份,配置文件中的选项依赖于安装时的模块。

    main block  //全局配置;    event {    ...    }   //事件驱动的相关配置段;    http {    ...    }  //http的配置。    mail {...       } //mail相关配置

http配置段: //下面吗可以有横多的server虚拟主机,或者

http {......server {    ...    server_name    //名字    root   //指明根路径    alias  //指明映射    location /uri/ {     //指明    }    ...}server {...}   //每个主机一个,哪怕只有一个。}

main配置段:

配置指令类别:

正常运行必备的配置;优化性能相关的配置;用于调试、定位问题的配置;

正常运行必备的配置:

  1. user USERNAME [GROUPNAME]; // 指定用于运行worker进程的用户和组;
    user nginx nginx;
  2. pid /PATH/TO/PID_FILE; //指定nginx进程的pid文件路径; 可以在官方文档中查看。
    pid /var/run/nginx.pid;
  3. worker_rlimit_nofile_number # ; //指定一个worker进程所能够打开的最大文件描述符数量;
  4. worker_rlimit_sigpending #; //指定每个用户能够发往worker进程的信号的数量;

性能优化相关的配置:

  • worker_processes #|auto; //指明工作进程worker进程的个数;通常应该为物理CPU核心数量减1,因为cpu的编号从0开始。
    可以为”auto”,实现自动设定;

  • worker_cpu_affinity CPUMASK | auto …; //affininty亲和力
    让每个核运行一个nginx进程,如果不这样CPU轮转是吧进程切换出去再次切换进来的时候,不一定是原来的cpu,CPU本地缓存就没办法命中,性能不保证;这回产生不必要的浪费。
    CPUMASK: cpu掩码 下面是滴1,2 ,3 4 个cpu上
    0001; 0010; 0100; 1000 指明运行在哪个cpu上,1掩盖的位在第几位上就是几。然后减一。因为cpu的编号从0开始。
    ps axo commond ,pib,psr // 查看效果 命令 pid 哪个cpu
    worker_cpu_affinity 00000001 00000010 00000100; //指运行在哪几个或那个CPU上。
    master工作是很清闲,所以不用绑定

  • worker_priority nice; //调整worker进程优先级
    [-20, 19]
  • timer_resolution interval; //计时器解析度,降低此值,可减少gettimeofday()系统调用的次数

调试、定位问题的配置:

  • daemon off|on ; //是否以守护进程方式启动nignx;调试的的时候应该设置为off,此时会将相关的信息输出到屏幕上;
  • master_process on|off; //是否以master/worker模型运行nginx;调试时设置为off;
  • error_log /PATH/TO/ERROR_LOG LEVEL;
    error_log file | stderr | syslog:server=address[,parameter=value] | memory:size [debug | info | notice | warn | error | crit | alert | emerg];
    //错误日志文件及其级别;出于调试的需要,可以设定为debug;但debug仅在编译时使用了“–with-debug”选项时才有效;
    能放在server中上面的配置选项。
    方式:

    file /PATH/TO/SOME_LOG_FILE;
    stderr:发送到错误输出;
    syslog:server=address[,parameter=value]:发送给syslog服务器;
    memory:size 日志写到缓冲中再慢慢写到磁盘
    日志级别:debug依赖于configure时的–with-debug选项;


nginx.conf的配置event相关:

main配置段不需要放在括号中
events {

}

  • worker_connections #; //每个worker进程所能够响应的最大并发请求数量;默认512个。
    受限于worker_rlimit_noflie(可以打开的文件的数量)
    worker_proceses * worker_connections =当前nginx能够响应的并发连接数量
  • use [epoll|rgsig|select|poll]; //指明并发连接请求处理时的方法。linux上是epoll。定义使用的事件模型;建议让nginx自动选择;
  • accept_mutex [on|off]; //master调度worker接收用户的请求的负载均衡锁;默认开启。启用时,表示用于让多个worker轮流地、序列化地响应新请求;使用的accept()系统调用。如果禁用则可能会产生资源竞争。
  • accept_mutex_delay TIME //设置获得互斥锁的最少延迟时间。缺省500ms。
  • lock_file /PATH/TO/LOCK_FILE; //accept_mutex用到的锁文件路径。

套接字或主机相关的指令

http {...} // nginx 使用锁机制,保证互斥。

http{

} //相关的配置。

  • server {} //定义一个虚拟主机;基于IP和主机名没什么区别。server在http内部。
server {    listen PORT;     server_name NAME;    root /PATH/TO/DOCUMENTROOT;    }

注意:
(1) 基于port;listen指令监听在不同的端口;
(2) 基于hostname; server_name指令指向不同的主机名;
(3) 基于IP的虚拟主机; listen IP:PORT //很少用。IP和名称的主机名区别不大。
- listen //

listen address[:port] [default_server] [ssl] [backlog=number] [rcvbuf=size] [sndbuf=size];listen port [default_server] [ssl] ;listen unix:path [default_server][ssl];第三类的套接字,unix套接字。

default_server:设置默认虚拟主机;用于基于IP地址,或使用了任意不能对应于任何一个server的name时所返回站点;
ssl:用于限制只能通过ssl连接提供服务;
backlog:后援队列的长度;
spdy:SPDY protocol(speedy),在编译了spdy模块的情况下,用于支持SPDY协议;
http2:http version 2;
sndbuf: 发送缓冲区的大小。
rcvbuf: 接收缓冲大小;

  • server_name NAME […]; //指明当前主机的server名。
    后可跟一个或多个主机名;支持使用*任意长度的任意字符;名称还可以使用通配符和正则表达式(~);

(1) 首先做精确匹配;例如:www.magedu.com
(2) 左侧通配符;例如:*.magedu.com
(3) 右侧通配符,例如:www.magedu.*
(4) 正则表达式,例如:~^.*\.magedu\.com$ //~开头表示,如果正则匹配到很多主机名,则优先级为1》2》3》4
(5) default_server

  • tcp_nodelay on|off; //对keepalive模式下的连接是否使用TCP_NODELAY选项,(小资源不被回应,而是会一并返回);

  • sendfile on|off; //(内核中封装响应报文)是否启用sendfile功能;

  • tcp_nopush on|off;
    //是否启用TCP_NOPUSH(FREEBSE)或TCP_CORK(Linux)选项;仅在sendfile为on时有用。();

路径相关的指令:

nginx -t -s
- root 设置web资源的路径映射;用于指明用户请求的URL所对应本地文件系统的文档的目录路径;
可用的上下文:http,server,localtion,if

mkdir  -pv  /web/html           server {        ...        root  /data/www/vhost1;    }

http://www.magedu.com/images/logo.jpg –> /data/www/vhosts/images/logo.jpg

server {      //就需要三行设置虚拟主机listen,server_name  root        ...    listen 80;        server_name  www.magedu.com;    location /images/ {        root  /data/imgs/;    ...    }  }

http://www.magedu.com/images/logo.jpg –> /data/imgs/images/logo.jpg


  • location [ = | ~ | ~* | ^~ ] uri { … } //根据资源种类选择对应的处理方式,location用来选择资源。
    location @name { … }
    功能:允许根据用户请求的URI来匹配定义的各location(匹配资源),匹配到时,此请求将被相应的location块中的配置所处理;简言之,即用于为需要用到专用配置的uri提供特定配置 。location可以进行嵌套;
server {    ...    server_name www.magedu.com;    root /data/www;    location  /admin/  {    configuration  A      } }  

location PATTER
=:URI的精确匹配;
~:做正则表达式匹配,区分字符大小写;
~*:做正则表达式匹配,不区分字符大小写;
^~:URI的左半部分匹配,不区分字符大小写;

匹配优先级:精确匹配= > ^~ > ~或~* > 不带符号的URL;

  • alias path;
    只能用于location配置段,定义路径别名,文档映射的一种机制;
 location  /i/ {       alias   /web/html/;        }   

访问http://xxxx/i/a.jpg —–> /web/html/a.jpg

      location /bbs/ {     root /web/forum/;        }   

访问的是 /web/forum/bbs/a.jpg

注意:
root指令:给定的路径对应于location中的“/url/左侧”这个URL;/images/test.jpg –> /data/imgs/images/test.jpg
alias指令:给定的路径对应于location的“/uri/”这个URL;/images/test.jpg –> /data/imgs/test.jpg

  • index file …;
    生效位置: http,server,location
    默认主页面,不同的location可用在不同的主页中;

  • error_page code … [=[response]] uri;
    根据用户请求资源的http响应的状态码重定向错误页面,也可以把多个状态定向到某个页面上;

    error_page  404  /404.html    //这是个相对位置    error_page  404  =200  /404.html     //以指定的响应状态码进行响应。
  • try_files file … uri;
    try_files file … =code;
    生效于server location
    尝试查找第1至第N-1个文件,第一个即为返回给请求者的资源;若1至N-1文件都不存在,则跳转至最一个uri(必须不能匹配至当前location,而应该匹配至其它location,否则会导致死循环);
    例:
location /test {try_files test1.html  test2.html   test3.html    xxxx}     //开始匹配名字,匹配不到转到xxxx此时的状态码是404,还可以进行状态码的指定。location = 50x.html {root  html }  //当用户精确匹配是才会访问 html 在root下,root为于安装nginx的根路径。

客户端请求相关的配置:

  1. keepalive_timeout timeout [header_timeout];
    //设定keepalive连接的超时时长;0表示禁止长连接;默认为75s;
  2. keepalive_requests number;
    //在keepalived连接上所允许请求的最大资源数量;默认为100;
  3. keepalive_disable none | browser …;
    //指明禁止为何种浏览器使用keepalive功能;不用可忽略。
  4. send_timeout #;
    //发送响应报文的超时时长,默认为60s。特别地,是指两次写操作之间的间隔时长;
  5. client_body_buffer_size size;
    //用于接收客户请求报文body的缓冲区大小;默认为16k;超出此指定大小时,其将被移存于磁盘上;
  6. client_body_temp_path path [level1 [level2 [level3]]];
    //设定用于存储客户端请求body的临时存储路径及子目录结构和数量,缓冲的太多会查找困难,设定级别;
    client_body_temp_path /var/tmp/client_body 2 2; 两个16进制数字创建一级子目录,2个16进制创建2级子目录;
  7. client_max_body_size= #M //用户上传文件大小(还需要更改php。ini参数 )

对客户端请求进行限制的配置

  • limit_excpet METHOD {…} // 对指定范围之外的其它的方法进行访问控制;
    例:
limit_except  GET {  //指定方法    allow  172.16.0.0/16;       //可以使用所有方法的主机    deny all;     //其他主机无法使用get以外的方法}
  • limit_rate speed; // 限制客户端每秒钟所能够传输的字节数,默认为0表示无限制;
    例:
location = /index.html {    limit_rate 2048   //单位是bytes/second}

文件操作优化相关的配置

  • aio on|off | threads[=pool]; //开启AIO功能;使用多少线程,了解。.
    生效于http,server,location
  • directio size|off; //设定直接I/O的大小,或关闭I/O.
    写请求不做缓存,直接刷到磁盘上。 慢,可靠性高。
    Enables the use of the O_DIRECT flag (FreeBSD, Linux), the F_NOCACHE flag (Mac OS X), or the directio() function (Solaris), when reading files that are larger than or equal to the specified size.

  • open_file_cache off; //打开的文件缓存。
    open_file_cache max=N [inactive=time];
    nginx可以缓存以下三种信息(文件元数据):
    (1) 文件描述符、文件大小和最近一次的修改时间;
    (2) 打开的目录的结构;
    (3) 没有找到的或者没有权限操作的文件的相关信息;

max=N表示可缓存的最大条目上限;一旦达到上限,则会使用LRU算法从缓存中删除最近最少使用的缓存项;
inactive=time:在此处指定的时长内没有被访问过的缓存项是为非活动缓存项,因此直接删除;

  • open_file_cache_errors [on | off]; // 是否缓存查找时发生错误时的文件相关信息;
  • open_file_cache_min_uses #; //缓存项在非活动期限内最少应该被访问的次数,才可以称为活动项;
  • open_file_cache_valid # ; //每隔多久检查一次缓存中缓存项的有效性;默认为60s;

其他模块

ngx_http_access_module模块的配置(基于IP的访问控制)
应用上下文:http, server, location, limit_except

 allow address | CIDR | unix: | all; deny address | CIDR | unix: | all;   //规则顺序重要。

ngx_http_auth_basic_module模块的配置(basic认证)

auth_basic string | off;

使用http basic认证协议对用户进行认证;

auth_basic_user_file file;

实现用户认证的账号文件;
文件格式:

name1:password1name2:password2:comment  //第三项可以为描述

密码格式:

(1) encrypted with the crypt() function; (2) md5加密; (3) htpasswd -c -m /etc/nginx/.ngxpasswd;

例:

location /admin/ {auth_basic "Admin Area";     //直接写的auth_basic_user_file /etc/nginx/.ngxhtpasswd;}                   

ngx_http_stub_status_module模块配置(超级重要):

通过指定的uri输出nginx的基本状态信息 stub status;
在nginx1.8版本上,不需要加on,加了也无所谓。在1.8以前的版本高需要加on。表示开启。

location /admin {stub_status on;   /没有on会报错;}
Active connections: 1  server accepts handled requests   //过去的16630948 16630948 31070465 Reading: 6 Writing: 179 Waiting: 106     //现在的          Active connections:当前活动的客户端连接数;accepts:已经接受的客户端连接总数量;handled:已经处理完成的客户端连接总数量;requests:客户端的总的请求数量;Readking:正在读取的客户端请求的数量;Writing:正向其发送响应报文的连接数量;Waiting:等待其发出请求的空闲连接数量;

ngx_http_referer_module模块配置(基于请求报文中的Referer首部的值做访问控制)
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首部,但其没有有效值,或其值非以http://或https://开头;server_names:其值为一个主机名;arbitrary string:直接字符串,可以使用*通配符;regular expression:以~起始的正则表达式;

内置变量:$invalid_referer(所有不能符合valid_referer指定定义的引用请求均为不合法引用;不能被引用匹配到的都是内置变量)
示例:

valid_referers   none   blocked   server_names   *.magedu.com   example.*  www.example.org/galleries/   ~\.google\.;   if ($invalid_referer) {    return  403;    } 

nginx的https配置

使用模块ngx_http_ssl_module 编译时加载

ssl on|off ; //是否启动当前主机的ssl功能。ssl_certificate FILE  //当前主机使用的证书PEM格式。ssl_certficate_key FILE: //当前主机证书私钥文件。ssl_protocols[SSLv2][SSLv3][TLSv1][TLSv1.2][TLSv1.1]; //支持加密方式ssl_session_cache off |none |[builtin[:size]][share:name:size];      //指明会话缓存机制;    builtin:使用openssl内建的机制,各worker独有。cache命中不高。    shared 由各worker共享的缓存,name:缓存空间的名称 size:字节为单位的缓存单位空间的大小,1M可以缓存4000个会话; //只用共享内存,不用builtitin。ssl_ciphers  //ssl_perfer_server_ciphers   //倾向于使用ssl服务器的算法。ssl_session_timeout time; //会话超时时长。指sslsessioncache中缓存条目的会话

http基于IP识别。SSL在TCP层。

配置证书,密钥,server name,location

nginx访问日志

ngx_http_log_module模块的配置
The ngx_http_log_module module writes request logs in the specified format.//可以指定格式的日志
access_log path [format [buffer=size [flush=time]] [if=condition]];
access_log path format gzip[=level] [buffer=size] [flush=time] [if=condition];
access_log syslog:server=address[,parameter=value] [format [if=condition]];
9:33
access_log off; //访问日志文件路径,格式名称以及缓存大小和刷写时间间隔;建议定义缓冲以提升性能;
log_format name string ...;
//定义日志格式及其名称;日志格式一般通过调用内置变量来定义;
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off|on; //默认关闭

max最大缓存条目;incative=time:非活动时长;min_uses:最少使用次数;‘valid:验证缓存条目有效性的条目。

nginx的url重写

ngx_http_rewrite_module模块配置
重写最多10次,防止死循环。10:10。
功能:实现了动态资源静态化(有的动态资源申请过就不发生变化了),方便搜素引擎读取,可以方便缓存,提高网站安全性和专业性。
把用户请求的URL基于regex做检查,匹配到时将替换为replacement指定的字符串;后端服务器会处理转换后的url rewite
在同一个location中存在的多个rewrite规则会自上而下逐个被检查(循环);可以使用flag控制次循环功能;

如果replacement是以http://或https://开头,则会替换结果会直接以重定向的方式返回给客户端;
匹配规则:
自上而下,逐条处理。处理过就不再处理。
将请求的url基于正则表达式进行重写;
http –> https, domain1.tld –> domain2.tld, uri1 –> uri2, …

处理过成可能是a.jpg—>a.html 处理里完成之后再次转化为jpg返回给用户。
指令:

rewrite regex replacement [flag]; //。讲明白,说清楚。
regex:正则表达式,用于匹配用户请求的url;例如(.*)\jpg ---> $1.html还可以跨主机。
replacement:重写为的结果;
[flag]:控制工作过程。本来使第一条检查完以后直接人道后端,现在要进行多次处理。下面的关键字直接加在关键字后面。

last    //重写完成之后停止对当前uri的进一步处理,改为对新url的新一轮处理匹配,(再重写一次)类似conntine;break    //重写完成之后停止当uri的处理,转向其后面的其它配置;//重写后的规则C端看不到。;redirect    //重写完成之后会返回客户端一个临时的重定向,由客户端对新的url重新发起请求(临时302)//客户端是可以看到的;(就是在匹配规则的时候直接返回一个url(此时后端并没有处理),浏览器自动用新的url访问服务器)。permanent    //重写完成之后会返回客户端一个永久的重定向(重写后的url,客户端会向这个url重新发起请求),由客户端对新的url重新发起请求(永久301);

例如:

server{  location  / {    root mp3 ;    index xxxxx    rewite ^/(download/.*)/media/(.*)\.*$/mp3/$2.mp3 last;  //访问media下的MP3,被定向到MP3下的MP3    }}
PCRE正则表达式元字符字符匹配:., [ ], [^]次数匹配:*, +, ?, {m}, {m,}, {m,n}位置锚定:^, $或者:|分组:(), 后向引用, $1, $2, ...

regwrite_log on | off //是否启用重写日志,默认关闭。启用时,日志信息被发送错误日志;
调试方法:错误日志debug; 开启rewrite_log;

if (condition) { ... } : //条件判断满足条件时执行配置,引用新的配置上下文;
通常对内建变量进行判断;
condition比较表达式:

==,!=~:模式匹配,区分字符大小写;~*:模式匹配,不区分字符大小写;!~:模式不匹配,区分字符大小写;!~*: 模式不匹配,不区分字符大小写;

文件及目录存在性判断:

-f, !-f:是否存在且为普通文件;-d, !-d: 是否存在且为目录;-e, !-e:是否存在;-x, !-x:是否存在且可执行;

/看视屏11:09
return

return code [text];  return code URL;return URL;立即停止对请求的uri的处理,并返回指定的状态码;

nginx.org/en/docs/http/ngx_croe_module.html 中有很多变量。
set $variable value; //自定义变量赋值,变量在赋值和引用的时候都需要加上’$‘;
if的例子:

if ($httpd_user_agent ~ MSIIE) {  rewrite ^(.*)$ /msie/$1 break;    //无论请求的的是什么,都加一个资源;}if ($http_cookie ~* "id=([^;]+)(?:;|$") {  set $id $1;    }  //请求报文首部中COOKIE的值,设定一个变量ID,值为$1;if($request_method =POST){return 405; //拒绝405}if($slow){    limit_rate 10k; //慢的用户分到10k速率;}if($invalid_referer){    return 403;  //黑名单403,返回;}

重定向80至443端口:

server{listen 80;server_name www.abc.com ;rewrite ^(.*) https://$server_name$1  permanent;   //在匹配到任何规则后进行重写,并发出permanent永久重定向。}server{    listen 443;    server_name www.abc.com;    root  /PATH/TO/ROOT ;    ssl on ;    ssl_certificate /etc/nginx/certs/server.crt;    ssl_certificate_key /etc/nginx/certs/serer.key;}

nginx的压缩传送

ngx_http_gzip_module模块配置—-是一个过滤器,对指定的内容进行压缩传输。不是所有的浏览器都会支持
gzip on | off; // 启用或禁用gzip压缩响应报文;
gzip_comp_level LEVEL; //压缩比,1-9,默认为1;
gzip_disable regex ...; //regex是为用于匹配客户端浏览器的正则表达式;表示对所有匹配到的浏览器禁不执行压缩响应;
gzip_min_length length; //触发压缩功能的响应报文的最小长度;
gzip_http_version 1.0 | 1.1; //设定启用压缩功能时,协议的最小版本;
gzip_types mime-type ...; //指明仅对哪些类型的资源执行压缩操作;即压缩过滤器.默认为text/html;
gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...; //定义对客户端请求的具有何种请求属性的资源启用压缩功能;如expired则表示对由于使用了expire首部而无法缓存的对象启用压缩功能;讲到缓存再细讲。
示例:

gzip  on;gzip_http_version 1.0;gzip_comp_level 6;gzip_disable msie6;gzip_min_length 2;  多大进行压缩gzip_types text/plain text/css text/xml application/x-javascript application/xml application/json application/java-script;  //这些都是静态资源
server {       rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;    rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra  last;     return  403;   ...    }               

http://www.magedu.com/download/a/b/c/media/32.wmv --> /download/a/b/c/mp3/32.mp3

location / {    root html;    index index.html index.htm    rewtrite (.*)\.txt$$1.html}
1 0
原创粉丝点击