欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Nginx简介和常用的一些配置

程序员文章站 2022-03-11 08:14:21
...

简介

Nginx是一个免费的、开源的、高性能的HTTP服务器和反向代理,以及IMAP/POP3代理服务器。Nginx是为解决C10K问题编写的少数服务器之一。与传统服务器不同,NGNX不依赖线程来处理请求。相反,它使用了更可扩展的事件驱动(异步)架构。这种架构使用较小但更重要的是在负载下可预测的内存量。即使您不希望同时处理数千个请求,您仍然可以从Nginx的高性能和小内存占用中受益。

特点

  • 静态的web资源服务器;(图片服务器,或js/css/html/txt等静态资源服务器)
  • 结合FastCGI/uwSGI/SCGI等协议反代动态资源请求;
  • http/https协议的反向代理;
  • imap4/pop3协议的反向代理;
  • tcp/udp协议的请求转发;
  • 使用epoll模型,使Nginx在高并发环境下表现的很好。但是处理动态请求的时候没有太多优势(静态小文件多的情况下同时处理的连接数多)
  • 占用资源少
  • 配置简单,灵活

应用的场景

  • 处理静态请求(图片,视频服务)html js css flv等等
  • 处理动态请求,nginx+fastcgi 的方式运行
  • 反向代理,负载均衡
  • 缓存服务

安装

这里使用编译安装
可以再官网找到tar包,http://nginx.org/en/download.html

系统: CentOS7
Nginx版本:1.14

yum install openssl openssl-devel gcc gcc-devel pcre pcre-devel -y
useradd -M -s /sbin/nologin nginx
cd /usr/local/src/
wget http://nginx.org/download/nginx-1.14.0.tar.gz ##这里直接wget吧tar包下载下来
tar -xf nginx-1.14.0.tar.gz 
cd nginx-1.14.0
./configure --prefix=/usr/local/nginx1.14 --user=nginx --group=nginx --with-http_ssl_module  --with-http_stub_status_module --with-http_flv_module --with-http_mp4_module --with-threads --with-file-aio
make && make install 
ln -sv /usr/local/nginx1.14 /usr/local/nginx
PATH=/usr/local/nginx/sbin/:$PATH

我们可以看一下Nginx目录结构

[root@localhost nginx-1.14.0]# tree /usr/local/nginx -L 1
/usr/local/nginx
├── conf    #存放配置文件的目录
├── html    #默认的站点目录
├── logs    #存放日志的目录
└── sbin    #nginx命令的目录

常见配置指令

1.user

格式:user user [group]
定义worker进程所属的用户和用户组

2.pid /PATH/TO/PID_FILE

pid文件路径

3.include file

指明包含进来的其它配置文件片断;

4.load_module file

指明要装载的动态模块

性能优化相关的配置

1.worker_processes number | auto;

worker进程的数量;通常应该等于小于当前主机的cpu的物理核心数;
auto:当前主机物理CPU核心数;

2.worker_cpu_affinity cpumask …;

worker_cpu_affinity auto [cpumask];
cpu核心绑定,将worker进程绑定在固定的cpu核上,我们考虑这样一种场景,worker进程没有绑定在固定的cpu上,worker进程可能每次都在不同的cpu上运行,比如第一次在第一个cpu上,第二次在第二个cpu上,这样你在第一个cpu上的缓存就用不到了。就会被浪费掉,减少了缓存命中。
举个例子,加入有4个cpu我们可以这样写
worker_cpu_affinity 0001 0010 0100 1000;
其中0001表示绑定在0号cpu上,0010表示绑定在1号cpu上。以此类推。

ps axo pid,command,psr| grep nginx| grep -v grep  #可以用这个命令查看是否绑定成功,请求进来的时候,执行看一下绑定的cpu变了没。

3.worker_priority number;

指定worker进程的nice值,设定worker进程优先级;[-20,20]

4.worker_rlimit_nofile number;

worker进程所能够打开的文件数量上限;

事件驱动相关的配置

1.worker_connections number;

每个worker进程所能够打开的最大并发连接数数量;
nginx所有进程并发连接数=worker_processes * worker_connections

2.use method;

指明并发连接请求的处理方法,一般使用epoll

3.accept_mutex on | off;

处理新的连接请求的方法;on意味着由各worker轮流处理新请求,Off意味着每个新请求的到达都会通知所有的worker进程;

与套接字相关的配置:

1.server { … }

配置一个虚拟主机;

server {
        listen address[:PORT]|PORT;
        server_name SERVER_NAME;
        root /PATH/TO/DOCUMENT_ROOT;                            
}

2.listen PORT|address[:port]|unix:/PATH/TO/SOCKET_FILE

格式:listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]

  • default_server:设定为默认虚拟主机;
  • ssl:限制仅能够通过ssl连接提供服务;
  • backlog=number:后援队列长度;
  • rcvbuf=size:接收缓冲区大小;
  • sndbuf=size:发送缓冲区大小;

3.server_name name …;

指明虚拟主机的主机名称;后可跟多个由空白字符分隔的字符串;
支持通配任意长度的任意字符;server_name www.ice.*
支持~起始的字符做正则表达式模式匹配;
匹配优先级机制:
首先是字符串精确匹配;
左侧*通配符;
右侧*通配符;
正则表达式;

4.tcp_nodelay on | off;

在keepalived模式下的连接是否启用TCP_NODELAY选项;同个链接比如请求多个资源,会到一定程度一起发送,而不是马上发送。开启状态就是直接发。不攒起来发。

5.tcp_nopush on|off;

在sendfile模式下,是否启用TCP_CORK选项;吧响应报文首部和文件起始内容放在一起发送,发送一个文件在一个报文里,因为sendfile是高级io,用户请求的资源在硬盘上,一般是从硬盘读取到内核,然后从内核读取到进程,然后再从进程发往内核,然后再送出去。sendfile模式则是,不需要从内核读取到进程,而是直接从硬盘读取到内核然后直接发送出去。然后报文首部在nginx进程生成,然后发送到内核,内核再从网卡出去。而开启了这个选项会让内核里的资源等一等进程的报文首部。合并成一个文件再发送出去

6.sendfile on | off;

是否启用sendfile功能;sendfile是高级io,用户请求的资源在硬盘上,一般是从硬盘读取到内核,然后从内核读取到进程,然后再从进程发往内核,然后再送出去。sendfile模式则是,不需要从内核读取到进程,而是直接从硬盘读取到内核然后直接发送出去。

定义路径相关的配置:

1.root path;

设置web资源路径映射;用于指明用户请求的url所对应的本地文件系统上的文档所在目录路径;可用的位置:http, server, location, if in location;

2.location [ = | ~ | ~* | ^~ ] uri { … }

Sets configuration depending on a request URI.
在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location,并找出一个最佳匹配,而后应用其配置;
=:对URI做精确匹配;
~:对URI做正则表达式模式匹配,区分字符大小写;
~*:对URI做正则表达式模式匹配,不区分字符大小写;
^~:对URI的左半部分做匹配检查,不区分字符大小写;
不带符号:匹配起始于此uri的所有的url;
匹配优先级:=, ^~, ~/~*,不带符号;
官方的一个典型例子

location = / {
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /documents/ {
    [ configuration C ]
}

location ^~ /images/ {
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}
#请求“/”的时候会匹配configuration A
#请求“/index.html”将会匹配configuration B,
#请求“/documents/document.html”将会匹配configuration C
#请求“/images/1.gif”将会匹配configuration D
#请求“/documents/1.jpg”将会匹配configuration E

3.alias path;

定义路径别名,文档映射的另一种机制;仅能用于location上下文;
注意:location中使用root指令和alias指令的意义不同;
(a) root,给定的路径对应于location中的/uri/左侧的/;
(b) alias,给定的路径对应于location中的/uri/右侧的/;

4.index file …;

默认资源;http, server, location;

5.error_page code … [=[response]] uri;

定义错误页面,可以再location内定制错误页面

#        error_page 404 /404.html;
#            location = /40x.html {  ##这里可以用root指令定制错误页面
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }

6.try_files file … uri;

定义客户端请求的相关配置

1.keepalive_timeout timeout [header_timeout];

设定保持连接的超时时长,0表示禁止长连接;默认为75s;

2.keepalive_requests number;

在一次长连接上所允许请求的资源的最大数量,默认为100;

3.keepalive_disable none | browser …;

对哪种浏览器禁用长连接;

4.send_timeout time;

向客户端发送响应报文的超时时长,此处,是指两次写操作之间的间隔时长;

5.client_body_buffer_size size;

用于接收客户端请求报文的body部分的缓冲区大小;默认为16k;超出此大小时,其将被暂存到磁盘上的由client_body_temp_path指令所定义的位置;
client_body_temp_path path [level1 [level2 [level3]]];
设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量;
client_body_temp_path /var/tmp/client_body 2 1 1
1:表示用一位16进制数字表示一级子目录;0-f
2:表示用2位16进程数字表示二级子目录:00-ff
2:表示用2位16进程数字表示三级子目录:00-ff

对客户端进行限制的相关配置:

1.limit_rate rate;

限制响应给客户端的传输速率,单位是bytes/second,0表示无限制;

2.limit_except method … { … }

限制对指定的请求方法之外的其它方法的使用客户端;

limit_except GET {
    allow 192.168.1.0/24;
    deny  all;
}

文件操作优化的配置

1.aio on | off | threads[=pool];

是否启用aio功能;

2.directio size | off;

在Linux主机启用O_DIRECT标记,此处意味文件大于等于给定的大小时使用,例如directio 4m;

3.open_file_cache off;

open_file_cache max=N [inactive=time];
nginx可以缓存以下三种信息:
(1) 文件的描述符、文件大小和最近一次的修改时间;
(2) 打开的目录结构;
(3) 没有找到的或者没有权限访问的文件的相关信息;
max=N:可缓存的缓存项上限;达到上限后会使用LRU算法实现缓存管理;
inactive=time:缓存项的非活动时长,在此处指定的时长内未被命中的或命中的次数少于open_file_cache_min_uses指令所指定的次数的缓存项即为非活动项;

4.open_file_cache_valid time;

缓存项有效性的检查频率;默认为60s;

5.open_file_cache_min_uses number;

在open_file_cache指令的inactive参数指定的时长内,至少应该被命中多少次方可被归类为活动项;

6.open_file_cache_errors on | off;

是否缓存查找时发生错误的文件一类的信息;