一、Nginx产生背景
巨大流量海量并发的访问
单台服务器资源和能力有限
二、负载均衡
1、高并发
每秒内多个请求访问,需要同时处理大量线程进程
2、负载均衡
将请求/数据均匀的分摊到多个操作单元上执行
3、高并发处理
每台tomcat的并发量在200到250之间,因此在并发量高时,需要添加tomcat数量,为保证每台tomcat负载量合理时,需要负载均衡。
常见互联网分布式架构:客户端层,反向代理层,站点层,服务层,数据层。
将请求的数据均匀分摊到多个操作单元上执行,则可实现负载均衡。
三、nginx
1、什么是nginx
nginx是一款轻量级的web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,特点是占用内存少,并发能力强。
官方测试nginx能够支持5万并发连接,并且CPU、内存等资源消耗非常低,运行稳定。
2、nginx优缺点对比
nginx:
为轻量级
占用资源内存少
处理请求为异步非阻塞(例如ajax)
在高并发下nginx能保持低资源,低消耗高性能,高度模块化的设计,编写模块相对简单
配置简洁,Apache配置复杂
apache:
Rewrite重写,相比nginx的rewrite强大模块超多
相比nginx,bug少
四、nginx的使用
1、安装相关依赖
[root@node2 bin]# yum -y install gcc openssl-devel pcre-devel zlib-devel
2、下载enginx,我们使用阿里的Tengine
下载地址:http://tengine.taobao.org/download_cn.html
同时解压缩
3、安装nginx
进入tengine解压后目录,执行:
.configure //此时安装在默认目录/usr/local/nginx
//也可以指定安装目录
./configure --prefix=/usr/soft/nginx
之后执行如下,进行安装
make && make install
4、为方便管理,将nginx添加至系统服务中
cd /etc/rc.d/init.d/ //进入如下目录
新建nginx文本,将如下文本拷贝其中
#!/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
修改nginx文件的执行权限
chmod +x nginx
添加该文件至系统服务中
chkconfig --add nginx
chkconfig --list nginx //查看是否添加成功
此时nginx安装配置完毕可直接输入命令启动使用:
service nginx start //启动
service nginx stop //关闭
service nginx restart //重启
启动后,关闭Linux防火墙,浏览器访问虚拟机ip:80
出现welcome to nginx 则配置成功
五、nginx配置
进入nginx安装目录的nginx.conf文件
vim /usr/local/nginx/conf/nginx.conf
主要内容如下(后续进行负载均衡配置时,主要更改此配置文件)
#进程数,建议设置和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;
}
}
1、负载均衡配置
nginx支持如下负载均衡
(1)、轮询负载均衡
此配置为默认配置
upstream haha{
server 192.168.30.102:8080; //此为另外两台tomcat部署所在的虚拟机ip,8080位tomcat端口
server 192.168.30.103:8080;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://haha;
}
}
(2)、加权负载均衡
upstream haha{
server 192.168.30.102:8080 weight=5; //数字可为1-10任意整数,数字越大权重越大
server 192.168.30.103:8080 weight=3; //此处表示5:3
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://haha;
}
}
(3)、最少连接数,将请求分配给活动连接数最少的服务器
upstream haha{
least_conn;
server 192.168.30.102:8080;
server 192.168.30.103:8080;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://haha; //haha名字自定,但需要与upstream处相同
}
}
(4)、ip-hash 基于ip地址,确认该访问哪台服务器,可以保证同一个ip始终访问一台服务器
upstream haha{
ip_hash;
server 192.168.30.102:8080 weight=5;
server 192.168.30.103:8080 weight=3;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://haha;
}
}
2、访问限制
location / {
deny 192.168.2.180;
allow 192.168.30.0/24; //表示允许192.168.30.0--192.168.30.255之间的ip
deny all;
proxy_pass http://haha;
}
从上到下,匹配到就跳出,即如果第一个将该ip禁了(不管ip是准确ip还是一个范围内),第二个允许了,也表示禁止,因为第一次匹配就已经禁止了,后续不再允许。
六、虚拟主机
1、虚拟主机概述
指在网络服务器上分出一定的磁盘空间,用户可以租用此部分空间,以供用户放置站点及应用组件,提供必要的数据存放及传输功能。
优点:由于多态虚拟主机共享一台真实主机资源,用户承受的硬件费用,网络维护费用,通信线路的费用大幅度降低,软件配置,防攻击等安全措施都由专业服务商提供,大大简化服务器管理的复杂性,同时也不必为使用和维护服务器的技术问题担心。
2、虚拟主机类别
(1)、基于域名的虚拟主机
upstream sh{
server 192.168.30.102:8080;
}
upstream bj{
server 192.168.30.103:8080;
}
server{
listen 80;
server_name city2.com;
location / {
proxy_pass http://bj;
}
}
server{
listen 80;
server_name city2.com;
location / {
proxy_pass http://sh;
}
}
(2)、基于端口的虚拟主机
upstream sh{
server 192.168.30.102:8080;
}
upstream bj{
server 192.168.30.103:8080;
}
server{
listen 80; //80端口
server_name localhost;
location / {
proxy_pass http://bj;
}
}
server{
listen 81; //81端口
server_name localhost;
location / {
proxy_pass http://sh;
}
}
(3)、基于ip的虚拟主机(很少使用)
七、正向代理和反向代理
1、正向代理
代理客户端,当我们访问google,无法直接访问,可以使用VPN等进行翻墙,此时,我们将请求信息发送到VPN等代理服务器上,它将我们符请求发送到google,获取google返回的结果,再将结果安返回给我们
2、反向代理
代理服务器,访问百度,我们只需要访问www.baidu.com,该代理服务器获取请求,再将请求发送给内部网络上的服务器,内部的服务器将处理结果返回给代理服务器,代理服务器将内容返回给我们。在这个过程中,我们只访问baidu,其内部的服务器对于我们是透明的。
八、nginx的session共享
1、产生
http是无状态的,也就是说服务器无法识别你
session被提出用于解决此问题,但session只存在一台服务器,如果一台服务器崩掉,或请求需要在不同服务器上处理,session在两台服务器直接无法互通,相关信息会丢失。
2、解决session一致性方案
a、session复制
tomcat自带session复制功能,将每台tomcat之间进行session的备份复制,但访问人数多时,session的存储将消耗大量资源。
b、session共享
一般使用memcached缓存服务
3、memcached使用
(1)、安装
yum -y install memcached
(2)、将web服务器连接memcached的jar包拷贝至tomcat的lib目录下
(3)、配置tomcat目录下的context.xml,将如下内容拷贝到里面(注意,n1对应ip为安装memcached的服务器地址,端口号11211)
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.30.102:11211"
sticky="true"
lockingMode="auto"
sessionBackupAsync="false"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
sessionBackupTimeout="1000" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />
所有tomcat都需要配置,内容相同
(4)、启动(ip为安装位置)
memcached -d -m 128m -p 11211 -l 192.168.30.102 -u root -P /tmp/
(5)、为方便sessionId的查看,可更改index.jsp(在tomcat/webapps/ROOT/index.jsp)页面
<%@ 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>
(6)、nginx均衡时,使用的tomcat在发生变化,但sessionId不变,则说明配置成功