nginx

一.Nginx是什么?

1.Nginx概述

  • 一款高新能、轻量级Web服务软件
  • 系统资源消耗低
  • 对HTTP并发连接的处理能力高
  • 单台物理服务器可支持30000~50000个并发请求
  • 是一款轻量级的高性能的web服务器/反向代理服务器/电子邮件(IMAP/POP3)代理服务器

Apache

Apache是以进程为基础的结构,进程要比线程消耗更多的系统开支,不太适用于多处理器环境,因此,在一个apache Web站点扩容时,通常是增加服务器或扩充群集节点而不是增加处理器。

2.Nginx和Apache的优缺点比较

先讲nginx的优点:

1、可以跨平台,配置简单,内存消耗少,10个nginx才占用150M内存。

2、使用的是epoll模型,这种模型是I/O多路复用技术(I/O多路复用是一种技术,它允许一个进程或线程监控多个网络连接,当其中某个或某几个连接有数据时,当前程序可以拿到网卡收到的数据进行下一步的处理;),异步非阻塞的模型(异步非阻塞模型可以提高程序的效率,在等待I/O操作完成的同时,可以继续执行其他代码。)

3、nginx支持高并发连接,处理2-3万并发连接数,官方监测能支持5万并发。

4、成本低,且开源,稳定性高,宕机概率非常小;

5、内置的健康检查功能,可以允许在服务器宕机的时候,做健康检查,再发送的请求就不会发给宕机的服务器,会重新提交到其他节点上。

nginx的缺点:
nginx有个不太友好的地方是,nginx不方便处理动态资源,可以进行动静分离,将动态请求交给后端程序去进行处理

nginx相对于apache的优点∶
  1. 轻量级,同样起web服务,比apache占用更少的内存及资源
  2. 静态处理,Nginx 静态处理性能比 Apache 高
  3. Nginx可以实现无缓存的反向代理加速,提高网站运行速度;
  4. Nginx的性能和可伸缩性不依赖于硬件,Apache依赖于硬件;
  5. Nginx支持热部署,启动速度迅速,可以在不间断服务的情况下,对软件版本或者配置进行升级;
  6. nginx是异步进程,基于事件的web服务器,多个连接对应一个进程 ;apache是同步多进程,基于流程的web服务器,一个连接对应一个进程;
  7. Nginx高度模块化,编写模块相对简单,且组件比Apache少
  8. nginx抗并发,nginx处理请求是异步非阻塞的,而Apache则是阻塞性的,在高并发下的nginx能够保持低资源,低消耗高性能
apache相对于nginx的优点∶
  • Rewrite比nginx的rewrite强大 (rewrite的主要功能就是实现统一资源定位符URL的跳转)

  • 模块多,基本想到的都可以找到

  • 少bug, nginx的bug相对较多

  • 超稳定

存在的理由:一般来说,需要性能的web服务,用nginx。若不需要性能只求稳定,就选用apache。

三.nginx的应用场景

1、可以做web服务器,nginx是一个http服务,可以独立地提供http服务,可以做静态服务器;

2、虚拟主机。可以实现一台服务器,虚拟多个站点,例如基于ip、不同端口、或者不同域名的站点

3、反向代理服务器,负载均衡。当网站的访问量达到一定的程度时,单台服务器就不能满足用户的请求,此时需要多台服务器集群,此时可以使用nginx做反向代理,并且多台服务器可以平均分担负载,不会让某台服务器负载高或者闲置。(也可以使用ip hash技术 进行负载均衡分配)

4、nginx中还可以配置安全管理,比如支持nginx搭建API接口网关,对每一个接口服务进行拦截;

5、nginx还能做缓存服务器;

四.nginx为什么能支持高并发

最核心的原因:nginx是异步,非阻塞,使用 epoll ,和并且可以进行简单的配置细节优化。

假设一个server采用一个进程(或者线程)负责一个请求的方式,那么进程的数量就是并发的数量,那么会有很多进程在等待中,等待网络的传输,非常耗时耗资源。

但是nginx是使用了异步非阻塞的程序运行方式,解决了等待浪费时间的痛点,有一个专门进行调度进程,每次有一个request请求,就可以分配给worker进程去进行处理,web server 的工作性质决定了每个 request 的大部份生命都是在网络传输中,实际上花费在 server 机器上的时间片不多。这是几个进程就解决高并发的秘密所在。

五.为什么nginx不使用多线程

nginx采用单线程来异步非阻塞处理请求 (管理员可以配置 Nginx 主进程的工作进程的数量)(epoll),不会为每个请求分配 cpu 和内存资源,节省了大量资源,同时也减少了大量的 CPU 的上下文切换。所以才使得 Nginx 支持更高的并发。

六.nginx的两种进程

1.nginx有两种进程,master进程和worker进程

master进程:用于管理worker进程,读取nginx的配置文件信息

worker进程:处理连接请求

2.Nginx模块与作用

main模块:全局配置模块,所有模块都要执行遵守

配置运行nginx服务器的用户(组)、worker_process数(进程)、nginx进程PID存放路径、错误日志存放路径、配置文件的引入等

stream服务模块:实现反向代理功能,包括TCP协议代理

邮件服务模块:主要用于支持 Nginx 的邮件服务

对 POP3 协议、 IMAP 协议和 SMTP协议的支持

第三方模块:二次开发,为了扩展 Nginx 服务器应用,完成开发者自定义功能

Json 支持、 Lua 支持等

events模块:影响nginx服务器与用户的网络连接

events {                                              #events模块设置

woker_connections 65536;                #设置单个工作进程最大并发连接数

use epoll;                                           #事件驱动类型选择为epoll

accept_mutex on;                              #同一时刻一个请求轮流由work进程除了,即轮询

multi_accept on;                                #每个工作进程同时接受多个网络连接

}

http模块:跟web服务相关,主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,包含几个子模块

自定义服务日志、允许sendfile方式传输文件、连接超时时间、单连接请求数上限、Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等

location模块:uri网址定位

server模块:服务模块

配置80端口监听、虚拟主机、DNS域名解析等

auth_basic模块:对网页设置用户名密码

gzip模块:压缩

proxy模块:设置后端IP地址、端口号及http和加密的https

ssl模块:https加密

3.Nginx三大作用:反向代理、负载均衡、动静分离

反向代理:在服务端 配置,客户端 访问服务器A ,服务器A 为代理服务器 ,将客户服务再转发到服务器B 

       作用:缓存,将服务器的响应缓存在自己的内存中,减少服务器压力;

                  负载均衡,将用户请求分配给多个服务器;

                  访问控制

正向代理:在客户端 配置,配置完了再去访问具体服务,即代理服务器 代理了客户端 ,再去和目标服务器 进行交互

       作用:提高访问速度

                  隐藏客户端真实IP地址

负载均衡:分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务

nginx七层负载均衡调度算法(六种)

1、轮询(默认调度算法)

特点:每个请求按时间顺序逐一分配到不同的后端服务器处理。
适用业务场景:后端服务器硬件性能配置完全一致,业务无特殊要求时使用。

upstream backendserver {
server 192.168.0.14:80 max_fails=2 fail_timeout=10s;
server 192.168.0.15:80 max_fails=2 fail_timeout=10s;
}
2、加权轮询

特点:指定轮询几率,weight值(权重)和访问比例成正比,用户请求按权重比例分配。
适用业务场景:用于后端服务器硬件性处理能力不平均的情形。

upstream backendserver {
server 192.168.0.14:80 weight=5 max_fails=2 fail_timeout=10s;
server 192.168.0.15:80 weight=10 max_fails=2 fail_timeout=10s;
}
3、ip_hash(IP哈希)

特点:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session会话保持问题。
适用业务场景:适用于需要账号登录的系统,会话连接保持的业务。

upstream backendserver {
ip_hash;
server 192.168.0.14:80 max_fails=2 fail_timeout=10s;
server 192.168.0.15:80 max_fails=2 fail_timeout=10s;
}
4、最少连接数 least_conn

特点:按nginx反向代理与后端服务器之间的连接数,连接数最少的优先分配。

适用业务场景:适用于客户端与后端服务器需要保持长连接的业务。

upstream backendserver {
least_conn; server 192.168.0.14:80 max_fails=2 fail_timeout=10s;
server 192.168.0.15:80 max_fails=2 fail_timeout=10s;
}

5、响应时间 fair(需编译安装第三方模块 ngx_http_upstream_fair_module)

特点:按后端服务器的响应时间来分配请求,响应时间短的优先分配。
适用业务场景:对访问响应速度有一定要求的业务。

upstream backendserver {
fair;
server 192.168.0.14:80 max_fails=2 fail_timeout=10s;
server 192.168.0.15:80 max_fails=2 fail_timeout=10s;
}

6、url_hash(URL分配 )(需编译安装第三方模块 ngx_http_upstream_hash_module)

特点:按访问url的hash结果来分配请求,使同一个url访问到同一个后端服务器。

适用业务场景:适用于后端服务器为缓存服务器时比较有效。

upstream backendserver {
server 192.168.0.14:80 max_fails=2 fail_timeout=10s;
server 192.168.0.15:80 max_fails=2 fail_timeout=10s;
hash $request_uri;
}

动静分离:采用代理的方式,在server{}段中加入带正则匹配的location来指定匹配项针对PHP的动静分离:静态页面交给Nginx处理,动态页面交给PHP-FPM模块或Apache处理。

在Nginx的配置中,是通过location配置段配合正则匹配实现静态与动态页面的不同处理方式,通过使用Nginx提高网站的响应速度,优化用户体验

七.编译安装nginx

1.关闭防火墙,将安装nginx所需软件包传到/opt目录下

systemctl stop firewalld
systemctl disable firewalld
setenforce 0

2.安装依赖包 

#nginx的配置及运行需要pcre、zlib、openssl等软件包的支持,因此需要安装这些软件的开发包,以便提供相应的库和头文件。

yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make

3.创建运行用户、组

Nginx 服务程序默认以 nobody 身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限)

useradd -M -s /sbin/nologin nginx

4.编译安装Nginx

cd /opt
tar zxvf nginx-1.12.0.tar.gz -C /opt/
cd nginx-1.12.0/
 
./configure \
--prefix=/usr/local/nginx \		#指定nginx的安装路径
--user=nginx \					#指定用户名
--group=nginx \					#指定组名
--with-http_stub_status_module	#启用 http_stub_status_module 模块以支持状态统计
 
 
make -j2 && make install
make -j2 ##表示cpu有2核,使用2个cpu同时一起编译,make是将源代码翻译成二进制
make install ##表示将二进制文件放到指定的目录中

5.想要使用nginx命令直接启动服务,两种方式

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/		#让系统识别nginx的操作命令
##做软连接,创建二进制文件到PATH路径中
##一般是安装在/usr/local中,就放到/usr/local下的/sbin下
 
 
还有一种当时是在PATH环境变量中加入nginx程序的目录,这种不常用

 6.详解nginx的命令

nginx -t
nginx -v
nginx -V
nginx -s 信号

nginx_第1张图片

##cat /usr/local/nginx/logs/nginx.pid 先查看nginx的pid
##停止nginx服务的三种方式
kill -3  
kill -s QUIT 
killall -3 nginx
killall -s QUIT nginx
nginx -s quit 
kill -1 
kill -s HUP 
killall -1 nginx
killall -s HUP nginx
nginx -s reload

7.nginx版本编译安装平滑升级的方式

新版本升级:
tar xf nginx-1.25.3.tar.gz
cd nginx-1.25.3/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module \  ##加上状态收集模块
--with-http_ssl_module    ##最新的版本需要加上ssl模块
 
make
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_old   ##将原来的程序进行备份
cp objs/nginx /usr/local/nginx/sbin/nginx          ##将新编译好的二进制文件放到安装目录下
make upgrade  #要保证当前 nginx 进程是通过 /usr/local/nginx/sbin/nginx 启动的,而不是通过查找环境变量中那个 nginx 命令启动的
#或者先 killall nginx ,再/usr/local/nginx/sbin/nginx

8.使用systemd管理的两种办法

方法一:添加nginx系统服务,可以通用centos5-7三个版本
先创建一个nginx脚本文件
vim /etc/init.d/nginx
#!/bin/bash
#chkconfig: - 99 20  ##这一步必须要有,其中 - 表示为任何级别都不开启,99为第99个程序启动,20为第20个程序关闭
#description:Nginx Service Control Script   ##脚本目的描述
COM="/usr/local/nginx/sbin/nginx"     ##nginx启动的绝对路径
PID="/usr/local/nginx/logs/nginx.pid"   ##nginx的pid号的文件
case "$1" in
start)
  $COM
;;
 
stop)
  kill -s QUIT $(cat $PID)
;;
 
restart)
  $0 stop
  $0 start
;;
 
reload)
  kill -s HUP $(cat $PID)
;;
 
*)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1
 
esac
exit 0
chmod +x /etc/init.d/nginx  ##给脚本加上执行权限
chkconfig --add nginx	##添加为系统服务
chkconfig --list nginx  ##查看运行级别中是否开机自启动
chkconfig --level 35 nginx on|off ##设置字符多用户和图形化界面可以开机自启动|关闭

nginx_第2张图片

service nginx start  ##启动
service nginx stop   ##关闭
 
命令与/etc/init.d/nginx脚本中相呼应
 方法二:使用systemd 进行管理
vim /lib/systemd/system/nginx.service
[Unit] ##服务说明
Description=nginx  ##描述服务
After=network.target  ##依赖,当依赖的服务启动的时候再启动自定义的服务
[Service] ##服务运行参数的设置
Type=forking ##表示后台运行,使用启动类型应该同事指定PIDFile=,这样便于systemd能够追踪
PIDFile=/usr/local/nginx/logs/nginx.pid  ##指定pid的文件
ExecStart=/usr/local/nginx/sbin/nginx   ##服务启动的命令,就是绝对路径启动的命令
ExecReload=/bin/kill -s HUP $MAINPID  ##加载
ExecStop=/bin/kill -s QUIT $MAINPID   ##关闭
PrivateTmp=true   ##表示给服务分配独立的临时空间
[Install]
WantedBy=multi-user.target  ##服务安装的相关设置,可设置多用户
 

nginx_第3张图片

chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service

需要注意的是:service启动和systemctl启动不能相互混用,使用其一即可

总结:nginx是一款可以轻量级(体现在内存消耗少),高性能(体现在抗高并发 ),能够实现反向代理(多台nginx服务的时候,做客户端和服务端的请求转发),并且可以做静态处理的web服务器。最牛的核心优势:支持异步非阻塞处理请求,使用的是epoll(I/O多路复用技术)!!!

你可能感兴趣的:(http,网络协议,网络)