MENU

Nginx常用配置文档详解

2020 年 11 月 14 日 • 阅读: 214 • 运维

一览Nginx大部分常用配置字段的用法

Nginx中文文档:

https://www.nginx.cn/doc/index.html

Nginx模块图片示意:

nginx模块图片

main(全局设置):设置的指令将影响其他所有设置。
server(主机设置):指令主要用于指定主机和端口。
upstream(负载均衡服务器设置):指令主要用于负载均衡,设置一系列的后端服务器。
location(URL匹配特定位置的设置):用于匹配网页位置。

1.全局块配置

user www www;
worker_processes 2;
  
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
  
pid logs/nginx.pid;

user:指定nginx进程使用什么用户启动,并获得相应的用户权限。如果user指令不配置或者配置为user nobody nobody,默认由nobody账户运行。

worker_processes:指定启动多少进程来处理请求,一般情况下设置成CPU的核数,如果开启了ssl和gzip更应该设置成与逻辑CPU数量一样甚至为2倍,可以减少I/O操作。每个Nginx进程平均耗费10M~12M内存。在配置了之后,假如上面的数目是2,那么启动Nginx服务器后,在后台主机上查看Nginx的进程情况,可以看到应该是有2个Nginx进程。master进程是接收并分配请求给worker处理。

worker_cpu_affinity:在高并发情况下,通过设置cpu粘性来降低由于多CPU核切换造成的寄存器等现场重建带来的性能损耗。如worker_cpu_affinity 0001 0010 0100 1000; (四核)。

error_log:全局错误日志级别及存放路径。日志输出级别有debug,info,notice,warn,error,erit可供选择,其中,debug输出日志最为详细,而crit输出日志最少。一般设置warn级别及以上。

pid:Nginx进程号记录文件。Nginx是作为系统守护进程在进行,需要在某个文件中保存当前运行程序的主进程号。

worker_rlimit_nofile:用来绑定worker进程和CPU,Linux内核2.4 以上可用。最大打开文件数,可设置为系统优化后的ulimit -HSn的结果。现在在Linux2.6 内核下开启文件打开数为65535,worker_rlimit_nofile 就应该填写65535.这是因为Nginx调度时请求到进程并不是那么均衡,所以假如填写10240,总并发量达到3-4万时就有进程超过10240了,这就会返回502。

2.Events

events {
use epoll;
worker_connections 2048;
}

use:事件模块指令,用来指定Nginx的工作模式。Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll 。其中select 和poll 都是标准的工作模式,kqueue和epoll是高效的工作模式。在Linux操作系统下,nginx默认使用epoll事件模型,得益于此,nginx在Linux操作系统下效率相当高。同时Nginx在OpenBSD或FreeBSD操作系统上采用类似于epoll的高效事件模型kqueue。在操作系统不支持这些高效模型时才使用select。

work_connections:单个worker进程最大连接数。nginx最大连接数=worker连接数*worker进程数。默认是1024。这个可以增到到8192都没关系,看情况而定,但不能超过前面的worker_rlimit_nofile。

3.HTTP模块

http {
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;
}

server_tokens off: 隐藏响应header和错误通知中的版本号。

include mime.types: 文件扩展名与文件类型映射表。

default_type application/octet-stream: 默认文件类型。这里设定默认类型为二进制流。例如在没有配置PHP环境时,Nginx是不予解析的,此时,用浏览器访问PHP文件就会出现下载窗口。

log_format: 自定义服务日志。HttpLog模块指令,用于指定Nginx日志的输出日志。

<1>head头缓存

server_names_hash_bucket_size 128;
client_header_buffer_size 32k; 
large_client_header_buffers 4 128k; 
client_max_body_size 10m; 
client_body_buffer_size 128k; 

sendfile on ; 
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65 : 
client_body_timeout 60s;
send_timeout 60s;

sendfile: 开启高效文件传输模式,默认是关闭状态(off)。sendfile指令指定nginx是否调用sendfile函数来输出文件,减少用户空间到内核空间的上下文切换。对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。

tcp_nopush: 激活tcp_nopush参数可以允许把httpresponse header和文件的开始放在一个文件里发布,积极的作用是减少网络报文段的数量。

tcp_nodelay: 激活tcp_nodelay,内核会等待将更多的字节组成一个数据包,从而提高I/O性能。

keepalive_timeout number: 设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接。单位是秒,这个参数很敏感,涉及浏览器的种类、后端服务器的超时设置、操作系统的设置。长连接请求大量小文件的时候,可以减少重建连接的开销,但假如有大文件上传,65s内没上传完成会导致失败。如果设置时间过长,用户又多,长时间保持连接会占用大量资源。

server_names_hash_bucket_size: 服务域名的hash表大小。

server_names_hash_max_size: 服务域名的最大hash表大小。

client_header_buffer_size: 用来指定来自客户端请求头的header buffer 大小。对于大多数请求,1K的缓存已经足够了,如果自定义了消息头或有更大的cookie,可以增大缓存区大小。

large_client_header_buffers: 用来指定客户端请求中较大的消息头的缓存最大数量和大小,4为个数,128k为大小,最大缓存为4个128KB。

client_max_body_size: 客户端请求的最大的单个文件字节数。

client_body_buffer_size: 缓冲区代理缓冲用户端请求的最大字节数。

client_body_timeout: 用于设置客户端请求主体读取超时时间,默认是60s。如果超过这个时间,客户端还没有发送任何数据,nginx将返回Request time out(408)错误。

send_timeout: 用于指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。

<2>模块http_proxy及upstream

upstream

这个模块实现的是nginx作为反向代理服务器的功能,包括缓存功能,负载均衡等等,将在后续博客进行深究。

<3>模块http_gzip

gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 6;
gzip_types text/html text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
gzip_vary on;

gzip on: 开启gzip压缩输出,减少网络传输。

gzip_min_length 1k: 最小压缩文件大小,页面字节数从header头的Content-Length中获取。默认值为0,不管多大页面都压缩,建议设置成大于1K的字节数,小于1K可能会越压越大。

gzip_buffers 4 16k: 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。4 16k代表以16k为单位,安装原始数据大小以16k为单位的4倍申请内存,默认是申请与原始数据大小相同的内存空间来存储gzip压缩结果。

gzip_http_version 1.1: 用于识别 http 协议的版本,早期的浏览器不支持 Gzip 压缩,用户就会看到乱码,所以为了支持前期版本加上了这个选项。如果你用了 Nginx 的反向代理并期望也启用 Gzip 压缩的话,由于末端通信是 http/1.0,故请设置为 1.0。默认是1.1,目前主流浏览器都已成指出。(前端如果是squid2.5请使用1.0)。

gzip_comp_level 6: 压缩等级,1压缩比最小,处理速度最快,9压缩比最大,传输速度快,但是消耗CPU资源。

gzip_types text/plain application/x-javascript text/css application/xml: 压缩类型,匹配mime类型进行压缩,无论是否指定,”text/html”类型总是会被压缩的。

gzip_vary on: 和http头有关系,会在响应头加个 Vary: Accept-Encoding ,可以让前端的缓存服务器缓存经过gzip压缩的页面,例如,用Squid缓存经过Nginx压缩的数据。

gzip_proxied any: Nginx作为反向代理的时候启用,决定开启或者关闭后端服务器返回的结果是否压缩,匹配的前提是后端服务器必须要返回包含”Via”的 header头。

limit_zone crawler $binary_remote_addr 10m: 开启限制IP连接数的时候需要使用。

<4>模块FastCGI

fastcgi_connect_timeout 300;  
fastcgi_send_timeout 300;  
fastcgi_read_timeout 300;  
fastcgi_buffer_size 64k;  
fastcgi_buffers 4 64k;  
fastcgi_busy_buffers_size 128k;  
fastcgi_temp_file_write_size 128k;  
fastcgi_cache TEST;  
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;  
fastcgi_cache_valid 200 302 1h;  
fastcgi_cache_valid 301 1d;  
fastcgi_cache_valid any 1m;

fastcgi_connect_timeout 300; 指定连接到后端FastCGI的超时时间。

fastcgi_send_timeout 300; 指定向FastCGI传送请求的超时时间,这个值是已经完成两次握手后向FastCGI传送请求的超时时间。

fastcgi_read_timeout 300; 指定接收FastCGI应答的超时时间,这个值是已经完成两次握手后接收FastCGI应答的超时时间。

fastcgi_buffer_size 64k; 用于指定读取FastCGI应答第一部分需要多大的缓冲区,这个值表示将使用1个64KB的缓冲区读取应答的第一部分(应答头),可以设置为fastcgi_buffers选项指定的缓冲区大小。

fastcgi_buffers 4 64k; 指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求。如果一个PHP脚本所产生的页面大小为256KB,那么会为其分配4个64KB的缓冲区来缓存;如果页面大小大于256KB,那么大于256KB的部分会缓存到fastcgi_temp指定的路径中,但是这并不是好方法,因为内存中的数据处理速度要快于硬盘。一般这个值应该为站点中PHP脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为256KB,那么可以把这个值设置为“16 16k”、“4 64k”等。

fastcgi_busy_buffers_size 128k; 默认值是fastcgi_buffers的两倍。

fastcgi_temp_file_write_size 128k; 表示在写入缓存文件时使用多大的数据块,默认值是fastcgi_buffers的两倍。

fastcgi_cache TEST; 表示开启FastCGI缓存并为其指定一个名称。开启缓存非常有用,可以有效降低CPU的负载,并且防止502错误的发生。但是开启缓存也会引起很多问题,要视具体情况而定。

fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m; FastCGI缓存指定一个文件路径、目录结构等级、关键字区域存储时间和非活动删除时间。

fastcgi_cache_valid 200 302 1h; 用来指定应答代码的缓存时间。实例中的值表示将200和302应答缓存一个小时,将301应答缓存1天,其他应答均缓存1分钟。

Server虚拟主机

http服务上支持若干虚拟主机。每个虚拟主机一个对应的server配置项,配置项里面包含该虚拟主机相关的配置。在提供mail服务的代理时,也可以建立若干server。每个server通过监听地址或端口来区分。

server

server模块将在后续博客详解。

server {
listen 80;
server_name xxx.com;
root /apps;
index index.html index.htm index.php;
  
charset utf-8;
access_log logs/host.access.log main;
}

listen 80; 监听端口,默认80,小于1024的要以root启动。可以为listen *:80、listen 127.0.0.1:80等形式。

server_name xxx.com; 服务器名,如localhost、www.example.com,可以通过正则匹配,多个域名之间用空格分开。

charset utf-8; 用于设置网页的默认编码格式。

access_log: 日志存放路径和输出级别。

root /apps; 定义服务器的默认网站根目录位置。如果locationURL匹配的是子目录或文件,root没什么作用,一般放在server指令里面或/下。这个目录可以是相对路径,也可以是绝对路径。

index index.jsp index.html index.htm; 定义路径下默认访问的文件名,一般跟着root放。

location块

location

URL地址匹配是进行Nginx配置中最灵活的部分。 location支持正则表达式匹配,也支持条件判断匹配,用户可以通过location指令实现Nginx对动、静态网页进行过滤处理。使用location URL匹配配置还可以实现反向代理,用于实现PHP动态解析或者负载负载均衡。更多用法将在后续博客更新,在此制作简单介绍。

location / {
root /apps/oaapp;
index index.jsp index.html index.htm index.php;
}

/: 匹配规则符号。

root /apps; 定义服务器的默认网站根目录位置。如果匹配到这个location块,那么以location块中的root进行访问。

index index.jsp index.html index.htm index.php; 定义路径下默认访问的文件名,一般跟着root放。


nginx配置文件的存放方式

nginx配置文件存放方式

该目录下,所有conf文件都是nginx默认生成的配置文件,其中指定了nginx.conf为启动nginx时的配置文件,在conf.d文件夹中,是各个模块自定义的配置文件。

nginx.conf配置如下

nginx.conf

在这个文件中一般只写入main全局块,upstream块,events块,http块,而不写入具体的server块。最后一行的include表示包含在这个路径下的所有conf,即此路径下的所有conf文件生效。

自定义conf块

nginx.conf

三个自定义的conf,每一个分别写入了一个server模块,保证互不影响。

其中一个的具体示例:

nginx.conf

后续

敬请期待后续更新。

最后编辑于: 2020 年 11 月 18 日
返回文章列表 文章二维码 打赏
本页链接的二维码
打赏二维码
添加新评论

已有 1 条评论
  1. 哲弟     Windows 10 /    FireFox

    牛逼牛逼