Nginx (engine x) 是一个高性能的Web服务器和反向代理服务器,也可以作为邮件代理服务器。
Nginx简介
Nginx发展介绍
Nginx (engine x) 是一个高性能的Web服务器和反向代理服务器
,也可以作为邮件代理服务器。
Nginx 特点是占有内存少,并发处理能力强,以高性能、低系统资源消耗而闻名,Nginx官方测试为5万并发请求
。与Nginx同类型的Web服务器还有Apache、Lighttpd(音同lighty)、Tengine(阿里巴巴的) 等。Nginx 的并发处理能力在同类型的Web服务器中表现极好(Apache、Lighttpd),在全世界范围内大量的网站使用了Nginx,国内互联网中也大量使用了Nginx,比如:淘宝、新浪、搜狐、网易、美团等。
Nginx是免费开源的,同时Nginx也有收费的商业版本,商业版本提供了性能优化、宕机等紧急问题处理等技术支持和服务。
Nginx是什么
Nginx是一个高性能的HTTP和反向代理服务器,特点是占用内存少,并发能力强。Nginx的并发能力在同类型的网页服务器中表现良好,中国大陆使用Nginx的网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
Nginx可以作为静态页面的web服务器,同时还支持CGI协议的动态语言,比如Perl、PHP等,但是不支持Java。
Nginx的应用场景
-
反向代理。
-
负载均衡。
-
动静分离。
-
高可用集群
正向代理和反向代理概念
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器;
正向代理类似一个跳板机,代理访问外部资源。比如:我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器,它能访问那个我不能访问的网站,于是我先连上代理服务器,告诉它我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。
正向代理和反向代理举例
正向代理
在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问。

比如你现在缺钱,想找马云爸爸去借钱,可想而知人家可能鸟都不鸟你,到最后碰一鼻子灰借不到钱。不过你认识你家隔壁老王,而老王认识马云同志,而且关系还很好。这时候你托老王去找马云借钱,当然这事最后成了,你从马云那里借到了500万!这时候马云并不知道钱是你借的,只知道这钱是老王借的。最后由老王把钱转交给你。在这里,老王就充当了一个重要的角色:代理。
此时的代理,就是我们常说的正向代理。代理客户端去请求服务器,隐藏了真实客户端,服务器并不知道真实的客户端是谁。正向代理应用最广泛的莫过于现在的某些“科学上网工具”,你访问不了谷歌、Facebook的时候,你可以在国外搭建一台代理服务器,代理你访问,代理服务器再把请求到的数据转交给你,你就可以看到内容了。
反向代理
反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
比如你现在很无聊,想找人聊天,这时候你拨通了联通客服10010电话,联通的总机可能随机给你分配一个闲置的客服给你接通。这时候你如愿以偿的和客服聊了起来,问了问她目前有没有结婚、有没有对象、家住哪里、她的微信号、她的手机号。。。
此时联通总机充当的角色就是反向代理,你只知道和客服接通并聊了起来,具体为什么会接通这个客服MM,怎么接通的,你并不知道。
反向代理隐藏了真正的服务端,就像你每天使用百度的时候,只知道敲打 www.baidu.com 就可以打开百度搜索页面,但背后成千上万台百度服务器具体是哪一台为我们服务的,我们并不知道。我们只知道这个代理服务器,它会把我们的请求转发到真实为我们服务的那台服务器那里去。

综上所述:正向代理代理对象是客户端,反向代理代理对象是服务端。
负载均衡
单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先 请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服 务器,也就是我们所说的负载均衡。

动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速 度。降低原来单个服务器的压力。

总结
软件层面一般常用Nginx来做反向代理服务器,它的性能非常好,用来做负载均衡。
Nginx使用
下载
免费开源版的官方网站:http://nginx.org
Nginx 有 Windows 版本和 Linux 版本,但更推荐在 Linux 下使用 Nginx
下载 nginx-1.14.2.tar.gz 的源代码文件
wget http://nginx.org/download/nginx-1.14.2.tar.gz
我的习惯,将下载或者上传的安装文件放到 /home/soft/
目录下。
安装
安装前的准备
Nginx的安装需要确定Linux安装相关的几个库,否则配置和编译会出现错误:
cc
pcre
openssl
zlib
① 安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装
# 检查是否安装
yum list installed | grep gcc
# 执行安装
yum install gcc -y
② PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。
# 检查是否安装
yum list installed | grep pcre
# 执行安装
yum install pcre pcre-devel -y
③ zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。
# 检查是否安装
yum list installed | grep zlib
# 执行安装
yum install zlib zlib-devel -y
④ OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。
# 检查是否安装
yum list installed | grep openssl
# 执行安装
yum install openssl openssl-devel -y
⑤ 一次性安装,执行如下命令
yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y
正式安装
① 下载nginx,两种方式
a. 直接下载.tar.gz
安装包,地址:https://nginx.org/en/download.html
b. 使用wget
命令下载(推荐)
。确保系统已经安装了wget,如果没有安装,执行 yum install -y wget
安装。
cd /home/soft # 我喜欢将东西放到这里
wget http://nginx.org/download/nginx-1.14.2.tar.gz
② 解压命令
tar -zxvf nginx-1.14.2.tar.gz
③ 切换至解压后的nginx主目录,执行命令
cd nginx-1.14.2
④ 进行配置,大多数使用默认配置就行了
./configure --prefix=/usr/local/nginx # (其中--prefix是指定nginx安装路径) 注意:等号左右不要有空格
⑤ 执行命令进行编译安装
make && make install
⑥ 安装成功后,可以切换到 /usr/local/nginx
目录下,查看内容
[root@iz2ze4lfnjztrjppyfbqo1z nginx]# cd /usr/local/nginx/
[root@iz2ze4lfnjztrjppyfbqo1z nginx]# ll
total 16
drwxr-xr-x 2 root root 4096 Jan 24 10:37 conf
drwxr-xr-x 2 root root 4096 Jan 24 10:37 html
drwxr-xr-x 2 root root 4096 Jan 24 10:37 logs
drwxr-xr-x 2 root root 4096 Jan 24 10:37 sbin
⑦ 查看版本号(使用nginx操作命令前提条件:必须进入nginx的目录/usr/local/nginx/sbin
)
./nginx -v
⑧ 查找安装路径
whereis nginx
启动
普通启动
切换到nginx安装目录的sbin目录下,执行:./nginx

nginx 体系结构由 master
进程和其 worker
进程组成。
master 进程读取配置文件,并维护 worker 进程,而 worker 进程则对请求进行实际处理。
nginx 启动后,安装目录下会出现一些 _tmp 结尾的文件,这些是临时文件,不用管。
进行访问,配置文件中默认端口为80
,在浏览器可以看到这样的页面。

通过配置文件启动
# 先进入到sbin目录下关闭nginx
./nginx -s stop
# 通过配置文件启动
./nginx -c /usr/local/nginx/conf/nginx.conf # 进入到 usr/local/nginx/sbin 目录下
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf # 使用绝对路径执行命令
其中 -c 是指定配置文件,而且配置文件路径必须指定绝对路径
Nginx 常用的命令
启动命令
在 /usr/local/nginx/sbin
目录下执行 ./nginx
或者 ./nginx -c 配置文件路径
关闭命令
在 /usr/local/nginx/sbin
目录下执行 ./nginx -s stop
安全退出命令
在 /usr/local/nginx/sbin
目录下执行 ./nginx -s quit
,比 stop 更安全一点
重新加载命令
在 /usr/local/nginx/sbin
目录下执行 ./nginx -s reload
配置检查
当修改Nginx配置文件后,可以使用Nginx命令进行配置文件语法检查,用于检查Nginx配置文件是否正确
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf –t
其它
Linux上查看nginx版本:/usr/local/nginx/sbin/nginx -V
-v
(小写的v)显示 nginx 的版本
-V
(大写的V)显示 nginx 的版本、编译器版本和配置参数
Nginx 配置文件
学习Nginx首先需要对它的核心配置文件有一定的认识,这个文件位于Nginx的安装目录 /usr/local/nginx/conf
目录下,名字为 nginx.conf


根据上述文件,我们可以很明显的将 nginx.conf 配置文件分为三部分。
全局块
从配置文件开始到 events 块之间
的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。
比如上面第一行配置的:
worker_processes 1;
这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。
events块
比如上面的配置:
events {
worker_connections 1024;
}
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。
上述例子就表示每个 work process 支持的最大连接数为 1024, 这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。
http块
http全局块
http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。

server块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
而每个 server 块也分为全局 server 块,以及可以同时包含多个 location 块。
1、全局server块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
2、location块
一个 server 块可以配置多个 location 块
。
这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string
),对虚拟主机名称(也可以是 IP 别名
)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
需要注意的是:http 块也可以包括 http全局块
、server块
。
Nginx 部署静态网站
Nginx是一个HTTP的web服务器,可以将服务器上的静态文件(如HTML、图片等)通过HTTP协议返回给浏览器客户端。
案例
上传项目
将静态网站部署到Nginx服务器上,比如我本地有个静态项目 ace-master 。
通过 Xftp 将 ace-master 上传到 linux 服务器 /opt/static 目录下,为了演示方便,将名字改为 ace 。

修改配置
修改 nginx.conf 配置文件
在server中,通过location匹配访问的路径,然后转发给静态资源,注意要以分号结尾

重启nginx服务器
/usr/local/nginx/sbin/nginx -s reload
去浏览器访问!通过 http://47.94.217.177 访问即可。
精确匹配
若想通过 http://47.94.217.177/ace 访问,则修改配置文件

重启服务器访问,这样,访问 /ace 的时候就会去 /opt/static 下找 ace 目录,访问 index.html 。
location中配置路径讲解
初次接触:可能会遇到404找不到页面的错误,主要原因是配置路径问题
规则:ip + port 等于 root
,假设server的配置如下:
server {
listen 80; # 端口号
location / {
root /opt/static/ace; # 静态文件路径
}
}
# 那么以下访问地址访问的静态资源为
http://192.168.92.128:80/ = root = /opt/static/ace
http://192.168.92.128:80/ace = root/ace = /opt/static/ace/ace
location匹配顺序
在没有标识符的请求下,匹配规则如下:
1、nginx服务器首先在server块的多个location块中搜索是否有标准的uri和请求字符串匹配。如果有多个标准uri可以匹配,就匹配其中匹配度最高的一个location。
2、然后,nginx在使用location块中,正则uri和请求字符串,进行匹配。如果正则匹配成功,则结束匹配,并使用这个location处理请求;如果正则匹配失败,则使用标准uri中,匹配度最高的location。
备注:
1、如果有精确匹配,会先进行精确匹配,匹配成功,立刻返回结果。
2、普通匹配与顺序无关,因为按照匹配的长短来取匹配结果。
3、正则匹配与顺序有关,因为是从上往下匹配。(首先匹配,就结束解析过程)
4、在location中,有一种通配的location,所有的请求,都可以匹配,如下:
location / {
# 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
# 但是正则和最长字符串会优先匹配
}
语法:
location [ = | ~ | ~* | ^~] uri {
}
= # 用于不含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求
~ # 用于表示uri包含正则表达式,并且区分大小写
~* # 用于表示uri包含正则表达式,并且不区分大小写
^~ # 用于不含正则表达式的uri前,要求Nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配
# 注意: 如果uri包含正则表达式,则必须要有~或者~*标识。
结合标识符,匹配顺序如下:
(location =
) > (location 完整路径
) > (location ^~ 路径
) > (location ~,~* 正则顺序
) > (location 部分起始路径
) > (location /
)
即
(精确匹配
)> (最长字符串匹配,但完全匹配
) >(非正则匹配
)>(正则匹配
)>(最长字符串匹配,不完全匹配
)>(location通配
)
Nginx 应用案例
反向代理
实现效果
使用 nginx 反向代理,根据访问的路径跳转到不同端口的 tomcat 服务中。
nginx 监听端口为9001。
访问 http://47.94.217.177:9001/edu/ 直接跳转到 47.94.217.177:8081
访问 http://47.94.217.177:9001/vod/ 直接跳转到 47.94.217.177:8082
准备工作
使用docker启动两个tomcat容器,对外暴露端口,一个8081端口,一个8082端口
分别创建文件夹edu和vod和对应index页面。
docker run -d -p 8081:8080 --name tomcat01 tomcat:9.0
docker run -d -p 8082:8080 --name tomcat02 tomcat:9.0
nginx配置
进入/usr/local/nginx/conf/
目录,修改nginx.conf
文件:
nginx.conf
文件修改格式:
.........
server {
listen 9001; # 端口号
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location ~ /edu/ {
proxy_pass http://localhost:8081;
}
location ~ /vod/ {
proxy_pass http://localhost:8082;
}
............
}
开放对外访问的端口号9001。
如果nginx没启动,那么就启动:
cd /usr/local/nginx/sbin/
./nginx -c /usr/local/nginx/conf/nginx.conf
如果nginx启动了,那么就让nginx重新加载一下配置文件
cd /usr/local/nginx/sbin/
./nginx -s reload
负载均衡
实现效果
浏览器地址栏输入地址 http://47.94.217.177/edu/index.html ,负载均衡效果,平均到8081和8082端口中,
准备工作
使用docker启动两个tomcat容器,对外暴露端口,一个8081端口,一个8082端口
两个容器中都创建文件夹edu和对应index.html页面,index.html内容要能分辨这两个tomcat。
docker run -d -p 8081:8080 -v /usr/local/tomcat/webapps8081:/usr/local/tomcat/webapps --name tomcat01 tomcat:9.0
docker run -d -p 8082:8080 -v /usr/local/tomcat/webapps8082:/usr/local/tomcat/webapps --name tomcat02 tomcat:9.0
负载均衡的配置
http {
...
upstream myserver {
server localhost:8081 weight=3;
server localhost:8082 weight=1;
}
server{
location / {
...
proxy_pass http://myserver;
proxy_set_header Host $host;
...
}
...
}
}
其中weight=1表示权重,用于后端服务器性能不均的情况,访问比率约等于权重之比,权重越大访问机会越多。
upstream是配置nginx与后端服务器负载均衡非常重要的一个模块
,并且它还能对后端的服务器的健康状态进行检查,若后端服务器中的一台发生故障,则前端的请求不会转发到该故障的机器。
如果nginx没启动,那么就启动:
cd /usr/local/nginx/sbin/
./nginx -c /usr/local/nginx/conf/nginx.conf
如果nginx启动了,那么就让nginx重新加载一下配置文件
cd /usr/local/nginx/sbin/
./nginx -s reload
Nginx常用负载均衡策略
轮询(默认)
注意:这里的轮询并不是每个请求轮流分配到不同的后端服务器,与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下。
如果后端服务器down掉,将自动剔除。
upstream backserver {
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
权重
每个请求按一定比例分发到不同的后端服务器,weight值越大访问的比例越大,用于后端服务器性能不均的情况。
upstream backserver {
server 192.168.0.14 weight=5;
server 192.168.0.15 weight=2;
}
ip_hash
ip_hash也叫IP绑定,每个请求按访问ip的hash值分配,这样每个访问客户端会固定访问一个后端服务器
,可以解决会话Session丢失
的问题。
算法:hash("124.207.55.82") % 2 = 0, 1
upstream backserver {
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
fair (第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配
upstream backserver {
server 127.0.0.1:8080;
server 127.0.0.1:9090;
fair;
}
最少连接
web请求会被转发到连接数最少的服务器上
upstream backserver {
least_conn;
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
负载均衡其他几个配置
upstream backserver {
server 127.0.0.1:9100;
# 其它所有的非backup机器down的时候,才请求backup机器
server 127.0.0.1:9200 backup;
}
upstream backserver {
server 127.0.0.1:9100;
# down表示当前的server是down状态,不参与负载均衡
server 127.0.0.1:9200 down;
}
一般在项目上线的时候,可以分配部署不同的服务器上,然后对Nginx重新reload。
reload不会影响用户的访问,或者可以给一个提示页面,系统正在升级…
动静分离
概述
Nginx的负载均衡和静态代理结合在一起,我们可以实现动静分离,这是实际应用中常见的一种场景。
动态资源,如jsp由tomcat或其他web服务器完成。
静态资源,如图片、css、js等由nginx服务器完成。
它们各司其职,专注于做自己擅长的事情。
动静分离充分利用了它们各自的优势,从而达到更高效合理的架构。


通过location指定不同的后缀名实现不同的请求转发。通过expires参数设置,可以使浏
览器缓存过期时间,减少与服务器之前的请求和流量。具体Expires定义: 是给一个资源
设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,
所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,
不建议使用Expires来缓存),如果设置3d, 表示在这3天之内访问这个URL, 发送一
个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,
如果有修改,则直接从服务器重新下载,返回状态码200。。
准备工作
# 在liunx系统中准备静态资源,用于进行访问
/data/image # 图片文件夹
/data/www # html文件夹
具体配置
在nginx配置文件中进行配置
location /www/ {
root /data/;
index index.html index.htm;
}
location /image/ {
root /data/;
autoindex on;
}
重启nginx,测试
http://47.94.217.177:9001/www/a.html
http://47.94.217.177:9001/image/001.png

上图是因为autoindex on
这个设置生效的。
nginx.conf配置参考
# 安全问题,建议使用nobody,不要用root
# user nobody;
# worker数和服务器的CPU数量相等为最佳
worker_processes 1;
# worker绑定CPU(1个worker绑定4个CPU)
# worker_cpu_affinity 0001 0010 0100 1000
# 错误日志
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
# 每个worker进程所能建立连接的最大值
worker_connections 1024;
# Nginx支持IO多路复用
# use epoll;
# 当一个worker抢占到一个连接时,是否尽可能的让其获取更多的链接,默认是off。
# multi_accept on;
# 默认是on,开启Nginx的抢占锁机制
# accept_mutex on;
}
http {
# 当Web服务器收到静态的资源文件请求的时候,根据请求文件的后缀名在服务器的MIME配置文件中找到对应的MIME Type,再根据MIME TYPE设置HTTP Response的Content-Type,然后浏览器根据Content-Type的值处理文件
include mime.types;
# 如果不能从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 logs/access.log main;
# 开启从磁盘直接到网络的文件传输,适用于有大文件上传下载的情况,提高IO的效率
sendfile on;
#tcp_nopush on;
# 一个请求完成之后还要保持连接多久,默认为0,表示完成请求后直接关闭连接
#keepalive_timeout 0;
keepalive_timeout 65;
# 开启或关闭gzip模块
#gzip on;
# 设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Type中进行获取
#gzip_min_length 1k;
# gzip的压缩比,1 压缩比最小处理速度最快,9压缩比最大但处理速度最慢(传输速度快但比较消耗CPU)
#gzip_comp_level 4;
# 匹配MIME类型进行压缩,(无论是否指定)"text/html"类型总是会被压缩的
#gzip_types types text/plain text/css application/json application/x-javascript text/xml
# 动静分离
# 服务器端静态资源缓存,最大缓存到内存中的文件,不活跃期限
#open_file_cache max=655350 inactive=20s;
# 活跃期限内最少使用的次数,否则视为不活跃
#open_file_cache_min_uses 2;
# 验证缓存是否活跃的时间间隔
# open_file_cache_valid 30s;
# 负载均衡
upstream myserver {
# 1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,则自动剔除
# 2.指定权重 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。server 192.168.247.101:8081 weight=1;
# 3.IP绑定 ip_hash 每个请求按照访问ip的hash的结果分配,这样每个访客固定一个后端服务器,可以解决Session的问题。
# 4.备机方式 backup 正常情况下不访问设置为backup的备机,只有当所有非备机全部宕机的情况下,服务才会进备机
# 5. fair 第三方 按后端服务器的响应时间来分配请求,响应时间短的优先分配
# 6. url_hash 第三方 按访问URL的hash的结果来分配请求,使得每一个URL都定向到同一个后端服务器,后端服务器为缓存时比较有效
server 192.168.247.101:8081;
server 192.168.247.101:8082;
}
server {
# 监听端口
listen 80;
# 服务名
server_name localhost;
# 字符集
#charset koi8-r;
#access_log logs/host.access.log main;
# 路径匹配
# location [=|~|~*|^~] /uri/ { _ }
# = 精确匹配
# ~ 正则匹配,区分大小写
# ~* 正则匹配,不区分大小写
# ^~ 关闭正则匹配
# 匹配规则
# 1. 所有匹配分两个阶段,第一个叫做普通匹配,第二个叫做正则匹配。
# 2. 普通匹配,首先通过"="来匹配完全精确的location
# 2.1 如果没有精确匹配到,那么按照最大前缀匹配的原则,来匹配location
# 2.2 如果匹配到的location有^~,则以此location为匹配最终结果,如果没有会把匹配结果暂存,继续进行正则匹配
# 3. 正则匹配,依次从上到下匹配前缀是~或~*的location,一旦匹配成功依次,则立刻以此location为准,不再向下继续进行正则匹配
# 4. 如果正则匹配度不成功,则继续使用之前暂存的普通匹配的location
location / { # 匹配任何查询,因为所有请求都以/开头,但是正则表达式罪责和长的块规则将被优先和查询匹配
# 反向代理的路径
proxy_pass http://myserver;
proxy_set_header Host $host;
# 定义服务器的默认网站根目录位置
root 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 {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ .php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ .php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
Nginx配置高可用集群
概述
我们已经可以使用Nginx来保证服务的高可用,但是依然有问题,如果Nginx出现了单点故障,那么整个服务就将宕机,所以我们可以考虑使用Nginx+Keepalived
来实现集群高可用。

Keepalived介绍
-
Keepalived是一种高性能的服务器高可用或热备解决方案,Keepalived可以用来防止服务器单点故障的发生,通过配合Nginx可以实现web前端服务的高可用。
-
Keepalived以VRRP协议为实现基础,用VRRP协议来实现高可用性(HA)。VRRP(Virtual Router Redundancy Protocol)协议用于实现路由器冗余的协议,VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由IP(一个或多个),而在路由器组内部,如果实际拥有这个对外IP的路由器工作正常的话就是MASTER,或者通过算法选举产生,MASTER实现针对虚拟路由器IP的各种网络功能,如ARP请求,ICMP以及数据的转发等,其他设备不拥有该虚拟IP,状态是BACKUP,除了接受MASTER的VRRP状态通告信息完,不执行对外的网络功能。当主机失效的时候,BACKUP将接管原先MASTER的网络功能。
-
VRRP协议使用多播数据来传输VRRP数据,VRRP数据使用特殊的虚拟源MAC地址发送数据而不是自身网卡的MAC地址,VRRP运行的时候只有MASTER路由器定时发送VRRP通告信息,表示MASTER工作正常以及虚拟路由器IP(组),BACKUP只接收VRRP数据,不发送数据,如果一定时间内没有接受到MASTER的通告信息,各个BACKUP将宣告自己成为MASTER,发送通告信息,重新进行MASTER选举。
架构图

机器规划
主机名称 | IP地址 | 安装软件 |
---|---|---|
Nginx-MASTER(Nginx的主节点) | 192.168.49.100 | Nginx、Keepalived |
Nginx-BACKUP(Nginx的从节点) | 192.168.49.101 | Nginx、Keepalived |
Nginx+Keepalived实现高可用集群
安装nginx
在192.168.49.100和192.168.49.101机器上安装Nginx。
-
为了以示区别,将192.168.49.100上的Nginx的首页换成192.168.49.100:
cd /usr/local/nginx/html
echo "192.168.49.100" > index.html
-
为了以示区别,将192.168.49.101上的Nginx的首页换成192.168.49.101:
cd /usr/local/nginx/html
echo "192.168.49.101" > index.html
-
分别启动192.168.49.100和192.168.49.101上的Nginx:
cd /usr/local/nginx/sbin
./nginx
安装Keepalived
wget方式
-
下载keeepalived:
wget https://www.keepalived.org/software/keepalived-2.2.1.tar.gz
-
解压keeepalived:
tar -zxvf keepalived-2.2.1.tar.gz
-
进入keeepalived的解压目录:
cd keepalived-2.2.1/
-
执行 ./configure
命令:
./configure
-
如果出现了 *** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS
,可以执行如下的命令:
yum -y install libnl libnl-devel libnfnetlink-devel
./configure
-
执行 make && make install
命令:
make && make install
yum方式
使用yum命令进行安装
$ yum install keepalived -y
$ rpm -q -a keepalived #查看是否已经安装上
默认安装路径: /etc/keepalived
安装之后,在etc里面生成目录keepalived, 有配置文件keepalived.conf
配置
-
在192.168.49.100(主节点)配置Keepalived:
mkdir -pv /etc/keepalived
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
## 标识本节点的字条串,通常为 hostname
router_id nginx-master;
script_user root
enable_script_security
}
## 检测脚本
## keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加。如果脚本执行结果非 0,并且 weight配置的值小于 0,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中 priority 对应的值。
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -5
fall 3
rise 2
}
## 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
## 主节点为 MASTER,对应的备份节点为 BACKUP
state MASTER
interface ens33
# 主机的IP地址
mcast_src_ip 192.168.49.100
# 虚拟路由id
virtual_router_id 100
## 节点优先级,值范围 0-254,MASTER 要比 BACKUP 高
priority 100
## 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
nopreempt
## 组播信息发送间隔,所有节点设置必须一样,默认 1s
advert_int 2
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx
}
## 虚拟 IP 池, 所有节点设置必须一样
virtual_ipaddress {
192.168.49.110
}
}
-
在192.168.49.101(从节点)配置Keepalived:
mkdir -pv /etc/keepalived
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id nginx-backup
script_user root
enable_script_security
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -5
fall 3
rise 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 101
priority 90
mcast_src_ip 192.168.49.101
advert_int 2
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.49.110
}
}
-
在192.168.49.100和192.168.49.101上创建Nginx的检查脚本:
cd /etc/keepalived
vim nginx_check.sh
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fichmod +x /etc/keepalived/nginx_check.sh
-
分别启动192.168.49.100和192.168.49.101上的Keepalived:
systemctl daemon-reload
systemctl enable --now keepalived # keepalived启动
systemctl stop keepalived.service #keepalived停止
# 另一种方式
systemctl start keepalived.service #keepalived启动
ps -ef I grep keepalived #查看keepalived是否启动
-
查看VIP:
# 在192.168.49.100和192.168.49.101上输入如下的命令
ip a
-
测试VIP:
ping 192.168.49.110 -c 4
Nginx的原理
Master && Worker

Nginx的Worker是如何工作的

一个Master和多个Worker的好处
-
对于每个worker进程来说,独立的进程,不需要枷锁,省略了锁带来的开销,同时在编程以及问题查找时,也会方便很多。
-
采用独立的进程 ,可以互相之间不会影响,一个进程退出后,其他进程还在工作,服务不会中断,master进行则可以很快启动新的worker进程。当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worer上的所有请求失败,不过不会影响到所有的请求,降低了风险,这也是我们使用
nginx -s reload
能热部署的原因所在。
设置多少个worker合适
-
worker数量和服务器的CPU数量相等最为合适。
-
设置worker数量:
worker_processes 4
-
worker绑定CPU(4个worker绑定4核CPU)
worker_cpu_affinity 0001 0010 0100 1000
-
worker绑定CPU(4个worker绑定8核CPU中的4个)
worker_cpu_affinity 00000001 00000010 00000100 00001000
连接数worker_connections
发送一个请求,占用了worker几个连接数
-
如果是普通静态访问,是2个连接数。
-
如果是反向代理来说,是4个连接数。
并发数
Nginx有1个Master,有4个worker,每个worker支持的最大连接数1024,支持的最大并发数是多少?
-
如果是普通的静态访问,最大的并发数是: worker_connections * worker_processes / 2 = 1024 * 4 / 2
。 -
如果作为反向代理来说,最大的并发数是: worker_connections * worker_processes / 4 = 1024 * 4 / 4
。
原文始发于微信公众号(程序员阿晶):Nginx快速入门
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/19692.html