Nginx

Nginx

**简介:**Nginx由俄罗斯人开发,是一款开源、高性能的Web服务器、反向代理服务器、负载均衡服务器,其特点稳定、高性能、低能耗,其底层使用事件驱动+异步非阻塞I/O模型。

解释

事件驱动:Nginx 的 Worker 进程是单线程的,通过一个主循环监听所有 I/O 事件,如新连接、数据到达

I/O多路复用:使用高效的系统调用,如Linux的epoll,监听Socket

非阻塞I/O操作:Nginx进行I/O操作的时候,若数据未就绪,Worker会记录当前状态并转去处理其他请求,当数据就绪时通过事件回调继续处理。


Nginx重要文件目录

1
2
3
4
5
6
7
8
#主配置文件
/etc/nginx/nginx.conf
#自定义子配置文件目录
/etc/nginx/conf.d
#日志存放目录
/var/log/nginx
#日志切割文件
/etc/logrotate.d/nginx

安装

1
2
3
4
5
6
7
8
9
10
11
12
13
vim /etc/yum.repos.d/nginx.repo

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

dnf clean all

dnf -y install nginx

部署静态Web网站

配置文件

1
2
3
4
5
6
7
8
9
10
server {
listen 2001;
server_name test01.com;

root /www/test01;

location / {
index index.html;
}
}

网站目录

1
2
3
4
mkdir -p /www/test01
vim /www/test01/index.html
chown -R nginx:nginx /www/test01
chmod -R 755 /www/test01

防火墙

1
2
firewall-cmd --permanent --add-port=2001/tcp
firewall-cmd --reload

测试

1
2
curl IP:2001
http://IP:2001

反向代理

作用在服务器端,Nginx接受请求后转发给后端服务器,最后将响应结果返回给客户端。

常用代理参数

1
2
3
4
5
6
7
8
9
#被代理服务器地址
proxy_pass http://xxxxxxx.????;
#Nginx的主机名,请求从哪个Nginx过来的
proxy_set_header Host $host;
#客户端真实的IP
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#告诉服务器客户端使用的是什么协议
proxy_set_header X-Forwarded-Proto $scheme;

缓冲

作用:将服务器响应的数据放在内存中,等待请求中的数据处理完毕再返回给客户端,当缓冲区大小到达设定值后会写入临时文件内,防止客户端网速不好时拖慢服务器。

缓冲常用配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#启用或禁用缓冲,on开启,off禁用,默认on
proxy_buffering on;
#单个缓冲区大小
proxy_buffer_size 4k;
#缓冲区数量和大小
proxy_buffers 8 4k;
#忙碌时缓冲区大小
proxy_busy_buffers_size 8k;
# 临时文件最大大小
proxy_max_temp_file_size 1024m;
# 每次写入临时文件的数据量
proxy_temp_file_write_size 16k;
# 临时文件目录
proxy_temp_path /var/nginx/proxy_temp;

缓存

作用:Nginx将响应数据保存在磁盘中,返回给客户端的数据优先从缓存中获取,提升网站性能,减轻服务器压力。

缓存常用配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#在http里指定缓存路径时间等
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m use_temp_path=off;
#解释
/var/cache/nginx:缓存数据存放路径
levels=1:2:定义缓存目录的层级结构
keys_zone=my_cache:10m:定义缓存名字和存储key的大小
inactive=60m:指定缓存项在不被访问情况下的保留时间
use_temp_path=off:禁用预缓存机制

#在server中配置,指定使用哪个缓存策略
proxy_cache my_cache; #上面keys_zone的值
#访问成功的数据保留时间
proxy_cache_valid 200 302 10m;
#404保留时间
proxy_cache_valid 404 1m;
#其他数据保留时间
proxy_cache_valid any 5m;

负载均衡

作用:将网络流量分发到多个服务器,以此来提高服务器的性能。

1
2
3
4
5
6
7
8
9
10
11
12
#在子配置文件或http中配置,和server标签是同级
upstream my_test{
server 服务器地址1;
server 服务器地址2;
...;
}

server {
location / {
proxy_pass http://my_test;
}
}

负载均衡策略

1
2
3
4
5
6
7
8
9
10
11
12
13
#不写默认是轮询,按顺序分发

#最少连接,将请求分发给当前连接数最少的服务器
least_conn

#IP哈希,将客户端IP作为哈希key的值,来自同一IP的请求总是发给同一服务器处理
ip_hash

#权重,能者多劳,尽可能的把请求分发给内存大的服务器,默认是1
weight=数值

#通用哈希,自定义哈希的key值,consistent仅对发生问题的服务器重新哈希解析
hash $request_uri consistent

问题

轮询和最少连接策略都可能造成来自同一客户端的请求分发到了不同的服务器上;

IP哈希当服务器宕机或者扩容的时候,会引发大量的路由变化,所有基于IP哈希策略的请求都要重新解析,导致大量缓存失效等问题;

健康检查

Nginx会检测后端服务器在指定周期内的失败响应次数,达到指定次数时,再下一个周期内都不会派发请求到该服务器上。

1
2
3
4
#指定周期时间,单位秒,默认10秒
fail_timeout=数值
#指定失败次数,默认1次
max_fails=数值

HTTPS配置

作用:对网络传输加密,实现互联网传输安全保护。

自定义生成证书

1
2
3
4
5
6
#生产密钥
openssl genrsa -des3 -out server.key 2048
#创建证书签名
openssl req -new -key server.key -out server.csr
#生成自签名证书
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
#crt文件
ssl_certificate 证书文件路径;
# .key文件
ssl_certificate_key 密钥文件路径
#禁用不安全协议
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#配置安全预设组合
ssl_ciphers HIGH:!aNULL:!MD5;
#指定密码文件所在路径,自定义文件,将密码填入即可
ssl_password_file 密码文件所在路径;
#设置SSL会话缓存,优化CPU,第一句缓存空间大小,第二句时间
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
}

TCP代理

作用:Nginx不仅可以代理HTTP请求,还可以作为TCP和UDP协议的代理,例如MySQL、Redis等服务。

注意点

1、在nginx.conf主配置文件中配置

2、配置块和http同级

配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
stream {
upstream 自定义名称 {
server 服务器地址:端口;
server 服务器地址:端口;
...;
}
server {
listen 端口号;
proxy_pass 上面自定义的名称;
proxy_timeout 60s; #超时时间
proxy_connect_timeout 5s; #连接后端服务器的超时时间

}
}

扩展

在配置mysql的时候可以使用keepalive配置项来定义连接池空闲连接的数量;

连接池有一百个连接,可以指定始终开启的连接,这样就不用反复开关连接,减轻服务器资源的压力。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
stream {
upstream 自定义名称 {
server 服务器地址:端口;
server 服务器地址:端口;

keepalive 8;
}
server {
listen 端口号;
proxy_pass 上面自定义的名称;
proxy_timeout 60s; #超时时间
proxy_connect_timeout 5s; #连接后端服务器的超时时间

}
}

重写

作用:用于修改或重定向URI。

第一种:return

1
2
3
4
#停止处理,返回状态码,或状态码加提示信息
return code [msg];
#重定向
return code URL;

第二种:rewrite

1
2
3
4
5
6
rewrite 正则表达式 替换目标 [标志位];

#标志位,重写后的处理流程,可选
last:停止当前rewrite处理,用重写好的URI重新搜索location块,相当于新请求,会重新执行匹配逻辑。

break:停止当前rewrite处理,不重新搜索location,继续执行后续指令,通常在location中使用。