nginx背景
-
高性能的http和反向代理服务器,也是
IMAP/POP3/SMTP服务器 (
注释1
)
-
事件驱动方式编写,性能高(注释2)
-
高效的反向代理和负载均衡(注释3)
-
稳定性强、丰富的模块库、灵活的配置、低系统资源消耗,无内存泄漏问题
-
对 proxy 和 rewrite 模块的支持很彻底,还支持 mod_fcgi、ssl、vhosts
nginx特点
Nginx 做为 HTTP 服务器,有以下几项基本特性:
处理静态文件,索引文件以及自动索引;打开文件描述符缓冲。
模块化的结构。包括 gzipping, byte ranges, chunked responses,以及 SSI-filter 等 filter。如果由 FastCGI 或其它代理服务器处理单页中存在的多个 SSI,则这项处理可以并行运行,而不需要相互等待。
支持 SSL 和 TLSSNI。
Nginx 专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率 。
它支持内核 Poll 模型,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。
Nginx 可以作为静态页面的 web 服务器,同时还支持 CGI 协议的动态语言,如 perl、php等。
但是不支持 java。Java 程序只能通过与 tomcat 配合完成。
Nginx 专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率 ,能经受高负载的考验。
Nginx 具有很高的稳定性。
其它 HTTP 服务器,当遇到访问的峰值,或者有人恶意发起慢速连接时,也很可能会导致服务器物理内存耗尽频繁交换,失去响应,只能重启服务器。例如当前 apache 一旦上到 200 个以上进程,web响应速度就明显非常缓慢了。而 Nginx 采取了分阶段资源分配技术,使得它的 CPU 与内存占用率非常低。Nginx 官方表示保持 10,000 个没有活动的连接,它只占 2.5M 内存,所以类似 DOS 这样的攻击对 Nginx 来说基本上是毫无用处的。就稳定性而言,Nginx 比 lighthttpd 更胜一筹。
Nginx 支持热部署。
它的启动特别容易, 并且几乎可以做到 7*24 不间断运行,即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下,对软件版本进行进行升级。
Nginx 采用 master-slave 模型,能够充分利用 SMP 的优势,且能够减少工作进程在磁盘 I/O 的阻塞延迟。
当采用 select()/poll() 调用时,还可以限制每个进程的连接数。
Nginx 代码质量非常高,代码很规范,手法成熟,模块扩展也很容易。
特别值得一提的是强大的 Upstream 与 Filter 链。Upstream 为诸如 reverse proxy,与其他服务器通信模块的编写奠定了很好的基础。而 Filter 链最酷的部分就是各个 filter 不必等待前一个 filter 执行完毕。它可以把前一个 filter 的输出做为当前 filter 的输入,这有点像 Unix 的管线。这意味着,一个模块可以开始压缩从后端服务器发送过来的请求,且可以在模块接收完后端服务器的整个请求之前把压缩流转向客户端。
Nginx 采用了一些 os 提供的最新特性如对 sendfile (Linux2.2+),accept-filter (FreeBSD4.1+),TCP_DEFER_ACCEPT (Linux 2.4+)的支持,从而大大提高了性能。
nginx在架构中的作用
---面向客户的总入口。
---
一台机器
为不同的域名/ip/端口提供服务
---使用反向代理,整合后续服务为一个完整业务
---mvvm模式中,用来发布前端html/css/js/img
---使用upstream,负载多个tomcat
nginx程序架构
nginx模块化设计
核心模块是
Nginx
服务器正常运行必不可少的模块,提供错误日志记录、配置文件解析、事件驱动机制、进程管理等核心功能。
标准
HTTP
模块提供
HTTP
协议解析相关的功能,如:端口配置、网页编码设置、
HTTP
响应头设置等。
可选
HTTP
模块主要用于扩展标准的
HTTP
功能,让
Nginx
能处理一些特殊的服务,如:
Flash
多媒体传输、解析
GeoIP
请求、
SSL
支持等。
邮件服务模块主要用于支持
Nginx
的邮件服务,包括对
POP3
协议、
IMAP
协议和
SMTP
协议的支持。
第三方模块是为了扩展
Nginx
服务器应用,完成开发者自定义功能,如:
Json
支持、
Lua
支持等。
nginx多进程模型
一个master进程多个worker进程
work作用
woker进程主要用来处理网络事件,各个woker进程之间是对等且相互独立的,它们同等竞争来自客户端的请求,一个请求只可能在一个woker进程中处理,woker进程个数一般设置为
机器CPU核数
。
进程控制
对Nginx进程的控制主要是通过master进程来做到的,主要有两种方式:
(1)手动发送信号
从图1可以看出,master接收信号以管理众woker进程,那么,可以通过kill向master进程发送信号,比如kill -HUP pid用以通知Nginx从容重启。所谓从容重启就是不中断服务:master进程在接收到信号后,会先重新加载配置,然后再启动新进程开始接收新请求,并向所有老进程发送信号告知不再接收新请求并在处理完所有未处理完的请求后自动退出。
(2)自动发送信号
可以通过带命令行参数启动新进程来发送信号给master进程,比如./nginx -s reload用以启动一个新的Nginx进程,而新进程在解析到reload参数后会向master进程发送信号(新进程会帮我们把手动发送信号中的动作自动完成)。当然也可以这样./nginx -s stop来停止Nginx。
nginx采用epoll多路复用模型
多路复用定义(注释5):对于IO文件的请求,当一个IO流要进行文件处理的时候,要获取一组文件的描述符,当文件描述符还没有就绪时,那么它就在等待,直到描述符一旦就绪,马上上报系统通知的机制,告诉应用程序我准备就绪,你可以来操作了。这就是IO多路复用的方式。
这种机制处理起来就很高效,多路复用就是在一个线程里,交替并发的完成。复用的就是一个线程。
nginx配置详解
nginx文件结构:
.. #全局块
events { #events块
...}
http #http块{
... #http全局块
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块}
1、
全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
2、
events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
3、
http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
4、
server块:配置虚拟主机的相关参数,一个http中可以有多个server。
5、
location块:配置请求的路由,以及各种页面的处理情况。
nginx配置文件:
########### 每个指令必须有分号结束。#################
#user administrator administrators; #配置用户或者组,默认为nobody nobody。
#worker_processes 2; #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大连接数,默认为512}
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#access_log off; #取消服务日志
log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
access_log log/access.log myFormat; #combined为日志格式的默认值
sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
upstream crs{
server 127.0.0.1:18081;
server 127.0.0.1:18082 backup; #热备
}
gzip on;##是否对传输数据进行压缩,压缩后会极大减少网络传输带宽
error_page 404 https://www.baidu.com; #错误页
server {
keepalive_requests 120; #单连接请求上限次数。
listen 18080; #监听端口
server_name 127.0.0.1; #监听地址
location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。此目录对应监听端口
#root path; #根目录
#index vv.txt; #设置默认页
proxy_pass http://crs; #请求转向crs定义的服务器列表
allow 127.0.0.1; #拒绝的ip
deny172.18.5.54; #允许的ip
}
}}
上面是nginx的基本配置,需要注意的有以下几点:
1、几个常见配置项:
1.$remote_addr 与 $http_x_forwarded_for 用以记录客户端的ip地址;
2.$remote_user :用来记录客户端用户名称;
3.$time_local : 用来记录访问时间与时区;
4.$request : 用来记录请求的url与http协议;
5.$status : 用来记录请求状态;成功是200;
6.$body_bytes_s ent :记录发送给客户端文件主体内容大小;
7.$http_referer :用来记录从那个页面链接访问过来的;
8.$http_user_agent :记录客户端浏览器的相关信息;
2、惊群现象:一个网路连接到来,多个睡眠的进程被同时叫醒,但只有一个进程能获得链接,这样会影响系统性能。
3、每个指令必须有分号结束。
nginx安装部署
模块依赖性Nginx需要依赖下面3个包
-
ssl功能需要 openssl 库 ( 点击下载
)
-
gzip模块需要 zlib 库 ( 点击下载
)
-
rewrite模块需要 pcre 库 ( 点击下载
)
依赖包安装顺序依次为:openssl、zlib、pcre, 最后安装Nginx包。
step1:下载包
openssl-fips-2.0.2.tar.gz
zlib-1.2.7.tar.gz
pcre-8.21.tar.gz
nginx-1.12.2.tar.gz
step 2:安装OpenSSL (如果已安装过,则无需重复安装)
[root@localhost wcw]# tar -zxvf openssl-fips-2.0.2.tar.gz
[root@localhost wcw]# cd openssl-fips-2.0.2
[root@localhost openssl-fips-2.0.2]# ./config
[root@localhost openssl-fips-2.0.2]# make
[root@localhost openssl-fips-2.0.2]# make install
step 3:安装zlib
[root@localhost wcw]# tar -zxvf zlib-1.2.7.tar.gz
[root@localhost wcw]# cd zlib-1.2.7
[root@localhost zlib-1.2.7]# ./configure
[root@localhost zlib-1.2.7]# make
[root@localhost zlib-1.2.7]# make install
step 4:安装pcre
[root@localhost wcw]# tar -zxvf pcre-8.21.tar.gz
[root@localhost wcw]# cd pcre-8.21
[root@localhost pcre-8.21]# ./configure
[root@localhost pcre-8.21]# make
[root@localhost pcre-8.21]# make install
step 5:安装Nginx(如果无法安装,可参考如下'nginx安装出错')
[root@localhost wcw]# tar -zxvf nginx-1.12.2.tar.gz
[root@localhost wcw]# cd nginx-1.12.2
[root@localhost nginx-1.12.2]# ./configure --prefix=/usr/local/nginx --with-pcre=../pcre-8.21 --with-zlib=../zlib-1.2.7 --with-openssl=../openssl-fips-2.0.2
[root@localhost nginx-1.12.2]# make
[root@localhost nginx-1.12.2]# make install
nginx基本操作指令(需要在sbin下)
启动服务:nginx
退出服务:nginx -s quit
强制关闭服务:nginx -s stop
重载服务:nginx -s reload (重载服务配置文件,类似于重启,但服务不会中止)
验证配置文件:nginx -t
使用配置文件:nginx -c "配置文件路径"
使用帮助:nginx -h
nginx负载均衡策略
环境搭建初步测试:
测试: http://115.29.66.116:18080/,可以正常访问
后台搭建两个服务:端口分别为18081、18082,服务根目录为crs
http://115.29.66.116:18080/crs 后台随机访问到18081或18082(netstat -tnlp|grep 1808 查看网络运行情况)
负载均衡配置:
轮询:
请求按照顺序转发,即 18081->18082->18083->18081
upstream crs {
server 127.0.0.1:18081;
server 127.0.0.1:18082;
server 127.0.0.1:18083;
}
加权轮询
请求按照权重随机转发,即 三者权重一致,分配到的概率对等。如果不配置weight,默认权重为1
upstream crs {
server 127.0.0.1:18081 weight=1;
server 127.0.0.1:18082 weight=1;
server 127.0.0.1:18083 weight=1;
}
最少连接处
请求转发到最少连接的服务上,以减轻服务压力
upstream crs {
least_conn;
server 127.0.0.1:18081;
server 127.0.0.1:18082;
server 127.0.0.1:18083;
}
ipHash
web服务需要共享session,使用该策略可以实现某一客户端的请求固定转发至某一服务器。
upstream crs {
ip_hash;
server 127.0.0.1:18081;
server 127.0.0.1:18082;
server 127.0.0.1:18083;
}
nginx配置静态资源服务器
nginx静态资源服务器配置
server {
listen 18080;
server_name 127.0.0.1;
#charset koi8-r;
#access_log logs/host.access.log main;
location / { ###配置根目录
# root html;
proxy_pass http://crs;
allow 127.0.0.1;
index index.html index.htm;
}
###################重点
location /css/ {##配置访问路径
root /root/static/; ##配置文件在linux系统的所在路径
expires 30d; ##缓存超时时间配置
}
静态资源服务器位置:
访问服务:
nginx场景面试题
1、解释一下什么是Nginx?
Nginx是一个web服务器和反向代理服务器,用于HTTP、HTTPS、SMTP、POP3和IMAP协议;
2、请列举Nginx的一些特性
反向代理/L7负载均衡器;
嵌入式Perl解释器;
动态二进制升级;
可用于重新编写URL,具有非常好的PCRE支持
3、解释Nginx如何处理HTTP请求
读取解析请求行;
读取解析请求头;
多阶段处理:nginx把请求处理划分成了11个阶段,也就是说当nginx读取了请求行和请求头之后,将请求封装了结构体ngx_http_request_t。然后每个阶段的handler都会根据这个ngx_http_request_t,对请求进行处理,例如重写uri,权限控制,路径查找,生成内容以及记录日志等等;
返回结果到客户端;
4、在Nginx中,如何使用未定义的服务器名称来阻止处理请求?
只需将请求删除的服务器就可以定义为:
Server {
listen 80;
server_name “ “ ;
return 444;
}
这里,服务器名被保留为一个空字符串,它将在没有“主机”头字段的情况下匹配请求,而一个特殊的Nginx的非标准代码444被返回,从而终止连接。
5、使用“反向代理服务器”的优点
反向代理服务器可以隐藏源服务器的存在和特征。它充当互联网云和web服务器之间的中间层。这对于安全方面来说是很好的,特别是当您使用web托管服务
时。
6、解释Nginx服务器上的Master和Worker进程
Master进程:读取及评估配置和维持;
Worker进程:处理请求
7、如何通过不同于80的端口开启Nginx?
为了通过一个不同的端口开启Nginx,你必须进入/etc/Nginx/sites-enabled/,如果这是默认文件,那么你必须打开名为“default”的文件。编辑文件,并放置在你想要的端口:
Like server { listen 81; }
1
8、请解释是否有可能将Nginx的错误替换为502错误、503?
502 =错误网关
503 =服务器超载
确保fastcgi_intercept_errors被设置为ON,并使用错误页面指令;
https://www.cnblogs.com/already/p/5922977.html(配置404、502、503配置)
9、在Nginx中,解释如何在URL中保留双斜线?
要在URL中保留双斜线,就必须使用merge_slashes_off;
语法:merge_slashes [on/off]
默认值: merge_slashes on
环境: http,server
10、请解释ngx_http_upstream_module的作用是什么?
ngx_http_upstream_module用于定义可通过fastcgi传递、proxy传递、uwsgi传递、memcached传递和scgi传递指令来引用的服务器组。
11、请解释什么是C10K问题?
C10K问题是指无法同时处理大量客户端(10,000)的网络套接字;
12、陈述stub_status和sub_filter指令的作用是什么?
Stub_status指令:该指令用于了解Nginx当前状态的当前状态,如当前的活动连接,接受和处理当前读/写/等待连接的总数;
Sub_filter指令:它用于搜索和替换响应中的内容,并快速修复陈旧的数据;
13、Nginx是否支持将请求压缩到上游?
可以使用Nginx模块gunzip将请求压缩到上游。gunzip模块是一个过滤器,它可以对不支持“gzip”编码方法的客户机或服务器使用“内容编码:gzip”来解压缩响应
14、如何在Nginx中获得当前的时间?
要获得Nginx的当前时间,必须使用SSI模块、dategmt和date
g
mt和date_local的变量。
Proxy_set_header THE-TIME $date_gmt;
1
15、Nginx服务器解释-s的目的是什么?
用于运行Nginx -s参数的可执行文件;
16、解释如何在Nginx服务器上添加模块?
在编译过程中,必须选择Nginx模块,因为Nginx不支持模块的运行时间选择;
nginx项目架构实战-公司应用的webnet服务设计
基于nginx设计的web高并发消息组件,支持海量消息并发推送。
设计原理:利用nginx_push_stream_module实现服务器消息推送。
流程:
1、客户端向nginx订阅title
2、后台服务数据更新后向nginx发送对应title数据
3、nginx根据订阅title的客户端数量进行广播,将数据推送到客户端中。
注释说明:
注释1: http://help.163.com/09/1223/14/5
(pop3、smtp、imap服务器的区别)
注释2: https://www.cnblogs.com/lguow/p/10750296.html
(事件驱动模型)
注释3:
https://blog.csdn.net/lixiangss1993/article/details/87934562(正向代理与反向代理)
注释4:
https://baike.baidu.com/item/%E7%BD%91%E5%85%B3/98992?fr=aladdin(网关)
https://baike.baidu.com/item/openssl/5454803?fr=aladdin(openssl 安全套接层协议)
https://blog.csdn.net/gsl222/article/details/79867319?utm_source=blogxgwz8(config、make、make install指令)
https://blog.csdn.net/mingongge/article/details/90623806(nginx启动并处理nginx请求)
https://blog.csdn.net/qq_36492368/article/details/79855387(nginx高并发与原理-重点)
https://www.cnblogs.com/66w66/p/12617114.html(阿里云linux环境下nginx安装出错,修复并安装处理)