Tomcat结合Apache、Nginx实现高性能的web服务器

一、Tomcat为什么需要与apache、nginx一起结合使用?

Tomcat虽然是一个servlet和jsp容器,但是它也是一个轻量级的web服务器。它既可以处理动态内容,也可以处理静态内容。不过,tomcat的最大优势在于处理动态请求,处理静态内容的能力不如apache和nginx,并且经过测试发现,tomcat在高并发的场景下,其接受的最大并发连接数是由限制的,连接数过多会导致tomcat处于"僵死"状态,因此,在这种情况下,我们可以利用nginx的高并发,低消耗的特点与tomcat一起使用。因此,tomcat与nginx、apache结合使用共有如下几点原因:

1、tomcat处理html的能力不如Apache和nginx,tomcat处理静态内容的速度不如apache和nginx。

2、tomcat接受的最大并发数有限,接连接数过多,会导致tomcat处于"僵尸"状态,对后续的连接失去响应,需要结合nginx一起使用。

通常情况下,tomcat与nginx、Apache结合使用,nginx、apache既可以提供web服务,也可以转发动态请求至tomcat服务器上。但在一个高性能的站点上,通常nginx、apache只提供代理的功能,也就是转发请求至tomcat服务器上,而对于静态内容的响应,则由前端负载均衡器来转发至专门的静态服务器上进行处理。其架构类似于如下图:

在这种架构中,当haproxy或nginx作为前端代理时,如果是静态内容,如html、css等内容,则直接交给静态服务器处理;如果请求的图片等内容,则直接交给图片服务器处理;如果请求的是动态内容,则交给tomcat服务器处理,不过在tomcat服务器上,同时运行着nginx服务器,此时的nginx作为静态服务器,它不处理静态请求,它的作用主要是接受请求,并将请求转发给tomcat服务器的,除此之外,nginx没有任何作用。

二、tomcat的连接器协议

tomcat和前端web服务器(nginx或Apache)之间的通信时靠连接器协议来完成的,tomcat共支持4中连接器协议,分别为:

1) HTTP连接器

2) SSL连接器

3) AJP 1.3连接器

4) proxy连接器(好像这个没用了)

也可以归档为支持2种连接器协议:AJP和HTTP,它们用来在Web服务器和Tomcat之间进行数据传输,并提供相应的控制命令。

AJP(Apache JServ Protocol)协议

目前正在使用的AJP协议的版本是通过JK和JK2连接器提供支持的AJP13,它基于二进制的格式在Web服务器和Tomcat之间传输数据,而此前的版本AJP10和AJP11则使用文本格式传输数据。由于这种协议是二进制的,因此在处理请求时的效率比http协议要高。目前常用AJP协议的版本是1.3,它主要有以下特征:

1) 在快速网络有着较好的性能表现,支持数据压缩传输;

2) 支持SSL,加密及客户端证书;

3) 支持Tomcat实例集群;

4) 支持在apache和tomcat之间的连接的重用,不适用于与nginx通信;

HTTP协议:诚如其名称所表示,使用HTTP或HTTPS协议在Web服务器和Tomcat之间建立通信,此时,Tomcat就是一个完全功能的HTTP服务器,它需要监听在某端口上以接收来自于前端服务器的请求,对于动态请求需要转交给servlet容器进行处理。如果前端是nginx做代理的话,那么nginx和tomcat之间的通信只能使用http协议了,而不能使用AJP协议。

http连接器也有3种类型

Tomcat的HTTP连接器有三种:

1) 基于java的HTTP/1.1连接器,这也是Tomcat6默认使用的连接器,即Coyote;它是Tomcat作为standalone模式工作时所用到的连接器,可直接响应来自用户浏览器的关于JSP、servlet和HTML的请求;此连接器是一个Java类,定义在server.xml当中,默认使用8080端口;

2) Java开发的高性能NIO HTTP/1.1连接器,它支持非阻塞式IO和Comnet,在基于库向tomcat发起请求时,此连接器表现不俗;但其实现不太成熟,有严重bug存在;

3) C/C++开发的native APR HTTP/1.1连接器;在负载较大的场景中,此连接器可以提供非常好的性能;APR即Apache Portable Runtime,它是一个能让开发者采用与平台无关的风格的方式来开发C/C++代码本地库,它能够很好的跨Windows,;

默认tomcat的采用的是第1种连接器类型。

实验前的准备步骤:

1)、由于我是将tomcat和nginx在不同的服务器上配置的,因此,tomcat的ip地址为192.168.1.103,nginx的ip地址为172.16.1.100

2)、关闭系统上的防火墙和selinux

3)、nginx系统上的ip地址和网关配置省略了



三、tomcat与nginx一起结合使用

tomcat与nginx为什么需要一起使用的原因就不在阐述了,前面已经说得很清楚了,这里直接给出操作步骤。

1、安装nginx

# yum -y install nginx

2、编辑并配置nginx的配置文件/etc/nginx/nginx.conf

在该配置文件中添加如下配置即可

upstream tomcat {

server 172.16.1.100 weight=1  max_fails=3 fail_timeout =10s;

location ~*   \.(jsp|do)$ {

proxy_pass http://tomcat;

}

nginx上只需要添加转发动态请求的配置即可。

3、启动nginx服务

# service nginx start

4、安装配置tomcat

tomcat的安装这里就不在详述了。这里只给出tomcat的配置

编辑tomcat的配置文件server.xml,添加如下内容:

<Host name="www.xsl.com" appBase="webapps" unpackWARs="true" autoDeploy="true">

<Context docBase="app1" path="a" reloadable="true" />

</Host>

创建相应的目录及其文件

# mkdir -pv /usr/local/tomcat7/app1/a

# cd  /usr/local/tomcat7/app1/a

# vim index.jsp

添加如下测试代码

<%@ page language="java" %>

<%@ page import="java.util.*" %>

<html>

<head>

<title>JSP test page.</title>

</head>

<body>

<% out.println("Hello,world!"); %>

</body>

</html>

其实整个内容也就是显示"hello world"。

启动tomcat

# service tomcat start

5、测试访问http://192.168.1.103/app1/a/index.jsp

四、tomcat结合apache一起使用

apache与tomcat结合使用时,有2种模块可以与tomcat进行通信,这两种模块分别是mod_proxy模块和mod_jk模块。mod_proxy模块是apache自带的模块,因此要使用该模块,只需要启用该模块就行了。而mod_jk模块,需要下载并进行手动编译,使其成为apache的一个模块。

mod_proxy模块可以基于http协议与tomcat进行通信,也可以基于ajp协议与tomcat进行通信;而mod_jk模块只能基于ajp协议与tomcat进行通信。

apache使用mod_proxy模块与tomcat进行通信

其步骤如下:

(1)、apache使用mod_proxy模块与tomcat通信时,需要加载proxy_module、proxy_http_module、proxy_ajp_module、proxy_balancer_module(负载均衡时需要使用该模块)等这些模块。

# yum -y install httpd

查看apache是否已经启用该模块了。

# httpd -M | grep proxy

httpd: Could not reliably determine the server‘s fully qualified domain name, using localhost.localdomain for ServerName

proxy_module (shared)

proxy_balancer_module (shared)

proxy_ftp_module (shared)

proxy_http_module (shared)

proxy_ajp_module (shared)

proxy_connect_module (shared)

(2)、编辑httpd的配置文件/etc/httpd/conf.d/proxy.conf文件,添加如下内容:

proxyvia off

proxypreservehost on

proxyrequests off

proxypass / ajp://172.16.1.100/

proxypa***everse  / ajp://172.16.1.100/

如果你的http版本是2.4的话,其配置如下:

proxyvia off

proxypreservehost on

proxyrequests off

<Proxy *>

Require all granted

</Proxy>

proxypass / ajp://172.16.1.100/

proxypa***everse  / ajp://172.16.1.100/

<Location  / >

Require all granted

</Location>

如果要想基于http连接器协议与tomcat工作的话,只需要将ajp改为http即可。其他的配置都不变。

关于如上apache指令的说明:

ProxyPreserveHost {On|Off}:如果启用此功能,代理会将用户请求报文中的Host:行发送给后端的服务器,而不再使用ProxyPass指定的服务器地址。如果想在反向代理中支持虚拟主机,则需要开启此项,否则就无需打开此功能。

ProxyVia  {On|Off|Full|Block}:用于控制在http首部是否使用Via:,主要用于在多级代理中控制代理请求的流向。默认为Off,即不启用此功能;On表示每个请求和响应报文均添加Via:;Full表示每个Via:行都会添加当前apache服务器的版本号信息;Block表示每个代理请求报文中的Via:都会被移除。

ProxyPa***everse:用于让apache调整HTTP重定向响应报文中的Location、Content-Location及URI标签所对应的URL,在反向代理环境中必须使用此指令避免重定向报文绕过proxy服务器。

ProxyRequests {On|Off}:是否开启apache正向代理的功能;启用此项时为了代理http协议必须启用proxy_http_module模块。同时,如果为apache设置了ProxyPass,则必须将ProxyRequests设置为Off。

ProxyPass  [path]  !|url  [key=value key=value ...]]:将后端服务器某URL与当前服务器的某虚拟路径关联起来作为提供服务的路径,path为当前服务器上的某虚拟路径,url为后端服务器上某URL路径。使用此指令时必须将ProxyRequests的值设置为Off。需要注意的是,如果path以“/”结尾,则对应的url也必须以“/”结尾,反之亦然。

另外,mod_proxy模块在httpd 2.1的版本之后支持与后端服务器的连接池功能,连接在按需创建在可以保存至连接池中以备进一步使用。连接池大小或其它设定可以通过在ProxyPass中使用key=value的方式定义。常用的key如下所示:

◇ min:连接池的最小容量,此值与实际连接个数无关,仅表示连接池最小要初始化的空间大小。

◇ max:连接池的最大容量,每个MPM都有自己独立的容量;都值与MPM本身有关,如Prefork的总是为1,而其它的则取决于ThreadsPerChild指令的值。

◇ loadfactor:用于负载均衡集群配置中,定义对应后端服务器的权重,取值范围为1-100。

◇ retry:当apache将请求发送至后端服务器得到错误响应时等待多长时间以后再重试。单位是秒钟。

(3)、启动httpd服务

# service httpd start

(4)、安装配置tomcat

tomcat的安装这里就不在详述了。这里只给出tomcat的配置

编辑tomcat的配置文件server.xml,添加如下内容:

<Host name="www.xsl.com" appBase="webapps" unpackWARs="true" autoDeploy="true">

<Context docBase="app1" path="a" reloadable="true" />

</Host>

创建相应的目录及其文件

# mkdir -pv /usr/local/tomcat7/app1/a

# cd  /usr/local/tomcat7/app1/a

# vim index.jsp

添加如下测试代码

<%@ page language="java" %>

<%@ page import="java.util.*" %>

<html>

<head>

<title>JSP test page.</title>

</head>

<body>

<% out.println("Hello,world!"); %>

</body>

</html>

其实整个内容也就是显示"hello world"。

启动tomcat

# service tomcat start

(5)、测试访问http://192.168.1.103/app1/a/index.jsp

apache使用mod_jk模块与tomcat进行通信

mod_jk是ASF的一个项目,是一个工作于apache端基于AJP协议与Tomcat通信的连接器,它是apache的一个模块,是AJP协议的客户端(服务端是Tomcat的AJP连接器)。

(1)、编译安装mod_jk

下载地址:http://tomcat.apache.org/connectors-doc/

# yum -y install httpd

# yum -y install httpd-devel

# tar xf tomcat-connectors-1.2.41-src.tar.gz

# cd /root/tomcat-connectors-1.2.41-src/native

# ./configure --with-apxs (如果没有apxs程序,需要安装httpd-devel包)

# make && make install

(2)、编辑httpd的配置文件/etc/httpd/conf.d/httpd-jk.conf

apache要使用mod_jk连接器,需要在启动时加载此连接器模块。为了便于管理与mod_jk模块相关的配置,这里使用一个专门的配置文件/etc/httpd/conf.d/httpd-jk.conf来保存相关指令及其设置。其内容如下:

LoadModule  jk_module modules/mod_jk.so

JkWorkersFile /etc/httpd/conf.d/workers.properties

JkLogFile logs/mod_jk.log

JkLogLevel debug

JkMount /* TomcatA

JkMount /status/ stat1

除了需要使用LoadModule指令在apache中装载模块外,mod_jk还需要在apache的主配置文件中设置其它一些指令来配置其工作属性。如JkWorkersFile则用于指定保存了worker相关工作属性定义的配置文件,JkLogFile则用于指定mod_jk模块的日志文件,JkLogLevel则可用于指定日志的级别(info, error, debug),此外还可以使用JkRequestLogFormat自定义日志信息格式。而JkMount(格式: JkMount  <URL to match>  <Tomcat worker name>)指定则用于控制URL与Tomcat workers的对应关系。

/etc/httpd/conf.d/workers.properties的内容如下:

worker.list=TomcatA,stat1

worker.TomcatA.port =8009

worker.TomcatA.host=172.16.1.100

worker.TomcatA.type=ajp13

worker.TomcatA.lbfactor=1

worker.stat1.type=status

根据其工作机制的不同,worker有多种不同的类型,这是需要为每个worker定义的一项属性woker.<work name>.type。常见的类型如下:

◇ ajp13:此类型表示当前worker为一个运行着的Tomcat实例。

◇ lb:lb即load balancing,专用于负载均衡场景中的woker;此worker并不真正负责处理用户请求,而是将用户请求调度给其它类型为ajp13的worker。

◇status:用户显示分布式环境中各实际worker工作状态的特殊worker,它不处理任何请求,也不关联到任何实际工作的worker实例。具体示例如请参见后文中的配置。

worker其它常见的属性说明:

◇ host:Tomcat 7的worker实例所在的主机;

◇ port:Tomcat 7实例上AJP1.3连接器的端口;

◇ connection_pool_minsize:最少要保存在连接池中的连接的个数;默认为pool_size/2;

◇ connection_pool_timeout:连接池中连接的超时时长;

◇ mount:由当前worker提供的context路径,如果有多个则使用空格格开;此属性可以由JkMount指令替代;

◇ retries:错误发生时的重试次数;

◇ socket_timeout:mod_jk等待worker响应的时长,默认为0,即无限等待;

◇ socket_keepalive:是否启用keep alive的功能,1表示启用,0表示禁用;

◇ lbfactor:worker的权重,可以在负载均衡的应用场景中为worker定义此属性

(3)、启动httpd服务

# service httpd start

(4)、安装配置tomcat

tomcat的安装这里就不在详述了。这里只给出tomcat的配置

编辑tomcat的配置文件server.xml,添加如下内容:

<Host name="www.xsl.com" appBase="webapps" unpackWARs="true" autoDeploy="true">

<Context docBase="app1" path="a" reloadable="true" />

</Host>

并且将<Engine />这一行改为如下行:

<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA">

这里的TomcatA要与此前的保持一致。

创建相应的目录及其文件

# mkdir -pv /usr/local/tomcat7/app1/a

# cd  /usr/local/tomcat7/app1/a

# vim index.jsp

添加如下测试代码

<%@ page language="java" %>

<%@ page import="java.util.*" %>

<html>

<head>

<title>JSP test page.</title>

</head>

<body>

<% out.println("Hello,world!"); %>

</body>

</html>

其实整个内容也就是显示"hello world"。

启动tomcat

# service tomcat start

(5)、测试访问http://192.168.1.103/app1/a/index.jsp

五、tomcat的session集群

对于web服务器集群技术而言,最重要的环节就是如何保证多个节点间的session信息一致性。要实现这一点,大体有二种方式:

一是将所有的session信息放置在一台独立的服务器或者数据库中,集群中所有的节点都可以通过这台服务器获取其相关数据信息。不过如果这台服务器挂了的话,那么所有的节点都不能获取其session信息了,因此,最好对这台服务器做高可用。但是这无疑增加了企业的成本。

二是在多台节点间实现session信息复制,任何一个节点都保存了所有的session数据。只要不是所有的节点都挂掉的话,那么仍然可以响应请求,这种方式比较可靠,但是节点之间的相互复制,会增加服务器的负载,并且会增加网络带宽。常见的平台或中间件如microsoft asp.net和IBM WAS都会提供对两种共享方式的支持,tomcat也是这样,但是一般采用第二种方式。

tomcat的session集群架构

实验前提:

nginx所在服务器地址为:192.168.1.103

TomcatA所在服务器地址为:172.16.1.100

TomcatB所在服务器地址为:172.16.1.200

关闭所有服务器上iptables和selinux

1、实验拓扑图如下:

本实验中前端采用的是nginx,其实后端tomcat主机上还应该加上apache或nginx的,只不过之前已经将该过程实现了,因此,这里就不在给出tomcat如何与nginx、apche一起集合使用的步骤了。

2、配置安装nginx

# yum -y install nginx

编辑nginx的配置文件/etc/nginx/nginx.conf,并添加如下内容:

# vim /etc/nginx/nginx.conf

upstream tomcat {

server 172.16.1.100:8080 weight=1 max_fails=3 fail_timeout=10s;

server 172.16.1.200:8080 weight=1 max_fails=3 fail_timeout=10s;

}

server {

listen 80;

location / {

root /htdoc/www;

index index.html;

}

location ~*   \.(jsp|do)$ {

proxy_pass http://tomcat;

}

}

最后,启动nginx服务

# service  nginx  start

3、配置安装tomcatA

tomcat和jdk的安装过程不再给出,这里只给出修改配置文件的步骤。

修改tomcat的配置文件server.xml(我这里的路径为/usr/local/tomcat7/conf/server.xml)

将<Engine>这一行改为如下行:

<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA">

其实就是添加了一个jvmRoute参数。

还需要在配置文件中添加一个Host容器

<Host name="node1.xsl.com" appbase="webapps" unpackWARs="true" autoDeploy="true" >

<Context docBase="node" path="app" reloadable="true" />

</Host>

创建相应的目录及文件

# mkdir /usr/local/tomcat7/webapps/node/app

# vim /usr/local/tomcat7/webapps/node/app/index.jsp

<%@ page language="java" %>

<html>

<head><title>TomcatA</title></head>

<body>

<h1><font color="red">TomcatA.magedu.com</font></h1>

<table align="centre" border="1">

<tr>

<td>Session ID</td>

<% session.setAttribute("magedu.com","magedu.com"); %>

<td><%= session.getId() %></td>

</tr>

<tr>

<td>Created on</td>

<td><%= session.getCreationTime() %></td>

</tr>

</table>

</body>

</html>

最后,在启动tomcat服务即可

# service tomcat start

4、配置安装tomcatB

tomcat和jdk的安装过程不再给出,这里只给出修改配置文件的步骤。

修改tomcat的配置文件server.xml(我这里的路径为/usr/local/tomcat7/conf/server.xml)

将<Engine>这一行改为如下行:

<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatB">

其实就是添加了一个jvmRoute参数。

还需要在配置文件中添加一个Host容器

<Host name="node2.xsl.com" appbase="webapps" unpackWARs="true" autoDeploy="true" >

<Context docBase="node" path="app" reloadable="true" />

</Host>

创建相应的目录及文件

# mkdir /usr/local/tomcat7/webapps/node/app

# vim /usr/local/tomcat7/webapps/node/app/index.jsp

<%@ page language="java" %>

<html>

<head><title>TomcatB</title></head>

<body>

<h1><font color="blue">TomcatB.magedu.com</font></h1>

<table align="centre" border="1">

<tr>

<td>Session ID</td>

<% session.setAttribute("magedu.com","magedu.com"); %>

<td><%= session.getId() %></td>

</tr>

<tr>

<td>Created on</td>

<td><%= session.getCreationTime() %></td>

</tr>

</table>

</body>

</html>

最后,在启动tomcat服务即可

# service tomcat start

5、测试访问nginx的负载功能是否成功

访问http://192.168.1.103/node/app/index.jsp,显示结果如下:

再一次刷新访问,显示结果如下:

由此,nginx的负载均衡功能已经实现。注意观察两次访问的结果,其session信息是不相同的,这也就是说其中任何一台tomcat服务器宕机了,则该服务器上的session信息都会丢失。因此,还需要将session信息保持下来,这里我采用将两台tomcat服务器上的session信息相互进行复制来实现session保持功能。

6、tomcat的session(复制)集群实现过程

在TomcatA和TomcatB上的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="228.0.0.4"

port="45564"

frequency="500"

dropTime="3000"/>

<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"

//TomcatA        address="172.16.1.100"

//TomcatB        address="172.16.1.200"

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=""/>

<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"

tempDir="/tmp/war-temp/"

deployDir="/tmp/war-deploy/"

watchDir="/tmp/war-listen/"

watchEnabled="false"/>

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

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

</Cluster>

注意:将TomcatA和TomcatB上的<Receiver >中的address由"auto"改为可以接受心跳信息的地址。这里我将TomcatA上的address改为"172.16.1.100";TomcatB上的地址改为"172.16.1.200"。

然后在TomcatA和TomcatB上相应的应用程序目录(即Context中的docBase目录)下创建WEB-INF目录,且创建一个web.xml文件(直接将CATALINA_HOME/conf目录下的web.xml文件复制过来即可)。

# mkdir /usr/local/tomcat7/webapps/node/WEB-INF

# cp /usr/local/tomcat7/conf/web.xml  /usr/local/tomcat7/webapps/node/WEB-INF

编辑/usr/local/tomcat7/webapps/node/WEB-INF/web.xml文件,添加如下一行信息:

<distributable/>

这行信息添加到<web-app>容器下。

最后,再次访问http://192.168.1.103/node/app/index.jsp

再次刷新访问,显示结果如下:

观察两次访问的SESSION ID是一样的,由此,tomcat的session集群已经实现了。

原文地址:https://www.cnblogs.com/jpfss/p/10090307.html

时间: 2024-08-28 05:40:35

Tomcat结合Apache、Nginx实现高性能的web服务器的相关文章

Apache、IIS、Nginx等绝大多数web服务器,都不允许静态文件响应POST请求

最近调用一个接口,发现httppost请求目标网站会出现405 状态码,原因为 Apache.IIS.Nginx等绝大多数web服务器,都不允许静态文件响应POST请求 所以将post请求改为get请求即可 package com.changyou.test; import java.io.IOException; import java.io.UnsupportedEncodingException; //import org.apache.commons.httpclient.HttpCli

Nginx+uWSGI+Django部署web服务器

目录 Nginx+uWSGI+Django部署web服务器 环境说明 前言 搭建项目 Django部署 编辑luffy/luffy/settings.py 编辑luffy/app01/views.py 编辑luffy/luffy/urls.py 运行并测试 uWSGI部署 测试运行uWSGI 使用uWSGI运行django项目 uWSGi热加载Djangoa项目 部署nginx nginx配置uwsgi和django django部署static文件 重新加载nginx进行测试 测试nginx

Nginx:轻量级高性能的Web服务器

Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由Igor Sysoev为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日.其将源代码以类BSD许可证的形式发布,因它的稳定性.丰富的功能集.示例配置文件和低系统资源的消耗而闻名.2011年6月1日,nginx 1.0.4发布.Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/

Nginx配置文件(作为Web服务器)

Nginx作为Web服务器时,其配置文件参数如下: #user  nobody; #默认的运行用户 worker_processes  1; #工作进程数,建议和CPU核心数一致,默认为1 #error_log  logs/error.log; #error_log  logs/error.log  notice; #error_log  logs/error.log  info; #pid        logs/nginx.pid; events { worker_connections  

varnish+nginx实现单双web服务器缓存

实验目的: varnish利用实现对后端单双静态web服务器的缓存 varnish包的下载路径:http://repo.varnish-cache.org/redhat/varnish-3.0/el6 可以下载到varnish的rpm包 需要下载的有: varnish-3.0.5-1.el6.x86_64 varnish-docs-3.0.5-1.el6.x86_64 varnish-libs-3.0.5-1.el6.x86_64 varnish的官网地址:https://www.varnish

nginx反向代理后端web服务器记录客户端ip地址

nginx在做反向代理的时候,后端的nginx web服务器log中记录的地址都是反向代理服务器的地址,无法查看客户端访问的真实ip. 在反向代理服务器的nginx.conf配置文件中进行配置. location /bbs { proxy_pass http://192.168.214.131/bbs; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarde

攻城狮在路上(肆)How tomcat works(一) 简单的web服务器

 该节总共三个类:Request\Response\HttpServer---user.dir 该节的目的是实现简单web服务器对静态文件的访问.需要对请求头.请求体的格式有所了解,不然就没有办法解析. 1.Request: 主要的方法是parse,该方法的主要逻辑是解析Socket的Inputstream,读取输入流,解析出请求访问的地址uri,比如:/index.jsp 解析uri时,是针对HTTP请求的标准格式进行解析:GET /articles/news/today.asp HTTP/1

Nginx+Keeplived+Tomcat搭建高可用/负载均衡的web服务器集群

一.集群规划 服务器角色 主机名 IP地址/VIP 软件 Nginx Master NK1 20.0.20.101/20.0.20.100 Nginx/Keepalived Nginx Backup NK2 20.0.20.102/20.0.20.100 Nginx/Keepalived Web Server NK3 20.0.20.103 Tomcat Web Server NK4 20.0.20.104 Toncat #关闭selinux和firewall #软件版本为:apache-tom

Linux服务器内核参数优化(适合Apache,Nginx,Squid等多种web应用)

net.ipv4.tcp_fin_timeout=2 net.ipv4.tcp_tw_reuse=1 net.ipv4.tcp_tw_recycle=1 net.ipv4.tcp_syncookies=1 net.ipv4.tcp_keepalive_time=600 net.ipv4.ip_local_port_range=4000 65000 net.ipv4.tcp_max_syn_backlog=16384 net.ipv4.route.gc_timeout=100 net.ipv4.t