Nginx
1. 基本概念
概述
- Nginx 是一个高性能的 HTTP 和反向代理服务器
- 特点是占有内存少,并发能力强
- 专为性能优化而开发,性能是其最最要的考量
反向代理
- 谈反向代理之前咱们先来理解一下正向代理,比方当初咱们要拜访
www.google.com
,谷歌大陆目前是不能间接拜访的,那么咱们就能够通过在浏览器配置代理服务器进行拜访(如下图) - 接下来咱们介绍反向代理,客户端对代理无感知,客户端不须要任何配置,咱们只须要将申请发送到反向代理服务器,而后由反向代理服务器去抉择指标服务器获取数据后,再返回给客户端。此时反向代理服务器和指标服务器对外就是一个服务器。显然,反向代理对外裸露的是反向代理服务器,暗藏了实在服务器
- 比方下图中,咱们想指标服务器发出请求时,由反向代理服务器抉择 tomcat 服务器 8001 端口,获取数据后,再将数据返回给客户端
负载平衡
- 客户端发送多个申请到服务器,服务器与数据库交互解决申请,处理完毕后,再将后果返回给客户端
- 这种架构模式实用于晚期零碎繁多简略,并发较少的状况。随着信息数量的一直增长,访问量和申请量的飞速增长,服务器性能就会达到瓶颈,此时咱们应该如何解决?
- 首先想到的是晋升服务器的配置,然而随着摩尔定律的日益生效,硬件的性能晋升曾经不能满足日益晋升的性能需求。另外一个办法是咱们能够减少服务器的数量,将申请散发到各个服务器上,这就是咱们说的 负载平衡
- 如下图,将 15 个申请散发到三台服务器上,现实状态是每台服务器 3 个申请
动静拆散
- 为了放慢网站的解析速度,能够把动静页面和动态页面由不同的服务器来解析,放慢解析速度,升高原来单个服务器的压力
2. Nginx 装置、命令和配置文件
Linux 中装置 Nginx
-
装置 PCRE
PCRE 作用是让 Nginx 反对 Rewrite 性能。
cd /usr/src/ wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz
tar zxvf pcre-8.37.tar.gz
cd pcre-8.37/ ./configure make && make install
pcre-config --version
-
装置编译工具及库文件
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
-
装置 Nginx
cd /usr/src/ wget http://nginx.org/download/nginx-1.12.2.tar.gz
tar zxvf nginx-1.12.2.tar.gz
cd nginx-1.12.2/ ./configure make && make install
/usr/local/nginx/sbin/nginx -v
- 装置胜利后,在
usr
多进去一个文件夹local/nginx
,启动脚本为/nginx/sbin/nginx
-
测试
cd /usr/local/nginx/sbin ./nginx ps -ef | grep nginx
间接拜访 IP 地址能够看到如下界面
防火墙相干操作
- 查看凋谢的端口号:
firewall-cmd --list-all
- 设置凋谢的端口号:
firewall-cmd --add-service=http --permanent
eg:sudo firewall-cmd --add-port=80/tcp --permanent
- 重启防火墙:
firewall-cmd --reload
- 敞开防火墙:
systemctl stop firewalld
- 永恒敞开防火墙:
systemctl disable firewalld
- 查看凋谢的端口号:
Nginx 常用命令
应用 nginx 命令前要进入
nginx
目录:cd /usr/local/nginx/sbin
- 查看 nginx 版本号:
./nginx -v
- 启动 nginx:
./nginx
- 敞开 nginx:
./nginx -s stop
- 重载 nginx:
./nginx -s reload
-
配置 systemctl
配置 systemctl 后的启动形式
- 状态:
ssytemctl status nginx
- 启动:
systemctl start nginx
- 敞开:
systemctl stop nginx
- 重启:
systemctl restart nginx
配置办法
-
nginx.service
cd /usr/lib/systemd/system vim nginx.service
-
将以下内容复制进去 <font color=”red”>(正文的内容不要放进去!!!)</font>
[Unit] // 对服务的阐明 Description=nginx - high performance web server // 形容服务 After=network.target remote-fs.target nss-lookup.target // 形容服务类型 [Service] // 服务的一些具体运行参数的设置 Type=forking // 后盾运行的模式 PIDFile=/usr/local/nginx/logs/nginx.pid //PID 文件的门路 ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf // 启动 筹备 ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf // 启动命令 ExecReload=/usr/local/nginx/sbin/nginx -s reload // 重启命令 ExecStop=/usr/local/nginx/sbin/nginx -s stop // 进行命令 ExecQuit=/usr/local/nginx/sbin/nginx -s quit // 疾速进行 PrivateTmp=true // 给服务调配长期空间 [Install] WantedBy=multi-user.target // 服务用户的模式
- 赋予权限:
chmod +x /usr/lib/systemd/system/nginx.service
-
启动服务
// 启动服务之前,须要先重载 systemctl 命令 systemctl daemon-reload systemctl start nginx.service
报错间接
kill -9
杀死从新拉起即可
- 状态:
Nginx 配置文件
Nginx 配置文件地位:
/usr/local/nginx/conf/nginx.conf
配置文件由三局部组成
-
第一局部:全局块(从配置文件开始到 events 块之间的内容)
- 次要设置一些影响 Nginx 服务器整体运行的配置指令,次要包含配置运行 Nginx 服务器的用户(组)、容许生成的 worker process 数、过程 PID 寄存门路、日志寄存门路和类型以及配置文件的引入等
worker_processes 1
:Nginx 服务器并发解决的值,worker_processes 值越大,能够反对的并发解决数量越多
-
第二局部:events 块
events {worker_connections 1024;}
- events 块波及的指令次要影响 Nginx 服务器与用户的网络连接,比方
worker_connections 1024;
示意 Nginx 反对的最大连接数为 1024
- events 块波及的指令次要影响 Nginx 服务器与用户的网络连接,比方
-
第三局部:http 块(http 块也能够包含 http 全局块、server 块)
- http 全局块:http 全局块配置的指令包含文件引入、MIME-TYPE 类型、日志自定义、连贯超时工夫、单链接申请数下限等
-
server 块:这块和虚拟主机有密切联系,每个 http 块能够包含多个 server 块,每个 server 块就相当于一个虚拟主机,每个 server 块也分为全局 server 块,以及能够同时蕴含多个 location 块
- 全局 server 块:最常见的配置是本虚拟主机的监听配置和本虚拟主机的名称或 IP 配置
- location 块:次要作用的是基于 Nginx 服务器接管到的申请字符串(eg:server_name/uri-string),对虚拟主机名称(也能够是 IP 别名)之外的字符串(eg:/uri-string)进行匹配,对特定的申请进行解决。地址定向、数据缓存和应答管制等性能,还有许多第三方模块的配置也在这里进行
3. Nginx 配置实例
<0> 筹备工作
-
装置 tomcat,应用默认端口号 8080
cd /usr/src wget https://mirrors.cnnic.cn/apache/tomcat/tomcat-8/v8.5.73/bin/apache-tomcat-8.5.73.tar.gz tar zxvf apache-tomcat-8.5.73.tar.gz
- 装置 jdk:可参考此教程 Linux 装置和配置 JDK13
-
启动 tomcat
cd /usr/src/apache-tomcat-8.5.73/bin/ ./startup.sh
-
拜访 tomcat(服务器要凋谢 8080 端口)
<1> 反向代理 • 实例一
- 实现成果:关上浏览器,在浏览器地址输出地址
www.123.com
,跳转到 Linux 零碎 tomcat 主页面中 - 过程剖析:Windows 浏览器不能间接拜访 t omcat,要通过 nginx 反向代理到 tomcat
-
具体配置
- 在 Windows 零碎的 host 文件进行域名和 ip 对应关系的配置
C:\Windows\System32\drivers\etc\hosts
-
在 nginx 进行申请转发的配置(反向代理)
cd /usr/local/nginx/conf/ vim nginx.conf
-
测试
// 启动 nginx cd /usr/local/nginx/sbin ./nginx
- 在 Windows 零碎的 host 文件进行域名和 ip 对应关系的配置
<2> 反向代理 • 实例二
-
实现成果:应用 nginx 反向代理,依据拜访的门路跳转到不同端口的服务中,nginx 监听端口为 9001
- 拜访
http://118.195.179.192:9001/edu/
间接跳转到127.0.0.1:8080
- 拜访
http://118.195.179.192/vod/
间接跳转到127.0.0.1:8081
- 拜访
-
筹备工作
-
筹备两个 tomcat 服务器,一个 8080 端口,一个 8081 端口
cd /usr/src mkdir tomcat8008 mkdir tomcat8081 cp apache-tomcat-8.5.73.tar.gz tomcat8080 cp apache-tomcat-8.5.73.tar.gz tomcat8081 ps -ef | grep tomcat kill -9 端口号 cd tomcat8080 tar zxvf apache-tomcat-8.5.73.tar.gz cd .. cd tomcat8081 tar zxvf apache-tomcat-8.5.73.tar.gz cd .. cd tomcat8080 cd apache-tomcat-8.5.73/ cd bin/ ./startup.sh cd .. cd .. cd .. cd tomcat8081 cd apache-tomcat-8.5.73/ cd conf vim server.xml
shutdown 端口轻易改一下,我这里改成 8015
-
端口改成 8081
启动 tomcat8081./startup.sh
能够看到咱们启动了两个 tomcat,一个是 8080,一个是 8081
咱们能够拜访看一下
-
-
创立文件夹和测试页面
- 在
/usr/src/tomcat8080/apache-tomcat-8.5.73/webapps
下创立 edu 文件夹,并在文件夹下创立 a.html 文件,内容为<h1>8080!!!</h1>
- 同样的,在
/usr/src/tomcat8081/apache-tomcat-8.5.73/webapps
下创立 vod 文件夹,并在文件夹下创立 a.html 文件,内容为<h1>8081!!!</h1>
- 在
-
具体配置
-
找到 nginx 配置文件进行反向代理配置
cd /usr/local/nginx/conf vim nginx.conf
增加一个 server
server { listen 9001; server_name 118.195.179.192; location ~ /edu/ {proxy_pass http://127.0.0.1:8080;} location ~ /vod/ {proxy_pass http://127.0.0.1:8081;} }
凋谢端口号 9001、8080、8081
从新加载 nginxcd /usr/local/nginx/sbin ./nginx --s stop ./nginx
-
- 最终测试
-
location 指令阐明
-
该指令用于匹配 URL,语法如下:
location [= | ~ | ~* | ^~] uri {}
=
:用于不含正则表达式的 uri 前,要求申请字符串与 uri 严格匹配,如果匹配胜利,就进行持续向下搜寻并立刻解决该申请~
:用于示意 url 蕴含正则表达式,并且辨别大小写~*
:用于示意 uri 蕴含正则表达式,并且不辨别大小写^~
:用于不含正则表达式的 uri 前,要求 nginx 服务器找到标识 uri 和申请字符串匹配度最高的 location 后,立刻应用此 location 解决申请,而不再应用 location 块中的正则 uri 和申请字符串做匹配
-
<3> 负载平衡
- 实现成果:通过浏览器地址栏输出地址
http://118.195.179.192/edu/a.html
,负载平衡成果,均匀 8080 和 8081 端口 -
筹备工作
- 筹备两台 tomcat 服务器,一台 8080,一台 8081(上一个实例曾经筹备过)
- 在两台 tomcat 的 webapps 目录下,创立名称为 edu 文件夹,在 edu 文件夹创立 a.html 页面,用于测试
-
在 nginx 的配置文件中进行负载平衡的配置
cd /usr/local/nginx/conf vim nginx.conf
- 测试
-
负载平衡调配策略
- 轮询(默认):每个申请按工夫程序逐个调配到不同的后端服务器,如果后端服务器 down 掉,能主动剔除
-
weight
- weight 代表权重,默认为 1,权重越高被调配的客户端越多
-
指定轮询几率,weight 和拜访比率成正比,用于后端服务器性能不均的状况
upstream myserver { server 118.195.179.192:8080 weight=5; server 118.195.179.192:8081 weight=10; }
-
ip_hash:每个申请按拜访 ip 的 hash 后果调配,这样每个拜访固定拜访一个后端服务器,能够解决 session 问题,eg
upstream myserver { ip_hash; server 118.195.179.192:8080; server 118.195.179.192:8081; }
-
fair(第三方):按后端服务器的响应工夫来调配申请,响应工夫短的优先调配
upstream myserver { server 118.195.179.192:8080; server 118.195.179.192:8081; fair; }
<4> 动静拆散
动静拆散从目前实现角度来讲大抵分为两种
- 一种是纯正把动态文件独立成到独自的域名,放在独立的服务器上
- 另一种办法就是动静跟动态文件混合在一起公布,通过 nginx 来离开
通过 location 指定不同的后缀名实现不同的申请转发。通过 expires 参数设置,能够使浏览器缓存过期期间,缩小与服务器之前的申请和流量。具体 expires 定义:是给一个资源设定一个过期工夫,也就是说无需去服务端验证,间接通过浏览器本身确认是否过期即可,所以不会产生额定的流量。此种办法非常适合不常常变动的资源。(如果常常更新的文件,不倡议应用 Expires 来缓存)。比方:设置 3d,示意在 3 天之内拜访这个 URL,发送一个申请,比对服务器该文件最初更新工夫没有变动,则不会从服务器抓取,返回状态码 304,如果有批改,则间接从服务器从新下载,返回状态码 200
-
筹备工作
-
在 Linux 零碎中筹备动态资源,用于进行拜访
cd / mkdir static cd static mkdir www mkdir image
www
文件夹中创立文件a.html
,内容为<h1>test html</h1>
image
文件夹中轻易放一张图片,我这里放的是01.jpg
-
- 实现成果:浏览器拜访 www 下
a.html
和 image 下01.jpg
(不是通过 tomcat,而是通过 nginx 动态资源配置拜访) -
具体配置
cd /usr/local/nginx/conf vim nginx.conf
启动 / 重启 nginxcd /usr/local/nginx/sbin ./nginx
-
测试
- 浏览器输出地址
http://118.195.179.192/image/01.jpg
- 浏览器输出地址
http://118.195.179.192/www/a.html
- 浏览器输出地址
<5> 高可用集群
-
什么是高可用?
- 有一台主服务器和一台备份服务器,个别申请时都是依据主服务器发送申请,当主服务器的 Nginx 挂掉时,会主动切换到备份服务器,通过备份服务器进行拜访,此时备份服务器作为主服务器的地位来解决申请,这就是高可用
-
筹备工作
- 须要两台 Nginx 服务器
- 在两台服务器装置 nginx(后面有教程)
- 在两台服务器装置 keepalived
yum install keepalived -y
装置目录为:/etc/keepalived
查看是否被装置:rpm -q -a keepalived
-
实现高可用配置(主备配置)
cd /etc/keepalived vim keepalived.conf
主服务器
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_script chk_http_port { script "/usr/local/src/nginx_check.sh" interval 2 # 检测脚本执行的距离 weight 2 } vrrp_instance VI_1 { state MASTER # 备份服务器上将 MASTER 改为 BACKUP interface eth0 # 网卡 virtual_router_id 51 # 主、备机的 virtual_router_id 必须雷同 priority 100 # 主、备机取不同的优先级,主机值较大,备机值较小 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress {192.168.200.16 # VRRP H 虚拟地址} }
备份服务器
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_script chk_http_port { script "/usr/local/src/nginx_check.sh" interval 2 # 检测脚本执行的距离 weight 2 } vrrp_instance VI_1 { state BACKUP # 备份服务器上将 MASTER 改为 BACKUP interface eth0 # 网卡 virtual_router_id 51 # 主、备机的 virtual_router_id 必须雷同 priority 90 # 主、备机取不同的优先级,主机值较大,备机值较小 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress {192.168.200.16 # VRRP H 虚拟地址} }
在主服务器和备份服务器
/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 # Nginx 启动脚本地位 sleep 2 if [`ps -C nginx --no-header |wc -1` -eq 0];then killall keepalived fi fi
启动两台服务器的 nginx 和 keepalived
cd /usr/local/nginx/sbin ./nginx systemctl start keepalived
- 测试:两台服务器要在同一局域网,我这里只是为了演示流程
-
keepalived 配置文件详解
global_defs
:全局配置(次要是router_id 服务器名字
在/etc/host
增加主机名称)-
vrrp_script
:脚本配置script "xxx.sh"
interval 2
:检测脚本执行的距离(2s)weight -20
:权重(当脚本中的条件成立,以后主机的权重升高 20)
-
vrrp_instance
:虚构 IP 配置state BACKUP
:示意服务器是主服务器(MASTER)还是备份服务器(BACKUP)interface eth0
:绑定的网卡(通过ifconfig
查看)virtual_router_id 51
:主备机的 id 值,相当于惟一标识priority 90
:优先级,值越大,优先级越高(个别主服务器设置为 100,从服务器小于 100,比方 90)advert_int 1
:每隔多长时间发送一个心跳,检测服务器是否或者,默认每隔 1 s 发送一个心跳authentication {auth_type PASS auth_pass 1111}
:权限校验形式(明码:1111)vritual_ipaddress
:绑定虚构 IP(能够绑定多个)
4. Nginx 原理
- nginx 启动后有两个过程:master 和 worker
- master 就相当于一个领导,不做具体工作,分配任务给 worker,worker 做具体的工作
-
worker 如何进行工作?
- 当 client(客户端)发送一个申请到 nginx,首先到 master,master 失去申请后,将申请分担给 worker,一个 master 上面有很多个 worker,worker 获取工作不是平均分配,也不是轮询,而是
争抢
的机制
- 当 client(客户端)发送一个申请到 nginx,首先到 master,master 失去申请后,将申请分担给 worker,一个 master 上面有很多个 worker,worker 获取工作不是平均分配,也不是轮询,而是
client 发送申请 -> master ->worker(争抢机制)-> 具体操作
-
一个 master 和多个 worker 有什么益处?
- 能够应用
nginx -s reload
热部署,利于 nginx 进行热部署操作 - 每个 worker 都是独立的过程,不须要加锁,一个过程退出后,其余过程可失常工作,升高危险
- 能够应用
-
设置多少个 worker 适合?
- Nginx 同 redis 相似都采纳了 IO 多路复用机制,每个 worker 都是一个独立的过程,每个过程里只有一个主线程,通过异步非阻塞形式来解决申请。每个 worker 的线程能够把一个 CPU 的性能施展到极致。因而,
worker 数和服务器的 CPU 数相等是最为合适的
。设少了会节约 CPU,设多了会造成 CPU 频繁切换上下文带来的损耗
- Nginx 同 redis 相似都采纳了 IO 多路复用机制,每个 worker 都是一个独立的过程,每个过程里只有一个主线程,通过异步非阻塞形式来解决申请。每个 worker 的线程能够把一个 CPU 的性能施展到极致。因而,
-
连接数 worker_connection(每个 worker 过程所能建设连贯的最大值)
- 发送一个申请,占用了 worker 的几个连接数?答案:2(client 拜访动态资源,worker 收到申请后返回)或者 4 个(worker 自身不反对 Java,worker 要把申请转发给 tomcat,tomcat 再返回)
-
nginx 有一个 master,有 4 个 worker,每个 worker 反对的最大连接数为 1024,反对的 最大的并发数 为多少?
worker 最大反对的连接数 4*1024 worker 反对的最大并发 4*1024/2=2048 或 4*1024/4=1024
一般的动态拜访最大并发数是:worker_connections * worker_processes / 2
作为反向代理来说,最大的并发数量是:worker_connections * worker_processes / 4
【注】worker_connections:每个 worker 反对的最大连接数(即下面所说的 1024)
worker_processes:worker 的数量