`
阅读更多
Apache Tomcat原本就是一家,更是一家亲!Apache与Tomcat整合,无非是将Apache作为前端根据请求路径、端口、代理分发给多个Tomcat,以到达转发负载均衡的目的!同时,通过Apache和Tomcat相互作用,进行粘性会话会话拷贝构建集群!这一切的最终结果就是“云服务”!不要说Session不重要,当下火爆的团购,如果离开Session还能快活多久?如何保证Session同步,仍然是不能回避的问题!

这里要说的是基于HTTP和AJP跳转方式的负载均衡实现,关于JK,由于效率问题一直成为诟病,并且mod_jk2模块已经不再被更新了,这里就不折腾它的复杂配置了!

至于说Apache+Tomcat+SSL,并不是难题!只要完成了Apache+SSL然后配置相应的负载均衡、反向代理等等就可以达到目的,相关Apache+SSL参考征服 Apache + SSL

Ubuntu Server 10.04版本,Apache选用2.2.14,Tomcat选用6.0.24。


相关内容:
征服 Apache + SSL
征服 Apache + SVN
征服 Apache + SVN +  LDAP
征服 Apache + Tomcat
征服 Nginx
征服 Nginx + Tomcat


步骤:
  1. 安装Apache基本模块
  2. 后台监控
  3. 负载均衡简单测试
  4. 配置Tomcat相关模块(AJP)
  5. 保持Session唯一,粘性会话
  6. Tomcat集群,Session复制


1.安装Apache相关模块
负载均衡需要的主要是代理模块!
经过几次Apache配置尝试,在Ubuntu下配置Apache实在是太容易了。加载什么模块、取消什么模块两个命令搞定。

#启用模块
sudo a2enmod <model>
#禁用模块
sudo a2dismod <model>


这里,我们需要让Apache提供代理服务,其中又包含基于http、ftp、ajp等等协议的代理功能,同时还需要负载均衡模块。我们可以通过命令逐个加载:

#代理核心模块
sudo a2enmod proxy
#代理AJP模块
sudo a2enmod proxy_ajp
#代理负载均衡模块
sudo a2enmod proxy_balancer
#代理HTTP模块
sudo a2enmod proxy_http
#代理FTP模块
sudo a2enmod proxy_ftp


完成上述操作后,系统会提示重启Apache!
先不着急重启,现学现卖,了解下Apache的目录结构。在Ubuntu下配置Apache主要是在/etc/apache2目录下:

分述:
  • apache2.conf核心配置文件,一般不需要修改!
  • conf.d目录,里面包含了一些字符集设置,文档等设置!
  • dav_svn.authzdav_svn.passwd是前面做SVN时,相关权限、密码文件。
  • envvars定义了运行时的用户身份——www-data。
  • httpd.conf是Apache留给我们自己折腾的配置文件,默认为空。apache2.conf会加载这个文件。
  • ports.conf端口默认配置。apache2.conf会加载这个文件。
  • magic为mod_mime_magic模块服务。
  • mods-enabledmods-available mods-enabled会被apache2.conf加载,里面包含*.load和*.conf文件。*.load文件中是加载相应的模块(位于/usr/lib/apache2/modules/中),而*.conf中是对应的基本配置。但这些文件其实都是链接到mods-available中相应的文件上。当我们通过a2enmod操作时,实际上正是操作了这些软链接。
  • sites-availablesites-enabledmods-enabledmods-available的关系类似,只是其中包含的是站点内容。

罗嗦了一堆,下面配置负载均衡部分。
执行修改:
sudo vi /etc/apache2/mods-available/proxy.conf


上图红框中的内容是原始内容,白框中的内容是我新加的部分。
注意红框中的配置:
        <Proxy *>
                AddDefaultCharset off
                Order deny,allow
                #Deny from all
                Allow from localhost ip6-localhost  
        </Proxy>

在默认配置中,Deny from all处于可用状态。当我们配置其他代理节点时,将导致杜绝访问!使用Allow from localhost ip6-localhost 限制仅允许本机访问!
再说,白框中的内容:
        <Proxy balancer://zlex>
                BalancerMember http://localhost:8080/
                BalancerMember http://192.168.49.1:8080/
        </Proxy>

这里,我配置了一个负载均衡节点balancer://zlex,其中包含了两个服务http://localhost:8080/http://192.168.49.1:8080/,一个是虚拟机上的Tomcat、一个是真机上的Tomcat。这里使用的Http的转发方式,当然,使用AJP未尝不可,稍后详述!
这里的节点次序会有一个先后关系,Apache会将请求按照FIFO的方式调度顺次分配到各个节点上!如果其中有一个节点挂掉,将跳过该节点顺次寻找可用节点。
再说代理和反向代理:
        ProxyPass /zlex balancer://zlex
        ProxyPassReverse /zlex balancer://zlex

这里配置,如果要访问/zlex路径时,将跳转到balancer://zlex上,也就是享受负载均衡!

2.后台监控
我们如何知道某个节点负载多少,响应时间多久,服务是否正常呢?Apache提供了负载均衡监控平台:http://localhost/balancer-manager。但是,这个服务默认是不存在。
除了用于负载均衡配置、监控的balancer-manager还有http://localhost/server-statushttp://localhost/server-info
我们需要添加info模块:
#系统信息模块
sudo a2enmod info

同时,为了能够使用balancer-manager,我们需要配置:
<Location /balancer-manager>
        SetHandler balancer-manager
        Order Deny,Allow
        #Deny from all
        Allow from localhost ip6-localhost
</Location>

把这段代码放到哪?由于它同属系统信息配置,我把它放到了info.conf中,说白了就是照猫画虎:
sudo vi /etc/apache2/mods-available/info.conf


注意,这段代码放到了<IfModule mod_info.c></IfModule>之间!
现在,我们重启Apache:
sudo /etc/init.d/apache2 restart

来看看管理界面http://localhost/balancer-manager


我们再来看看服务器基本信息http://localhost/server-info


上述两个服务需要加载info模块,而服务器状态(server-status)不需要http://localhost/server-status


3.负载均衡简单测试
疯狂访问http://localhost/zlex,直到手酸眼烦!
我这里故意使用不同了Tomcat界面,来验证自己的配置是否生效。更疯狂的是,我甚至把节点指向了百度、搜狐,来测试负载均衡的效果。如果你细致观察,Apache是将请求顺次分配到各个节点上的。
如果其中一个节点发生问题(例如,强行关闭一个Tomcat,或配置一个错误节点)Apache将会经过几次尝试后,绕过这个问题节点,寻找可以成功访问的节点。如果这个节点恢复正常使用,Apache将在该Tomcat恢复正常工作后大约1分钟内将该节点标识为可用!
现在,再看看现在的后台(http://localhost/balancer-manager)啥样子:

如果我们控制一个节点的状态是否可用,该怎么做:

涉及到负载量,session同步等等,我们最后讨论!

4.配置Tomcat相关模块(AJP)
基于Http协议分发并不复杂,但AJP效果更好!一次诡异事件中,内网访问正常,外网访问多次失败,最后通过AJP方式完美解决了!
在Tomcat中配置AJP也很简单,修改server.xml开启AJP模块:
sudo vi /etc/tomcat6/server.xml 

开启AJP配置:
<Connector  port="8009" protocol="AJP/1.3" 
                URIEncoding="UTF-8"
                redirectPort="8443" />

注意使用的端口port="8009",字符集URIEncoding="UTF-8",这是输入框、请求字符集乱码的入口!
接下里就可以通过AJP方式进行节点分发了。修改/etc/apache2/mods-available/proxy.conf
sudo vi /etc/apache2/mods-available/proxy.conf  

http改为ajp,将8080改为8009
        <Proxy balancer://zlex>
                BalancerMember ajp://localhost:8009/
                BalancerMember ajp://192.168.49.1:8009/
        </Proxy>

重启Apache:
sudo /etc/init.d/apache2 restart 

再看看管理界面http://localhost/balancer-manager

至此,我们完成了基本负载均衡的基本配置!

/etc/apache2/mods-available/proxy.conf还有一些属性:
noFailOver是否打开失败转移,On|Off,默认为Off,添加在ProxyPass后面,如:
        ProxyPass /zlex balancer://zlex  stickySession=JSESSIONID noFailOver=On

如果这样配置,当提供给你服务的服务器发生异常,那么你将一直看着它返回给你503,直到系统恢复正常!

loadfactor表示后台服务器负载到由Apache发送请求的权值,默认值为1添加在BalancerMember后面:
        <Proxy balancer://zlex>
                BalancerMember ajp://localhost:8009/
                BalancerMember ajp://192.168.49.1:8009/
        </Proxy>


可以实现三种策略:
  1. 轮询均衡策略的配置
  2. 按权重分配均衡策略的配置
  3. 权重请求响应负载均衡策略的配置


5.Session唯一,粘性会话
Apache已经可以轻松将内容处理的工作分配给各个Tomcat了!
当然,这还不够,Session还是个问题!
WHY?

我们来做一系列修改,来检测Session到底出现了什么问题!
先来改造Tomcat,修改server.xml
sudo vi /etc/tomcat6/server.xml 

修改<Engine />节点,增加jvmRoute属性:
 <Engine 
              name="Catalina" 
              defaultHost="localhost" 
              jvmRoute="tomcat1">

另一个Tomcat设置改为
 <Engine 
              name="Catalina" 
              defaultHost="localhost" 
              jvmRoute="tomcat2">

通过jvmRoute,指定了Tomcat唯一标识!
然后修改/etc/apache2/mods-available/proxy.conf
sudo vi /etc/apache2/mods-available/proxy.conf

如下:
        <Proxy balancer://zlex>
                BalancerMember ajp://localhost:8009/zlex     route=tomcat1 
                BalancerMember ajp://192.168.49.1:8009/zlex        route=tomcat2 
        </Proxy>

        ProxyPass /zlex balancer://zlex
        ProxyPassReverse /zlex balancer://zlex


这里需要通过修改route属性,将Apache与Tomcat关联起来!
注意,Tomcat中定义的jvmRoute需要与Apache定义的route相对应!
我们来看一下http://localhost/balancer-manager发生了什么变化:

我们注意到route字段有了新的标识,当然,我们也可以通过这个配置界面修改这些信息,但当前修改不会真的修改/etc/apache2/mods-available/proxy.conf文件,Apache重启后将丢失。

为了更细致的对比进过复杂均衡的结果,这里增加了zlex应用!主要是监控Session的变化!
只看核心代码:
<b>当前SessionID:</b>
<br />
<%
        String sessionID = session.getId();
        out.println(sessionID);
        System.err.println("sessionID = " + sessionID);

        // 如果有新的 Session 属性设置
        String dataName = request.getParameter("dataName");
        if (dataName != null && !dataName.isEmpty()) {
                String dataValue = request.getParameter("dataValue");
                session.setAttribute(dataName, dataValue);
        }
%>
<br />
<br />
<b>Session属性列表:</b>

<br />
<%
        Enumeration<String> e = (Enumeration<String>) session
                        .getAttributeNames();
        while (e.hasMoreElements()) {
                String name = e.nextElement();
                String value = (String) session.getAttribute(name);
                out.println(name + " = " + value + "<br>");
                System.err.println(name + " = " + value);
        }
%>
<form method="POST">
<ul style="list-style-type: none;">
        <li><label for="dataName">键:</label><input size="20" id="dataName"
                name="dataName"></li>
        <li><label for="dataValue">值:</label><input size="20"
                id="dataValue" name="dataValue"></li>
        <li><input type="submit" value="提交" /></li>
</ul>
</form>

将其做成一个名为zlex的web应用,分别部署到两个Tomcat上!
然后重启Apache:
sudo /etc/init.d/apache2 restart

不断刷新http://localhost/zlex,看看真正的结果:
第1次:
第2次:
第3次:
第4次:
仔细观察,每次请求都按照负载均衡配置的节点次序依次请求到不同的Tomcat上。尤其是当我们通过jvmRouteroute做了绑定之后,信息更加准确。但是,仔细观察,每次请求的SessionID都是不一样!对于纯Web应用,尤其是依靠SessionID区分唯一用户的应用,这将是一场噩梦——解决了服务器压力均衡问题,却带来了SessionID不唯一问题!这就需要SessionID绑定,或者说叫做“会话复制”。
如果这时候你在页面上提交表单,将键值对保持在session中,在页面刷新后,将无法获得该信息,因为Seesion丢失了!
接着修改/etc/apache2/mods-available/proxy.conf,让SeesionID保持唯一:
sudo vi /etc/apache2/mods-available/proxy.conf

增加stickySession属性:
        ProxyPass /zlex balancer://zlex  stickySession=JSESSIONID

stickySession粘性会话,根据这一属性,浏览器将通过cookie绑定SeesionID。如果这个时候再次访问http://localhost/zlex,你会发现,页面不会来回跳转了!
sticky是什么?
引用
sticky模式
利用负载均衡器的sticky模式的方式把所有同一session的请求都发送到相同的Tomcat节点。这样不同用户的请求就被平均分配到集群中各个tomcat节点上,实现负载均衡的能力。这样做的缺点是没有灾难恢复的能力。一旦一个节点发生故障,这个节点上所有的session信息全部丢失;
同一用户同一session只和一个webServer交互,一旦这个webserver发生故障,本次session将丢失,用户不能继续使用 !



提交一个Session设定看看http://localhost/zlex

观察后台日志:

再看看返回页面,这相当于一次页面刷新,如果正常粘性会话,我们将获得当前SessionID对应的一切信息:

这说明粘性会话生效了!
我们得到了形如
引用
50DAF14C6CDF8ACFBDC1095A5EE8E2CF.tomcat1
的SessionID。这样,我们就能知道当前访问的是哪台服务器了!
如果,换一个浏览器打开该页面http://localhost/zlex,将会获得一个新的SessionID,并且,根据Apache中配置的负载均衡节点列表依次访问下一个节点!
如果这时候负载均衡节点列表中某一节点发生异常,那么Apache将按照惯例,跳转该节点,并在该节点恢复正常后约1分钟内重新将其纳入可用节点!

修改刚才的jsp页面,看看Http头中都有些什么:
<b>Cookie信息:</b>
<br />
${header["cookie"]}
<br />
<b>Host信息:</b>
<br />
${header["host"]}
<br />


sticky模式的根本在于浏览器支持cookie,如果浏览器不支持cookie,则需要修改server.xml文件中的<Context />节点,将cookie置为false,关闭cookie功能,让jsessionid显式传递!

6.Tomcat集群,Session复制
经过两天反复研究,两只互不相认的Tomcat终于在网络上“资源共享”了——Session复制成功!
关于Tomcat集群以及Session复制,网上已经有很多很多,但是否真的能用?!为了确认这一问题,周末还跑到书店翻了翻《Apache Tomcat 高级编程》,参考Clustering/Session Replication HOW-TO(有点小错误),经过两天苦战,克服种种小问题,终于拿下!

整理概念:
引用

群集,是包含多个服务器实例的指定集合,这些服务器实例共享相同的应用程序、资源以及配置信息。您可以将不同计算机上的服务器实例分组到一个逻辑群集中并将其作为一个单元来管理。您可以使用 DAS 轻松控制多机群集的生命周期。

群集可以实现水平可伸缩性、负载平衡和故障转移保护。根据定义,群集中的所有实例都具有相同的资源和应用程序配置。当群集中的服务器实例或计算机出现故障时,负载平衡器检测到该故障,会将通信从出现故障的实例重定向至群集中的其他实例,并恢复用户会话状态。由于群集中所有实例上的应用程序和资源都相同,因此一个实例可以故障转移至群集中的任何其他实例。


引用
Session复制,主要是指集群环境下,多台应用服务器之间同步Session,确保Session保持一致,且Session中的内容保持一致,对外透明——看起来就像是一台应用服务器!
如果其中一台服务器发生故障,根据负载均衡的原理,Apache会遍历寻找可用节点,分发请求。与此同时,当前用户Session不能发生数据丢失,其余各节点服务器应保证用户Session数据同步。

Session复制核心内容主要是:
  1. Session内容序列化(serialize),会消耗系统性能。
  2. Session内容通过广播同步给成员,会造成网络流量瓶颈,即便是内网瓶颈。


因此,Session复制的这两个潜在问题,致使复杂均衡节点最多不会超过4个。因为,当节点数大于4时,整个集群的吞吐量将不再上升!

为了搭建Tomcat集群,我将两个Tomcat分别部署到两台虚拟机上,确保网段一致。(这一步很关键,我最初将Tomcat1(192.168.49.132)部署在虚拟机上,将Tomcat2(192.168.49.128)部署在本机上,结果,网络总有问题,耽误了很多时间。

由于变换了IP,我需要修改Apache的/etc/apache2/mods-available/proxy.conf文件:
sudo vi /etc/apache2/mods-available/proxy.conf 


修改负载均衡节点如下:
        <Proxy balancer://zlex>
                BalancerMember ajp://192.168.49.128:8009/zlex        route=tomcat1
                BalancerMember ajp://192.168.49.132:8009/zlex        route=tomcat2
        </Proxy>


对于windows系统,不需要考虑网络问题,广播地址(这里用到224.0.0.0240.0.0.0)默认开放,对于linux则需要通过命令开放地址。
Ubuntu上开放广播地址(eth0网卡):
sudo route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0

然后通过-v参数查看当前开放的广播地址:
route -v



注意,重启后,该路由设置将丢失!

在Ubuntu下,可以考虑修改/etc/networks文件!


如果有必要,Windows上开放广播地址(192.168.49.128本机地址):
route add 224.0.0.0 mask 240.0.0.0 192.168.49.128

然后通过print参数查看当前开放的广播地址:
route print



然后,修改tomcat的server.xml文件:
sudo vi /etc/tomcat6/server.xml 

<Engine /> 节点中加入如下内容:
          <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                 channelSendOptions="8">

          <Manager className="org.apache.catalina.ha.session.DeltaManager"
                   expireSessionsOnShutdown="false"
                   notifyListenersOnReplication="true"/>

          <Channel className="org.apache.catalina.tribes.group.GroupChannel">
            <Membership className="org.apache.catalina.tribes.membership.McastService"
                        address="224.0.0.0"
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="192.168.49.1"
                      port="4000"
                      autoBind="100"
                      selectorTimeout="5000"
                      maxThreads="6"/>

            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
              <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
            </Sender>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
          </Channel>

          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                 filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
          <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

          <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        </Cluster> 


这里需要注意<Membership />Receiver<Membership />节点的address属性是广播地址;Receiver节点的address属性是本地绑定地址。当然,默认为auto。由于我在启动Tomcat时,Tomcat频频将地址指向127.0.0.1,无奈只好使用固定IP。
此外,为了降低Session复制的成本,Tomcat通过<Valve />节点,以过滤器的方式控制哪些请求可以忽略Session复制:
          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                 filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>


同时,在<Host>节点中加入如下内容:
          <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                    tempDir="/tmp/war-temp/"
                    deployDir="/tmp/war-deploy/"
                    watchDir="/tmp/war-listen/"
                    watchEnabled="false"/>


在Tomcat的官方文档(Tomcat 6)中,对于<Deployer  />节点的部署位置是错误的,通过观察Tomcat启动日志,确认该节点应当不属于<Host />节点中!

注意:Tomcat 6与Tomcat5在上述节点中使用的类包(包中名称由cluster变化为ha)有所不同,且结构有所调整。

先别急着重启,我们需要修改应用中的web.xml文件,将<distributable />节点部署到<web-app />节点中,开启分布式服务:


注意:如果没有设置该节点,SessionID将不能保持同步,不同的服务器将各自建立独立的SessionID!

监控Tomcat日志:
 tail -f /var/lib/tomcat6/logs/catalina.out 

然后重启Tomcat1:
sudo /etc/init.d/tomcat6 restart

观察日志:

注意两处红框:
第一处,Cluster启动,并绑定192.168.49.132:4000上,进行TCP通讯,并等待其它成员(Member)。
第二处,在管理器中注册/zlex,绑定JvmRouteBinderValve


至此,说明集群设置已经生效,但不能说明集群配置成功!

接着我们启动Tomcat2,观察其日志:

Cluster启动,并绑定192.168.49.128:4000上并发现成员[b]192.168.49.132![/b]
再看Tomcat1的日志:

Tomcat1发现其成员Tomcat2!这说明TCP通讯已建立,Tomcat成员可以进行Session同步!
同时,Tomcat成员直接会每隔一个时间段相互侦测/验证其他成员是否正常:


现在,开始访问http://localhost/zlex,并不断刷新当前页面:

除了两处标识主机来源的tomcatX不同外,session是完全一致的!
提交一次修改,并不断刷新当前页:

如果仔细观察,当前SessionID在不断交替变化,这说明负载均衡在起作用!
我们再来看看2个Tomcat后台日志都做了什么!
Tomcat1:

Tomcat2:
两只猫都打印了相同的内容(a=1)不同的细节在于,sessionID带有服务器标识!

如果我们强行关闭Tomcat2:
首先,Tomcat1会很快侦测到Tomcat2离线,因为这是TCP通讯,成员之间很容易检测到其他成员是否离线!Tomcat1后台日志如下:

其次,Apache会侦测到Tomcat2发生异常,将其余请求转交给其他节点,即交由Tomcat1处理!
继续刷新http://localhost/zlex当前页面,耐心等待几秒。你会发现,即便再次刷新页面,sessionID仍旧绑定在标识tomcat1服务器上。
然后,我们恢复Tomcat2服务,Tomcat1会马上侦测到Tomcat2已经恢复正常:

最后,我们再次刷新当前页,Apache已经将请求分发给Tomcat2了,从后台日志可以看到session信息会很快被同步了!

如果带有tomcatX标识的sessionID有很多不便之处,可以关闭粘性会话。简单的讲,就是取消Tomcat中[b]server.xml<Engine/ >节点的jvmRoute属性![/b]然后,重启tomcat、apache!

页面提交一个b=3

左边为Tomcat1,右边为Tomcat2!SessionID一致!

除了上述几种方案外,还有Terracotta模式。一种第三方集群组件,2009年收购了缓存组件EhCache,可以结合Tomcat、JBoss等多种服务器,提供多种负载均衡、集群等功能实现,且当负载均衡节点超过8个时,仍然能够保持集群吞吐量的线性增长。
Eclipse插件地址:
http://download.terracotta.org/eclipse/update
下载地址:
http://www.terracotta.org/dl/oss-download-catalog

至此,Apache + Tomcat成功完成,征服Apache系列暂告一段落!
作为开博以来的第100帖,算是很成功了!

测试应用见附件!



相关内容:
征服 Apache + SSL
征服 Apache + SVN
征服 Apache + SVN +  LDAP
征服 Apache + Tomcat
征服 Nginx
征服 Nginx + Tomcat
  • 大小: 60 KB
  • 大小: 64.9 KB
  • 大小: 48.5 KB
  • 大小: 92.6 KB
  • 大小: 21.6 KB
  • 大小: 49.4 KB
  • 大小: 34.9 KB
  • 大小: 91.9 KB
  • 大小: 95.7 KB
  • 大小: 77 KB
  • 大小: 16.8 KB
  • 大小: 18.4 KB
  • 大小: 16.5 KB
  • 大小: 19.2 KB
  • 大小: 19.5 KB
  • 大小: 12.8 KB
  • 大小: 18.1 KB
  • 大小: 12.2 KB
  • 大小: 25.7 KB
  • 大小: 56.6 KB
  • 大小: 228.7 KB
  • 大小: 131.2 KB
  • 大小: 42 KB
  • 大小: 122.5 KB
  • 大小: 31 KB
  • 大小: 32 KB
  • 大小: 32 KB
  • 大小: 13.9 KB
  • 大小: 19.1 KB
  • 大小: 61.6 KB
  • 大小: 25.7 KB
  • 大小: 33.2 KB
  • 大小: 32.7 KB
  • 大小: 26.2 KB
  • 大小: 58.9 KB
29
1
分享到:
评论
11 楼 laj12347 2014-11-04  
分享。辛苦了.敬佩楼主的钻研
10 楼 icewall 2014-03-26  
引用
Allow from localhost ip6-localhost 限制仅允许本机访问!


为什么要设置为只有本地才能访问呢?这样其他用户不就不能使用这个代理服务了?那这个代理服务就没有意义了啊。
9 楼 this_super 2013-10-17  
good 
8 楼 LaxLee 2012-09-27  
钦佩!!!
7 楼 xierenjing 2011-12-25  
感谢楼主的无私奉献,写的很详细
6 楼 qq443507232 2011-03-18  
很给力 读了之后 感受颇深
5 楼 snowolf 2010-08-27  
calvinlyc 写道
LZ 写的真的很详细,受教了,一直想找类似这样文章学习一下,谢谢LZ分享

等全部内容整理完毕,我会共享PDF文件!
4 楼 calvinlyc 2010-08-27  
LZ 写的真的很详细,受教了,一直想找类似这样文章学习一下,谢谢LZ分享
3 楼 yinishao 2010-08-26  
太详细了!!!
2 楼 liuyes 2010-08-24  
太强大了
1 楼 programdolt 2010-08-24  
敬佩楼主的钻研和分享精神,

相关推荐

    征服Ajax Web 2.0

    3. **Tomcat 5以上**: Apache Tomcat是一个开源的Servlet容器,用于部署Java Web应用。 4. **Eclipse 3.0**: 集成开发环境,支持Java和JavaScript开发,便于构建和调试Ajax应用。 **四、学习资源** 本资源可能包含...

    JavaEE程序员必读图书大推荐参照.pdf

    8. 《Tomcat 权威指南》:做 Java Web 的一般都必须学习这个,为 Apache 的开源项目。 9. 《Head First Servlets & Jsp》:Servlet 和 Jsp 是 JavaEE 程序员必须要掌握好的。 10. 《Head First HTML与 CSS.XHTML 》...

    (源码)基于C语言的SmartPlugModbus固件项目.zip

    # 基于C语言的SmartPlugModbus固件项目 ## 项目简介 该项目是一个基于C语言的固件项目,旨在实现一个支持Modbus RTU通信协议的智能设备固件。该固件被设计为与SmartPlugModbus设备配合使用,用于控制和管理多个电源插座,提供过流、欠流、过压、欠压和过热保护,同时监控插座状态和电压、电流等参数。 ## 项目的主要特性和功能 1. Modbus RTU通信协议支持固件实现了Modbus RTU通信协议,允许通过Modbus协议与设备进行通信,包括读取和写入设备参数、状态和控制命令。 2. 多插座控制固件支持控制多个电源插座,包括开启、关闭、查询状态等。 3. 保护功能设备提供过流、欠流、过压、欠压和过热保护,防止设备损坏和安全事故。 4. 参数配置通过Modbus协议,用户可以配置设备的保护参数,如电流、电压限制等。

    毕设单片机实战项目基于ESP8266 Mesh SDK开发,通过HSPI与STM32通讯.zip

    【项目资源】: 单片机项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。

    毕业设计物联网实战项目基于龙芯派的物联网食品仓储监测系统.zip

    【项目资源】: 物联网项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。

    (源码)基于嵌入式系统的StackAttack游戏项目.zip

    # 基于嵌入式系统的StackAttack游戏项目 ## 项目简介 StackAttack是一个基于嵌入式系统的游戏项目,设计用于SPI TFT彩色液晶显示面板上运行。游戏的核心玩法是操控一个名为“Claw”(爪子)的游戏角色,在由格子组成的地图上移动并抓取箱子。玩家通过操纵杆控制游戏角色,成功抓取并移动箱子到目标位置后得分。游戏地图由二维数组表示,每个格子代表一个位置。当玩家成功将所有箱子移动到目标行时,游戏结束。 ## 项目的主要特性和功能 1. 游戏角色控制玩家通过操纵杆控制Claw(爪子)角色移动。 2. 地图和箱子管理游戏地图由二维数组表示,每个格子代表一个位置。箱子在游戏地图上的位置由数组中的值表示。 3. 游戏逻辑包括角色的移动、箱子的抓取和移动、得分计算等。 4. 图形显示使用SPITFTILI9341图形库控制SPI TFT显示屏,实现游戏的图形输出。 5. 暂停功能游戏支持暂停功能,方便玩家随时暂停游戏。

    【嵌入式系统与计算机视觉】基于STM32、OpenCV和CNN的车牌识别系统:社区车辆管理与收费应用

    内容概要:本文档提供了基于STM32、OpenCV和卷积神经网络的车牌识别系统的完整代码示例。系统通过摄像头捕捉视频流,利用OpenCV进行图像处理(如灰度化、二值化、轮廓检测等)以定位车牌区域,并使用预训练的ONNX模型对车牌字符进行识别。之后,系统将识别到的车牌号与预先存储在CSV文件中的居民车牌数据库进行匹配,以判断车辆是否为小区居民所有,从而实现对外来车辆的收费管理。; 适合人群:对嵌入式系统开发、计算机视觉和深度学习感兴趣的开发者,尤其是有一定C++编程基础和技术背景的研究人员或工程师。; 使用场景及目标:①适用于社区、停车场等场所的车辆管理;②帮助开发者理解车牌识别的基本流程,包括图像预处理、车牌定位、字符识别以及与数据库的交互;③提供一个可扩展的基础框架,便于后续优化和功能增加。; 阅读建议:读者应确保具备基本的OpenCV库使用经验和C++编程能力。在学习过程中,建议同时参考相关文献资料,深入理解每个步骤背后的原理,并尝试调整参数或替换模型以提高识别精度。此外,还需准备相应的硬件设备(如摄像头)和软件环境(如安装OpenCV库),以便实际运行代码并观察效果。

    fregefffewfw

    efwfw

    基于S7-200 PLC与MCGS组态的智能交通灯控制系统设计与实现

    内容概要:本文详细介绍了利用西门子S7-200 PLC和MCGS组态软件构建智能交通灯控制系统的方法。首先阐述了系统的硬件配置,包括PLC的选择、IO分配、光电开关的应用等。接着深入探讨了梯形图编程的核心逻辑,如定时器嵌套、车流判断、紧急模式处理等。同时,还讲解了MCGS组态界面的设计要点,如动态指示灯、车流统计曲线、急停按钮等功能的实现。此外,文中分享了一些调试经验和优化技巧,如信号隔离、通信参数设置、夜间模式优化等。 适合人群:对PLC编程和工业自动化感兴趣的工程技术人员、高校相关专业学生。 使用场景及目标:适用于城市交通管理部门进行智能交通灯系统的规划与实施,旨在提高交通效率,减少拥堵。通过学习本文,读者能够掌握PLC编程的基本方法和MCGS组态软件的使用技巧。 其他说明:文中提供了详细的接线图、梯形图代码片段和组态界面截图,便于读者理解和实践。同时,作者还分享了许多实际操作中的注意事项和经验教训,有助于初学者少走弯路。

    毕业设计物联网实战项目基于物联网的气象台站系统.zip

    【项目资源】: 物联网项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。

    VB珠宝首饰店管理系统设计(源代码+系统+开题报告+答辩PPT).zip

    摘 要 面对信息时代的机遇与挑战,利用高科技手段来提高企业的管理水平无疑是一条行之有效的途径。利用计算机管理可以最大限度的发挥准确、快捷、高效等作用, 在越来越激烈的珠宝行业中,计算机管理技术对珠宝首饰公司的服务管理提供强有力的支持。因此,利用全新的计算机网络和珠宝首饰管理系统,已成为提高珠宝首饰公司的管理效率,改进服务水准的重要手段之一。本系统应用Visual Basic 6.0 中文版开发前台,用Microsoft Access 作后台服务器,采用客户机/服务器(C/S)管理思想来对珠宝首饰进销存管理。 关键词:管理水平, 管理效率,服务水准,珠宝首饰管理系统,客户机/服务器,管理思想

    稀疏分解方法在信号去噪中的应用研究_内含源码数据论文.zip

    稀疏分解方法在信号去噪中的应用研究_内含源码数据论文.zip

    2008年领导力发展年度报告

    本书由吉姆·诺埃尔和大卫·多蒂奇编辑,旨在探讨领导力发展领域的最新趋势和实践。书中不仅提供了领导力发展领域的历史回顾,还挑战了组织对领导力发展的战略视角,详细介绍了如何培养全球领导者,并提供了关于领导力发展方法、策略和系统、高潜力人才发展、高层管理参与、有效学习方法以及领导力指标等方面的深入案例研究和理论分析。此外,书中还探讨了创新的领导力发展方法,并对未来的发展趋势进行了展望。

    一种基于 QR 二维码的彩色二维码编码译码设计及其软件实现.zip

    一种基于 QR 二维码的彩色二维码编码译码设计及其软件实现.zip

    毕设单片机实战项目基于机智云和 esp8266-12F WIFI 模块的智能插座控制安卓APP.zip

    【项目资源】: 单片机项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。

    毕业设计物联网实战项目基于mqttd-centos7-v2.3.11.zip 配置的emqtt服务器,配套金大万翔物联网管理平台.zip

    【项目资源】: 物联网项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。

    【光子晶体模拟】基于COMSOL弱形式PDE的三维光子晶体能带结构计算与优化:电磁场切向连续性处理及带隙分析系统设计使用COMSOL

    内容概要:本文详细介绍了使用COMSOL Multiphysics的弱形式接口对三维光子晶体进行数值模拟的方法和技巧。文章通过具体的代码示例,解释了如何构建光子晶体的介电常数分布、设置弱形式PDE、处理电磁场切向连续性、应用Floquet周期边界条件以及特征值求解等关键步骤。特别强调了弱形式接口相比传统物理场接口的优势,如灵活性和对复杂边界的处理能力。文中还分享了一些实用的经验和注意事项,如布洛赫边界条件的实现、特征值求解器参数的优化配置以及网格划分的技巧。 适合人群:具备一定电磁学和数值模拟基础的研究人员或工程师,尤其是对光子晶体仿真感兴趣的读者。 使用场景及目标:①理解并掌握COMSOL弱形式接口在光子晶体仿真中的应用;②学习如何通过弱形式设置处理复杂的电磁场问题;③提高对光子晶体能带结构和带隙特性的认识;④掌握特征值求解和网格划分的最佳实践。 阅读建议:由于本文涉及较多的具体代码和物理概念,建议读者在阅读过程中结合COMSOL软件进行实际操作,同时查阅相关电磁理论书籍以加深理解。此外,对于文中提到的一些具体参数设置和技巧,可以通过尝试不同的配置来巩固所学知识。

    机械工程PT5000汽轮机滑动轴承系统模拟试验台:动态行为与振动控制研究

    内容概要:PT5000汽轮机滑动轴承系统模拟试验台是一个类似于电厂汽轮机发电机的缩小模型,旨在帮助用户获取汽轮机转子动态行为和滑动轴承油膜现象的实际经验,并研究振动控制方法。该试验台模拟两级涡轮机(低压和中压),每级转子两侧各有8个叶片,共计16个叶片。通过电机驱动而非涡轮发电机,可以进行启停机测试,识别共振现象。试验台还支持多种实验,如不平衡/现场动平衡、轴不对中实验、摩擦实验、油膜故障试验、轴颈轴承实验以及根据油压和温度进行的转子动力学试验。试验台配备了多种传感器和控制系统,包括电涡流传感器、温度传感器、压力传感器等,用于监测和记录实验数据。 适合人群:从事汽轮机设计、制造、维护的技术人员,以及相关专业的高校师生和研究人员。 使用场景及目标:①研究汽轮机转子的动态行为和滑动轴承的油膜现象;②进行振动控制方法的研究;③模拟再现油膜涡动转和油膜震荡,研究其控制条件;④进行不平衡、不对中、摩擦等常见故障的模拟和分析;⑤通过调整油压、温度和预加载力,研究轴的行为变化。 其他说明:该试验台不仅适用于教学和科研,还可用于工业领域的培训和技术验证。试验台具有丰富的配置和可选配件,可以根据具体需求进行定制。试验台的机械和电气参数详细列出,确保用户能够全面了解设备性能。

    知识图谱,电影领域,知识图谱构建

    电影类型知识图谱构建,包含相关数据集

Global site tag (gtag.js) - Google Analytics