`
annan211
  • 浏览: 445328 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

电子商务网站基础架构 nginx + memcached + tomcat + squid 集群

 
阅读更多
本文中 包含 nginx memcached tomcat 集群 的安装和配置
wget url 为下载所需的资源文件方式,也可以通过 VMware Tools 工具载入,
如何安装 VMwareTools 参考本博客或者其他资料
后面最后一章节是安装配置squid 在项目第一期不作要求。





第一章 安装配置nginx
1 安装nginx
   1 下载解压nginx
①: wget http://nginx.org/download/nginx-1.7.7.tar.gz
	 ②: tar zxvf nginx-1.7.7.tar.gz 


  Nginx 依赖很多软件(gcc、g++、make、libz-dev、libbz2-dev、libreadline-dev)
  所以下面我们就来安装这些依赖包
 yum  -y install gcc gcc-c++ autoconf automake
	  yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel



  安装此模块之前需要先获取root权限,不然会提示 you need to be root to perform this command
  获取权限的方法是  终端 输入su 回车,输入密码

2 建立用户组(可以跳过这一步)
 
groupadd -r nginx
	  man useradd
	  useradd -s /sbin/nologin -g nginx -r nginx 
	  id nginx


3 需要pcre库支持 pcre是一个正则表达式库
下载
 wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.36.tar.gz

解压
 tar -zxvf pcre-8.36.tar.gz 

进入目录安装
 cd pcre-8.36
	 ./configure
	 make && make install


以上准备工作已经完成。以下开始进入安装。

 cd nginx-1.7.7
	 ./configure
	 make && make install


上面的步骤完成  nginx就已经安装好了。
因为我们使用的是默认的 configure,所以会安装到/usr/local/nginx目录。相应的配置文件是/usr/local/nginx/conf/nginx.conf。
因为前面建立的是nginx 用户,所以到
cd usr/local/nginx/conf/nginx.conf 文件 就是nginx配置文件了。

	使用命令 ps  -ef | grep nginx  
	root 48344 1 0 00:41 ? 00:00:00 nginx:master process /usrlocal/nginx/sbin/nginx


关闭nginx (前提切入 root 用户,su)
	kill -quit 48344

	nginx 重启命令
	/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
	或者 先杀死 在启动
	kill -quit 主进程号


不间断重启nginx
kill -HUP 主进程号

可以查看具体的安装目录
查看 80 端口是否被监听 netstat -tulnp | grep :80
	卸载nginx
	yum remove nginx

	(chmod -R 777 nginx-1.7.7 将所有文件夹设置为可读可写)


可以使用下面 的语句块 实现多台虚拟主机的配置
下面是 最终的配置文档形式
#user  www www;
	worker_processes  1;
	pid     /usr/local/nginx/logs/nginx.pid;
	events {
		use epoll;
		worker_connections  1024;
	}
	http {
		include       mime.types;
		default_type  application/octet-stream;
		include     proxy.conf;  #一定要指向代理文件
		sendfile        on;
		tcp_nopush      on;
		keepalive_timeout  65;
		
		# 这里实现轮询
		upstream www.server80.com{ 
		   server 127.0.0.1:8080 weight=1;
		   server 127.0.0.1:9080 weight=1;
		}
		
		##cache 缓存部分 有些设置在代理文件中##
		  proxy_temp_file_write_size 128k;
		  proxy_temp_path /home/temp_dir;#如果页面允许我们缓存 那么就会在这个路径下 这个是临时目录
		  ## 如果页面允许我们缓存 那么就会在这个路径下
		  proxy_cache_path /home/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
		##end##
  
		server {
		 #listen   8081;
		 server_name   www.server80.com;
		 location /{
		   root html;
		   index  index.html  index.jsp index.htm;
		   proxy_redirect off;
		   proxy_set_header Host $host; #这一句至关重要
		   proxy_set_header X-Real-IP $remote_addr;
		   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		   proxy_pass  http://www.server80.com; # 转向tomcat
		 }
		 ## 缓存部分
		 location ~ .*\.(gif|jpg|png|htm|html|css|js|flv|ico|swf)(.*) {
              proxy_pass http://www.server80.com;
              proxy_redirect off;
              proxy_set_header Host $host;
              proxy_cache cache_one;
              proxy_cache_valid 200 302 1h;
              proxy_cache_valid 301 1d;
              proxy_cache_valid any 1m;
              expires 30d;
        }
		access_log /usr/local/nginx/logs/www.server80.com.log;
	  }

	}


下面是nginx.conf同目录的 代理文件proxy.conf 的最终形式


proxy_connect_timeout 300s;
	proxy_send_timeout   900;
	proxy_read_timeout   900;
	proxy_buffer_size    32k;
	proxy_buffers     4 32k;
	proxy_busy_buffers_size 64k;
	proxy_redirect     off;
	proxy_hide_header  Vary;
	proxy_set_header   Accept-Encoding '';
	proxy_set_header   Host   $host;
	proxy_set_header   Referer $http_referer;
	proxy_set_header   Cookie $http_cookie;
	proxy_set_header   X-Real-IP  $remote_addr;
	proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
	#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP


检测nginx 是否安装成功,可以在安装路径 html 下新增一个文件
直接访问这个文件

2 安装memcached
 
 wget http://www.danga.com/memcached/dist/memcached-1.2.0.tar.gz
	# wget http://www.monkey.org/~provos/libevent-1.2.tar.gz

	# ./configure --prefix=/usr
	# make
	# make install

	测试libevent 
	.测试libevent是否安装成功:
	# ls -al /usr/lib | grep libevent



安装memcached
     转向其解压路径 直接安装
cd memcached-1.2.0
./configure --with-libevent=/usr

# make
# make install

安装完成后会把memcached放到 /usr/local/bin/memcached ,


测试是否成功安装memcached:
# ls -al /usr/local/bin/mem*

启动memcached

/usr/local/bin/memcached -d -m 10 -u root -l 127.0.0.1 -p 11211 -c 256 -P /usr/local/memcached.pid
    /usr/local/bin/memcached -d -m 10 -u root -l 127.0.0.1 -p 11212 -c 256 -P /usr/local/memcached.pid


参数:
	-p <num>      设置TCP端口号(默认不设置为: 11211)
	-U <num>      UDP监听端口(默认: 11211, 0 时关闭) 
	-l <ip_addr>  绑定地址(默认:所有都允许,无论内外网或者本机更换IP,有安全隐患,若设置为127.0.0.1就只能本机访问)
	-d                    以daemon方式运行
	-u <username> 绑定使用指定用于运行进程<username>
	-m <num>      允许最大内存用量,单位M (默认: 64 MB)
	-P <file>     将PID写入文件<file>,这样可以使得后边进行快速进程终止, 需要与-d 一起使用


	可以启动多个memcached 当一台memcached宕机之后  另外一台继续工作,试验证明。


停止memcached
先使用 netstat -ntpl 查看 memcached 的pid
使用命令kill pid 杀死进程


测试
telnet 127.0.0.1 12111

如果出现 bash:telnet:command not found
安装一下即可
yum -y insatll telnet
 
 
3 安装多个tomcat
 
① 安装 jdk
首先卸载默认的jdk1.42
rpm -qa | grep gcj                                          
libgcj-devel-3.4.6-3
java-1.4.2-gcj-compat-1.4.2.0-27jpp             
libgcj-3.4.6-3

# yum -y remove java-1.4.2-gcj-compat

② 下载jdk
http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
或者
wget http://download.oracle.com/otn-pub/java/jdk/7u71-b14/jdk-7u71-linux-x64.tar.gz
        http://download.oracle.com/otn-pub/java/jdk/7u71-b14/jdk-7u71-linux-x64.tar.gz

解压 tar -zxvf jdk1.7.0_71-xxxxx.tar.gz
重命名 mv jdk1.7.0_71-xxxxx.tar.gz jdk1.7.0_71

   ③ 写入环境变量 /etc/profile 最后加入如下内容
export JAVA_HOME=/usr/local/jdk1.7.0_71
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/rt.jar
检测jdk 安装成功与否  java -version

   ④ 导入tomcat 压缩包  apache-tomcat-7.0.57.tar.gz
解压 tar -zxvf apache-tomcat-7.0.57.tar.gz
重命名 mv apache-tomcat-7.0.57.tar.gz tomcat7-1

复制一份tomcat
cp -r tomcat7-1 tomcat7-2

修改
tomcat7-2 中的文件
   1 conf/server.xml
        修改三个监听端口
<Server port="8005" shutdown="SHUTDOWN">
改成
<Server port="9005" shutdown="SHUTDOWN">

<Connector port="8080" protocol="HTTP/1.1"
   connectionTimeout="20000"
   redirectPort="8443" />
改成
<Connector port="9080" protocol="HTTP/1.1"
   connectionTimeout="20000"
   redirectPort="8443" />

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
改成
<Connector port="9009" protocol="AJP/1.3" redirectPort="8443" />

使用jvmRoute 区分不同的tomcat ,目的是1 在验证页面上可以观察的很清晰,2 可以实现
不同的session 使用不同的tomcat处理 减轻服务器压力。

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
有多个tomcat的时候  可以设置jvmRoute="tomcat1,2,3,4....."

   2  conf/context.xml(为了与memcached 集成实现session 同步,需要在两个tomcat中都修改此文件)
      1) 在 Context 节点下 加入如下代码
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"     
                    memcachedNodes="n1:localhost:11211 "     
                    requestUriIgnorePattern=".*\.(png|gif|jpg|css|js){1}quot"  
                    sessionBackupAsync="false"     
                    sessionBackupTimeout="100"     
                    transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"     
                    copyCollectionsForSerialization="false"     
                />
          2) 我们需要一系列的jar包来实现session同步
    asm-3.2.jar
javolution-5.4.3.1.jar
kryo-1.04.jar
kryo-serializers-0.8.jar
memcached-session-manager-1.6.3.jar
memcached-session-manager-tc7-1.6.3.jar
minlog-1.2.jar
msm-javolution-serializer-1.6.3.jar
msm-kryo-serializer-1.6.3.jar
msm-xstream-serializer-1.6.3.jar
reflectasm-0.9.jar
spymemcached-2.8.4.jar

这些jar 会打包附在本博文附件
需要将这些jar 分别 复制到tomcat/bin 目录
linux 可以使用命令
       cp -frap jar/* tomcat7-1/lib  完成     */
      
   ⑤ 为了更加通用和简单易懂 以及后期添加更多的tomcat集群 这里也对/etc/profile 文件进行修改
        #tomcat7-1
CATALINA_BASE=/usr/local/tomcat7-1
CATALINA_HOME=/usr/local/tomcat7-1
TOMCAT_HOME=/usr/local/tomcat7-1
export CATALINA_BASE CATALINA_HOME TOMCAT_HOME

#tomcat7-2
CATALINA_2_BASE=/usr/local/tomcat7-2
CATALINA_2_HOME=/usr/local/tomcat7-2
TOMCAT_2_HOME=/usr/local/tomcat7-2
export CATALINA_2_BASE CATALINA_2_HOME TOMCAT_2_HOME
        
这里设置的变量值 需要在tomcat 安装目录下引用

现在打开tomcat7-1/bin/catalina.sh
    export JAVA_HOME=/usr/local/jdk1.7.0_71
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=$JAVA_HOME/lib
export CATALINA_HOME=$CATALINA_HOME
export CATALINA_BASE=$CATALINA_BASE

现在打开tomcat7-2/bin/catalina.sh
    export JAVA_HOME=/usr/local/jdk1.7.0_71
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=$JAVA_HOME/lib
export CATALINA_HOME=$CATALINA_2_HOME
export CATALINA_BASE=$CATALINA_2_BASE    

修改 tomcat 的配置文件
  tomcat7-1的配置文件和
  tomcat7-2的配置文件修改如下:
修改 tomcat7-2/bin  下的文件:startup.sh 和 shutdown.sh(加入的内容一样),在文件中加入以下内容:

tomcat7-1的配置文件修改如下:(startup.sh 和 shutdown.sh)
export JAVA_HOME=/usr/java/jdk1.7.0_45
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib:$JAVA_HOME/bin
export CATALINA_HOME=$CATALINA_HOME 
export CATALINA_BASE=$CATALINA_BASE

tomcat7-2的配置文件修改如下:(startup.sh 和 shutdown.sh)
export JAVA_HOME=/usr/java/jdk1.7.0_45
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib:$JAVA_HOME/bin
export CATALINA_HOME=$CATALINA_2_HOME 
export CATALINA_BASE=$CATALINA_2_BASE


4 etc/hosts 文件添加域名 www.server80.com

5 测试项目

在eclipse 下新建cluster web项目,
其中有两个页面
cluster.jsp
 
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page import="java.util.*" %>
<%       
  response.setHeader("Pragma","Public");    
  response.setHeader("Cache-Control","Public");      
  response.setDateHeader("Expires",10);   
  %> 
<html><head><title>Cluster Test</title></head>
<body>
<%
  //HttpSession session = request.getSession(true);
  System.out.println(session.getId());
  out.println("<br> SESSION ID:" + session.getId()+"<br>");  
  // 如果有新的请求,则添加session属性
  String name = request.getParameter("name");
  if (name != null && name.length() > 0) {
     String value = request.getParameter("value");
     session.setAttribute(name, value);
  }  
    out.print("<b>Session setting success !!!</b>");   
%>
</body>
</html>

cluster2.jsp

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page import="java.util.*" %>
<%       
  response.setHeader("Pragma","Public");    
  response.setHeader("Cache-Control","Public");      
  response.setDateHeader("Expires",10);   
  %> 
<html><head><title>Cluster Test</title></head>
<body>
<%
  //HttpSession session = request.getSession(true);
  System.out.println(session.getId());
  out.println("<br> SESSION ID:" + session.getId()+"<br>");     
    out.print("<b>Session List:</b>");  
    Enumeration<String> names = session.getAttributeNames();
    while (names.hasMoreElements()) {
        String sname = names.nextElement(); 
        String value = session.getAttribute(sname).toString();
        out.println( sname + " = " + value+"<br>");
        System.out.println( sname + " = " + value);
   }
%>
</body>
</html>


页面 1 用于设置session
页面2  用于获取session

当启动 nginx memcached 和 两个 tomcat
访问 www.server80.com/cluster/cluster.jsp?name=kk&value=pp
请求将以轮询的形式访问分布式状态的两个tomcat
访问 www.server80.com/cluster/cluster2.jsp

页面上  我们看到我们的请求在以轮询的方式访问两个tomcat 但是sessionID是不会变化的,
这就说明 虽然我们访问的是不同的tomcat 但是是同一个session ,到此,session同步完成。


本章节安装配置squid 项目第一期不作要求
配置 suqid(多台,多台squid(不同路径) 集群 一台 nginx)

参照  http://blog.yunvi.com/html/160.html

下载 wget http://www.squid-cache.org/Versions/v3/3.4/squid-3.4.9-20141113-r13188.tar.gz

解压 tar -zxvf squid-3.4.9-20141113-r13188.tar.gz

重命名 mv squid-3.4.9-20141113-r13188 squid-3.4.9

安装

cd suqid-3.4.9

./configure --prefix=/usr/local/squid \
--localstatedir=/var/squid \
--enable-stacktraces
make && make install

优化linux内核
linux内核的优化根据具体情况来定,其中比较重要的参数有:
net.ipv4.tcp_max_tw_buckets = 6000
表示允许的最多timewait数量,这个值根据服务器的情况来定,不建议太高
net.ipv4.ip_local_port_range = 1024    65000
允许tcp连接打开的端口范围,上面指定为1024-65000
参考优化参数:(将此参数插入到/etc/sysctl.conf文件中)

运行命令使其生效:
sysctl -p

创相关目录并启动squid

mkdir /var/squid
chown -R squid.squid /var/squid
ln -s /usr/local/squid/sbin/squid /usr/sbin/
ln -s /usr/local/squid/bin/squidclient /usr/bin/
ulimit -SHn 102400
squid -z
squid

如果出现没有权限
直接使用 chmod 777 /usr/local/squid/var/logs/cache.log


查看squid服务是否正常启动,端口是否打开
netstat -an | grep 80

也可以用 netstat -ntpl 查看
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics