写在前面
Centos版本:Centos 7.6 - 64bit
Nginx版本:1.20.2
一、什么是Nginx
Nginx (engine x) 是一款轻量级的Web 服务器 、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。
二、Nginx用在哪些地方
2.1 静态资源服务
动静分离:为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。本质上是通过本地文件系统来提供服务;
一般来说,都需要将动态资源和静态资源分开,由于 Nginx 的高并发和静态资源缓存等特性,经常将静态资源部署在 Nginx 上。如果请求的是静态资源,直接到静态资源目录获取资源,如果是动态资源的请求,则利用反向代理的原理,把请求转发给对应后台应用去处理,从而实现动静分离。
使用前后端分离后,可以很大程度提升静态资源的访问速度,即使动态服务不可用,静态资源的访问也不会受到影响。
2.2 正向代理和反向代理(负载均衡)
正向代理
正向代理就是客户端将自己的请求先发给代理服务器,通过代理服务器将请求转发给服务器。我们常用的VPN就是一种代理服务器。比如:你想要访问国外的某个网站,你的客户端就需要连接上一个可以连访问外网的服务器。正向代理代理的是客户端。
反向代理
反向代理,反向代理代理的是服务器。在有多个服务器的情况下,为了能让客户端访问到的ip地址都为同一个网站,就需要使用反向代理。比如:一开始单台机器可以对外提供服务,在用户请求暴增的情况下,就需要多个机器对外提供相同的服务,此时就需要使用nginx作为反向代理,用户只需要访问特定的服务器,nginx会自动根据各个机器的负载情况,将请求转发到不同的机器。
2.3 负载均衡策略
- 轮询:按照顺序将请求转发到后台机器
- 加权轮询:根据机器性能的不同,为每个机器设置不同的权重。比如:可以为内存大、性能强劲的机器分配较大的权重,使其处理更多的请求。
- ip hash绑定服务器:对客户端ip进行hash操作,并对机器个数取余,使其分配到固定的机器。缺点:不易于水平扩展。
- 一致性哈希:水平扩展友好
三、Nginx安装
3.1 安装编译环境及第三方依赖
Nginx的配置及运行需要pcre、zlib等软件包的支持,因此需要安装这些软件包的开发包,以便提供相应的库和头文件。
yum install gcc-c++ // 安装编译环境 yum install zlib zlib-devel openssl openssl-devel pcre pcre-devel
3.2 下载nginx安装包
wget http://nginx.org/download/nginx-1.20.0.tar.gz tar -zxvf nginx-1.20.0.tar.gz // 解压 cd nginx-1.20.0 // 进入解压目录 ./configure --prefix=/usr/local/nginx // --prefix 指定安装目录,可以不写 make sudo make install
3.3 Nginx安装默认目录
其中sbin下就是nginx的可执行程序。logs目录下是日志:包括Nginx访问日志和错误日志,及Nginx运行时的主进程的的进程号会保存在mginx.pid文件中。
html目录下是静态网页:
conf目录下是nginx的核心配置,主要关注 nginx.conf即可。Nginx最小的配置如下:
# 配置用户及用户组 user root; #启动多少个子进程(worker),通常设置成和cpu的数量相等 worker_processes 1; events { worker_connections 1024; } http { include mime.types; #告诉浏览器以什么格式去接收和解析文件 default_type application/octet-stream; sendfile on; #开启零拷贝 keepalive_timeout 65; # 虚拟主机 vhost server { listen 80; server_name localhost; # 域名或者主机名 location / { root html; index index.html index.htm; } #如果服务端发生错误,会显示50x.html #http://www.baidu.com/50x.html error_page 500 502 503 504 /50x.html; # 去html目录下找 50x.html,html是相对路径,可以修改 location = /50x.html { root html; } } }
3.3.1 启动nginx
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
##### 3.3.2 停止nginx
/usr/local/nginx/sbin/nginx -s stop
3.3.3 重新加载nginx
/usr/local/nginx/sbin/nginx -s reload
3.3.4 配置文件分析
全局模块
配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
user nobody; #配置用户或者组,默认为nobody worker_processes 1; #允许生成的进程数,默认为1 error_log logs/error.log; #制定日志路径,级别。这个设置可以放入全局块, #http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg error_log logs/error.log notice; error_log logs/error.log info; pid logs/nginx.pid; #指定nginx进程运行文件存放地址
events块配置
events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
设置网络连接的序列化
Nginx是多进程的,当某一时刻只有一个网络连接达到时,多个睡眠的进程会被同时叫醒(这种现象叫“惊群”),但是只有一个进程可以获得连接。如果每次唤醒的进程数太多,会影响系统的性能。为了解决这一问题,Nginx配置中有一条指令accpet_mutex,当其设置为开启的时候,将会对多个Nginx的进程接收连接进行序列化,防止多个进程对连接的争抢。语法为:
accept_mutex on | off; // #设置网路连接序列化,防止惊群现象发生,默认为on
设置是否允许同时接收多个连接
每个Nginx服务器的worker_process 都有能力同时接收多个新到达的连接,但是这需要在配置文件中进行设置,语法为:
multi_accept on | off; // 默认为off,关闭 即每个worker一次只能接收一个新到达的网络连接,并且只能在events块中进行配置
事件驱动模型的选择
Nginx提供了多种事件驱动模型来处理网络消息,语法为:
use method; // method可以为:select poll epoll kqueue等等
定义MIME_Type
在浏览器中,可以显示html、XML、GIF等多种类型的文本、媒体等资源,浏览器为了区分这些资源,需要使用MIME Type。
我们可以看到再http全局块中如上配置,inclue 表示从外部引用了 mime.types 文件。这个文件在 /etc/mime.types