Nginx

Nginx

一、基本概念

nginx 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。有报告表明能支持高达50000个并发连接数。

1.反向代理

说到反向代理,不得不说说正向代理,什么是正向代理,如果把局域网外的internet想象成一个巨大的资源库,则局域网中的客户端要访问internet,则需要通过代理服务器来访问,这种代理服务器就称为正向代理。简单来说,就是访问一个网址,先给浏览器配置代理服务器(区别与反向代理),通过代理服务器再去帮我们访问网址。
反向代理: 我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器,目标服务器处理完后返回数据,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。如图
在这里插入图片描述

2.负载均衡

在我们传统单一的web项目中,完整的一个过程是:客户端发起请求 --> 服务器 --> 数据库,然后返回到客户端,在并发量少时,这样是没问题的,但随着使用人群的增多,并发量变大,项目就会出现性能瓶颈,经常出现宕机的情况。为了解决这个问题,我们有许多解决方案,最直接的就是提高硬件设施的性能,但这样做不但成本高,而且随着项目的复杂度、访问量等继续增大,带来的问题也越来越多。我们打个比喻,开始2个人同时吃饭(并发),我们拿个小锅就可以解决,然后到10个,我们可以换成大一点的,如果到100个人,我们就不太可能买一口能够做100份食物的锅了,这时,我们可以买10口做10个人的饭的锅,这样也能满足我们的需求。负载均衡也一样,我们通过多台服务器(集群)来解决大并发的问题,nginx自动帮我们将请求分配到各个服务器。

3.动静分离

用来加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析的速度,降低原来单个服务器的压力。如图
在这里插入图片描述

二、nginx在linux下的安装

安装前请下载好nginx安装包

官网下载

在这里插入图片描述
在这里插入图片描述
然后可以选着使用Xshell将文件传至Linux

安装所需依赖

安装依赖之前需要了解一些简单的linux知识:

一般来说Linux系统基本上分两大类:
RedHat系列: RedhatQ.Centos、Fedora等
Debian系列: DDebian、Ubuntu等…

Debian系列:

  • 常见的安装包格式rpm包、安装rpm包的命令: rpm-参数。
  • 包管理工具yum
  • 支持tar包

Debian系列:

  • 常见的安装包格式deb包、安装rpm包的命令: deb-参数。
  • 包管理工具apt-get
  • 支持tar包

不同的系统使用的包管理工具不同,需要注意。
我就是在Ubuntu中使用yum包管理工具导致报错。
There are no enabled repos. Run “yum repolist all“ to see the repos you have.

言归正传 安装nginx所需依赖都有:

  • gcc
  • pcre-devel
  • openssl-devel
  • zlib-devel
# 安装gcc
apt-get install gcc
#安装 pcre
apt-get install libpcre3 libpcre3-dev
#安装zlib-devel
apt-get install zlib1g zlib1g-dev
#安装openssl-deve
# ubuntu14.04的仓库中没有发现openssl-dev,由下面openssL和Libssl-dev替代
#apt-get instaLl openssl openssl-dev
sudo apt-get install openssl
sudo apt-get install libssl-dev

安装nginx

1.解压 nginx

 tar -xvf nginx-1.12.2.tar.gz

2.进入解压后的目录会有一个configure文件,输入

 ./configure 

3.编译

make && make install

启动nginx

先进入目录 /usr/local/nginx/sbin/nginx(要root权限下进入),执行

 ./nginx

然后浏览器访问自己服务器的ip+80端口
出现下面的界面就是启动成功了:
在这里插入图片描述

三、nginx的基本操作

1、基本命令
注意: 使用nginx操作命令前提条件,必须进入到nginx的目录。
在这里插入图片描述

# 查看版本号
./nginx -v
# 启动nginx
./nginx
# 关闭nginx
./nginx -s stop
# 重新加载nginx(修改配置文件使其生效)
./nginx -s reload

2、配置文件
nginx的配置文件在nginx目录下的conf目录,全名为nginx.conf
nginx的配置文件由三部分组成

全局块
从配置文件开始到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令

比如配置
worker_processes 1;
这是nginx服务器并发处理服务的关键配置,它的值越大,可以支持的并发处理量
也越多,但是会受到硬件、软件等设备的制约。

events块
events块涉及的指令主要影响nginx服务器与用户的网络连接,常用的设置包括是否开启对多 work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个work process可以同时支持的最大连接数等

比如配置
worker_connections 1024;
支持的最大连接数为1024,这部分配置对于nginx的性能影响较大,
在实际中应灵活配置

http块
这是nginx配置中最频繁的一部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里,需要注意的是,http块包括http全局块、server块

http全局块
这部分包括文件引入,MIME-TYPE定义,日志自定义、连接超时时间、单链接请求数上限等。

server块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了 节省互联网服务器硬件成本。每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
全局 server 块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。
比如配置,代表监听80端口,服务名称为localhost

 listen  			  80;
 server_name  localhost;

location 块
一个 server 块可以配置多个 location 块。这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称 (也可以是IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。 地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

#比如配置
location /{
	root    html;
	index   index.html main.html
}

四、nginx实例配置

1.反向代理

准备工作
安装tomcat
1 在linux系统安装tomcat,使用默认端口8080

2.将tomcat的压缩包放到/usr/src目录下(可以使用Xshell工具通过拖动的方式来上传)

3.进入目录,将tomcat解压,命令:tar -xvf 压缩包名称,启动tomcat:进入tomcat目录,有一个startup.sh,执行命令:./startup.sh,启动成功后会看到 Tomcat started的提示,也可以通过日志查看启动效果,进入到 logs 目录下,输入命令:tail -f catalina.out 即可查看

实例实现-1
实现的效果为,在浏览器地址输入 www.123.com 就跳转到linux系统的tomcat主页面中

步骤1:配置域名
先在C:\Windows\System32\drivers\etc目录下配置自己的域名
在这里插入图片描述
步骤2:nginx请求转发的配置

进入到nginx的配置文件,进行配置

在这里插入代码片server {
	#监听端口
	listen 	   80;
	#监听ip
	server_name 192.168.16.168;
	
	location / {
		root html;
		#代理的目标地址
		proxy_pass http://127.0.0.1:8080;
		index index.html main.html;
	}
}

修改后保存(esc键 :wq),并运行nginx:./nginx
验证是否生效

输入www.123.com,如果来到了tomcat的主页面,则是成功了
在这里插入图片描述

实例实现-2
实现效果为,使用nginx反向代理,根据访问的路径跳转到不同端口的服务中,nginx监听的端口为9001,例如访问http://192.168.16.168:9001/edu/ 直接跳转到127.0.0.1:8080,访问http://192.168.16.168:9001/vod/ 直接跳转到127.0.0.1:8081

准备工作
准备两个tomcat服务器
与上文同理再次下载并安装一个tomcat,并在配置文件中将其监听的端口号改为8081;

准备文件夹和测试页面
在端口为8080的tomcat的目录下,再进入到webapps目录,创建文件夹edu,随便拖进来一个html(可以区别两个端口接口),同样的,在8081的tomcat目录下做同样操作,操作完后访问,如能访问进行下一步.
在这里插入图片描述
nginx配置
进入到nginx的配置文件,开始配置

server {
        listen       9001;#监听端口号
        server_name       192.168.147.128;

        location ~ /edu/ {  #表示路径中包含/eud/
        	#代理的目标地址
            proxy_pass  http://127.0.0.1:8080;
        }
        location ~ /vod/ {
            proxy_pass  http://127.0.0.1:8081;
        }
    }

配置后保存退出 重启nginx

补充:
location指令说明
该指令用于匹配 URL。
语法如下:

= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。

~:用于表示 uri 包含正则表达式,并且区分大小写。

~*:用于表示 uri 包含正则表达式,并且不区分大小写。

^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字 符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。

测试
输入: http://192.168.147.128:9001/edu/a.html
跳转至如下网页:
在这里插入图片描述
输入: http://192.168.147.128:9001/vod/a.html
跳转至如下网页:
在这里插入图片描述

2.负载均衡

实现效果,浏览器地址栏访问:http://192.168.147.128/edu/cs.html,负载均衡效果,平均到8080端口和8081端口中

准备工作
操作和上面一样

准备两台tomcat服务器,一台8080,一台8081,前面已经准备过了
在两台tomcat服务器的webapps目录中,创建名称是edu的文件夹,再创建html页面(用于区分)。

nginx配置

upstream myserver {
	server 192.168.147.128:8080;
	server 192.168.147.128:8081;
}
server {
	listen 	   80;
	server_name 192.168.147.128;
	location / {
		#代理的目标地址就是我们前面配置的myserver
		proxy_pass http://myserver;
	}
}

测试
访问192.168.147.128后跳出以下界面,点击刷新 就会在两个界面之间轮询即为成功
在这里插入图片描述
在这里插入图片描述
nginx负载均衡策略
在这里插入图片描述
1.轮询:
最基本的配置方法,上面的例子就是轮询的方式,它是upstream模块默认的负载均衡默认策略。每个请求会按时间顺序逐一分配到不同的后端服务器。

2.weigh(权重)
默认值为1,权重越高的被分配的机会越大,被请求的次数也越多(成正比)
示例配置如下:

upstream myserver {
	server 192.168.16.168:8881 weight=3;
	server 192.168.16.168:9991 weight=5;	
}

3.ip_hash
指定负载均衡器按照基于客户端IP的分配方式,这个方法确保了相同的客户端的请求一直发送到相同的服务器,以保证session会话。这样每个访客都固定访问一个后端服务器,可以解决session不能跨服务器的问题。

upstream myserver {
	ip_hash
	server 192.168.16.168:8080;
	server 192.168.16.168:8081;
}

详情请见:https://www.cnblogs.com/1214804270hacker/p/9325150.html

3.动静分离

准备静态资源
在我们的服务器中创建文件夹data,在data目录下在创建两个文件夹(html和img),放一些静态资源

nginx配置

server {
        listen       80;
        server_name  192.168.147.128;
        
        location /www/ {
            root  /data/;
            index index.html index.htm;
        }
        
        location /image/ {
            root /data/;
            autoindex    on;
        }

测试
在这里插入图片描述

在这里插入图片描述

五、Nginx基本原理

1.master&worker机制

nginx 启动后,由两个进程组成,一个是master(管理者),一个是worker(工作者)
一个nginx:master只有一个,worker可以有多个,master的工作包括:接受信号,将信号分发给worker进程,监听worker进程工作状态,当worker进程退出时(非正常),启动新的worker进程可以通过命令查看相关进程。

ps -ef | grep nginx

在这里插入图片描述
master就相当于领导,不做实质工作,只分配工作,worker是员工,负责处理工作,当一个请求进来,master进行管理,worker通过争抢的方式去获取请求,图示:
在这里插入图片描述
在这里插入图片描述

2.master&worker机制的优势

1.首先,对于每个 worker 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多

2.可以使用 nginx –s reload 热部署(不需要停机,边工作,边加载新的配置),利用 nginx 进行热部署操作

3.其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快启动新的 worker 进程

3.相关问题

worker的数量:
Nginx 同 redis 类似都采用了 io 多路复用机制,每个 worker 都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话下。每个 worker 的线程可以把一个 cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu 数相等是最为适宜的。设少了会浪费 cpu,设多了会造成 cpu 频繁切换上下文带来的损耗

连接数worker_connection:
发送一个请求需要占用两个或者四个worker,静态资源为两个(一来一回),动态资源(服务器)为四个(nginx还要去访问tomcat等服务器,拿到信息后返回,占用两个)

nginx支持的最大并发数
nginx 有一个 master,有四个 woker,每个 woker 支持最大的连接数 1024,支持的最大并发数是多少?

普通的静态访问 最大并发数是: worker_connections * worker_processes / 2

而如果是 HTTP 作为反向代理来说,最大并发数量应该是 worker_connections * worker_processes / 4

这个值是表示每个 worker 进程所能建立连接的最大值,所以,一个 nginx 能建立的最大连接 数,应该是 worker_connections * worker_processes。

当然,这里说的是最大连接数,对于 HTTP 请 求 本 地 资 源 来 说 , 能 够 支 持 的 最 大 并 发 数 量 是 worker_connections * worker_processes,如果是支持 http1.1 的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是: worker_connections * worker_processes / 2,

而如果是 HTTP 作 为反向代理来说,最大并发数量应该worker_connections * worker_processes / 4。

因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值