前言
在我们的开发过程中,Nginx是经常使用到的工具,我们常常用来做反向代理、负载均衡等,之前没有系统的学习,对nginx的使用和理解都停留在表面。本次分享结合理论与实践,文章课程链接:尚硅谷Nginx教程由浅入深
一、nginx的基本概念
Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。其特点是占有内存少(nginx内存小,只有1M),并发能力强(有报告表明能支持高达50000个并发连接数),事实上nginx的并发能力在同类型的网页服务器中表现较好。Nginx也可以作为静态页面的Web服务器,同时还支持 CGI 协议的动态语言,但是不支持Java,Java程序只能通过与 Tomcat 配合完成(tomcat支持500个并发数)。
优点
- Nginx使用基于事件驱动架构,使得其可以支持数以百万级别的TCP连接
- 高度的模块化和自由软件许可证使得第三方模块层出不穷
- Nginx是一个跨平台服务器,可以运行在Linux,Windows,FreeBSD,Solaris,AIX,Mac OS等操作系统上
- 这些优秀的设计能带来极大的稳定性
中国大陆使用Nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
1、正向代理与反向代理
代理的概念:
两个角色,一个是被代理角色,一个是目标角色,被代理角色通过这个代理访问目标角色完成一些任务的过程称为代理操作过程;如同生活中的专卖店~客人到adidas专卖店买了一双鞋,这个专卖店就是代理,被代理角色就是adidas厂家,目标角色就是用户。
正向代理: 在客户端(浏览器)配置代理服务器(区别于反向代理),通过代理服务器进行互联网访问
比如:vpn,代理客户端
反向代理: 我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器,目标服务器处理完后返回数据,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。如图
反向代理,代理服务端(无感知浏览服务器资源)
2、负载均衡
负载均衡通过多台服务器(集群)来解决大并发的问题,nginx自动将请求分配到各个服务器。
单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。
3、动静分离
加快网站的解析速度,把动态页面和静态页面由不同的服务器来解析,加快解析的速度,降低原来单个服务器的压力。
二、nginx在linux下的安装
安装前先确定有没有安装nginx
如果安装了,可以选择卸载
- 停止Nginx软件
- 查找根下所有名字包含nginx的文件
sudo find / -name nginx*
- 执行命令删除nignx安装的相关文件
yum remove nginx
步骤1、安装nginx相关依赖
依赖包括:pcre-8.37.tar.gz、openssl-1.0.1t.tar.gz、zlib-1.2.8.tar.gz、nginx-1.11.1.tar.gz
法一、安装 pcre 依赖
下载 pcre 压缩文件依赖
wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz
解压文件
tar –xvf pcre-8.37.tar.gz
编译
进入 pcre-8.37
执行 ./configure,
完成后回到 pcre 目录下执行 make && make install
查看 pcre 依赖是否安装成功
pcre-config --version
安装剩余依赖
输入命令
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
法二、一键安装上面4个依赖
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
步骤2、手动安装nginx
下载nginx包
解压 nginx
tar -xvf nginx-1.12.2.tar.gz
进入解压后的目录会有一个configure文件,输入 ./configure 命令执行
./configure
编译
make && make install
安装完成后的路径为:/usr/local/nginx,即在 usr/local 下多出来一个nginx文件夹
步骤3、启动nginx
nginx 文件夹内有 sbin 启动脚本,root权限进入目录 /usr/local/nginx/sbin/nginx,执行./nginx命令
./nginx
验证:浏览器访问自己服务器的47.98.50.22:80端口
访问到的前提是防火墙开放了80端口,
如果访问到显示Welcome to nginx !,则是成功了。
如果没有成功,要排查下防火墙是否开放了端口,操作如下(CentOs7.3):
## 1.开放端口
firewall-cmd --add-service=http --permanent
firewall-cmd --add-port=80/tcp --permanent
## 2.重启防火墙
firewall-cmd --reload
## 3.查看开放的端口
firewall-cmd --zone=public --list-all
三、nginx的基本操作
1、基本命令
注意,使用nginx操作命令前提条件,必须进入到nginx的目录:/usr/local/nginx/sbin (绝对路径)
常用命令如下:
./nginx -v # 查看版本号
./nginx -t # 检查配置文件
./nginx -c "配置文件路径" # 使用配置文件
./nginx -h # 使用帮助
./nginx # 启动nginx
./nginx -s stop # 暴力停止nginx服务
./nginx -s quit # 优雅停止nginx服务
./nginx -s reload # 重新加载nginx配置文件(重载服务配置文件,类似于重启,但服务不会中止)
ps -ef | grep nginx # 查看nginx相关进程
2、配置文件
Nginx服务器的配置信息主要集中在/usr/local/nginx/conf/nginx.conf 里面的 “nginx.conf” 这个配置文件中,并且所有的可配置选项分为三部分:main模块、events模块、http模块
main # 全局配置
events { # 工作模式配置
worker_connections 1024;
}
http { # http设置
server { # 服务器主机配置(虚拟主机、反向代理等)
listen 80;
server_name localhost;
location /admin { # 路由配置(虚拟目录等)
proxy_pass http://wl ;
xxx 127
}
location path {
....
}
location otherpath {
....
}
}
server {
listen 443;
server_name localhost;
location {
....
}
}
upstream name { # 负载均衡配置
server 127.0.0.1:8080 # 负载均衡配置(服务器资源)
}
}
(1) main模块
从配置文件开始到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令
#user nobody //用来指定nginx worker进程运行用户以及用户组,默认nobody账号运行
worker_processes 1;
# 指定nginx要开启的子进程数量,运行过程中监控每个进程消耗内存(一般几M~几十M不等)根据实际情况进行调整,通常数量是CPU内核数量的整数倍
# error_log # 定义错误日志文件的位置及输出级别[debug / info / notice / warn / error / crit]
# pid # 用来指定进程id的存储文件的位置
# worker_rlimit_nofile 65535 # 一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与Nginx进程数相除,但是Nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。
(2) events模块
events块涉及的指令主要影响nginx服务器与用户的网络连接,
主要包括:事件驱动模型的选择、最大连接数的配置
worker_connections 1024; # 单个进程最大连接数(最大连接数=连接数*进程数)
multi_accept # 配置指定nginx在收到一个新连接通知后尽可能多的接受更多的连接
use epoll # 指定线程轮询的方法,参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
(3) http模块
作为web服务器,http模块是nginx最核心的一个模块,配置项也是比较多的,项目中会设置到很多的实际业务场景,需要根据硬件信息进行适当的配置。代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里,需要注意的是,http模块包括http全局块、server块
①、http全局块
这部分包括MIME-TYPE定义,自定义服务日志、连接超时时间、允许sendfile方式传输文件,单链接请求数上限等。
- 基础配置
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream # 指定默认处理的文件类型可以是二进制
type_hash_max_size 2048 # 混淆数据,影响三列冲突率,值越大消耗内存越多,散列key冲突率会降低,检索速度更快;值越小key,占用内存较少,冲突率越高,检索速度变慢
sendfile on #开启高效文件传输模式,对于普通应用设为on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
tcp_nopush on # 让nginx在一个数据包中发送所有的头文件,而不是一个一个单独发
tcp_nodelay on # 让nginx不要缓存数据,而是一段一段发送,如果数据的传输有实时性的要求的话可以配置它,发送完一小段数据就立刻能得到返回值,但是不要滥用哦
keepalive_timeout 10 # 给客户端分配连接超时时间,服务器会在这个时间过后关闭连接。一般设置时间较短,可以让nginx工作持续性更好
client_header_timeout 10 # 设置请求头的超时时间
client_body_timeout 10 # 设置请求体的超时时间
send_timeout 10 # 指定客户端响应超时时间,如果客户端两次操作间隔超过这个时间,服务器就会关闭这个链接
limit_conn_zone $binary_remote_addr zone=addr:5m # 设置用于保存各种key的共享内存的参数,
limit_conn addr 100 # 给定的key设置最大连接数
server_tokens # 虽然不会让nginx执行速度更快,但是可以在错误页面关闭nginx版本提示,对于网站安全性的提升有好处哦
- 日志配置
access_log logs/access.log # 设置存储访问记录的日志
error_log logs/error.log # 设置存储记录错误发生的日志
- SSL证书配置
ssl_protocols # 指令用于启动特定的加密协议,nginx在1.1.13和1.0.12版本后默认是ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2,TLSv1.1与TLSv1.2要确保OpenSSL >= 1.0.1 ,SSLv3 现在还有很多地方在用但有不少被攻击的漏洞。
ssl prefer server ciphers # 设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件
- 压缩配置
gzip # 是告诉nginx采用gzip压缩的形式发送数据。这将会减少我们发送的数据量。
gzip_disable # 为指定的客户端禁用gzip功能。我们设置成IE6或者更低版本以使我们的方案能够广泛兼容。
gzip_static # 告诉nginx在压缩资源之前,先查找是否有预先gzip处理过的资源。这要求你预先压缩你的文件(在这个例子中被注释掉了),从而允许你使用最高压缩比,这样nginx就不用再压缩这些文件了(想要更详尽的gzip_static的信息,请点击这里)。
gzip_proxied # 允许或者禁止压缩基于请求和响应的响应流。我们设置为any,意味着将会压缩所有的请求。
gzip_min_length # 设置对数据启用压缩的最少字节数。如果一个请求小于1000字节,我们最好不要压缩它,因为压缩这些小的数据会降低处理此请求的所有进程的速度。
gzip_comp_level # 设置数据的压缩等级。这个等级可以是1-9之间的任意数值,9是最慢但是压缩比最大的。我们设置为4,这是一个比较折中的设置。
gzip_type # 设置需要压缩的数据格式。上面例子中已经有一些了,你也可以再添加更多的格式。
- 文件缓存配置
open_file_cache # 打开缓存的同时也指定了缓存最大数目,以及缓存的时间。我们可以设置一个相对高的最大时间,这样我们可以在它们不活动超过20秒后清除掉。
open_file_cache_valid # 在open_file_cache中指定检测正确信息的间隔时间。
open_file_cache_min_uses # 定义了open_file_cache中指令参数不活动时间期间里最小的文件数。
open_file_cache_errors # 指定了当搜索一个文件时是否缓存错误信息,也包括再次给配置中添加文件。我们也包括了服务器模块,这些是在不同文件中定义的。如果你的服务器模块不在这些位置,你就得修改这一行来指定正确的位置。
②、 server 模块
srever 模块配置是 http 模块中的一个子模块,用来定义一个虚拟访问主机,也就是一个虚拟服务器的配置信息。
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
- 全局server块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。
比如配置,代表监听80端口,服务名称为localhost
server {
listen 80;
server_name localhost 192.168.1.100; # 用来指定ip地址或者域名,多个配置之间用空格分隔
charset utf-8; # 用于设置www/路径中配置的网页的默认编码格式
access_log logs/access.log; # 用于指定该虚拟主机服务器中的访问记录日志存放路径
error_log logs/error.log; # 用于指定该虚拟主机服务器中访问错误日志的存放路径
......
}
- location 块
一个 server 块可以配置多个 location 块。location模块是Nginx配置中出现最多的一个配置,主要用于配置路由访问信息。在路由访问信息配置中关联到反向代理、负载均衡等等各项功能,所以location模块是一个非常重要的配置模块。
location / { # 表示匹配访问根目录
root /nginx/www; # 用于指定访问根目录时,访问虚拟主机的web目录
index index.php index.html index.htm; # 在不指定访问具体资源时,默认展示的资源文件列表
}
location 指令说明:该指令用于匹配URL
语法如下:
1ocation [ = | ~ | ~* | ^~ ] ur1{
}
# 通配符:
= # 用于不含正则表达式的url前,要求请求字符串与url严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
~ # 用于表示url包含正则表达式,并且区分大小写。
~* # 用于表示url包含正则表达式,并且不区分大小写。.
^~ # 用于不含正则表达式的url前,要求Nginx服务器找到标识url和请求字符串匹配度最高的1ocation后,立即使用此1ocation处理请求,而不再使用1ocation块中的正则url和请求字符串做匹配。.
注意:如果url包含正则表达式,则必须要有~或者~*标识。
四、nginx实例配置
1、正向代理
正向代理,代理浏览器 去重定向请求访问到目标服务器 的一种代理服务。
(1)、正向代理http请求的配置
#正向代理转发http请求
server {
resolver 114.114.114.114; # 指定DNS服务器IP地址
listen 8088; # 监听8088端口
server_name localhost; # 服务器IP或域名
location / {
proxy_pass http://www.baidu.com;
}
}
代理结果测试:
在浏览器输入:http://47.98.50.22:8088,页面跳转到百度首页,说明正向代理成功。
(2)、正向代理https请求的配置
正向代理转发http请求很简单,不过正向代理转发https请求稍微有一点麻烦,现在的网站基本上都是https,因此要实现nginx正向代理转发请求,除了要配置转发 http80 端口的请求,还有配置 https443端口的请求~
#正向代理转发https请求
server {
resolver 114.114.114.114; # 指定DNS服务器IP地址
listen 443; # 监听443端口
server_name localhost; # 服务器IP或域名
location / {
proxy_pass https://www.baidu.com;
}
}
1)、下载 https 所需模块
nginx官方并不支持直接转发https请求,但是阿里的一个大佬对nginx拓展了一个ngx_http_proxy_connect_module模块,并且在github上开源,不过维护的ngx_http_proxy_connect_module模块的补丁也是有nginx版本限制的(目前维护了1.4.x~1.19.x版本)
地址:https://github.com/chobits/ngx_http_proxy_connect_module
ngx_http_proxy_connect_module模块主要用于隧道SSL请求的代理服务器
我下载的nginx的版本是 nginx/1.22.1
作为反向代理时,代理服务器通常终结 (terminate) HTTPS加密流量,再转发给后端实例。HTTPS流量的加解密和认证过程发生在客户端和反向代理服务器之间。
而作为正向代理在处理客户端发过来的流量时,HTTP加密封装在了TLS/SSL中,代理服务器无法看到客户端请求URL中想要访问的域名,如下图。所以代理HTTPS流量,相比于HTTP,需要做一些特殊处理。
2、反向代理示例一
(1)、访问过程分析
(2)、具体配置及安装tomcat
-
在windows系统的host文件进行域名和ip对应关系的配置
C:\Windows\System32\drivers\etc
-
安装并启动tomcat
要运行tomcat,需要先安装jdk
① 在 官网:https://tomcat.apache.org/ 下载安装包
②上传服务器、解压缩tomcat
# 放在/usr/src下
tar -zxvf apache-tomcat-9.0.74.tar.gz # 解压文件
③ 进入tomcat的bin目录,./startup.sh就能正常启动
④ 开启8070端口、重启防火墙
firewall-cmd --add-port=8070/tcp --permanent # 永久开启8070端口
firewall-cmd --reload # 重启防火墙
⑤测试tomcat有没有安装成功
在浏览器输入http://47.98.50.22:8070就能看到如下界面,说明成功了
- 在nginx中进行请求转发的配置(反向代理配置)
(3)、测试
在浏览器输入http://www.111.com:8098/,可以发现访问代理成功
3、反向代理示例二
(1)、实现效果
访问http://47.98.50.22:9001/edu 直接跳转到127.0.0.1:8080
访问http://47.98.50.22:9001/vod 直接跳转到127.0.0.1:8081
(2)、准备工作
a、准备两个tomcat服务器,一个8080端口,一个8081端口
第二个tomcat需要修改端口
第二个如果启动失败,需要在/bin/catalina.sh里面添加JAVA_HOME的环境变量,就可启动成功
b、创建文件夹和测试页面
/usr/src/tomcat8080/apache-tomcat-9.0.75/webapps/edu/a.html
/usr/src/tomcat8081/apache-tomcat-9.0.75/webapps/vod/a.html
c、具体配置
-
找到nginx的conf/nginx.conf进行配置修改
-
开放对外访问的端口9001
firewall-cmd --add-port=9001/tcp --permanent
firewall-cmd --reload
(3)、测试
4、负载均衡(upstream)
upstream 模块主要负责负载均衡的配置,通过默认的轮询调度方式来分发请求到后端服务器。简单的配置方式如下。
(1)、实现效果
浏览器地址栏输入地址:http://47.98.50.22:8099/edu/a.html,达到负载均衡效果,平均到tomcat的8080和8081服务器中
(2)、准备工作
a、准备两个tomcat服务器,一个8080端口,一个8081端口
b、在两个tomcat中的webapps目录中,创建名称是edu文件夹,在edu文件夹内创建测试页面a.html
c、在nginx.conf文件中进行负载均衡的配置
在http块中加入自己命名的服务
upstream myserver{
ip_hash; # 指定请求调度算法,默认是weight权重轮询调度,可以指定
server 47.98.50.22:8080; # 分发服务器的列表配置
server 47.98.50.22:8081;
# server 192.168.1.100:8002 max_fails=3;
# server 192.168.1.100:8003 fail_timeout=20s;
# server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;
}
# -- down:表示该主机暂停服务
# -- max_fails:表示失败最大次数,超过失败最大次数暂停服务
# -- fail_timeout:表示如果请求受理失败,暂停指定的时间之后重新发起请求
(3)、 nginx分配服务器策略
1、轮询(默认)
# 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除
upstream myserver {
server 47.98.50.22:8080;
server 47.98.50.22:8081;
}
2、weight
# weight 代表权重默认为1,权重越高被分配的客户端越多
upstream myserver{
server 47.98.50.22:8080 weight=10;
server 47.98.50.22:8081 weight=2;
}
3、ip_hash
# 每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题,例如:
upstream myserver{
ip_hash;
server 47.98.50.22:8080;
server 47.98.50.22:8081;
}
4、fair (第三方)
# 按后端服务器的响应时间来分配请求,响应时间短的优先分配
upstream myserver{
server 47.98.50.22:8080;
server 47.98.50.22:8081;
fair;
}
(4)、 测试
5、动静分离
(1)、什么是动静分离
把动态请求跟静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat处理动态页面。
动静分离从目前实现角度来讲大致分为两种,
一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
另外一种方法就是动态跟静态文件混合在一起发布,通过Nginx来分开。
通过location指定不同的后缀名实现不同的请求转发。通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体Expires定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用Expires来缓存),我这里设置3d,表示在这3天之内访问这个URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200。
(2)、动静分离的配置
- 在liunx系统中准备静态资源,用于进行访问。
在/data/www/a.html
在/data/images/1.jpg - 在nginx的配置文件中进行配置
上面的配置,就是当请求是以/www/开始的,则进入/data/www/目录下找资源,如果是以/image/开始的,则进入/data/images/目录下找资源,同时该路径下配置了一个autoindex on,当访问/image/目录时,会列出该目录下的所有文件
(3)、测试
在浏览器输入地址:
http://47.98.50.22:8086/www/a.html
http://47.98.50.22:8086/images/1.jpg
五、nginx配置高可用集群
1、配置实例
1、准备两台nginx服务器
2、准备keepalived(帮助我们检测nginx是否挂掉了)
# Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat、corosync、pacemaker。但是它一般不会单独出现,而是与其它负载均衡技术(如lvs、haproxy、nginx)一起工作来达到集群的高可用。
3、虚拟ip
配置高可用的准备工作
1、需要两台服务器(两个虚拟机):192.168.17.129、192.168.17.131
2、在两台服务器上安装nginx
3、在两台服务器上安装keepalived
# 使用yum命令进行安装
在/usr下
yum install keepalived -y # 安装
rpm -q -a keepalived # 查看是否安装
安装之后,在/etc/keepalived/keepalived.conf # 主从配置的文件
4、完成高可用的配置(主从配置)
ifconfig # 查看网卡
(1)修改/etc/keepalived/keepalived.conf配置文件
(2)在/usr/local/src/nginx_check.sh里面添加检测脚本
#!/bin/bash
A=`ps - C nginx -no-header |wc -1`
if [ $A -eq 0];then
/usr/local/nginx/sbin/nginx
sleep 2
if [`ps - C nginx --no-header |wc -1` -eq 0];then
killall keepalived
fi
fi
# (检测主服务器是否挂掉,然后是否启用备用服务器)
(3)把两台服务器上的nginx与keepalived启动起来
# 在/usr/local/nginx/sbin下
systemctl start keepalived.service # 启动keepalived
systemctl stop keepalived.service # 启动keepalived
ps -ef| grep keepalived # 查看进程
最终测试
在浏览器地址栏输入 虚拟 ip 地址
2、解析keepalived.service文件
# 全局配置
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_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
# 检测脚本配置
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 # 检测脚本执行的间隔
weight 2
}
# 虚拟ip的配置
vrrp_instance VI_1 {
state MASTER # 备份服务器上将MASTER改为BACKUP
interface eth0 # 设置绑定的网卡
virtual_router_id 51 # 主、备机的virtual_router_id必须相同
priority 100 # 主备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 # 隔1s检测一下心跳
authentication { # 权限校验方式
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.16 // VRRP H虚拟地址
}
}
六、Nginx基本原理
1、master&worker机制
Nginx在启动时会以daemon形式在后台运行,采用多进程+异步非阻塞IO事件模型来处理各种连接请求。多进程模型包括一个master进程(管理者),多个worker进程(工作者),一般worker进程个数是根据服务器CPU核数来决定的。master进程负责管理Nginx本身和其他worker进程。
一个nginx:master只有一个,worker可以有多个,
master的工作包括:接收信号,将信号分发给worker进程,监听worker进程工作状态,当worker进程退出时(非正常),启动新的worker进程可以通过命令查看相关进程
2、master&worker机制的优势
Master进程的作用?
读取并验证配置文件nginx.conf;管理worker进程;
Worker进程的作用?
每一个Worker进程都维护一个线程(避免线程切换),处理连接和请求;注意Worker进程的个数和CPU个数相关(有利于进程切换)
master&worker机制的优势?
(1)可以使用nginx -s reload热部署,利用nginx进行热部署操作。
(2)每个woker是独立的进程,如果有其中的一个woker出现问题,其他woker独立的,继续进行争抢,实现请求过程,不会造成服务中断。
3、设置多少个worker合适
worker 数和服务器的 cpu 数相等是最为适宜的
Nginx 同 redis 类似都采用了 io 多路复用机制,每个 worker 都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 能处理成千上万个请求。每个 worker 的线程可以把一个 cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu 数相等是最为适宜的。设少了会浪费 cpu,设多了会造成 cpu 频繁切换上下文带来的损耗
4、连接数worker_connection
第一个: 发送请求,占用了woker的几个连接数?
答案:2或者4个
发送一个请求需要占用两个或者四个worker,静态资源为两个(一来一回),动态资源(服务器)为四个(nginx还要去访问tomcat等服务器,拿到信息后返回,占用两个)
第二个: nginx有一个master,有四个woker,每个woker支持最大的连接数据1024,支持的最大并发数是多少?
普通的静态访问最大并发数是: worker_connections * worker_processes / 2
而如果是 HTTP 作为反向代理来说,最大并发数量应该是 worker_connections * worker_processes / 4
这个值是表示每个 worker 进程所能建立连接的最大值,所以,一个 nginx 能建立的最大连接数,应该是 worker_connections * worker_processes。
当然,这里说的是最大连接数,对于 HTTP 请 求 本 地 资 源 来 说 , 能 够 支 持 的 最 大 并 发 数 量 是 worker_connections * worker_processes,如果是支持 http1.1 的浏览器每次访问要占两个连接,因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。
七、高级配置
在项目使用中,使用最多的三个核心功能是静态服务器、反向代理和负载均衡。
1、实现访问限制
快速实现简单的访问限制 经常会遇到希望网站让某些特定用户的群体(比如只让公司内网)访问,或者控制某个uri不让人访问。Nginx配置如下:
location / {
deny 192.168.1.100;
allow 192.168.1.10/200;
allow 10.110.50.16;
deny all;
}
deny和allow是ngx_http_access_module模块(已内置)中的语法。
2、解决跨域
使用Nginx可以纯前端解决请求跨域问题。 特别是在前后端分离调试时, 经常需要在本地起前端工程, 接口希望拉取服务端的实际数据而不是本地的mock。 而如果本地程序直接访问远程接口, 肯定会遇到跨域问题。现在前端成熟的做法,一般是把node proxy server集成进来。
#请求跨域,这里约定代理请求url path是以/apis/开头
location ^~/apis/ {
# 这里重写了请求,将正则匹配中的第一个()中$1的path,拼接到真正的请求后面,并用break停止后续匹配
rewrite ^/apis/(.*)$ /$1 break;
proxy_pass https://www.kaola.com/;
}
3、适配PC与移动环境
根据用户的浏览环境自动切换站点是很常见的需求。Nginx可以通过内置变量$http_user_agent,获取到请求客户端的userAgent,从而知道用户处于移动端还是PC,进而控制重定向到H5站还是PC站。
location / {
# 移动、pc设备适配
if ($http_user_agent ~* '(Android|webOS|iPhone|iPod|BlackBerry)') {
set $mobile_request '1';
}
if ($mobile_request = '1') {
rewrite ^.+ http://mysite-base-H5.com;
}
}
4、合并请求
前端性能优化中重要一点就是尽量减少http资源请求的数量。通过nginx-http-concat模块(淘宝开发的第三方模块,需要单独安装)用一种特殊的请求url规则,前端可以将多个资源的请求合并成一个请求,后台Nginx会获取各个资源并拼接成一个结果进行返回。
# nginx-http-concat模块的参数远不止下面三个,剩下的请查阅文档
location /static/js/ {
concat on; # 是否打开资源合并开关
concat_types application/javascript; # 允许合并的资源类型
concat_unique off; # 是否允许合并不同类型的资源
concat_max_files 5; # 允许合并的最大资源数目
}