一 Nginx的产生
关于Nginx的一些简介在这里就不具体解释了 百度都有的
它的产生是由于大型网站处理高并发的需要
二 负载均衡 高并发
2.1 高并发
见名知意,高(大量的),并发就是可以使用多个线程或者多个进程,同时处理(就是并发)不同的操作。
简而言之就是每秒内有多少个请求同时访问。
2.2 负载均衡
负载均衡:将请求/数据【均匀】分摊到多个操作单元上执行,负载均衡的关键在于【均匀】,也是分布式系统架构设计中必须考虑的因素之一。
下面这张是tomcat并发图
我们可以看到tomcat美妙处理300个请求的时候,tomcat已经开始不行了。
所以我们在高并发的场景下,这样实现负载均衡
三 Nginx的安装以及相关的配置
前戏已经做足了,下面开始进入正题!
3.1 Nginx的安装
安装如下依赖:gcc openssl-devel pcre-devel zlib-devel
安装命令:yum -y install gcc openssl-devel pcre-devel zlib-devel
解压文件:tar -zxvf nginx-1.8.1.tar.gz
configure配置: 进入解压后的源码目录,然后执行configure命令进行配置
配置命令:./configure --prefix=/usr/soft/nginx #prefix参数是我们指定的nginx安装的路径
注:/usr/local/nginx 是默认安装目录 所以也可以直接执行 ./configure
编译&安装: make && make install
3.2 配置Nginx为系统服务,以方便管理
1、在/etc/rc.d/init.d/目录中建立文本文件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.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
# make required directories
user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
options=`$nginx -V 2>&1 | grep 'configure arguments:'`
for opt in $options; do
if [ `echo $opt | grep '.*-temp-path'` ]; then
value=`echo $opt | cut -d "=" -f 2`
if [ ! -d "$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 $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $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 $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
3、修改nginx文件的执行权限
chmod +x nginx
4、添加该文件到系统服务中去
chkconfig --add nginx
查看是否添加成功
chkconfig --list nginx
启动,停止,重新装载
service nginx start|stop
四 负载均衡配置
4.1默认负载均衡平衡配置
http {
upstream whb{
server node02;
server node03;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://whb;
}
}
}
如果没有专门配置负载均衡方法,则默认为循环法。
所有请求都被 代理到服务器组whb,并且nginx应用HTTP负载平衡来分发请求。
4.2 加权负载平衡
通过使用服务器权重,还可以进一步影响nginx负载均衡算法,谁的权重越大,分发到的请求就越多。
upstream whb{
server node02 weight=5;
server ndoe03 weight=3;
}
4.3 最少连接负载均衡
在连接负载最少的情况下,nginx会尽量避免将过多的请求分发给繁忙的应用程序服务器,而是将新请求分发给不太繁忙的服务器,避免服务器过载。
upstream shsxt {
least_conn;
server node02;
server node03;
}
4.4 会话持久性
上述的循环或最少连接数的负载平衡方法,每个后续客户端的请求都可能被分发到不同的服务器。
不能保证相同的客户端总是定向到相同的服务器。
如果需要将客户端绑定到特定的应用程序服务器 。
换句话说,就是始终选择相同的服务器而言,就要使客户端的会话“粘滞”或“持久” 。
ip-hash负载平衡机制就是有这种特性。
使用ip-hash,客户端的IP地址将用作散列键,以确定应该为客户端的请求选择服务器组中的哪台服务器。
此方法可确保来自同一客户端的请求将始终定向到同一台服务器,除非此服务器不可用。
upstream whb{
ip_hash;
server node02;
server node03;
}
4.5 Nginx的访问控制
Nginx还可以对IP的访问进行控制,allow代表允许,deny代表禁止
location / {
deny 192.168.4.78;
allow 192.168.235.0/24;
deny all;
}
从上到下的顺序,匹配到了便跳出。
五 虚拟主机
关于对虚拟主机的概念我也不想做过多解释
其实就是VPS 不知道自行百度去吧
5.1 基于域名的虚拟主机
upstream shsxt{
server node02;
}
upstream bjsxt{
server node03;
}
#访问shsxt时会把请求导到shsxt服务器组中去
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://shsxt;
}
}
#访问bjsxt的时候会把请求导到bjsxt服务器组中去
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://bjsxt;
}
}
5.2 基于端口的虚拟主机
http {
upstream shsxt{
server node02;
}
upstream bjsxt{
server node03
}
server {
#当访问nginx的80端口时,将请求导给bjsxt组
listen 8080;
server_name localhost;
location / {
proxy_pass http://bjsxt;
}
}
server {
#当访问nginx的81端口时,将请求导给shsxt组
listen 81;
server_name localhost;
location / {
proxy_pass http://shsxt;
}
}
}
六 关于正向代理和反向代理
正向代理:
举个例子:
我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。像我们经常通过vpn访问国外的网站,此时就是正向代理。
比如翻墙:
反向代理:
是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
七 关于Nginx的session一致性的问题
如果你的网站是存放在一个机器上,那么是不存在这个问题的,因为会话数据就在这台机器,
但是如果你使用了负载均衡把请求分发到不同的机器呢?
这个时候会话id在客户端是没有问题的,但是如果用户的两次请求到了两台不同的机器,
而它的session数据可能存在其中一台机器,这个时候就会出现取不到session数据的情况,
于是session的共享就成了一个问题。
解决session的方案:
1、session复制
tomcat 本身带有复制session的功能。
2、共享session
需要专门管理session的软件,
memcached 缓存服务,可以和tomcat整合,帮助tomcat共享管理session。
3、安装memcache
安装memcached内存数据库
yum –y install memcached
启动: memcached -d -m 128m -p 11211 -l 192.168.235.113 -u root -P /tmp/
- web服务器连接memcached的jar包拷贝到tomcat的lib
- 配置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
- 修改index.jsp,取sessionid看一看
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html lang="en">
SessionID:<%=session.getId()%>
</br>
SessionIP:<%=request.getServerName()%>
</br>
<h1>tomcat1</h1>
</html>