Nginx介绍
Nginx 采用了事件驱动和异步架构,此设计使 Nginx 成为可扩展、高性能的服务器。它是一个开源、轻量级和高性能的 Web 服务器,也用作 HTTP、HTTPS、SMTP、IMAP、POP3 协议的反向代理服务器,另一方面,它也用作 IMAP、POP3 和 IMAP 的 HTTP 负载均衡器、HTTP 缓存和电子邮件代理。简而言之,我们可以说 Nginx 是一种用于处理并发请求的软件。
Nginx 最重要的功能是反向代理和负载均衡,反向代理将允许我们在端口 80 上托管多个域名,同时使用不同的语言编写后端服务,负载均衡可以把多个提供相同功能的后端服务配置成彼此冗余。
Nginx 负责访问日志、黑名单、负载平衡和提供静态文件访问,后台 Web 服务则可专注于业务逻辑处理,Nginx 是动静分离架构的入口程序。
①Nginx 支持高并发,内存占用小。
②Nginx 支持配置文件动态修改。
工作原理
nginx 在启动后,会以 daemon 的方式在后台运行,后台进程包含一个 master 进程和多个 worker 进程,worker 进程以非 root 用户运行,可以在配置文件中配置运行 worker 进程的用户。
master 进程主要用来管理 worker 进程,包含:接收来自外界的信号,向各 worker 进程发送信号,监控 worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动重新启动新的 worker 进程。
worker 进程则是处理基本的网络事件。多个 worker 进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个 worker 进程中处理,一个 worker 进程,不可能处理其它进程的请求。
总结其主要功能分别如下:
主进程(master process)的功能:
①读取 Nginx 配置文件并验证其有效性和正确性
②按照配置启动、管理和关闭工作进程
③接受外界指令,比如重启、升级及关闭服务器等指令
④不中断服务,实现平滑升级,重启服务并应用新的配置
⑤开启日志文件
工作进程(woker process)的功能:
①接收处理客户端的请求
②将请求以此送入各个功能模块进行处理
③IO 调用,获取响应数据
④与后端服务器通信,接收后端服务器的处理结果
⑤缓存数据,访问缓存索引,查询和调用缓存数据
⑥发送请求结果,响应客户端的请求
⑦接收主程序指令,比如重启、升级和退出等
模块结构
Nginx 的各种功能和操作都由模块来实现。Nginx 由内核和一系列模块组成,内核提供web服务的基本功能,如启用网络协议,创建运行环境,接收和分配客户端请求,处理模块之间的交互。Nginx 的模块从结构上分为核心模块、基础模块和第三方模块。
核心模块: HTTP 模块、EVENT 模块和 MAIL 模块
基础模块: HTTP Access 模块、HTTP FastCGI 模块、HTTP Proxy 模块和 HTTP Rewrite 模块
第三方模块: HTTP Upstream Request Hash 模块、Notice 模块和 HTTP Access Key 模块及用户自己开发的模块。
目录结构
常用命令
cd/usr/local/nginx/sbin/ ——使用命令需切换到此目录下
./nginx ——启动
./nginx -s stop ——停止
./nginx -s quit ——安全退出
./nginx -s reload ——重新加载配置文件
ps aux|grep nginx ——查看nginx进程
./nginx -v ——查看版本号
Nginx配置文件
Nginx 主配置文件 /local/nginx/nginx.conf 是一个纯文本类型的文件,整个配置文件是以区块的形式组织,通常每一个区块以一对大括号{}来表示开始与结束。
Main 位于 nginx.conf 配置文件的最高层;
Main 层下可以有 Event、HTTP 层;
Http 层下面允许有多个 Server 层,用于对不同的网站做不同的配置;
Server 层下面允许有多个 Location,用于对不同的路径进行不同模块的配置。
全局配置部分用来配置对整个 server 都有效的参数。主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以 及配置文件的引入等。
user nginx; #进程用户
worker_processes 1; #工作进程,配合和CPU个数保持一致
error_log /var/log/nginx/error.log warn; #错误日志路径及级别
pid /var/run/nginx.pid; #Nginx服务启动的pid
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 worker process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 worker process 可以同时支持的最大连接数等。
events {
worker_connections 1024; #每个worker进程支持的最大连接数
use epoll; #内核模型,select、poll、epoll
}
http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
http {
include /etc/nginx/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 /var/log/nginx/access.log main; #访问日志
sendfile on; #优化静态资源
#tcp_nopush on; #nginx不要缓存数据,而是一段一段发送
keepalive_timeout 65; #给客户端分配连接超时时间,服务器会在这个时间过后关闭连接。
#gzip on; #压缩
include /etc/nginx/conf.d/*.conf;
}
Server 块也被叫做“虚拟主机”部分,它描述的是一组根据不同 server_name 指令逻辑分割的资源,这些虚拟服务器响应 HTTP 请求,因此都包含在 http 部分。最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。一个 server 块可以配置多个 location 块。
server {
listen 80; #监听端口,默认80
server_name localhost; #提供服务的域名或主机名
#charset koi8-r;
#access_log logs/host.access.log main;
location / { #控制网站访问路径
root /usr/share/nginx/html; #存放网站的路径
index index.html index.htm; #默认访问的首页
}
#error_page 404 /404.html; #错误页面
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html; #定义请求错误,指定错误代码
location = /50x.html { #错误代码重定向到新的location
root html;
}
Nginx反向代理
反向代理服务器和目标服务器对外是一个服务器,暴露的是代理服务器的地址和端口,隐藏了真实服务器的地址和端口。用户只需要将请求发送到代理服务器,代理服务器会将请求分发给目标服务器,目标服务器返回数据后,数据通过代理服务器返回给客户端,这种方式就叫做反向代理。
当 NGINX 服务器代理请求时,它将请求发送到指定的服务器,获取响应,并将其发送回客户端。可以使用指定的协议向 HTTP 服务器或非 HTTP 服务器发送代理请求。支持的协议包括 FastCGI、uwsgi、SCGI 和 Memcached。要将请求传递到 HTTP 代理服务器,使用 proxy_pass 指令。
location /some/path/ {
proxy_pass http://www.example.com/link/;
}
要将请求传递到非 HTTP 代理服务器,请使用适当的 **_pass 指令:
fastcgi_pass:将请求传递给 fastCGI 服务器。
uwsgi_pass:将请求传递给 uwsgi 服务器。
scgi_pass:将请求传递给 SCGI 服务器。
memcached_pass:将请求传递给 memcached 服务器。
Nginx负载均衡
负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。
Nginx 以高并发、低消耗而闻名,这个特点使其很适合作为一个负载均衡器 (Load Balancer),有策略地分发请求给不同的后端服务器。避免单点故障之余,亦增强整个系统的可用性,简单说不容易宕机。负载均衡是反代的其中一个用途。本文介绍 Nginx 常用的几个负载均衡策略。
http{
... #以下方法指定一种
upstrem myserver { #不指定方法则默认轮循
Ip_hash; (ip_hash方法) #每个请求按访问ip的hash分配结果
server 192.168.106.128:8080; weight=1( weight方法) #权重越高分配的请求越多;
server 192.168.106.128:8081; weight=2
Fair;(第三方) #根据后台服务器的响应时间来分配请求,响应时间短的优先分配
}
}
Nginx动静分离
为了加快网站的解析速度,可以将动态页面和静态页面分别部署到两台服务器上,有不用的服务器来解析,加快解析速度,降低单服务器的压力,这种方式就是动静分离。Nginx动静分离简单来说就是将动态请求和静态请求分开,不仅仅是单纯的将动态页面和静态页面分开。
location /image/ {
root /data/; #静态文件夹名
autoindex on; # 当配置该项时,访问文件后会显示文件夹的内容
}
Nginx高可用(主从配置)
一般情况下,客户端访问的是主代理服务器,有主代理服务器将请求分发到目标服务器上;当主代理服务器出现异常而导致无法访问时,客户端会去访问备份代理服务器,有备份代理服务器将请求分发到目标服务器上,这种方式就是高可用。
在这个模式下,代理服务器会对外暴露一个虚拟ip,同时每个代理服务器均需配置KeepAlived,由KeepAlived控制虚拟ip实际访问的是哪台代理服务器;而客户端访问的是代理服务器暴露的虚拟ip。
global_defs { #全局配置
notification_email { # 邮件通知信息
# 收件人
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
# 发件人
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1 # SMTP服务器地址
smtp_connect_timeout 30 # SMTP 超时时间
# 路由器标识,一般不用改,也可以写成每个主机自己的主机名
router_id LVS_DEVEL #访问到服务器的名字
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_http_port{ #检测脚本配置
script “/usr/local/src/nginx_check.sh”
Interval 2; #检测脚本执行时间间隔
weight -20; #权重; 脚本权重改变
}
# 一个vrrp_instance就是定义一个虚拟路由器的实例名称
vrrp_instance VI_1 {
state BACKUP #定义类型,MASTER(主服务器)或BACKUP(备份服务器)
interface ens33 # 接口,网卡名
virtual_router_id 51 # 虚拟路由ID,取值范围为0-255 主备机需相同
priority 90 # 优先级,值越高优先程度越高,主服务器需比备份服务器要高
advert_int 1 # 频率,单位为秒 检测心跳
# 通信认证机制
authentication {
auth_type PASS # 认证方式,可以是PASS或AH
auth_pass 1111 # 认证密码,最大8位数
}
virtual_ipaddress { # 虚拟IP地址
192.168.106.16
}
}
特点总结
处理基本的网络事件;
worker之间是平等的;
以竞争的方式来争抢来自客户端的请求;
用户与worker之间的交互的接口;
管理worker进程,实现服务重启、平滑升级、更换日志文件,更新配置文件等功能;
默认采用多进程工作方式;
Nginx启动后,会运行一个master进程和多个worker进程;
一个master多个worker的好处:
1)可以使用nginx -s reload进行热部署,利用nginx进行热部署操作;
2)每个worker都是独立的进程,如果其中一个worker出现问题,也不会影响其他的worker,其他会进行对请求进行争抢,实现请求过程,不会造成服务中断;
需要设置多少个worker:
每个worker的线程都可以将一个cpu的性能发挥到极致,因此==worker数和服务器的cpu数一致==是最适宜的。
连接数worker_connection:
普通的静态访问最大并发数是:worker_connections * worker_processes / 2;
HTTP作为反向代理的最大并发数是:work_connections * worker_processes / 4;
以上,如果nginx有一个master,4个worker,每个worker支持的最大连接数是1024,那么支持的最大连接数是:
发送请求,占用了2个或者4个连接数;
支持的最大并发数:
1024 * 4 / 2 = 2048; # 静态
1024 * 4 / 4 = 1024; # HTTP