Nginx
一、简介
前言
Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,公开版本1.19.6发布于2020年12月15日。
代理
正向代理和反向代理的区别
区别有:用途不同。安全性不同。目的不同。代理不同。服务对象不同。功能不同。
- 用途不同。正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性减少网络使用率。反向代理的典型用途是将防火墙后面的服务器提供给Internet用户访问。
- 安全性不同。正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此你必须采取安全措施以确保仅为经过授权的客户端提供服务。反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。
- 目的不同。正向代理实际代理的是客户端。反向代理代理的是目标服务器。
- 代理不同。正向代理是客户端架构,而反向代理是服务器架构。
- 服务对象不同。正向代理中,服务器不知道真正的用户是谁。反向代理中,用户不知道真正的服务器是谁。
- 功能不同。正向代理主要用来解决访问问题。反向代理主要用于解决负载均衡、安全防护,但二者都能提高访问速度。
随笔:需要看使用的位置在哪里?如果说是在客户端则说明是在进行正向代理,反之,在服务器中则是说明进行反向代理。
简洁的说法:
正向代理:服务器无法确认客户端。
反向代理:客户端无法确认服务器。
Nginx的优势
1、作为Web服务器有优势
作为Web服务器,Nginx处理静态文件、索引文件,自动索引的效率非常高。
2、作为代理服务器有优势
作为代理服务器,Nginx可以实现无缓存的反向代理加速,提高网站运行速度。
3、作为负载均衡服务器有优势
作为负载均衡服务器,Nginx既可以在内部直接支持Rails和PHP,也可以支持HTTP代理服务器对外进行服务,同时还支持简单的容错和利用算法进行负载均衡。
4、性能好
Nginx是专门为性能优化而开发的,在实现上非常注重效率。它采用内核Poll模型,可以支持更多的并发连接,最大可以支持对50000个并发连接数的响应,而且只占用很低的内存资源。
5、稳定性强
Nginx采取了分阶段资源分配技术,使得CPU与内存的占用率非常低。Nginx官方表示,Nginx保持10000个没有活动的连接,而这些连接只占用2.5MB内存,因此,类似DOS这样的攻击对Nginx来说基本上是没有任何作用的。宕机的概率非常小。
6、高可用性
Nginx支持热部署,启动速度特别迅速,因此可以在不间断服务的情况下,对软件版本或者配置进行升级,即使运行数月也无需重新启动,几乎可以做到7×24小时不间断地运行。
7、高并发连接
跨平台、配置简单、方向代理、高并发连接:处理2-3万并发连接数,官方监测能支持5万并 发,内存消耗小:开启10个nginx才占150M内存 ,nginx处理静态文件好,耗费内存少。
8、健康检查功能
如果有一个服务器宕机,会做一个健康检查,再发送的请求 就不会发送到宕机的服务器了。重新将请求提交到其他的节点上。
9、节省宽带
支持GZIP压缩,可以添加浏览器本地缓存。
随笔:
Nginx最突出、最重要的功能就是负载均衡。所以我们使用Nginx最大的需求出发点就是负载均衡。
负载均衡的概念:因为单个服务器的负载承受能力有限,所以当请求并发量超过负载能力之后,就需要搭建集群。
二、安装
- 安装依赖包
# 一键安装上面四个依赖
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
- 下载并解压安装包
# 创建一个文件夹
cd /usr/local
mkdir nginx
cd nginx
# 下载tar包
wget http://nginx.org/download/nginx-1.13.7.tar.gz
tar -xvf nginx-1.13.7.tar.gz
- 安装nginx
# 进入nginx目录
cd /usr/local/nginx
# 进入目录
cd nginx-1.13.7
# 执行命令 考虑到后续安装ssl证书 添加两个模块
./configure --with-http_stub_status_module --with-http_ssl_module
# 执行make命令
make
# 执行make install命令
make install
- 启动nginx服务
/usr/local/nginx/sbin/nginx
- 配置nginx.conf
# 打开配置文件
vi /usr/local/nginx/conf/nginx.conf
将端口号改成8089(随便挑个端口),因为可能apeache占用80端口,apeache端口尽量不要修改,我们选择修改nginx端口。
- 重启nginx
/usr/local/nginx/sbin/nginx -s reload
# 查看nginx进程是否启动:
ps -ef | grep nginx
- 打开网站
# 步骤集中:
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
cd /usr/local
mkdir nginx
cd nginx
wget http://nginx.org/download/nginx-1.13.7.tar.gz
tar -xvf nginx-1.13.7.tar.gz
cd /usr/local/nginx/nginx-1.13.7
./configure --with-http_stub_status_module --with-http_ssl_module
make
make install
/usr/local/nginx/sbin/nginx
# 打开配置文件
vi /usr/local/nginx/conf/nginx.conf
/usr/local/nginx/sbin/nginx -s reload
# 查看nginx进程是否启动:
ps -ef | grep nginx
三、Nginx常用命令
# 启动 Nginx 服务器
/usr/local/nginx/sbin/nginx
# 停止 Nginx 服务器
/usr/local/nginx/sbin/nginx -s stop
# 重新加载配置文件
/usr/local/nginx/sbin/nginx -s reload
四、nginx配置
文件地址:/usr/local/nginx/conf/nginx.conf
nginx是一个功能非常强大的web服务器加反向代理服务器,同时又是邮件服务器等等 在项目使用中,使用最多的三个核心功能是反向代理、负载均衡和静态服务器
这三个不同的功能的使用,都跟nginx的配置密切相关,nginx服务器的配置信息主要集中在nginx.conf这个配置文件中, 并且所有的可配置选项大致分为以下几个部分
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
;
}
main # 全局配置
events { # nginx工作模式配置
}
http { # http设置
....
server { # 服务器主机配置
....
location { # 路由配置
....
}
location path {
....
}
location otherpath {
....
}
}
server {
....
location {
....
}
}
upstream name { # 负载均衡配置
....
}
}
如上述配置文件所示,主要由以一下6个部分组成:
- main:用于进行nginx全局信息的配置
- events:用于nginx工作模式的配置
- http:用于进行http协议信息的一些配置
- server:用于进行服务器访问信息的配置
- location:用于进行访问路由的配置
- upstream:用于进行负载均衡的配置
1、全局块
# user nobody nobody;
worker_processes 2;
# error_log logs/error.log
# error_log logs/error.log notice
# error_log logs/error.log info
# pid logs/nginx.pid
worker_rlimit_nofile 1024;
上述配置都是存放在main全局配置模块中的配置项
- user用来指定nginx worker进程运行用户以及用户组,默认nobody账号运行
- worker_processes指定nginx要开启的子进程数量,运行过程中监控每个进程消耗内存(一般几M~几十M不等)根据实际情况进行调整,通常数量是CPU内核数量的整数倍
- error_log定义错误日志文件的位置及输出级别【debug / info / notice / warn / error / crit】
- pid用来指定进程id的存储文件的位置
- worker_rlimit_nofile用于指定一个进程可以打开最多文件数量的描述
这个部分配置的是影响Nginx整体运行的配置指令。主要包括:
- 用户组
- 允许生成的worker process数
- PID(进程ID)文件存放位置
- 日志文件存放位置
- 日志类型
- 其它配置文件引入
目前看到的worker_processes就是一个关键配置,它直接影响了Nginx服务器的并发能力。worker_processes越大并发能力越强——当然不是无限的,会受到硬件、操作系统的制约。
2、events块
event {
worker_connections 1024;
multi_accept on;
use epoll;
}
上述配置是针对nginx服务器的工作模式的一些操作配置
- worker_connections 指定最大可以同时接收的连接数量,这里一定要注意,最大连接数量是和worker processes共同决定的。
- multi_accept 配置指定nginx在收到一个新连接通知后尽可能多的接受更多的连接
- use epoll 配置指定了线程轮询的方法,如果是linux2.6+,使用epoll,如果是BSD如Mac请使用Kqueue
events块涉及的指令主要影响Nginx服务器与用户的网络连接。
常用的设置包括是否开启对多worker process下的网络连接进行序列化、是否允许同时接收多个网络连接、选取哪种事件驱动模型来处理连接请求、每个work process可以同时支持的最大连接数等。
目前我们看到的worker_connections就是指定每个work process的最大连接数为1024。
所以这部分配置对Nginx性能也会有较大影响
3、HTTP块
Nginx 服务器配置中最频繁的部分:代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
作为web服务器,http模块是nginx最核心的一个模块,配置项也是比较多的,项目中会设置到很多的实际业务场景,需要根据硬件信息进行适当的配置,常规情况下,使用默认配置即可!
4、server模块
srever模块配置是http模块中的一个子模块,用来定义一个虚拟访问主机,也就是一个虚拟服务器的配置信息
server {
listen 80;
server_name localhost 192.168.1.100;
root /nginx/www;
index index.php index.html index.html;
charset utf-8;
access_log logs/access.log;
error_log logs/error.log;
......
核心配置信息如下:
- server:一个虚拟主机的配置,一个http中可以配置多个server
- server_name:用来指定ip地址或者域名,多个配置之间用空格分隔
- root:表示整个server虚拟主机内的根目录,所有当前主机中web项目的根目录
- index:用户访问web网站时的全局首页
- charset:用于设置www/路径中配置的网页的默认编码格式
- access_log:用于指定该虚拟主机服务器中的访问记录日志存放路径
- error_log:用于指定该虚拟主机服务器中访问错误日志的存放路径
5、location模块
location模块是nginx配置中出现最多的一个配置,主要用于配置路由访问信息
在路由访问信息配置中关联到反向代理、负载均衡等等各项功能,所以location模块也是一个非常重要的配置模块
一个 server 块可以配置多个 location 块。这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是IP别名)之外的字符串进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
基本配置
location / {
root /nginx/www;
index index.php index.html index.htm;
}
location /:表示匹配访问根目录
root:用于指定访问根目录时,访问虚拟主机的web目录
index:在不指定访问具体资源时,默认展示的资源文件列表
反向代理配置方式
通过反向代理代理服务器访问模式,通过proxy_set配置让客户端访问透明化
location / {
proxy_pass http://localhost:8888;
proxy_set_header X-real-ip $remote_addr;
proxy_set_header Host $http_host;
}
uwsgi配置
wsgi模式下的服务器配置访问方式
location / {
include uwsgi_params;
uwsgi_pass localhost:8888
}
6、upstream模块
upstream模块主要负责负载均衡的配置,通过默认的轮询调度方式来分发请求到后端服务器
简单的配置方式如下
upstream name {
ip_hash;
server 192.168.1.100:8000;
server 192.168.1.100:8001 down;
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;
核心配置信息如下
- ip_hash:指定请求调度算法,默认是weight权重轮询调度,可以指定
- server host:port:分发服务器的列表配置
- -- down:表示该主机暂停服务
- -- max_fails:表示失败最大次数,超过失败最大次数暂停服务
- -- fail_timeout:表示如果请求受理失败,暂停指定的时间之后重新发起请求/li>
7、配置文件语法要求
- 如果后面不是大括号,那么单行配置必须用分号结尾
- server块定义的listen和server_name,二者结合起来必须是唯一的
8、小结
配置文件结构:
- 全局块
- events 块
- http 块
- http 全局块
- server 块(可以有多个)
- server 全局块
- location 块(可以有多个)
五、反向代理
1、目标
通过Nginx访问Tomcat。
2、Tomcat搭建
【注】必须已经有Java环境才能正常运行
将该文件使用 XShell和Xftp 传送到我们的Linux系统中
# 解压
tar -zxvf apache-tomcat-9.0.54.tar.gz
# 进入bin目录执行启动
startup.sh
3、配置Nginx
修改配置文件之后,需要让Nginx重新加载配置文件。
在这里,proxy_pass起到了一个“请求转发”的作用。
注意:一下该服务是进行一个新增,直接加到最后面即可
server {
server_name www.kews1688.com;
location / {
proxy_pass http://localhost:8080;
}
}
4、配置域名
使用SwitchHosts工具添加如下配置:
192.168.239.128 www.kews1688.com
效果如下
六、location匹配规则
1、概述
Nginx在location配置中还提供了更丰富的语义。上面的例子只是一种非常简单的情况。
location的完整语法格式是:
location [=|~|~*|^~] uri {
}
其中匹配规则部分的各个符号含义如下:
- =:用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
- ~:用于表示 uri 包含正则表达式,并且区分大小写。
- ~*:用于表示 uri 包含正则表达式,并且不区分大小写。
- ^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。
2、案例
1、目标
访问不同请求地址,通过Nginx跳转到不同的Tomcat。
- 请求地址包含/edu:跳转到端口号8080
- 请求地址包含/vod:跳转到端口号8081
2、准备Tomcat
1、原Tomcat
在webapps目录下创建目录:edu
在edu目录下创建index.html
<html>
<head>
<title>Hello</title>
</head>
<body>
<p>8080</p>
</body>
</html>
2、新Tomcat
把Tomcat解压目录复制一份,修改端口号:
vim /opt/apache-tomcat-8081/conf/server.xml
21 -->
22 <Server port="8006" shutdown="SHUTDOWN">
23 <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
……
69 <Connector port="8081" protocol="HTTP/1.1"
70 connectionTimeout="20000"
71 redirectPort="8443" />
在webapps目录下创建目录:vod
在vod目录下创建index.html
<html>
<head>
<title>Hello</title>
</head>
<body>
<p>8081</p>
</body>
</html>
启动Tomcat:
```bash
/opt/apache-tomcat-8081/bin/startup.sh
3、配置Nginx
server {
listen 9000;
server_name www.zhutou366.com;
location ~ /edu/ {
proxy_pass http://localhost:8080;
}
location ~ /vod/ {
proxy_pass http://localhost:8081;
}
}
4、配置域名
在SwitchHosts工具中配置:
192.168.200.100 www.zhutou366.com
七、案例
1、目标
访问不同请求地址,通过Nginx跳转到不同的Tomcat。
- 请求地址包含/edu:跳转到端口号8080
- 请求地址包含/vod:跳转到端口号8081
2、准备Tomcat
1、原Tomcat
在webapps目录下创建目录:edu
在edu目录下创建index.html
<html>
<head>
<title>Hello</title>
</head>
<body>
<p>8080</p>
</body>
</html>
# 操作
# 进入webapps目录
cd /opt/apache-tomcat-8.5.32/webapps/
# 创建edu文件夹
mkdir edu
# 创建并修改内容
vim edu/index.html
2、新Tomcat
把Tomcat解压目录复制一份,修改端口号:
vim /opt/apache-tomcat-8081/conf/server.xml
21 -->
22 <Server port="8006" shutdown="SHUTDOWN">
23 <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
……
69 <Connector port="8081" protocol="HTTP/1.1"
70 connectionTimeout="20000"
71 redirectPort="8443" />
在webapps目录下创建目录:vod
在vod目录下创建index.html
<html>
<head>
<title>Hello</title>
</head>
<body>
<p>8081</p>
</body>
</html>
启动Tomcat:
/opt/apache-tomcat-8081/bin/startup.sh
③配置Nginx
server {
listen 9000;
server_name www.kews8888.com;
location ~ /edu/ {
proxy_pass http://localhost:8080;
}
location ~ /vod/ {
proxy_pass http://localhost:8081;
}
}
④配置域名
在SwitchHosts工具中配置:
192.168.239.128 www.kews8888.com
八、负载均衡
1、准备Tomcat
启动两个Tomcat,修改首页内容易于识别即可。
2、配置Nginx负载均衡
upstream atguiguBalance{
server localhost:8080;
server localhost:8081;
}
server {
listen 9100;
server_name www.kews1688.com;
location / {
proxy_pass http://locahost:8080;
}
}
3、Nginx负载均衡策略
无论哪种访问策略,第一个访问的服务器实例永远是随机的。
1、轮询
轮流访问每一个服务器实例,如果有服务器宕机可以自动剔除。
2、权重
权重大的服务器实例被访问到的几率大。
upstream server_pool{
server 192.168.239.128 weight=1;
server 192.168.239.128 weight=2;
server 192.168.239.128 weight=3;
}
3、IP HASH
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream server_pool{
ip_hash;
server 192.168.239.128:80;
server 192.168.239.128:80;
server 192.168.239.128:80;
}
4、公平
按后端服务器的响应时间来分配请求,响应时间短的优先分配。需借助第三方插件。
upstream server_pool{
server 192.168.239.128:80;
server 192.168.239.128:80;
server 192.168.239.128:80;
fair;
}
九、工作机制
1、master和worker分工
- master进程负责分配任务(只有一个)
- worker进程负责处理请求(可以多个)
2、master和worker配合
3、当前机制的好处
- 利于执行热部署操作
- 比如:执行nginx -s reload,工作中的worker继续工作;空闲worker重新加载配置文件;然后工作中的worker完成工作后执行重新加载。如果没有多个worker,一个worker重新加载配置文件时Nginx对外无法提供服务,相当于暂停。但Nginx是整个项目的入口,即使短时间暂停也不能接受。
- 独立进程,彼此隔离
- 每个worker是一个独立的进程,任何一个进程抛异常都不会影响其它进程。
- 每个worker进程内只有一个线程,基于IO多路复用技术效率极高。
- 每个worker进程内只有一个线程,不需要加锁,不需要线程间切换,非阻塞运行,省去了大量性能开销。
IO多路复用是Linux系统的新技术,Windows系统没有。
所以在Windows系统部署Nginx无法发挥出Nginx最大的性能。
4、Nginx并发能力评估
1、worker数量
由于Nginx基于IO多路复用机制,每个worker进程中都是单线程,能够把CPU的性能发挥到极致。所以设置的建议是:worker数等于CPU数。
- worker比CPU少会浪费
- worker比CPU多会争抢
2、连接数
Nginx总连接数=worker进程数量×每个worker可以建立的连接数
一个请求占用worker几个连接:
- 访问静态资源的请求:请求占用一个、响应占用一个
- 访问动态资源的请求:一共四个
- 前端访问Nginx:请求占用一个、响应占用一个
- Nginx访问Tomcat:请求占用一个、响应占用一个
3、并发数
所谓并发数,也就是同时能处理的请求数:
- 访问静态资源的请求:worker进程数×worker连接数÷2
- 访问动态资源的请求:worker进程数×worker连接数÷4
十、Nginx高可用
Nginx作为整个系统的入口,责任重大。
所以通常结合Keepalived,搭建Nginx高可用。
平常Keepalived中维护的VIP(虚拟IP)关联Nginx的主服务器:
如果主服务器宕机,则备份服务器关联VIP:
将来主服务器恢复运行,则备份服务器把VIP还给主服务器,自己继续作为备份服务器。
由于用户始终都是在访问VIP,所以对后面主备之间的切换无感。
除了“主备”这种模式,还有“主主”:
-
当前主服务器宕机,另一个顶上。
-
宕机的服务器恢复后,不会进行切换,恢复的服务器在旁边待命。
总结:
Nginx(反向代理)主要是进行负载均衡,减轻服务器压力,提高效率,是增加安全性
随笔:
灯火星星,置换须臾。
岁月漫长,欢迎来访。