nginx配置系列nginx配置语法解读
Posted 格格巫 MMQ!!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx配置系列nginx配置语法解读相关的知识,希望对你有一定的参考价值。
一、nginx的安装
安装就不说了…
二、nginx的配置文件解释
2.1、快速入门
main(全局设置),main部分设置的指令将影响其它所有部分的设置;
http(http服务器设置),http标准核心模块,http服务的相应配置;
server(主机设置)
接收请求的服务器需要将不同的请求按规则转发到不同的后端服务器上,在 nginx 中我们可以通过创建虚拟主机(server)的概念来将这些不同的服务配置隔离。
location(URL匹配特定位置后的设置)
location部分用于匹配网页位置(比如,根目录“/”,“/images”,等等),server 是对应一个域名进行的配置,而 location 是在一个域名下对更精细的路径进行配置。
下面附一张nginx配置文件详解示例图:
上图中只是把一些常见的配置做了解释,当然了,nginx还有更多的配置指令。。
在上一份儿nginx.conf文件大部分指令有注释的,如下:
#运行用户user nobody;
#启动进程,通常设置成和cpu的数量相等worker_processes 1;` `#全局错误日志及PID文件
#error_log logs/error.log;#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
#工作模式及连接数上限events
#epoll是多路复用IO(I/O Multiplexing)中的一种方式,
#仅用于linux2.6以上内核,可以大大提高nginx的性能
use epoll; ` `
#单个后台worker process进程的最大并发链接数
worker_connections 1024;
``
并发总数是 worker_processes 和 worker_connections 的乘积
即 max_clients = worker_processes * worker_connections
# 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4 为什么
为什么上面反向代理要除以4,应该说是一个经验值
根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000
worker_connections 值的设置跟物理内存大小有关
因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数
# 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右
我们来看看360M内存的VPS可以打开的文件句柄数是多少:
$ cat /proc/sys/fs/file-max
输出 34336
32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内
# 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置
使得并发总数小于操作系统可以打开的最大文件数目
其实质也就是根据主机的物理CPU和内存进行配置
当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。
ulimit -SHn 65535
http
#设定mime类型,类型由mime.type文件定义
include mime.types;
default_type application/octet-stream
;
#设定日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'
;
access_log logs
/access.log main;` `
#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
#对于普通应用,必须设为 on,
#如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
#以平衡磁盘与网络I/O处理速度,降低系统的uptime.
sendfile on;
#tcp_nopush on;
#连接超时时间
#keepalive_timeout 0;
#关于keepalive_timeout参数详细说明如下:
#http是一种无状态协议,客户端向服务器发送一个 TCP 请求,服务端响应完毕后断开连接。如果客户端向服务器发送多个请求,每个请求都要建立各自独立的连接以传输数据。
#http有一个Keep-Alive模式,它告诉webserver在处理完一个请求后保持这个TCP连接的打开状态。若接收到来自客户端的其它请求,服务端会利用这个未被关闭的连接,而不需要再建立一个连接。
#Keep-Alive在一段时间内保持打开状态,它们会在这段时间内占用资源,占用过多就会影响性能。
#Nginx使用keepalive_timeout来指定Keep-Alive的超时时间(timeout)。指定每个TCP连接最多可以保持多长时间。Nginx 的默认值是75秒,有些浏览器最多只保持60秒,所以可以设定为60秒。若将它设置为0,就禁止了keep-alive连接。
keepalive_timeout 65;
#65s(单位是:秒)。该参数是一个请求完成之后还要保持连接多久,不是请求时间多久,目的是保持长连接,减少创建连接过程给系统带来的性能损耗,类似于数据库连接池。
tcp_nodelay on;
#开启gzip压缩
gzip` `on;
gzip_disable
“MSIE [1-6].”;` `
#设定请求缓冲
client_header_buffer_size 128k;
large_client_header_buffers 4 128k;
#设定虚拟主机配置
server
#侦听80端口
listen 80;
#定义使用 www.nginx.cn访问
server_name www.nginx.cn;` `
#定义服务器的默认网站根目录位置
root html;
#设定本虚拟主机的访问日志
access_log logs
/nginx.access.log main;` `
#默认请求
location / ` `
#定义首页索引文件的名称
index index.php index.html index.htm;
` `
定义错误提示页面
error_page 500 502 503 504 /50x
.html;
location = /50x
.html
``
#静态文件,nginx自己处理
location ~ ^/(images|javascript|js|css|flash|media|static)/ ` `
#过期30天,静态文件不怎么更新,过期可以设大一点,
#如果频繁更新,则可以设置得小一点。
expires 30d;
#PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.
location ~ .php$
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
` `
#禁止访问 .htxxx 文件
location ~ /.ht
deny all;
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
2.2、详细解析
配置语法说明:
①、配置文件由指令与指令块构成
②、每条指令以;分号结尾,指令与参数间以空格符号分隔
③、指令块以{}大括号将多条指令组织在一起
④、使用#符号添加注释,提高可读性
⑤、include语句允许组合多个配置文件以提升可维护性
⑥、使用$符号使用变量
⑦、部分指令的参数支持正则表达式
Nginx的各种指令以及配置繁多,该系列博文会记录一些nginx常用配置,后期会说一些优化配置,有些配置可以在 https://tengine.taobao.org/nginx_docs/cn/docs/ 或者在 http://www.nginx.cn 或者在 官方文档上查看
配置块: server
由于IP地址的数量有限,因此经常存在多个主机域名对应着同一个IP地址的情况,这时在nginx.conf中就可以按照server_name(对应用户请求中的主机域名)并通过server块来定义虚拟主机,每个server块就是一个虚拟主机,它只处理与之相对应的主机域名请求。这样,一台服务器上的Nginx就能以不同的方式处理访问不同主机域名的HTTP请求了
语法:
语法: server_name name[…];
默认: server_name"";
配置块: server
虚拟主机名可以使用确切的名字,通配符,或者是正则表达式来定义,在开始处理一个HTTP请求时,Nginx会取出request header头(请求头)中的Host,与每个server中的server_name进行匹配,以此决定到底由哪一个server块来处理这个请求。有可能一个Host与多个server块中的server_name都匹配,这时就会根据匹配优先级来选择实际处理的server块。
注意:优先级问题,所导致的配置不生效。
server_name与Host的匹配优先级如下:
1)首先选择所有字符串完全匹配的server_name,如 nginx.2367.com 。
2)其次选择通配符在前面的server_name,如 *.2367.com。
3)再次选择通配符在后面的server_name,如nginx.2367.* 。
4)最后选择使用正则表达式才匹配的server_name,如 ~^.testweb.com$
如果都不匹配
1)、优先选择listen配置项后有default或default_server的
2)、找到匹配listen端口的第一个server块
配置块: location
location
语法: location[=||*|^~|@]/uri/…
location 会尝试根据用户请求中的URI来匹配上面的/uri表达式,如果可以匹配,就选择。
location 块中的配置来处理用户请求。当然,匹配方式是多样的,下面说一下location的匹配规则。
location 表达式类型:
表示执行一个正则匹配,区分大小写;
~* 表示执行一个正则匹配,不区分大小写;
^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它的location;
= 进行普通字符精确匹配。也就是完全匹配;
@ 它定义一个命名的 location,使用在内部定向时,例如 error_page, try_files;
location 表达式类型的优先级:
等号类型(=)的优先级最高。一旦匹配成功,则不再查找其它匹配项;
前缀普通匹配(^~)优先级次之。不支持正则表达式。使用前缀匹配,如果有多个location匹配的话,则使用表达式最长的那个;
正则表达式类型(~ ~*)的优先级次之。一旦匹配成功,则不再查找其它匹配项;
常规字符串匹配,如果有多个location匹配的话,则使用表达式最长的那个;
优先级总结来说:(location =) > (location 完整路径) > (location ^~ 路径) > (location ,* 正则顺序) > (location 部分起始路径)
文件路径的定义:
以root方式设置资源路径:
语法: root path;
配置块: http、server、location、if
以alias方式设置资源路径:
语法: alias path;
配置块: location
alias也是用来设置文件资源路径的,它与root的不同点主要在于如何解读紧跟location后面的uri参数
注意: location中使用root指令和alias指令的意义不同
(a) root,相当于追加在root目录后面 。比如访问的是 xxx/test=>/www/test
(b) alias,相当于对location中的uri进行替换,比如访问的是 xxx/test,想要访问到/www/test就必须设置 alias /www/test
三、nginx常用命令
3.1、查看Nginx的版本号:nginx -V
3.2、停止 nginx -s stop
3.3、退出 nginx -s quit
3.4、重启加载配置 nginx -s reload
3.5、配置文件启动 nginx -c </path/to/config> 为 Nginx 指定一个配置文件
3.6、nginx -t 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
四、nginx常用模块了解及使用
以上是关于nginx配置系列nginx配置语法解读的主要内容,如果未能解决你的问题,请参考以下文章