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配置段:
配置指令类别:
正常运行必备的配置;
优化性能相关的配置;
用于调试、定位问题的配置;
正常运行必备的配置:
- user USERNAME [GROUPNAME]; // 指定用于运行worker进程的用户和组;
user nginx nginx;
- pid /PATH/TO/PID_FILE; //指定nginx进程的pid文件路径; 可以在官方文档中查看。
pid /var/run/nginx.pid;
- worker_rlimit_nofile_number # ; //指定一个worker进程所能够打开的最大文件描述符数量;
- 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的根路径。
客户端请求相关的配置:
- keepalive_timeout timeout [header_timeout];
//设定keepalive连接的超时时长;0表示禁止长连接;默认为75s; - keepalive_requests number;
//在keepalived连接上所允许请求的最大资源数量;默认为100; - keepalive_disable none | browser …;
//指明禁止为何种浏览器使用keepalive功能;不用可忽略。 - send_timeout #;
//发送响应报文的超时时长,默认为60s。特别地,是指两次写操作之间的间隔时长; - client_body_buffer_size size;
//用于接收客户请求报文body的缓冲区大小;默认为16k;超出此指定大小时,其将被移存于磁盘上; - client_body_temp_path path [level1 [level2 [level3]]];
//设定用于存储客户端请求body的临时存储路径及子目录结构和数量,缓冲的太多会查找困难,设定级别;
client_body_temp_path /var/tmp/client_body 2 2;
两个16进制数字创建一级子目录,2个16进制创建2级子目录; - 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:password1
name2: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
}