以下内容整理自《学习Nginx HTTP Server》一书,深入浅出的介绍了nginx配置文件语法及HTTP核心模块、rewrite等模块的语法和指令。
基本信息
1.作者:(法)Clement Nedelcu 著 陶利军 译 2.出版社:清华大学出版社 3.阅读进度:100%
阅读心得 LEARNINGS
-
第1章介绍了linux基础知识,linux初学者建议看一下,以便巩固下linux的知识。
-
第2章介绍nginx的下载和安装,主要介绍了安装前的一些先决条件和编译时的配置选项,如有些编译选择已经默认开启,有些则是需要手动启用的。
-
第3章介绍了配置文件语法及指令块的结构。
-
第4、5章属于本书的重点,介绍了HTTP的配置和rewrite模块。
-
第6章 fastcgi入门一节介绍了fastcgi模块和upstream模块;
-
第7章 Nginx 反向代理模块对nginx反向代理的指令进行了一些介绍。
一、 nginx的基本配置(整理自第3章)
配置文件语法
配置文件由注释行,指令块配置项和一系列指令配置项组成。每一条指令由配置项名称和值参数组成,值参数可以是一个或多个附加参数,取决于解析该条指令的模块。
# user nobody;
worker_processes 4;
events {
worker_connections 1024;
}
-
块配置项由一个块配置项名和一对大括号组成。块配置后面是否带有参数,如location /webstatic {},取决于解析该配置块的模块。
-
指令配置项总是以分号结尾(;)。
-
字符"#"表示该行是注释行,nginx在读取配置文件时将忽略的文本。
指令特点
-
指令都有作用域,如上面例子,worker_connections 只能放在events区块才有意义。
-
配置块能相互嵌套。在某些情况下不同配置块能够相互嵌套。如在http区段,可以声明一个或多个server区段,server区段又可以插入一个或多个location区段。
-
最后同样重要的是配置的继承。在一个区段中嵌套其他区段,那么被嵌套的区段会继承其父区段的配置。在嵌套模块中重新声明指令会覆盖该继承。
指令值的单位
可以使用下面单位来指定配置文件所在上下文中指令值的单位。
-
k或K:千字节
-
m或M:兆字节
-
ms:Milliseconds(毫秒)
-
s:Seconds(秒)
-
m:Minutes(分钟)
-
h:Hours(小时)
-
d:Days(天)
-
w:Weeks(星期)
-
M:Months(月)
-
y:Years(年)
字符串值
注意:如果指令值中包含空格、分号或者是大括号等特殊字符,需要使用单引号或双引号将其括起。
nginx 基本模块
nginx是由一系列模块组成的,大致可以分为核心模块、Http核心模块和其他模块。其中核心模块在编译时不能被禁用。核心模块包含main模块、events模块和include包含指令。
main模块重要指令
main模块位于配置文件根部。提供如进程管理和安全的能力。
daemon on; #启用或禁用守护进程模式。
user nobody; #worker进程运行的用户和组,如果没有提供则使用nginx的master进程的用户和用户组。
worker_processes 4;#定义worker进程数量一般和cpu核数一致。
#错误日志,这里的级别由debug,info,notice,warn,error和crit(debug记录了全部日志,crit仅报告关键错误)
#作用域:main, http, mail, stream, server, location
error_log logs/error.log error;
pid logs/nginx.pid; #存放nginx守护进程的pid文件路径。
log_not_found on; #开启或禁用记录404错误。
...
#除上面指令外还有worker_rlimit_core、worker_rlimit_nofile、worker_cpu_affinity、worker_priority等。
events模块
事件模块提供的指令可以用来配置网络机制。
accept_mutex:on; #默认值on,启用或禁用使用一个接受互斥锁来打开套接字监听。
use epoll; #指定nginx所使用的网络事件模型,可选值有/dev/poll,epoll,kqueue等,通常不需要显式指定它,默认情况下nginx将使用最有效方法。
worker_connections 1024; #定义一个worker进程能够同时连接的数量。
configuration模块
它提供的include 指令能够将其他文件包含在nginx配置文件中。在配置文件的任何地方均可插入该指令。注意如果没有指定绝对路径,那么文件路径将和配置文件的目录相关。
include /file/path.conf;
include sites/*.conf;
二、HTTP 配置(整理自第4章)
介绍HTTP 核心模块
HTTP 核心模块是Nginx中最大的一个模块,它包含了所有的基本的区段、指令和变量。
区段结构
通过下面的例子,来认识http模块的区段结构。
http {
#在http区段中启用gzip压缩
gzip on;
server {
server_name localhost;
listen 80;
location /downloads/ {
#在此location区段禁用gzip压缩
gzip off;
}
}
}
-
http 区段位于配置文件的根部,在这个区段中允许定义HTTP模块的指令和HTTP模块的相关区段。
-
server区段用于声明一个站点,该区段只能用在http区段中。
-
loation 区段应用于网站特定的URI位置,该区段能够用于server区段中,也能嵌套在其他location中。
模块指令
在http/server/location三个层次的每个层次都可以插入指令,下面介绍的指令都主要由http模块引入,对于每条指令都有它的使用环境。指令对应的级别包括http块、server块、location块,另外还有rewrite模块的if块。注意:—一些指令不能用于某些级别。 下面介绍一些常见指令,如无特殊说明作用域为http,server,location。
套接字和主机配置指令
下表指令可以根据主机名或IP地址和端口的组合创建一个server区段。并通过一些指令来配置TCP套接字选项,以便调整网络设置。
-
listen:用于设置监听套接字使用的ip端口号。 语法:listen [address][:port][其他选项] 其他选项: default:指定监听的默认套接字,该server区段被用于默认的网站,在该IP地址和端口上接受任何客户端的请求。 ssl:指定的网站提供SSL服务。 其他选项依赖于bind和listen系统调用:backlog=num,rcvbuf=size,sndbuf=size,accept_filter=filter,deferred和bind。 作用域:server
-
server_name:在server区段中指定一个或多个主机名。 nginx收到http请求时,根据请求header中Host值与所有server区段比较,第一个与主机名匹配的server块将被选中,否则如果没有server区段与客户端请求的主机名匹配,nginx会选择第一个server区段,匹配监听参数(如listen *:80),另外具有default选项的listen会被优先选择。注意该指令接受通配符。 作用域:server
server_name www.website.com website.com;
server_name *.website.com;
server_name *.website.*;
-
tcp_nodelay:开启或关闭使用TCP_NODELAY套接字选项,仅用于keep-alive连接。它禁用了Nagle 缓冲算法。
-
tcp_nopush 开启或禁用TCP_NOPUSH(FreeBSD)或TCP_CORK(Linux)的scoket选项。如果tcp_nopush开启,则nginx将尝试在整个tcp数据包中发送整个http响应头。
-
sendfile 指定nginx是否调用sendfile系统函数来输出文件,减少内核空间和用户空间的上下文切换。对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。
另外还有sendfile_max_chunk、send_lowat等指令。
路径和文档
下表指令用来设置根目录、主页、错误页等。
-
root:定义文档的根目录。 作用域:http,server,location,if。
-
alias:location 指定uri路径的别名,它不会改变root的值。 作用域:location
location /i/ {
alias /spool/w3/images/;
}
#例如:请求"/i/top.gif",将返回这个文件: "/spool/w3/images/top.gif"。
#正如你所看到的,uri中location后面的部分会追加到这个目录后面,而location自身指定的uri路径是"丢弃的"
-
error_page 允许修改访问URI所产生的HTTP相应代码,并选择性地将它替换为其他代码。 作用域:http,server,location,if。 语法:error_page code1 [code2 ...] [=replacement code] [=@