Nginx 简介
什么是 Nginx
Nginx 是一款高性能的 HTTP 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师 Igor Sysoev 所开发,官方测试 Nginx 能够支支撑 5 万并发链接,并且 CPU、内存等资源消耗却非常低,运行非常稳定。
Nginx 的应用场景
- HTTP 服务器:Nginx 是一个 HTTP 服务可以独立提供 HTTP 服务。可以做网页静态服务器。
- 虚拟主机:可以实现在一台服务器虚拟出多个网站。例如个人网站使用的虚拟主机。
- 反向代理,负载均衡:当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用 Nginx 做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况
Nginx 惊群问题
在建立连接的时候,Nginx处于充分发挥多核CPU架构性能的考虑,使用了多个worker子进程监听相同端口的设计,这样多个子进程在accept建立新连接时会有争抢,这会带来著名的“惊群”问题,子进程数量越多越明显,这会造成系统性能的下降。
一般情况下,有多少CPU核心就有配置多少个worker子进程。假设现在没有用户连入服务器,某一时刻恰好所有的子进程都休眠且等待新连接的系统调用(如epoll_wait),这时有一个用户向服务器发起了连接,内核在收到TCP的SYN包时,会激活所有的休眠worker子进程。最终只有最先开始执行accept的子进程可以成功建立新连接,而其他worker子进程都将accept失败。这些accept失败的子进程被内核唤醒是不必要的,他们被唤醒会的执行很可能是多余的,那么这一时刻他们占用了本不需要占用的资源,引发了不必要的进程切换,增加了系统开销。
简单的说:就比如你去KTV唱歌,KTV晚上刚上班,你一进去就要叫小姐陪唱,老板一下就叫了好多个小姐姐过来,但是你只需要一个,所以这就造成了没必要的浪费。
Nginx 反向代理
什么是代理服务器?
代理服务器,客户机在发送请求时,不会直接发送给目的主机,而是先发送给代理服务器,代理服务接受客户机请求之后,再向主机发出,并接收目的主机返回的数据,存放在代理服务器的硬盘中,再发送给客户机。
为什么要使用代理服务器?
提高访问速度
由于目标主机返回的数据会存放在代理服务器的硬盘中,因此下一次客户再访问相同的站点数据时,会直接从代理服务器的硬盘中读取,起到了缓存的作用,尤其对于热门站点能明显提高请求速度。
防火墙作用
由于所有的客户机请求都必须通过代理服务器访问远程站点,因此可在代理服务器上设限,过滤某些不安全信息。
通过代理服务器访问不能访问的目标站点
互联网上有许多开放的代理服务器,客户机在访问受限时,可通过不受限的代理服务器访问目标站点,通俗说,我们使用的翻墙浏览器就是利用了代理服务器,虽然不能出国,但也可直接访问外网。
什么是正向代理?
正向代理,架设在客户机与目标主机之间,只用于代理内部网络对 Internet 的连接请求,客户机必须指定代理服务器,并将本来要直接发送到 Web 服务器上的 Http 请求发送到代理服务器中。
什么是反向代理?
反向代理服务器架设在服务器端,通过缓冲经常被请求的页面来缓解服务器的工作量,将客户机请求转发给内部网络上的目标服务器;并将从服务器上得到的结果返回给 Internet 上请求连接的客户端,此时代理服务器与目标主机一起对外表现为一个服务器。
反向代理有哪些主要应用?
现在许多大型 web 网站都用到反向代理。除了可以防止外网对内网服务器的恶性攻击、缓存以减少服务器的压力和访问安全控制之外,还可以进行负载均衡,将用户请求分配给多个服务器。
下载Windows版本的Nginx:http://nginx.org/en/download.html
Linux下使用Docker容器安装:docker pull nginx
注意:在Linux或者Windows下实现负载均衡和反向代理的方式基本相同都是更改nginx的nginx.conf配置文件
需求
- 两个 tomcat 服务通过 nginx 反向代理
- tomcat1 服务器:192.168.88.136:9090
- tomcat2 服务器:192.168.88.136:9091
1、运行两个tomcat容器(我这里使用docker容器启动)
docker run --name tomcat1 -p 9090:8080 -d tomcat
docker run --name tomcat2 -p 9091:8080 -d tomcat
2、编辑nginx.conf配置文件(windows版本的)
3、复制以下代码
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 配置一个代理即 tomcat1 服务器
upstream tomcatServer1 {
server 192.168.88.136:9090;
}
# 配置一个代理即 tomcat2 服务器
upstream tomcatServer2 {
server 192.168.88.136:9091;
}
# 配置一个虚拟主机
server {
listen 80;
server_name localhost;
location / {
# 域名 localhost 的请求全部转发到https://www.baidu.com/服务上
proxy_pass https://www.baidu.com/;
# 欢迎页面,按照从左到右的顺序查找页面
index index.jsp index.html index.htm;
}
}
server {
listen 80;
server_name localhost;
location / {
# 域名 admin.web.itoken.funtl.com 的请求全部转发到 tomcatserver2 即 tomcat2 服务上
proxy_pass https://www.google.com/;
index index.jsp index.html index.htm;
}
}
}
一个server就是一个虚拟主机,可以配置多个
4、浏览器输入localhost
出现百度页面就说明反向代理配置成功
(这里只是一个例子,在实际开发中域名用自己,转发页面自己指定)
Nginx负载均衡一些基础知识:
nginx 的 upstream目前支持 5 种方式的分配
1)、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2)、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
比如:
# 配置一个代理即 tomcat1 服务器
upstream tomcatServer1 {
server 192.168.88.136:9090 weight=2;
}
# 配置一个代理即 tomcat2 服务器
upstream tomcatServer2 {
server 192.168.88.136:9091 weight=1;
}
3)、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
4)、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
5)、url_hash(第三方)
Nginx 负载均衡
什么是负载均衡
负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
负载均衡,英文名称为 Load Balance,其意思就是分摊到多个操作单元上进行执行,例如 Web 服务器、FTP 服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
Nginx 实现负载均衡
- tomcat1 服务器:192.168.88.136:9090
- tomcat2 服务器:192.168.88.136:9091
1、编辑nginx.conf
配置文件(windows版本的)
2、复制以下代码到nginx.conf
中
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 配置一个代理即 mytomcat 服务器
upstream mytomcat {
server 192.168.88.136:9090;
server 192.168.88.136:9091;
}
# 配置一个虚拟主机
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://mytomcat;
# 欢迎页面,按照从左到右的顺序查找页面
index index.jsp index.html index.htm;
}
}
}
3、启动nginx,浏览器访问localhost
nginx会轮询访问tomcat服务器:192.168.88.136:9090
和192.168.88.136:9091
这样就实现了负载均衡
如果想指定轮询几率修改nginx.conf文件(9090端口的tomcat优先级更高):
# 配置一个代理即 mytomcat 服务器
upstream mytomcat {
server 192.168.88.136:9090 weight=2;
server 192.168.88.136:9091 weight=1;
}