Nginx安装与应用
1.1 Nginx介绍
Nginx 是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强
Nginx可以作为静态页面的web服务器,同时还支持CGI协议的动态语言,比如perl、php等。但是不支持java。Java程序只能通过与tomcat配合完成。Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率 ,能经受高负载的考验,有报告表明能支持高达 50,000个并发连接数。
Nginx概述 https://lnmp.org/nginx.html
netcraft统计排名 https://news.netcraft.com/archives/category/web-server-survey/
1.1.1 Nginx优点
- Nginx 可以在大多数 UnixLinux OS 上编译运行,并有 Windows 移植版。 Nginx 的1.4.0稳定版已经于2013年4月24日发布,一般情况下,对于新建站点,建议使用最新稳定版作为生产版本。
- Nginx 是一个很强大的高性能Web和反向代理服务器
- 连接高并发:Nginx能够支持高达 50,000 个并发连接数的响应
1.1.2 为什么使用Nginx
用单机tomcat搭建的网站,在比较理想的状态下能够承受的并发访问量在150到200左右。按照并发访问量占总用户数量的5%到10%这样计算,单点tomcat网站的用户人数在1500到4000左右。对于一个为全国范围提供服务的网站显然是不够用的,为了解决这个问题引入了负载均衡方法。负载均衡就是一个web服务器解决不了的问题可以通过多个web服务器来平均分担压力来解决,并发过来的请求被平均分配到多个后台web服务器来处理,这样压力就被分解开来。
负载均衡服务器分为两种:一种是通过硬件实现的负载均衡服务器,简称硬负载。另一种是通过软件来实现的负载均衡,简称软负载:例如apache和nginx。硬负载和软负载相比前者作用的网络层次比较多可以作用到socket接口的数据链路层对发出的请求进行分组转发但是价格成本比较贵,而软负载作用的层次在http协议层之上可以对http请求进行分组转发并且因为是开源的所以几乎是0成本,并且阿里巴巴,京东等电商网站使用的都是Nginx服务器。
1.1.3 正向代理
Nginx不仅可以做反向代理,实现负载均衡。还能用作正向代理来进行上网等功能。
**正向代理:**如果把局域网外的Internet想象成一个巨大的资源库,则局域网中的客户端要访问Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。
一般情况下,如果没有特别说明,代理技术默认说的是正向代理技术。
关于正向代理的概念如下: 正 向代理(forward)是一个位于客户端【用户A】和原始服务器(origin server)【服务器B】之间的服务器【代理服务器Z】,为了从原始服务器取得内容,用户A向代理服务器Z发送一个请求并指定目标(服务器B),然后代理服务器Z向服务器B转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。
所谓的正向代理就是代理服务器替代访问方【用户A】去访问目标服务器【服务器B】
这就是正向代理的意义所在。而为什么要用代理服务器去代替访问方【用户A】去访问服务器B呢?这就要从代理服务器使用的意义说起。
使用正向代理服务器作用主要有以下几点:
① 访问本无法访问的服务器B
我们抛除复杂的网络路由情节来看图,假设图中路由器从左到右命名为R1,R2假 设最初用户A要访问服务器B需要经过R1和R2路由器这样一个路由节点,如果路由器R1或者路由器R2发生故障,那么就无法访问服务器B了。但是如果用户 A让代理服务器Z去代替自己访问服务器B,由于代理服务器Z没有在路由器R1或R2节点中,而是通过其它的路由节点访问服务器B,那么用户A就可以得到服 务器B的数据了。现实中的例子就是“翻墙”。
② 加速访问服务器B
上图,防火墙作为网关,用来过滤外网对其的访问。假设用户A和用户B都设置了代理服务器,用户A允许访问互联网,而用户B不允许访问互联网(这个在代理服 务器Z上做限制)这样用户A因为授权,可以通过代理服务器访问到服务器B,而用户B因为没有被代理服务器Z授权,所以访问服务器B时,数据包会被直接丢 弃。
③隐藏访问者的行踪
如下图 ,我们可以看出服务器B并不知道访问自己的实际是用户A,因为代理服务器Z代替用户A去直接与服务器B进行交互。
正向代理是一个位于客户端和原始服务器(originserver)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内 容返回给客户端。客户端必须设置正向代理服务器,当然前提是要知道正向代理服务器的IP地址,还有代理程序的端口。
总之一句话:正向代理,隐藏的是客户端
1.1.4 反向代理
**反向代理:**其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
反向代理正好与正向代理相反,对于客户端而言代理服务器就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端。
使用反向代理服务器的作用如下:
用户A始终认为它访问的是原始服务器B而不是代理服务器Z,但实用际上反向代理服务器接受用户A的应答,从原始资源服务器B中取得用户A的需求资源,然后发送给用户A。由于防火墙的作用,只允许代理服务器Z访问原始资源服务器B。尽管在这个虚拟的环境下,防火墙和反向代理的共同作用保护了原始资源服务器B,但用户A并不知情。
总之一句话:反向代理,隐藏的是服务器
1.1.5 没有负载均衡
客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,再将结果返回给客户端。
这种架构模式对于早期的系统相对单一,并发请求相对较少的情况下是比较适合的,成本也低。但是随着信息数量的不断增长,访问量和数据量的飞速增长,以及系统业务的复杂度增加,这种架构会造成服务器相应客户端的请求日益缓慢,并发量特别大的时候,还容易造成服务器直接崩溃。很明显这是由于服务器性能的瓶颈造成的问题,那么如何解决这种情况呢?
我们首先想到的可能是升级服务器的配置,比如提高CPU执行频率,加大内存等提高机器的物理性能来解决此问题,硬件的性能提升已经不能满足日益提升的需求了。最明显的一个例子,天猫双十一当天,某个热销商品的瞬时访问量是极其庞大的,那么类似上面的系统架构,将机器都增加到现有的顶级物理配置,都是不能够满足需求的。那么怎么办呢?
上面的分析我们去掉了增加服务器物理配置来解决问题的办法,也就是说纵向解决问题的办法行不通了,那么横向增加服务器的数量呢?这时候集群的概念产生了,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。
1.1.6 负载均衡
当反向代理服务器不止一个的时候,我们甚至可以把它们做成集群,当更多的用户访问资源服务器B的时候,让不同的代理服务器Z(x)去应答不同的用户,然后发送不同用户需要的资源。
当然反向代理服务器像正向代理服务器一样拥有CACHE的作用,它可以缓存原始资源服务器B的资源,而不是每次都要向原始资源服务器B请求数据,特别是一些静态的数据,比如图片和文件,如果这些反向代理服务器能够做到和用户X来自同一个网络,那么用户X访问反向代理服务器X,就会得到很高质量的速度。如下图
2.1 Nginx安装
官方网站:http://nginx.org/
2.1.1 windows下安装
下载双击nginx.exe启动,访问 localhost:80
2.1.2 linux下安装
下载
2.1.2.1 安装pcre
1、安装环境
//安装gcc
yum install gcc-c++
//安装PCRE pcre-devel
yum install -y pcre pcre-devel
//安装zlib
yum install -y zlib zlib-devel
//安装Open SSL
yum install -y openssl openssl-devel
2、创建目录下载tar包
//进入usr/local目录
cd /usr/local
//创建nginx目录
mkdir nginx
//进入nginx目录
cd nginx
//下载tar包
wget http://nginx.org/download/nginx-1.24.0.tar.gz
//解压tar
tar -xvf nginx-1.13.7.tar.gz
3、安装nginx
//进入nginx目录
//执行命令
./configure
//执行make命令(要是执行不成功请检查最开始安装的四个有没有安装成功)
make
//执行make install命令
make install
4、启动nginx
//进入/usr/local/nginx/sbin目录,输入./nginx即可启动nginx
./nginx
//关闭nginx
./nginx -s quit 或者 ./nginx -s stop
//重启nginx
./nginx -s reload
//查看nginx进程
ps -ef|grep nginx
2.1.3 docker镜像安装
#拉取nginx镜像
docker pull nginx
#创建目录存放nginx.conf(复制来的),docker挂载该文件启动
#1.创建html文件目录:
mkdir /home/nginx/www
#2.创建配置文件目录:
mkdir /home/nginx/conf
#3.创建日志存放路径:
mkdir /home/nginx/log
#复制nginx.conf到配置文件目录,根据实际相关需要做默认配置修改
#启动nginx
docker run -p 80:80 --name nginx --restart always -v /home/nginx/www:/usr/share/nginx/html -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/log:/var/log/nginx -d nginx
3.1. Nginx虚拟机配置
3.1.1 ip和端口配置
主要是在描述nginx它是一个http服务器。它是apache的一个替代品。
对于nginx虚拟机配置主要可以从三个方面入手:
- ip配置
- 域名配置
- 端口配置
它的配置主要体现在 nginx/conf/nginx.conf
3.1.2 Nginx反向代理
实现效果:使用nginx反向代理,访问 www.localhost:80.com
直接跳转到 127.0.0.1:8080
反向代理请求流程图
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 反向代理配置
upstream server_list{
# 这个是tomcat的访问路径
server localhost:8080;
}
server {
listen 80;
server_name localhost;
location / {
root html;
# 注意:如果反向代理失败,去掉下划线,直接使用serverlist;
proxy_pass http://server_list;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
双击打开tomcat ,启动tomcat ,请求的是nginx的地址,代理到tomcat 的 页面
4.1 负载均衡
4.1.1 轮询
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 反向代理配置
upstream server_list{
# 这个是tomcat的访问路径
server localhost:8080;
server localhost:9999;
}
server {
listen 80;
server_name localhost;
location / {
root html;
proxy_pass http://server_list;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
使用 两个tomcat服务 ,拷贝一个tomcat
修改 conf
文件下面的 server.xml
配置文件 , 分别修改三个端口号
<Server port="18005" shutdown="SHUTDOWN">
<Connector port="9999" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="18009" protocol="AJP/1.3" redirectPort="8443" />
修改两台 tomcat
服务器下面 webapps\ROOT\index.jsp
分别加上 标记 ,用以区分
<h1>main</h1>
<h1>back</h1>
4.2 weight 权重
# 反向代理配置
upstream server_list{
# 这个是tomcat的访问路径
server localhost:8080 weight=5;
server localhost:9999 weight=1;
}
4.3 ip_hash
每个请求按访问ip的hash值分配,这样每个访问客户端会固定访问一个后端服务器,
可以解决会话Session丢失的问题
upstream backserver {
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
不管刷新多少遍,始终访问的是同一台tomcat服务器
4.4 最少连接
web请求会被转发到连接数最少的服务器上
upstream backserver {
least_conn;
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}