Nginx配置详解
Nginx常见的配置文件有以下几个
- nginx.conf:应用程序的基本配置文件
- mime.types:MIME类型关联的扩展文件
- fastcgi.conf:与fastcgi相关的配置
- proxy.conf:与proxy相关的配置
- sites.conf:配置Nginx提供的网站,包括虚拟主机
nginx.conf配置
Nginx的配置是在nginx.conf中进行配置的
主要由三部分组成
- 全局块
- events块
- http块
全局块
从配置文件开始到events块之间的内容是全局块,主要用来配置Nginx服务器整体运行的配置指令,主要包括配置运行Nginx的用户组、允许生成的worker process数,进行PID存放路径、日志存放路径和类型以及配置文件的引入
1 | #nginx中worker进程的用户和用户组 |
error_log off不是禁用日志,而是创建一个名为off的日志,要禁用日志,可以这么写:error_log /dev/null crit;
events块
主要是影响Nginx服务器与用户网络的连接,常用的配置包括是否开启对多worker process下的网络连接进行序列化,是否允许同时接受多个网络连接,选取哪种事件驱动模型来处理连接请求,每个worker process可以同时支持的并发数
1 | events { |
http块
Nginx配置中修改最频繁的配置就是http块的配置,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这个模块
http块又分为了http全局块和server块
http全局块
主要配置的是文件的引入、MIME-TYPE定义、日志自定义、是否使用sendfile传输文件、连接超时时间、单连接请求上限等
1 | http { #协议级别 |
server块配置虚拟主机
一个http块可以包含多个server块,每个server块就相当于一台虚拟主机
server块主要是虚拟主机的配置,为了充分利用服务器资源,一台nginx服务器一般都同时配置N个虚拟域名主机,即多个域名对应同一个80端口,每台虚拟主机都可以是一个独立的网站
Nginx可以配置多种类型的虚拟主机
- 基于IP
- 基于域名
- 基于端口
又分为了server全局块和location块,在server全局块中常见的配置就是虚拟主机监听配置以及虚拟主机的名称
1 | server { # 服务器级别 |
location块
每个server块可以包含多个location块,允许对不同的uri进行不同的配置,对特定的请求进行处理,如进行地址定向、数据缓存等功能
匹配规则
location有多种匹配规则[=|~|~*|^~|@]
/url/
没有修饰符表示必须以指定模式开头
1
2
3
4
5
6
7
8
9# 匹配以/abc开头的
location /abc {
}
# 以/abc开头的
http://zhhll.icu/abc
http://zhhll.icu/abc?id=11
http://zhhll.icu/abc/
http://zhhll.icu/abcd=表示精确匹配,优先级最高
1
2
3
4
5
6
7
8
9
10# 仅匹配/abc,可以有参数
location = /abc {
}
# 可以匹配
http://zhhll.icu/abc
http://zhhll.icu/abc?id=11
# 不能匹配
http://zhhll.icu/abc/
http://zhhll.icu/abcd
\^~ 类似于无修饰符,表示uri以某个字符串开头,即^~/spring/ 可以被所有以/spring/开头的匹配到
~为区分大小写的正则匹配,如果使用!~则表示取反,不匹配的正则
1
2
3
4
5
6
7
8
9
10location ~ /abc {
}
# 可以匹配
http://zhhll.icu/abc
http://zhhll.icu/abc?id=11
# 不能匹配
http://zhhll.icu/Abc
http://zhhll.icu/abc/
http://zhhll.icu/abcd
~*
为不区分大小写的正则匹配,如果使用!~*
则表示取反,不匹配的正则1
2
3
4
5
6
7
8
9
10location ~* /abc {
}
# 可以匹配
http://zhhll.icu/abc
http://zhhll.icu/abc?id=11
http://zhhll.icu/Abc
# 不能匹配
http://zhhll.icu/abc/
http://zhhll.icu/abcd
/ 通用匹配,任何请求都会匹配到
@ 客户端不能访问,只能由内部产生的请求来访问
静态文件路径
可以使用root或alias来指定静态资源文件路径,root可以配置在http块、server块、location块以及if块中,alias只能配置在location块中
root
使用root来表示请求的url时会进行完整的拼接,即如果请求使用的uri是/pic/index.html的话,使用root实际获取的是/data/www/web/pic/index.html
1 | location /pic/ { |
alias
alias会将location中配置的路径丢弃掉,即如果请求使用的uri是/pic/index.html的话,使用alias实际获取的是/data/www/web/index.html
1 | location /pic/ { |
Nginx常见配置参数
- server_names_hash_max_size 1024;
- server_names_hash_bucket_size 512;
- client_header_buffer_size 32k; # 客户端请求头部的缓冲区大小,有时候请求头过大,可以适时增大该配置
- large_client_header_buffers 4 32k;
- client_max_body_size 10m;#设置最大的允许客户端请求主体的大小(上传文件大小限制),默认为1m,如果大于该设置,会返回413
- client_body_buffer_size 128k; 为了阻止临时文件写到磁盘,可以通过该指令为客户端请求体设置缓存大小
- client_body_in_single_buffer 为了减少拷贝操作,该指令强制nginx将整个客户端请求体保存在单个缓存中
- client_body_temp_path 定义一个路径用于保存客户端请求体
- keepalive_timeout 60; #客户端连接超时时间,单位是秒,默认是75秒
- client_header_timeout #设置请求头的超时时间,可以设置低些,如10秒
- client_body_timeout #设置请求体的超时时间,可以设置低些,如10秒
- reset_timeout_connection #关闭不响应的客户端连接,这将会释放那个客户端所占有的内存空间,建议开启
- send_timeout #指定客户端的响应超时时间,如果在两次客户端读取操作之间,客户端没有读取任何数据,Nginx就会关闭连接,默认是60秒,可以设置小一些,如10秒
- sendfile on; # 开启高效传输模式(开启或禁用sendfile函数),默认为off
- tcp_nopush on; #将文件一次性一起传输给客户端,提高网络包的传输效率,建议开启
- tcp_nodelay on; #此时nginx不缓存数据,一段一段的发送(允许或禁止TCP_NODELAY),仅适用于keep-alive连接
- ssi on; # 开启ssi支持,默认为false
- ssi_silent_errors on; # 设置为on表示在处理ssi文件时不输出错误信息,默认为false
- ssi_types text/html; # 默认支持html 如果需要支持shtml(服务器执行脚本),需要设置为ssi_types text/shtml
- server_tokens off; # 关闭nginx版本号的显示,默认为on
Nginx优化相关参数
- worker_processes 2; # 配置生成的worker process数量,进程数,一般为cpu核数
- worker_rlimit_nofile 65536; # 一个nginx进程打开的最多文件描述符数目,一般设置为与系统设定的值相同(ulimit -n)
- worker_cpu_affinity 01 10;# 为每个进程分配CPU的工作内核
- use epoll; # 使用epoll的IO模型,epoll是linux内核为处理大量文件描述符而做了改进的poll,它能显著提高程序在大量连接中只有少数活跃的情况下的CPU利用率
- worker_connections 1024 # 每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为worker_processes*worker_connections
- keepalive_timeout 60 #keepalive超时时间,客户端到服务端的连接持续有效时间,当出现对服务器的后继请求时,可以避免重新建立连接
- client_header_buffer_size 4k 客户端请求头部的缓冲区大小,可以根据系统分页大小来设置,一般一个请求的头部大小不会超过1k
- open_file_cache max=102400 inactive=20s 为打开文件指定缓存,默认没有启用,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没有请求后删除缓存
- open_file_cache_vaild 30s 这个是指多长时间检查一次缓存的有效信息
- open_file_cache_min_uses 1 open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,将被移除
1 | events { |
Nginx常见用法
依据UA屏蔽爬虫
1 | if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou |
屏蔽IP访问
1 | allow 133.27.182.82; |
使用Auth权限访问
1 | auth_basic "bbs-auth"; |
限制带宽
1 | # 用户下载达到 500k 后,便控制其速度在 50k 以内 |
限制连接
1 | # 定义了一个名为“down”,10M大小,以连接IP为key的连接数据存储空间 |
限制请求
1 | # 定义一个名为”one”, 10M大小,每秒1个请求的请求数据存储空间 |
实时显示Nginx运行状况
在安装nginx是编译http_stub_status_module即可,使用参数为–with-http_stub_status_module
1 | location /ngx_status { |
设置错误页面
1 | error_page 404 /404.html |
在负载均衡里面,实现后端服务器故障转移的配置
1 | location ~ \.(jsp)$ { |
Nginx 常见错误码
- 301 永久重定向
- 302 临时重定向
- 403 禁止访问
- 404 文件不存在
- 413 文件上传超过限制
- 500 服务器错误
- 502 后台服务器无响应
- 504 Nginx超时,请求过多,工作进程不足