Nginx备忘录
安装
1 | # centos |
相关命令
1 | # mac中nginx默认安装在/usr/local/Cellar/nginx,同时也会加入到/usr/local/bin,进入 |
目录结构
1 | # nginx目录下 |
nginx.conf配置
使用mac的brew安装,目录在/usr/local/etc/nginx
1 | main |
nginx配置文件主要分为六个区域:main(全局设置)
、events(nginx工作模式)
、http(http设置)
、sever(主机设置)
、location(URL匹配)
、upstream(负载均衡服务器设置)
。
main模块
main是全局配置:
1 | user nobody nobody; |
user
来指定Nginx Worker进程运行用户以及用户组,默认由nobody账号运行。
worker_processes
来指定了Nginx要开启的子进程数。每个Nginx进程平均耗费10M~12M内存。最优值取决于许多因素,包括(但不限于)CPU核的数量、存储数据的硬盘数量及负载模式。不能确定的时候,将其设置为可用的CPU内核数将是一个好的开始(设置为“auto”将尝试自动检测它)。该值设置的是子进程worker数量,同时还有一个主进程master,比如设置值为2时,总共有3个进程。
error_log
用来定义全局错误日志文件。日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少。
pid
用来指定进程id的存储文件位置。
worker_rlimit_nofile
用于指定一个nginx进程可以打开的最多文件描述符数目,受限于操作系统的配置。如果你的nginx报错“too many open files”,就是操作系统的值比你设置的值小。可以通过ulimit -n
查看操作系统的值。通过ulimit -n 65535
修改,该命令将操作系统修改为65535。
events模块
events模块来用指定nginx的工作模式和工作模式及连接数上限:
1 | events { |
use
用来指定Nginx的工作模式。Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中,因为Mac基于BSD,所以Mac也得用这个模式,对于Linux系统,epoll工作模式是首选。
worker_connections
用于定义Nginx每个进程的最大连接数,即接收前端的最大请求数,默认是1024。最大客户端连接数由worker_processes
和worker_connections
决定,即Max_clients=worker_processes*worker_connections
。在作为反向代理时,Max_clients变为:Max_clients = worker_processes * worker_connections/4
。(关于max_clients值的计算,官方文档也没有给出明确公式,网上说法也不一。可以看下这个,我觉得还挺靠谱:Max_clients计算公式)
进程的最大连接数受Linux系统进程的最大打开文件数限制(每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄),只有操作系统中的ulimit -n
的值比worker_connections的值大,该设置才有效。
http模块
http模块是最核心的模块,它负责HTTP服务器相关属性的配置,主要包含server和upstream子模块。
1 | http{ |
include
可以用来加载其他配置文件,如include /etc/nginx/conf.d/*.conf
。上例中用来引入设定文件的mime类型,类型在配置文件目录下的mime.type文件定义,来告诉nginx来识别文件类型。
default_type
默认文件类型,当文件类型未定义时使用该值,值默认为text/plain
。通常修改为application/octet-stream
,使用二进制流的方式解析。
log_format
设置日志的格式,myFormat
相当于别名,配合access_log
使用。
access_log
访问日志存放目录。nginx调优时可以关闭该功能,提高磁盘IO读写速度。
server_tokens
对于性能没有优化,当访问失败时,可以隐藏nginx版本信息。
sendfile
可以使用sendfile(),使文件传输更高效。传输文件涉及到将内容从磁盘读取,写到Tcp连接的过程。该项关闭时的流程是,Pre-sendfile是传送数据之前在用户空间申请数据缓冲区。之后用read()将数据从文件拷贝到内核读取缓冲区,再从内核读取缓冲区读到用户缓冲区,write()将用户缓冲区数据写到内核Socket缓冲区,再写入网络协议引擎,进行传输。sendfile()可以在任意两个文件描述符之间互相拷贝数据,而sendfile()是可以立即将数据从磁盘读,经OS缓存,写入TCP socket,不经过用户缓冲区。因为这种拷贝是在内核完成的(避免了内核缓冲区和用户缓冲区之间的数据拷贝),sendfile()要比组合read()和write()以及打开关闭丢弃缓冲更加有效。
tcp_nopush
告诉nginx在一个数据包里发送所有头文件,而不一个接一个的发送。
tcp_nodelay
告诉nginx不要缓存数据,而是一段一段的发送。当需要及时发送数据时,就应该给应用设置这个属性,这样发送一小块数据信息时就不能立即得到返回值。tcp_nopush
和tcp_nodelay
两个指令设置为on用于防止网络阻塞。
1 | http{ |
keepalive_timeout
设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接。
client_header_timeout
请求头超时时间。
client_body_timeout
请求体超时时间。
reset_timeout_connection
关闭不响应的客户端连接。这将会释放那个客户端所占有的内存空间。
send_timeout
指定客户端的响应超时时间。这个设置不会用于整个转发器,而是在两次客户端读取操作之间。如果在这段时间内,客户端没有读取任何数据,nginx就会关闭连接。
limit_conn_zone
设置addr连接的共享内存为5m。$binary_remote_addr的长度为 4 bytes,会话信息的长度为 32 bytes,5m大约可以记录5*1k*32
个会话信息(一个会话占用 32 bytes。如果一个会话占用64bytes,可保存5*1k*16
个会话)。
limit_conn
设置addr的最大连接数为100,每个ip最多同时开100个连接。
1 | http{ |
gzip
采用gzip压缩的形式发送数据。可以减少发送的数据量。
gzip_disable
为指定的客户端禁用gzip功能。我们设置成IE6或者更低版本以使我们的方案能够广泛兼容。
gzip_static
告诉nginx在压缩资源之前,先查找是否有预先gzip处理过的资源。这要求你预先压缩你的文件(在这个例子中被注释掉了),从而允许你使用最高压缩比,这样nginx就不用再压缩这些文件了(想要更详尽的gzip_static的信息,请点击这里)。
gzip_proxied
允许或者禁止压缩基于请求和响应的响应流。我们设置为any,意味着将会压缩所有的请求。
gzip_min_length
设置对数据启用压缩的最少字节数。如果一个请求小于1000字节,我们最好不要压缩它,因为压缩这些小的数据会降低处理此请求的所有进程的速度。
gzip_comp_level
设置数据的压缩等级。这个等级可以是1-9之间的任意数值,9是最慢但是压缩比最大的。我们设置为4,这是一个比较折中的设置。
gzip_types
设置需要压缩的数据格式。
1 | http{ |
open_file_cache
打开缓存的同时也指定了缓存最大数目,以及缓存的时间。我们可以设置一个相对高的最大时间,这样我们可以在它们不活动超过20秒后清除掉。
open_file_cache_valid
在open_file_cache中指定检测正确信息的间隔时间。
open_file_cache_min_uses
定义了open_file_cache中指令参数不活动时间期间里最小的文件数。
open_file_cache_errors
指定了当搜索一个文件时是否缓存错误信息,也包括再次给配置中添加文件。我们也包括了服务器模块,这些是在不同文件中定义的。如果你的服务器模块不在这些位置,你就得修改这一行来指定正确的位置。
server模块
server模块是http的子模块,用来定义虚拟主机的配置。一个http中可以有多个server。
1 | server { |
listen
用于指定虚拟主机的服务端口。server_name
用来指定IP地址或者域名,多个域名之间用空格分开。root
表示在这整个server
虚拟主机内,全部的root web根目录。注意要和locate {}
下面定义的区分开来。index
全局定义访问的默认首页地址。注意要和locate {}
下面定义的区分开来。charset
用于设置网页的默认编码格式。access_log
用来指定此虚拟主机的访问日志存放路径,最后的main用于指定访问日志的输出格式。
location模块
nginx中最核心的模块,用来配置请求的路由,以及各种页面的处理情况。支持正则表达式、条件判断,同时可以设置负载均衡、反向代理、虚拟域名等。
匹配规则
location的url匹配具有一定优先级,其优先级如下:
1 | location [ = | ~ | ~* | ^~ ] uri { } |
语法
语法方面,主要有:
1 | location /static { |
root
用于指定当访问/static
目录时,所对应的主机对应的目录,为/var/app/www/static
。
alias
与root类似,但是区别在于当访问/static
时,对应的路径为/var/app/www
。
index
默认首页,按先后顺序依次查找。
try files
至少两个参数,按照顺序进行访问尝试,最后一个参数最好配置为静态页面,防止死循环。
rewite
将一个url重写成另一个url。
proxy_pass
反向代理配置,代理请求。其具体用法:
1 | # 当访问http://127.0.0.1/proxy/1.png时 |
upstream模块
upstream模块负责负载均衡。
1 | upstream baidu.com{ |
5种负载算法:
轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,则自动剔除故障机器,使用户访问不受影响。
weight
指定轮询权重,weight值越大,分配到的几率就越高,主要用于后端每台服务器性能不均衡的情况。
ip_hash
每个请求按访问IP的哈希结果分配,这样每个访客固定访问一个后端服务器,可以有效的解决动态网页存在的session共享问题。
fair(第三方)
更智能的一个负载均衡算法,此算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。如果想要使用此调度算法,需要Nginx的upstream_fair模块。
url_hash(第三方)
按访问URL的哈希结果来分配请求,使每个URL定向到同一台后端服务器,可以进一步提高后端缓存服务器的效率。如果想要使用此调度算法,需要Nginx的hash软件包。
另外,每台server还可以设置不同的负载状态:
down
表示当前server暂时不参与负载均衡。
backup
预留的备份机,当其他所有非backup机器出现故障或者繁忙的时候,才会请求backup机器,这台机器的访问压力最轻。
max_fails
允许请求的失败次数,默认为1,配合fail_timeout一起使用。
fail_timeout
经历max_fails次失败后,暂停服务的时间,默认为10s(某个server连接失败了max_fails次,则nginx会认为该server不工作了。同时,在接下来的 fail_timeout时间内,nginx不再将请求分发给失效的server)。
当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。
例子
1 | ########### 每个指令必须有分号结束。################# |
内置全局变量
1 | $args :这个变量等于请求行中的参数,同$query_string |