nginx配置文件详解

上一期我详细讲解了nginx以及如何通过nginx去安装wondpress这个博客程序,但是对配置文件只讲述了一点点,并未详细讲述。所以这一次来详细说明一下nginx的配置文件并且举例详细说明!

首先复习一下nginx的配置文件在哪里?在编译的时候你可以自己指定,我一般把它放到/etc/nginx之中,其中的nginx.conf是主配置文件,当然除此之外还有之前在编译过程中添加的模块也会生成配置文件,这些配置文件可以进行修改(属于全局的模块配置文件)如果需要可以在配置文件中使用include添加即可!还记得在上一期讲过的未添加mime.types之后会发生nginx只能显示静态文本的事情吗?

除nginx.conf之外其他配置文件简单说明:

mime.types:MIME类型关联的扩展文件
fastcgi.conf:与fastcgi相关的配置
proxy.conf:与proxy相关配置
sites.conf:配置nginx提供的网络,包括虚拟主机

nginx.conf配置文件分类:

main配置段:全局配置段!
event{}配置段:定义event模型工作特性!
http{}配置段:定义http协议相关的配置!

全局配置段可使用的常用配置:

user USERNAME [GROUPNAME];
指定运行owrker进程的用户和组,如user nginx nginx;

pid /PATH/TO/PID.FILE;
指定nginx守护进程的pid文件,一般在编译的时候

worker_rlimit_nofile #;
指定所有worker进程所能够打开的最大文件句柄数,默认为1024个(这个数值基本大家都会进行修改,不过建议别改的太大!)

worker_processes #;
打开worker进程的个数:通常应该改略少于cpu物理核心数,不知道有几个核心?使用lscpu查看!

上面就是在新安装完毕nginx之后使用的常用全局配置段,还有一些比如:绑定进程和CPU的、nice值等相关配置这个属于性能优化并且建议别去修改默认值,可能修改后还没默认值性能好!

event配置段可用的常用配置:

worker_connections #
设定单位worker进程所能够处理的最大并发连接数量,建议不要一上来就65535个…

daemon {on|off};
是否以守护进程方式运行nginx,调试时设置为off,这个选项是在debug的时候使用,所以正常情况下不要开启!

master_process {on|off};
是否以master/worker模型来运行nginx,调试时可以设置为off!

error_log FILE | STDEER | syslog:server=ADDRESS [,parameter=VALUE] | memory:size [debug | info | warn | error | crit | alert];
错误日志,前面定义文件位置(有很多种,本地、网络等)与日志记录级别(debug、info等)
注意:要使用debug,需要在编译nginx时使用了–with-debug选项才有效!还有就是这个配置段除了events还可以在虚拟主机server、http配置段进行使用!

http配置段可用的常用配置:

终于说到重点了,其实在上一期我只是蜻蜓点水的架构了LNMP来部署wordpress在现实情况中,尤其是企业nginx的配置段可能有N+1条(尤其根据企业的发展来决定的)所以在这边我还是要详细说明一下http中的配置选项!

include CONFIG;
后面的config是包含的配置文件,使用include具体就是加载某个配置文件,比如mime.types如果不进行加载那么程序启动时就不会加载对应的除nginx.conf之外的配置!可在:http、server使用

default_type CONFIG;
默认的选项是application/octet-stream;其实这个就是指定默认类型的之前填写过include包含mime.types之后就让它默认即可,不过这个类型还可以使用type{}来指定多个类型!英语说明:http://nginx.org/en/docs/http/ngx_http_core_module.html#default_type

log_format  FORMAT;
指定日志的记录格式(访问日志)关于格式的选项下面我会进行说明,默认格式:
‘$remote_addr – $remote_user [$time_local] “$request” ‘
‘$status $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent” “$http_x_forwarded_for”‘;

access_log PATH [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
定义访问日志,必须要写出访问日志的存放路径!关于日志还能进行压缩等操作,注:定义日志之后请定义日志记录格式!刚刚上面的关于日志格式和日志的配置定义在:http://nginx.org/en/docs/http/ngx_http_log_module.html

sendfile on|off;
这边不是定义是否能过够上传文件,而是传说中的0拷贝,也就是开启该功能后当有大量访问需要读取或者写入数据时候能够做到跳过用户空间,在内核空间中使用sendfile功能来读取写入数据,避免了内核层与用户层的上线文切换(content swith)工作,大大减少了系统性能的开销。

keepalive_timeout #;
定义连接超时时长,建议别太小否则别人在你网站上下载东西的时候就会出现下载到一半自动切断的现象…当然你不提供下载站点也没有问题的!

gzip on|off;
是否启动gzip压缩功能,这样能够减少带宽但是会增加cpu的开销。定义压缩的时候还有等级,详细看这边:http://nginx.org/en/docs/http/ngx_http_gzip_module.html

server{}
定义一个虚拟主机

linten :
监听的端口和地址,用法:
listen address[:port]; | listen PORT;


server name:
server_name NAME [……]; 主机名
后面可以跟上多个主机,名称还可以使用正则表达式(~)或通配符;关于查找顺序:
①先做精确匹配检查
②左侧通配符匹配检查;如:*.baidu.com
③右侧通配符匹配检查;如 mail.*
④正则表达式匹配检查:如 ~^.*\baidu\.com$
⑤default_server 默认的主机名

root:
root “PATH”;
设置资源路径映射,用于指明请求URL所对应的资源所在的文件系统上的起始位置

location:
location [= | ~ | ~* | ^~] URL {……} 其中{}里面属于定义的其他配置选项。可以定义在server中的网站根目录中的子目录,定义动态网站,定义访问控制列表,定义更换的业务别名等!
= 精确匹配检查
~ 正则表达式模式匹配检查,区分字符大小写
~* 正则表达式模块匹配检查,不区分字符大小写
^~ URI的前半部分匹配,不支持正则表达式
匹配的优先级:= ^~ ~ ~* 不带任何符号的location,注意优先级不像防火墙上面的从上到下,而是我刚刚写的优先级从左至右,左边的优先级为高!

按照优先级我举个例子,比如:

location ~ \.(jpg|jpeg)$ {
deny all;
}

location ~* \.(jpg|jpeg)$ {
allow all;
}

上述两个按照优先级那么肯定的是如果输入任何带有.jpg的网页必须全部被拒绝:

nginx02

如何我再添加一个location选项:

location = /like.jpg {
allow all;
}

那么带来的结果就是网页中最后匹配的是/like.jpg则可以预览:

nginx03

虽然上述举例不符合平时的使用但是location一但多的情况下请一定有要注意优先级顺序否则会发生异常情况!

location一般的使用场景:遇到业务模型拆分并且在一个虚拟主机中(就是同一个域名了)单独定义location比一股脑放进/中好用!单独做管制列表,比如使用allow deny对一些敏感文件进行访问拒绝的都可以做location!

alias path:
alias表示路径映射,即location指令后定义的URL是相对于alias所指明的路径而言。一般用于子目录更换位置,当然下面的另一个工具更好用!

rewrite :
rewrite regex(正则表达式原) replacement(正则表达式改后URL) flag (URL重写) 用户请求重定向,这个选项比较关键当公司将老的业务重新整合,推出新的业务更改内部的URL比如将图片业务从原先的/imgs改为img.XXX.com | 公司更改域名但是老的域名不可能就丢弃所以也需要进行重定向!这个选项在公司中会比较常用,我会在下一期举例说明!

URL重定向这个功能在平时也比较常用,遇到更换域名,业务变动时候!因为作为访客来说变动链接|域名不可能及时知道,使用重定向能过够轻松解决问题;下面来举例说明:

由于公司业务转变,将/data这个路径全部转换为http://www.cookiesinn.org 那么:

rewrite ^/data/$ http://www.cookiesinn.org last; #其实直接在server中定义即可或者也可以加上location在/中!那么当用户输入:你当前的域名/data之后就直接跳转到www.cookiesinn.org之中,其他访问链接如:你的域名/data/test.html则直接显示test.html 看上去不太智能哇!

nginx04

不过刚刚的内容在某些访问文件的条件下是用到比较多的,然后看这个:

rewrite ^/data/(.*)$ http://www.cookiesinn.org last;  #实现了刚刚的功能补全了访问/data/*都会进行跳转!

当然如果你希望的是跳转之后还能保证后面的*也能继承下去,比如/data/*跳转为www.cookiesinn.org/*可以这么写:

rewrite ^/data/(.*)$ http://www.cookiesinn.org/$1 last; #这样就算正常的业务变动基本常规写法了,一般业务拆分其实就是将原本的三级域名后面的URL改为另一个三级域名:例如www.cookiesinn.org/shop -> shop.cookiesinn.org或者是企业变动域名,但是后面的URL没有变动也是经常遇到的问题!

IP的访问控制:(可用在http、server、location中)一般配合location | server中使用!
allow IP/NETWORK | all
deny IP/NETWORK | all

上述经过我的筛选基本包括了平时经常使用的配置选项,不过还少了https的配置是不?对于https in nginx这个我专门抽一个专题来讲解!

Comments

Leave a Reply

Your email address will not be published. Name and email are required