大数据学习-Nginx章

大数据学习-Nginx章


(一) 产生背景

我们在日常生活中会遇见的一些问题:
如:大学选课、12306网站、京东、淘宝,大量用户进行访问操作时,出现的故障。

主要2大原因:

  • 巨大流量—海量的并发访问
  • 单台服务器资源和能力有限

在海量并发的环境下,用户每一次请求服务器,都需要大量的创建线程,每一次的线程都必须分配资源(CPU、内存、带宽、磁盘IO等),当资源不足的时候就会使得服务器宕机而无法提供服务。
那么如何保证网站在流量峰值时能够顺利运作???

(二) 负载均衡(Load Balance)

2-1、高并发

见名知意,高(大量的),并发就是可以使用多个线程或者多个进程,同时处理(就是并发)不同的操作。
简而言之就是每秒内有多少个请求同时访问。

2-2、负载均衡

将请求/数据【均匀】分摊到多个操作单元上执行,负载均衡的关键在于【均匀】,也是分布式系统架构设计中必须考虑的因素之一。

2-3、tomcat并发图

在这里插入图片描述
有tomcat的并发测试图可以发现,当每秒300个请求同时访问tomcat时,tomcat已经开始承受不住,出现波动。
那么大型网站是如何处理高并发的呢?
以下是高并发场景下,实现负载均衡的一个简化图。
在这里插入图片描述
只需要实现“将请求/数据 均匀分摊到多个操作单元上执行”,就能实现负载均衡。

(三) Nginx初探

3-1、什么是Nginx?

Nginx是一款轻量级的Web 服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。
由俄罗斯的程序设计师Igor Sysoev所开发,其特点是占有内存少并发能力强,nginx的并发能力确实在同类型的网页服务器中表现非常好。

  • 官方测试nginx能够支撑5万并发链接,并且CPU、内存等资源消耗却非常低,运行非常稳定。

(四) Nginx 和 apache 的优缺点

4-1.nginx相对于apache的优点:

  • 轻量级
  • 同样起web 服务,比apache 占用更少的内存及资源高并发
  • nginx 处理请求是异步非阻塞(如前端ajax)的,而apache 则是阻塞型的
  • 在高并发下nginx能保持低资源低消耗高性能高度模块化的设计
  • 编写模块相对简单
  • 还有,它社区活跃,各种高性能模块出品迅速(十几年时间发展)
  • Nginx 配置简洁, Apache 复杂

4-2.apache 相对于nginx 的优点:

  • Rewrite重写 ,比nginx 的rewrite 强大模块超多
  • 基本想到的都可以找到少bug ,nginx 的bug 相对较多。(出身好起步高)

(五) Nginx安装

5-1、安装依赖

依赖 gcc openssl-devel pcre-devel zlib-devel
执行命令:

yum -y install gcc openssl-devel pcre-devel zlib-devel

在这里插入图片描述

5-2、解压文件

下载文件(如nginx-1.8.1.tar.gz 或 tengine-2.1.0.tar.gz),通过Xftp,上传到服务器,将文件解压
解压指令 :

tar -zxvf tengine-2.1.0.tar.gz

在这里插入图片描述

5-3、configure配置

进入解压后的源码目录,然后执行configure命令进行配置
在这里插入图片描述
./configure --prefix=/usr/soft/nginx
这里我是直接 执行 ./configure
默认路径生成
在这里插入图片描述

5-4、编译并安装

进入解压后的源码目录,然后执行 make && make install 命令进行配置

make && make install

在这里插入图片描述
安装好后,会在默认路径下生成nginx目录(也可在configure时指定路径),这个目录就是nginx的软件了。
在这里插入图片描述

5-5、nginx命令

配置Nginx为系统服务,以方便管理

  1. 在/etc/rc.d/init.d/目录中建立文本文件nginx

    cd /etc/rc.d/init.d/
    vim nginx
    

    在这里插入图片描述

  2. 在文件中粘贴下面的内容:

#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/nginx.pid

# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ “KaTeX parse error: Expected 'EOF', got '&' at position 22: …KING" = "no" ] &̲& exit 0 nginx=…(basename KaTeX parse error: Expected 'EOF', got '&' at position 87: …config/nginx ] &̲& . /etc/syscon…nginx -V 2>&1 | grep ‘configure arguments:’`
for opt in $options; do
if [ `echo $opt | grep ‘.*-temp-path’` ]; then
value=`echo KaTeX parse error: Can't use function '\`' in math mode at position 22: …cut -d "=" -f 2\̲`̲ if …value” ]; then
# echo “creating” $value
mkdir -p $value && chown -R $user $value
fi
fi
done
}
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c N G I N X C O N F F I L E r e t v a l = NGINX_CONF_FILE retval= ?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc p r o g Q U I T r e t v a l = prog -QUIT retval= ?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
sleep 1
start
}
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc n g i n x H U P R E T V A L = nginx -HUP RETVAL= ?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case “$1” in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $“Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}”
exit 2
esac

  1. 修改nginx文件的执行权限

    chmod +x nginx
    
  2. 添加该文件到系统服务中去

    chkconfig --add nginx
    

    查看是否添加成功

    chkconfig --list nginx
    
  3. 启动,停止,重新装载

    service nginx start|stop
    

(六) Nginx配置

6-1、nginx默认配置详解

在这里插入图片描述

#进程数,建议设置和CPU个数一样或2倍
worker_processes 2;
#日志级别
error_log logs/error.log warning;(默认error级别)
# nginx 启动后的pid 存放位置
#pid logs/nginx.pid;
events {
#配置每个进程的连接数,总的连接数= worker_processes * worker_connections
#默认1024
worker_connections 10240;
}
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.php index.html index.htm; #定义首页索引文件的名称
}
#定义错误提示页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

在这里插入图片描述

6-2、负载均衡配置:

nginx支持以下负载均衡机制(或​​方法):

  1. 轮询负载均衡 - 对应用程序服务器的请求以循环方式分发
  2. 加权负载均衡
  3. 最少连接数 - 将下一个请求分配给活动连接数最少的服务器
  4. ip-hash - 哈希函数用于确定下一个请求(基于客户端的IP地址)应该选择哪个服务器。

6-2-1、默认负载平衡配置

使用nginx进行负载平衡的最简单配置可能如下所示:

http { 
	    upstream qiaoke{
	        server node02;
	        server node03;
        }

        server {
	        listen 80;
	        server_name  localhost;
	        location / {
	            proxy_pass http://qiaoke;
	        }
        }
}

运行相同应用程序的3个实例。如果没有专门配置负载均衡方法,则默认为循环法。所有请求都被 代理到服务器组qiaoke,并且nginx应用HTTP负载平衡来分发请求。

6-2-2、加权负载平衡

通过使用服务器权重,还可以进一步影响nginx负载均衡算法,谁的权重越大,分发到的请求就越多。
权重范围:1-10 ,默认权重为1

upstream qiaoke {
    server node02 weight=3;
	server node03;
}

6-2-3、最少连接负载平衡

在连接负载最少的情况下,nginx会尽量避免将过多的请求分发给繁忙的应用程序服务器,而是将新请求分发给不太繁忙的服务器,避免服务器过载。

upstream qiake {
    least_conn;
    server node02;
	server node03;
}

6-2-4、会话持久性

上述的循环或最少连接数的负载平衡方法,每个后续客户端的请求都可能被分发到不同的服务器。不能保证相同的客户端总是定向到相同的服务器。
如果需要将客户端绑定到特定的应用程序服务器 - 换句话说,就是始终选择相同的服务器而言,就要使客户端的会话“粘滞”或“持久” 。
ip-hash负载平衡机制就是有这种特性。使用ip-hash,客户端的IP地址将用作散列键,以确定应该为客户端的请求选择服务器组中的哪台服务器。此方法可确保来自同一客户端的请求将始终定向到同一台服务器,除非此服务器不可用

upstream shsxt{
    ip_hash;
    server node02;
	server node03;
}

6-3、Nginx的访问控制

Nginx还可以对IP的访问进行控制,allow代表允许,deny代表禁止。

location / {
	deny 192.168.4.242;
	allow 192.168.78.0/24;
	deny all;
	proxy_pass http://qiaoke;
}

从上到下的顺序,匹配到了便跳出。如上的例子先禁止了1个,接下来允许了1个网段,最后未匹配的IP全部禁止访问。

(七)、虚拟主机

7-1、何为虚拟主机

虚拟主机是指在网络服务器上分出一定的磁盘空间,用户可以租用此部分空间,以供用户放置站点及应用组件,提供必要的数据存放和传输功能。

说白了虚拟主机就是把一台物理服务器划分成多个“虚拟”的服务器,各个虚拟主机之间完全独立,在外界看来,每一台虚拟主机和一台单独的主机的表现完全相同。所以这种被虚拟化的逻辑主机被形象地称为“虚拟主机”。

优点:

由于多台虚拟主机共享一台真实主机的资源,每个虚拟主机用户承受的硬件费用、网络维护费用、通信线路的费用均大幅度降低。许多企业建立网站都采用这种方法,这样不仅大大节省了购买机器和租用专线的费用,网站服务器服务器管理简单,诸如软件配置、防病毒、防攻击等安全措施都由专业服务商提供,大大简化了服务器管理的复杂性;同时也不必为使用和维护服务器的技术问题担心,更不必聘用专门的管理人员。

类别:
  1. 基于域名的虚拟主机,通过域名来区分虚拟主机
  2. 基于端口的虚拟主机,通过端口来区分虚拟主机
  3. 基于ip的虚拟主机,很少用

7-2、基于域名的虚拟主机

http { 
    upstream qiaoke01{ 
        server node02; 
	} 
	upstream qoake02{ 
        server node03; 
     } 
 	server { 
        listen 80; 
		#访问 qiaoke01.com 的时候,会把请求导到 qiaoke01 的服务器组里
		server_name  qiaoke01.com;
	        location / {
	            proxy_pass http://qiaoke01;
	    }
	} 
    server { 
        listen 80; 
		#访问 qiake02.com 的时候,会把请求导到 qoake02 的服务器组里
		server_name  qoake02.com; 
	        location / {
	            proxy_pass http://qoake02;
	     }
	} 
}

注意:基于域名的虚拟机主机 在模拟应用场景时,需要在windows系统的hosts文件里配置域名映射。(C:\Windows\System32\drivers\etc\hosts)
在这里插入图片描述

启动nginx后,分别访问qiake01.com ,qiaoke02.com
可看出,访问不同域名,访问的是对应的tomcat服务。

7-3、基于端口的虚拟主机

http { 
    upstream qiaoke01{ 
        server node02; 
	} 
	upstream qoake02{ 
        server node03; 
     } 
 	server { 
 	    #当访问nginx的80端口时,将请求导给qiaoke01组
        listen 80; 
		server_name  localhost;
	        location / {
	            proxy_pass http://qiaoke01;
	    }
	} 
    server { 
       #当访问nginx的81端口时,将请求导给qoake02组
        listen 81; 
		server_name  localhost; 
	        location / {
	            proxy_pass http://qoake02;
	     }
	} 
}

通过不同端口访问,访问的是对应tomcat服务

(九)Nginx的session的一致性问题

http协议是无状态的,即你连续访问某个网页100次和访问1次对服务器来说是没有区别对待的,因为它记不住你。

那么,在一些场合,确实需要服务器记住当前用户怎么办?比如用户登录邮箱后,接下来要收邮件、写邮件,总不能每次操作都让用户输入用户名和密码吧,为了解决这个问题,session的方案就被提了出来,事实上它并不是什么新技术,而且也不能脱离http协议以及任何现有的web技术。

session的常见实现形式是会话cookie(session cookie),即未设置过期时间的cookie,这个cookie的默认生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。

9-1、Session共享

首先我们应该明白,为什么要实现共享,如果你的网站是存放在一个机器上,那么是不存在这个问题的,因为会话数据就在这台机器,但是如果你使用了负载均衡把请求分发到不同的机器呢?这个时候会话id在客户端是没有问题的,但是如果用户的两次请求到了两台不同的机器,而它的session数据可能存在其中一台机器,这个时候就会出现取不到session数据的情况,于是session的共享就成了一个问题。

9-2、Session一致性解决方案

  1. session复制

tomcat 本身带有复制session的功能。

  1. 共享session

需要专门管理session的软件,
memcached 缓存服务,可以和tomcat整合,帮助tomcat共享管理session。

9-3、安装memcached

  1. 安装memcached内存数据库

    yum install memcached –y
    

在这里插入图片描述
启动指令:

 memcached -d -m 128m -p 11211 -l "memcached服务器IP" -u root -P /tmp/

在这里插入图片描述

  1. web服务器连接memcached的jar包拷贝到tomcat的lib
    在这里插入图片描述

  2. 配置tomcat的conf目录下的context.xml

<Manager className=“de.javakaffee.web.msm.MemcachedBackupSessionManager”
memcachedNodes=“n1:192.168.17.9:11211”
sticky=“true”
lockingMode=“auto”
sessionBackupAsync=“false”
requestUriIgnorePattern=".*.(ico|png|gif|jpg|css|js)$"
sessionBackupTimeout=“1000” transcoderFactoryClass=“de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory” />

配置memcachedNodes属性,配置memcached数据库的ip和端口,默认11211,多个的话用逗号隔开。
目的是为了让tomcat服务器从memcached缓存里面拿session或者是放session
在这里插入图片描述

  1. 修改index.jsp,取sessionid看一看

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/fg19941101/article/details/85634304