简介
什么是Nginx?
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。,第一个公开版本0.1.0发布于2004年10月4日。
因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名.
Nginx是一个安装非常的简单、配置文件非常简洁(还能够支持per语法)、Bug非常少的服务。Ngink启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够不间断服务的情况下进行软件版本的升级。
其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
Nginx有什么作用?
- Http代理,反向代理:作为web服务器最常用的功能之一,尤其是反向代理。
- 动静分离
- 负载均衡
- 高可用
反向代理
正向代理
所谓的正向代理就是介于 客户端 和 原始服务器 之间的一个 服务器为了从原始服务器取得内容,客户端向 代理服务器 发送一个请求并且指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端,客户端才能使用
反向代理
反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率
负载均衡
单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。
Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,lp hash。扩展策略,就天马行空,只有你想不到的没有他做不到的。
动静分离
动静分离,在我们的软件开发中,有些请求是需要后台处理的,有些请求是不需要经过后台处理的(如:ss、 html、 jpg、js等等文件),这些不需要经过后台处理的文件称为静态文件。让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作。提高资源响应的速度。
目前,通过使用Nginx大大提高了我们网站的响应速度,优化了用户体验,让网站的健壮性更上一层楼!
Nginx的安装
nginx的官网: http://nginx.org/en/download.html (下载特别慢...)
度盘奉上:https://pan.baidu.com/s/1_c8oA5RrKQERE4F56NZbnQ 提取码:qd66
windows版本安装
- 解压在非中文目录即可
- 进入conf目录查看nginx的配置文件:nginx.conf
-
启动服务
-
可以双击nginx.exe启动 但是效果不好 不建议
-
在cmd中开启
-
在地址栏中输入localhost:80
Welcome to nginx! If you see this page, the nginx web server is successfully installed and working. Further configuration is required. For online documentation and support please refer to nginx.org. Commercial support is available at nginx.com. Thank you for using nginx.
出现此页面 成功!
-
-
关闭服务
nginx的关闭必须重新开启一个新的cmd命令窗口来进行关闭,将开启nginx的cmd关闭并不能关闭nginx服务。 重新在nginx的目录下开启一个cmd窗口,输入nginx.exe -s stop
命令来关闭nginx服务!
Linux版本安装
- 输入命令
whereis nginx
检查虚拟机中是否已经安装nginx,当没有输出时就说明没有nginx。
- 上传安装包至服务器,解压
tar -zxvf nginx-1.20.0.tar.gz
- 查看解压后的文件
-
输入make && make install 命令 进行编译
-
查看nginx是否安装成功,以及安装之后的位置在哪里。
- 查看配置文件,会看到端口号
- 到sbin目录下启动nginx
./nginx #若无报错,则启动成功
Nginx常用命令
cd /usr/local/nginx/sbin/ # 使用nginx必须进入此目录
./nginx # 启动
./nginx -s stop # 停止
./nginx -s quit # 安全退出
./nginx -s reload # 重新 加载配置文件 常用
./nginx -v # 查看当前版本号
ps aux|grep nginx # 查看nginx进程
配置文件
nginx由3部分组成
-
全局块
从配置文件开始到 events 块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令,主要包括配置运行Nginx服务器的用户(组)、允许生成的worker process 数,进程PID存放路径、日志存放路径和类型以及配置文件的引入等。
worker_processes 1; # 这是Nginx服务器并发处理服务的关键配置,worker _processes值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约
-
events块
events 块涉及的指令主要影响Nginx服务器与用户的网络连接,常用的设置包括是否开启对多 work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个wordprocess可以同时支持的最大连接数等。
events { worker_connections 1024; } # 上述例子就表示每个work process支持的最大连接数为1024. # 这部分的配置对Nginx的性能影响较大,在实际中应该灵活配置。
-
http块
这算是Nginx,服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。需要注意的是:http块也可以包括http全局块、server块。
http 全局块
http 全局块配置的指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等。
server 块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
每个http 块可以包括多个server 块,而每个server 块就相当于一个虚拟主机。
而每个server 块也分为全局server 块,以及可以同时包含多个locaton块。
-
全局 server 块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。
-
location 块
—个server 块可以配置多个location块。
这块的主要作用是基于Nginx服务器接收到的请求字符串(例如server_name/uri-string ),对虚拟主机名称(也可以是IP别名)之外的字符串(例如前面的/uri-string )进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
server {
listen 80; #nginx所在服务器的主机端口
server_name localhost; #nginx所在服务器的主机名
#charset koi8-r;
#access_log logs/host.access.log main;
location / { #/表示拦截所有请求
proxy_pass http://192.168.126.101:81; #这里是代理走向的目标WEB服务器:tomcat,httpd等
}
操作实例
反向代理、负载均衡
情景1
当我们把一个项目部署到多台服务器上时每个服务器各自执行自己的,无法访问到其他端口
愿景
只需访问一个地址,根据权重自动访问合适的端口
配置conf文件
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
# 流的配置 配置负载均衡 # --------------
upstream qd666 {
# 服务器资源
server 127.0.0.1:8080 weight=1; # 代理地址 权重
server 127.0.0.1:8081 weight=1;
}
server {
listen 80;
server_name localhost; # --------------
location / {
root html;
index index.html index.htm;
proxy_pass http://qd666 #-----------
}
}
}
nginx分配服务器策略
-
第一种轮询(默认)
每个诸求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down 掉,能自动剔除。
-
第二种 weight
weight代表权重默认为1,权重越高被分配的客户端越多
-
第三种 fair(第三方)
按后端服务器的喃应时间来分配请求,响应时间短的优先分配。
upstream s.erver poolf { server 192.168.0.1:80; server 192.168.0.50:80; fair; }
动静分离
动态请求与静态请求分离 比如操作数据库 就是动态请求;比如得到一个页面 图片地址,为静态请求。
动静分离的两种实现方式
- 一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
- 另外一种方法就是动态跟静忝文件混合在一起发布,通过nginx来分开。
通过location指定不同的后缀名实现不同的请求转发。通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体Expires定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 Expires来缓存),我这里设置3d,表示在这3天之内访问这个URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200。
配置文件配置
gzip on;
#增加upstream模块
upstream tomcat_server {
server 192.168.0.25:8080;
}
upstream static_server {
server 192.168.0.102;
}
#修改默认server的中配置
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html;
}
#匹配到http://ip/*.jpg或者*.png或者*.css时,交由静态资源服务器102处理
location ~ .*\.(jpg|png|css) {
proxy_pass http://static_server;
proxy_set_header X-Real-IP $remote_addr;
expires 30d; # 设置缓存时间
autoindex on; # 以列表展示
}
#匹配到http://ip/*.jsp时,交由后台tomcat处理动态资源
location ~ .*\.jsp$ {
proxy_pass http://tomcat_server;
proxy_set_header X-Real-IP $remote_addr;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
高可用
- 以上我们会遇到这样一个问题:
如果我们的nginx宕机,我们所有的请求都会失效,无法达到效果
- 解决方案
- 需要两台nginx服务器
- 需要keepalived
- 需要虚拟ip
准备工作
-
需要两台服务器192.168.17.129和192.168.17.131
-
在两台服务器安装nginx (不会装看上)
-
在两台服务器安装 keepalived (使用yum )
# 1.选择安装目录 # 2.安装 (需要联网) yum install keepalived -y # 3. 检查 rpm -q -a keepalived
keepalived配置文件
配置实例
主要就是修改keepalived的配置文件
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_ server 192.168.17.129
smtp_connect_timeout 30
router_id LVS_DEVEL # LVS_DEVEL这字段在/etc/hosts文件中看;通过它访问到主机
}
vrrp_script chk_http_ port {
script "/usr/local/src/nginx_check.sh"
interval 2 # (检测脚本执行的间隔)2s
weight 2 #权重,如果这个脚本检测为真,服务器权重+2
}
vrrp_instance VI_1 {
state BACKUP # 备份服务器上将MASTER 改为BACKUP
interface ens33 //网卡名称
virtual_router_id 51 # 主、备机的virtual_router_id必须相同
priority 100 #主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 #每隔1s发送一次心跳
authentication { # 校验方式, 类型是密码,密码1111
auth type PASS
auth pass 1111
}
virtual_ipaddress { # 虛拟ip
192.168.17.50 // VRRP H虛拟ip地址
}
}
新建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
把两台服务器上nginx和keepalived启动
$ systemctl start keepalived.service #keepalived启动
$ ps -ef I grep keepalived #查看keepalived是否启动
$ systemctl stop keepalived.service #keepalived停止
原理分析
1、master和worker
- worker工作模式
- 一个master和多个woker的好处
可以使用nginx -s reload热部署。
每个woker是独立的进程,如果有其中的一个woker,出现问题,其他woker独立的,继续进行争抢,实现请求过程,不会造成服务中断
- 设置多少个woker合适
Nginx同redis类似都采用了io多路复用机制,每个worker都是一个独立的进程, 但每个进
程里只有一个主线程,通过异步非阻塞的方式来处理请求,即使是 千上万个请求也不在话
下。每个worker的线程可以把一个cpu的性能发挥到极致。
所以worker数和服务器的cpu数量相等是最为适宜的。设少了会浪费cpu,设多了会造成cpu频繁切换上下文带来的损耗。
# 设置worker数量
worker.processes 4
# work绑定cpu(4work绑定4cpu)
worker_cpu_affinity 0001 0010 0100 1000
# work绑定cpu (4work绑定8cpu中的4个)
worker_cpu_affinity 0000001 00000010 00000100 00001000
- 连接数worker_ connection
第一个: 发送请求,占用了woker的几个连接数?
答案: 2或者4个。
第二个: nginx有一个master,有四个woker,每个woker支持最大的连接数1024,支持的最大并发数是多少?
答案:普通的静态访问最大并发数是: worker connections * worker processes /2,
而如果是HTTP作为反向代理来说,最大并发数量应该是worker connections * worker processes/4
这里放入 小杰要吃蛋记录的文章,不详细之处,请前往此处学习
Nginx面试题(总结最全面的面试题!!!)
完结